Browse Source

调整跳转链接

qymljy 2 years ago
parent
commit
93c995144d

+ 52 - 12
src/router/modelNormal.js

@@ -10,21 +10,21 @@ const moduleNormal = [
     component: ()=>import(/* webpackChunkName: "about" */ '@/system/moduleNormal/reportcenter/index.vue'),
   },
   {
-    path: '/customclassification',
+    path: '/custom_option',
     name: 'customclassification',
     meta: {
       title: '自定义选项分类',
-      name: 'custom_option',
+      name: 'customclassification',
       keepAlive:false
     },
     component: ()=>import(/* webpackChunkName: "about" */ '@/system/moduleNormal/customOptions/index.vue'),
   },
   {
-    path: '/account_manage',
-    name: 'users',
+    path: '/usersmanager',
+    name: 'usersmanager',
     meta: {
       title: '用户管理',
-      name: 'users',
+      name: 'usersmanager',
       keepAlive:false
     },
     component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/userManage/index.vue')
@@ -34,17 +34,17 @@ const moduleNormal = [
     name: 'accountManageDetail',
     meta: {
       title: '用户详情',
-      name: 'users',
+      name: 'usersmanager',
       keepAlive:false
     },
     component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/userManage/detail/index.vue')
   },
   {
-    path: '/role_manage',
-    name: 'roles',
+    path: '/rolesmanager',
+    name: 'rolesmanager',
     meta: {
       title: '角色管理',
-      name: 'roles',
+      name: 'rolesmanager',
       keepAlive:false
     },
     component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/roleManage/index.vue')
@@ -54,7 +54,7 @@ const moduleNormal = [
     name: 'roleManageDetail',
     meta: {
       title: '角色管理详情',
-      name: 'roles',
+      name: 'rolesmanager',
       keepAlive:false
     },
     component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/roleManage/detail/index.vue')
@@ -64,7 +64,7 @@ const moduleNormal = [
     name: 'vacationmag',
     meta: {
       title: '节假日管理',
-      name: 'vacation',
+      name: 'vacationmag',
       keepAlive:false
     },
     component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/vacationMag/index.vue')
@@ -74,7 +74,7 @@ const moduleNormal = [
     name: 'reminderconfig',
     meta: {
       title: '系统提醒设置',
-      name: 'remindconfig',
+      name: 'reminderconfig',
       keepAlive:false
     },
     component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/systemRemind/index.vue')
@@ -146,6 +146,46 @@ const moduleNormal = [
     },
     component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/productManage/detail/index.vue')
   },
+  {
+    path: '/depmanager',
+    name: 'depmanager',
+    meta: {
+      title: '组织架构',
+      name: 'depmanager',
+      keepAlive:false
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/depManage/index.vue')
+  },
+  {
+    path: '/depmanagerDetail',
+    name: 'depmanagerDetail',
+    meta: {
+      title: '组织架构详情',
+      name: 'depmanager',
+      keepAlive:false
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/depManage/detail/index.vue')
+  },
+  {
+    path: '/coderulemag',
+    name: 'coderulemag',
+    meta: {
+      title: '编码规则管理',
+      name: 'coderulemag',
+      keepAlive:false
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/codeRuleMag/index.vue')
+  },
+  {
+    path: '/tagmanager',
+    name: 'tagmanager',
+    meta: {
+      title: '标签管理',
+      name: 'tagmanager',
+      keepAlive:false
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/system/moduleNormal/tagManage/index.vue')
+  },
 
 
 ];

+ 40 - 0
src/system/moduleNormal/codeRuleMag/index.vue

@@ -0,0 +1,40 @@
+<template>
+  <div>
+    <listTemp ref="list" :param="param" :tableName="'coderuleTable'" :searchType="searchType">
+      <template #tb_cell="{data}">
+        <template v-if="data.column.dataIndex === 'operation'">
+          <edit :data="data.record" @onSuccess="listData"></edit>
+        </template>
+      </template>
+    </listTemp>
+  </div>
+</template>
+
+<script setup>
+  import listTemp from '@/components/listTemplate/index.vue';
+  import edit from './modules/edit.vue'
+  import {ref} from "vue";
+  const list = ref()
+  import { useRouter } from "vue-router";
+  const router = useRouter()
+  let searchType = ref([
+    {label:'搜索',key:'condition',type:'input'},
+  ])
+  let param = ref({
+    "content": {
+      "pageNumber": 1,
+      "pageSize": 20,
+      "where": {
+        "condition": "",
+      }
+    },
+    "id": 20221109110204,
+  })
+  const listData = ()=>{
+    list.value.tableData()
+  }
+</script>
+
+<style>
+
+</style>

+ 94 - 0
src/system/moduleNormal/codeRuleMag/modules/edit.vue

@@ -0,0 +1,94 @@
+<template>
+  <div>
+    <a-button type="link" @click="onShow">编 辑</a-button>
+    <a-drawer
+      append-to-body  v-model:visible="dialogFormVisible"
+      class="custom-class"
+      title="编辑规则"
+      placement="right"
+      width="600"
+      :closable="false"
+      @close="onClose"
+      >
+      <a-form size="small" :model="form"  layout="vertical">
+        <a-row :gutter="16">
+          <a-col :span="12">
+            <a-form-item label="编码名称">
+              <span >{{form.notes}}</span>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-item label="前置符">
+              <a-input v-model:value="form.fixed" autocomplete="off"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-item label="数值长度">
+              <a-input v-model:value="form.numlength" autocomplete="off"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-item label="时间格式">
+              <a-input v-show="form.numincludetime === 1" v-model:value="form.timeformat" autocomplete="off"></a-input>
+              <span v-show="form.numincludetime !== 1">{{form.timeformat}}</span>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-item label="是否包含时间信息">
+              <a-checkbox  v-model:checked="checked"></a-checkbox>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-item label="当前序号">
+              <span>{{form.serialnum}}</span>
+            </a-form-item>
+          </a-col>
+        </a-row>
+      </a-form>
+      <template #extra>
+        <a-space>
+          <a-button  @click="onClose" class="normal-btn-width">取 消</a-button>
+          <a-button  type="primary" @click="submit" class="normal-btn-width">确 定</a-button>
+        </a-space>
+      </template>
+    </a-drawer>
+  </div>
+</template>
+
+<script setup>
+  import {ref, defineProps, defineEmits} from "vue";
+  import Api from '@/api/api'
+  import utils from '@/utils/utils'
+  const emit = defineEmits(['onSuccess'])
+  const props = defineProps(['data'])
+  const form = ref({})
+  const dialogFormVisible = ref(false)
+  const checked = ref(false)
+  const onShow = ()=>{
+    dialogFormVisible.value = true
+    form.value = Object.assign({},form.value,props.data)
+    form.value.numincludetime == 1 ? checked.value = true : checked.value = false
+  }
+  const submit = async ()=>{
+    try {
+      checked.value ? form.value.numincludetime = 1 : form.value.numincludetime = 0
+      const res = await Api.requested({
+        "content":form.value,
+        "id":20230608101202
+      })
+      utils.message(res,'编辑成功',()=>{
+        onClose()
+        emit('onSuccess')
+      })
+    } catch (errorInfo) {
+      console.log('Failed:', errorInfo);
+    }
+  }
+  const onClose = ()=>{
+    dialogFormVisible.value = false
+  }
+</script>
+
+<style>
+
+</style>

+ 154 - 0
src/system/moduleNormal/depManage/detail/index.vue

@@ -0,0 +1,154 @@
+<template>
+  <div>
+    <detail-template :headData="mainAreaData" :title="userData.name" :tabs="['详细信息']" ownertable="sys_hr" :delParam="{id:'20221102090403',content:{hrids:[router.currentRoute.value.query.id]}}">
+      <template #operation>
+        <edit :data="userData" @onSuccess="mianData"></edit>
+        <bindUserToAccount :data="userData" @onSuccess="mianData"/>
+        <ceateAccount :data="userData" :hrid="router.currentRoute.value.query.id" @onSuccess="mianData"/>
+      </template>
+      <template #tab0>
+        <div class="defaultInfo">
+          <span >基本信息</span>
+        </div>
+        <defaultInfo :data="basicData"></defaultInfo>
+        <div class="defaultInfo-sys">
+          <span >系统信息</span>
+        </div>
+        <defaultInfo :data="systemData"></defaultInfo>
+      </template>
+    </detail-template>
+  </div>
+</template>
+
+<script setup>
+import Api from '@/api/api'
+import utils  from '@/utils/utils'
+import productList from '@/template/normalTable/index.vue'
+import detailTemplate from '@/components/detailTemplate/index.vue'
+import edit from './modules/edit.vue'
+import ceateAccount from './modules/ceateAccount.vue'
+import bindUserToAccount from './modules/bindUserToAccount.vue'
+import defaultInfo from '@/template/defaultInfo/index.vue'
+import { useRouter } from "vue-router";
+import { onMounted,ref } from "vue";
+const router = useRouter()
+const mainAreaData = ref([])
+const basicData = ref([])
+const systemData = ref([])
+const param = ref({
+  "id": 20221109093902,
+  "content": {
+    "sa_orderid": 0, //订单ID
+    "pageNumber": 1,
+    "pageSize": 20,
+    "where": {
+      "condition": ""
+    }
+  },
+})
+const userData = ref({})
+const mianData = async ()=>{
+  const res = await Api.requested({
+    "id":20230613102802,
+    "content": {
+      "nocache":true,
+      "hrid": router.currentRoute.value.query.id
+    }
+  })
+  userData.value = res.data
+  changeDataStructure(res.data)
+
+}
+const changeDataStructure = (data) => {
+  mainAreaData.value = [
+    {
+      label:'编号',
+      value:data.hrcode
+    },
+    {
+      label:'姓名',
+      value:data.name
+    },
+    {
+      label:'手机号',
+      value:data.phonenumber
+    },
+    {
+      label:'是否部门负责人',
+      value:data.isleader === 1?'是':'否'
+    },
+    {
+      label:'状态',
+      value:data.status == 1?'在职':'离职'
+    },
+  ]
+  basicData.value = [
+    {
+      label:'编号',
+      value:data.hrcode
+    },
+    {
+      label:'账号',
+      value:data.accountno
+    },
+    {
+      label:'姓名',
+      value:data.username
+    },
+    {
+      label:'账号类型',
+      value:data.usertypename
+    },
+    {
+      label:'授权角色',
+      value:data.userrole
+    },
+    {
+      label:'手机号',
+      value:data.phonenumber
+    },
+    {
+      label:'部门',
+      value:data.depname
+    },
+    {
+      label:'职位',
+      value:data.position
+    },
+    {
+      label:'是否部门负责人',
+      value:data.isleader === 1?'是':'否'
+    },
+    {
+      label:'状态',
+      value:data.status == 1?'在职':'离职'
+    },
+  ]
+  systemData.value = [
+    {
+      label:'创建时间',
+      value:data.createdate
+    },
+    {
+      label:'创建人',
+      value:data.createby
+    },
+    {
+      label:'最近编辑时间',
+      value:data.changedate
+    },
+    {
+      label:'最近编辑人',
+      value:data.changeby
+    },
+  ]
+}
+const onSelectChange = (val) =>{
+  console.log(val,'orderManage')
+}
+onMounted (()=>{
+  mianData()
+})
+</script>
+<style>
+</style>

+ 76 - 0
src/system/moduleNormal/depManage/detail/modules/bindUserToAccount.vue

@@ -0,0 +1,76 @@
+<template>
+  <div>
+    <a-button type="primary" @click="showDrawer">绑定账号</a-button>
+    <a-drawer
+      v-model:visible="visible"
+      class="custom-class"
+      title="绑定账号"
+      placement="right"
+      width="600"
+      :closable="false"
+      @close="onClose"
+    >
+    <normalTable :filterMultiple="true" rowKey="userid" size="small" :param="param" :columns="utils.TBLayout('unBindtACTable')" @onSelect="onSelect"/>
+      <template #extra>
+        <a-space>
+          <a-button @click="onClose">关闭</a-button>
+          <a-button type="primary" @click="submit">绑定</a-button>
+        </a-space>
+      </template>
+    </a-drawer>
+  </div>
+</template>
+
+<script setup>
+import {ref,defineProps,defineEmits} from 'vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+import normalTable from '@/template/normalTable/index.vue'
+const props = defineProps(['data'])
+const emit = defineEmits(['onSuccess'])
+const visible = ref(false)
+const param = ref({
+  "classname":"sysmanage.develop.optiontype.optiontype",
+  "method":"optiontypeselect",
+  "content":{
+    "pageNumber":1,
+    "pageSize":20,
+    "typename":"userlistunused",
+    "parameter":{"condition":""}
+  }
+})
+const form = ref({
+  type:'标准订单',
+  enterprisename:''
+})
+const showDrawer = ()=>{
+  visible.value = true
+}
+const formRef = ref()
+const onClose = () => {
+  visible.value = false;
+};
+const submit = async ()=>{
+  try {
+    console.log(props.data.userid,selectedAccount.value.userid)
+    props.data.userid = selectedAccount.value.userid
+    const res = await Api.requested({
+      "id":20230613102902,
+      "content":props.data
+    })
+    utils.message(res,'绑定成功',()=>{
+      onClose()
+      emit('onSuccess')
+    })
+  } catch (errorInfo) {
+    console.log('Failed:', errorInfo);
+  }
+}
+const selectedAccount = ref({})
+const onSelect = (val)=>{
+  selectedAccount.value = val.pop()
+  console.log(selectedAccount.value)
+}
+</script>
+<style>
+</style>

+ 98 - 0
src/system/moduleNormal/depManage/detail/modules/ceateAccount.vue

@@ -0,0 +1,98 @@
+<template>
+  <div>
+    <a-button type="primary" @click="showDrawer">创建账号</a-button>
+    <a-drawer
+      v-model:visible="visible"
+      class="custom-class"
+      title="创建账号"
+      placement="right"
+      width="600"
+      :closable="false"
+      @close="onClose"
+    >
+      <a-form ref="formRef" :model="form" size="small" layout="vertical">
+        <a-row :gutter="16">
+          <a-col :span="24">
+            <a-form-item label="登录账号">
+              <a-input v-model:value="form.accountno" placeholder="输入登录账号" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-item label="手机号">
+              <a-input v-model:value="form.phonenumber" placeholder="输入手机号" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-item label="选择角色" name="roleids" :rules="[{ required: true, message: '未选择新账号角色' }]">
+              <a-select
+                ref="select"
+                mode="multiple"
+                v-model:value="form.roleids"
+                placeholder="选择角色"
+                style="width: 100%"
+              >
+                <a-select-option v-for="item in rolesOptions" :key="item.roleid" :value="item.roleid">{{item.rolename}}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+      </a-form>
+      <template #extra>
+        <a-space>
+          <a-button @click="onClose">关闭</a-button>
+          <a-button type="primary" @click="submit">保存</a-button>
+        </a-space>
+      </template>
+    </a-drawer>
+  </div>
+</template>
+
+<script setup>
+import {ref,defineProps,defineEmits} from 'vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+const props = defineProps(['hrid'])
+const emit = defineEmits(['onSuccess'])
+const visible = ref(false)
+const form = ref({
+  accountno:"",
+  phonenumber:"",
+  roleids:[],
+})
+const showDrawer = ()=>{
+  roles()
+  visible.value = true
+}
+const formRef = ref()
+const onClose = () => {
+  visible.value = false;
+  formRef.value.resetFields();
+};
+const submit = async ()=>{
+  try {
+    const values = await formRef.value.validateFields();
+    const res = await Api.requested({
+      "id":20230613103002,
+      "content": {
+        "phonenumber":form.value.phonenumber,
+        "accountno":form.value.accountno,
+        "hrid":props.hrid,
+        "roleids":form.value.roleids
+      }
+    })
+    utils.message(res,'创建成功',()=>{
+      onClose()
+      emit('onSuccess')
+    })
+  } catch (errorInfo) {
+    console.log('Failed:', errorInfo);
+  }
+}
+const rolesOptions = ref([])
+const roles = async ()=>{
+  const res = await Api.optionstype('role')
+  rolesOptions.value = res.data
+}
+</script>
+<style>
+</style>

+ 180 - 0
src/system/moduleNormal/depManage/detail/modules/edit.vue

@@ -0,0 +1,180 @@
+<template>
+  <div>
+    <a-button type="primary" @click="showDrawer">编辑</a-button>
+    <a-drawer
+      v-model:visible="visible"
+      class="custom-class"
+      title="员工信息"
+      placement="right"
+      width="900"
+      :closable="false"
+      @close="onClose"
+    >
+      <a-form ref="formRef" :model="form"  size="small" layout="vertical">
+        <a-row :gutter="16">
+          <a-col :span="8">
+            <a-form-item label="人员编号" name="hrcode" :rules="[{ required: true, message: '请输入人员编号' }]">
+              <a-input v-model:value="form.hrcode" placeholder="输入人员编号"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="人员性别" name="name">
+              <a-select v-model:value="form.sex" style="width: 100%" placeholder="选择人员性别">
+                <a-select-option v-for="item in sexOptions" :key="item.index" :value="item.value">{{item.value}}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="人员姓名" name="name" :rules="[{ required: true, message: '请输入姓名' }]">
+              <a-input v-model:value="form.name" placeholder="输入姓名"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="所属部门" name="departmentids" :rules="[{ required: true, message: '请选择所属部门' }]">
+              <a-cascader v-model:value="form.departmentids" :options="depOptions" placeholder="选择所属部门" :fieldNames="{label:'depname',value:'departmentid',children:'subdep'}" :multiple="false" change-on-select clear @change="onChange"/>
+            </a-form-item>
+          </a-col>
+<!--          <a-col :span="8">
+            <a-form-item label="手机号码" name="phonenumber">
+              <a-input v-model:value="form.phonenumber" placeholder="输入手机号码"></a-input>
+            </a-form-item>
+          </a-col>-->
+          <a-col :span="8">
+            <a-form-item label="职位" name="position">
+              <a-input v-model:value="form.position" placeholder="输入职位"></a-input>
+            </a-form-item>
+          </a-col>
+<!--          <a-col :span="8">
+            <a-form-item label="身份证号" name="idcard">
+              <a-input v-model:value="form.idcard" placeholder="输入身份证号"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="8">
+            <a-form-item label="电子邮箱" name="email">
+              <a-input v-model:value="form.email" placeholder="输入姓名"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="办公电话" name="officetelephone">
+              <a-input v-model:value="form.officetelephone" placeholder="输入办公电话"></a-input>
+            </a-form-item>
+          </a-col>-->
+          <!-- <a-col :span="8">
+            <a-form-item label="汇报对象" name="reporthrid">
+              <a-input v-model:value="form.reporthrid" placeholder="输入汇报对象"></a-input>
+            </a-form-item>
+          </a-col> -->
+          <a-col :span="8">
+          <a-form-item label="是否部门负责人">
+            <a-select v-model:value="form.isleader">
+              <a-select-option :value="1">是</a-select-option>
+              <a-select-option :value="0">否</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="是否服务人员">
+            <a-select v-model:value="form.isworker">
+              <a-select-option :value="1">是</a-select-option>
+              <a-select-option :value="0">否</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+          <a-col :span="12">
+            <a-form-item label="状态">
+              <a-select v-model:value="form.status">
+                <a-select-option :value="1">在职</a-select-option>
+                <a-select-option :value="0">离职</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+      </a-form>
+      <template #extra>
+        <a-space>
+          <a-button @click="onClose">关闭</a-button>
+          <a-button type="primary" @click="submit">保存</a-button>
+        </a-space>
+      </template>
+    </a-drawer>
+  </div>
+</template>
+
+<script setup>
+import {ref,defineProps,defineEmits} from 'vue'
+import { storeToRefs } from 'pinia'
+import { useBaseStore } from '@/stores/modules/base'
+
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+const props = defineProps(['data'])
+const emit = defineEmits('onSuccess')
+const base = useBaseStore()
+const visible = ref(false)
+const form = ref({
+  userid:0,
+  hrid:0,
+  sex:'男',
+  phonenumber:'',
+  officetelephone:'',
+  idcard:'',
+  email:'',
+  birthday:'',
+  hrcode:"",
+  isleader:1,
+  isworker:0,
+  remarks:'',
+  status:1
+})
+const Provinces = ref([])
+const formRef = ref()
+const showDrawer = async ()=>{
+  form.value = Object.assign({},form.value,props.data)
+  form.value.departmentids = form.value.depfullid.split('/').map(Number)
+  console.log(form.value.status)
+  form.value.status == 1?form.value.status =1:form.value.status = 0
+  visible.value = true
+  sexData()
+  depData()
+}
+const onClose = () => {
+  visible.value = false;
+  formRef.value.resetFields();
+};
+const submit = async ()=>{
+  try {
+    const values = await formRef.value.validateFields();
+    const res = await Api.requested({
+     id:20230613102902,
+      content:form.value
+    })
+    utils.message(res,'添加成功',()=>{
+      emit('onSuccess')
+      onClose()
+    })
+  } catch (errorInfo) {
+    console.log('Failed:', errorInfo);
+  }
+}
+const onChange = (val)=>{
+  form.value.departmentid = form.value.departmentids.at(-1)
+}
+const sexOptions = ref([])
+const sexData = async () =>{
+  const res = await Api.optionstype('sex')
+  sexOptions.value = res.data
+}
+const depOptions = ref([])
+const depData = async ()=>{
+  const res = await Api.requested({
+    id:20230608101802,
+    content:{
+      nocache:true
+    }
+  })
+  depOptions.value = res.data
+}
+</script>
+<style>
+</style>

+ 73 - 0
src/system/moduleNormal/depManage/index.vue

@@ -0,0 +1,73 @@
+<template>
+  <div class="flex">
+    <main-area class="mainAreaPanel" @onTreeSelect="onTreeSelect"></main-area>
+    <listTemp :noAutoQuery="true"  keyRouteName="name" class="listPanel" ref="list" :dataSource="dataSource" :columns="columns" :param="param"  :tableName="'staffTable'" :searchType="searchType" :detailPage="{name:'depmanagerDetail',idname:'hrid'}">
+      <template #operation>
+        <add-worker :id="param.content.sa_saleareaid" @onSuccess="list.tableData()"></add-worker>
+      </template>
+      <template #tb_cell="{data}">
+        <template v-if="data.column.dataIndex === 'isleader'">
+          {{data.record.isleader == 1?'是':'否'}}
+        </template>
+        <template v-else-if="data.column.dataIndex === 'staffStatus'">
+          <a-tag color="#333">{{data.record.status == 1?'在职':'离职'}}</a-tag>
+        </template>
+        <template v-else-if="data.column.dataIndex === 'operation'">
+          <a-button type="link" @click="toDetailPage(data.record)">详 情</a-button>
+        </template>
+      </template>
+    </listTemp>
+  </div>
+</template>
+
+<script setup>
+  import Api from '@/api/api'
+  import utils from '@/utils/utils'
+  import listTemp from '@/components/listTemplate/index.vue';
+  import mainArea from './modules/mainDep.vue'
+  import addWorker from './modules/addWorker.vue'
+  import { ref } from 'vue'
+  import { useRouter } from "vue-router";
+  import { onMounted } from "vue";
+  const router = useRouter()
+  let columns = ref([])
+  let dataSource = ref([])
+  let searchType = ref([
+    {label:'搜索',key:'condition',type:'input'},
+  ])
+  let param = ref({
+    "content": {
+      "pageNumber": 1,
+      "pageSize": 20,
+      "containssub":1,
+      "departmentids":[],
+      "where": {
+        "condition": "",
+      }
+    },
+    "id": 20221102090303,
+  })
+  const list = ref()
+  const onTreeSelect =  (id)=>{
+    param.value.content.departmentids = [id]
+    list.value.tableData()
+  }
+  const toDetailPage = (record)=>{
+    // 跳转到详情
+    router.push({name:'depmanagerDetail',query:{id:record.hrid}})
+  }
+
+</script>
+<style scoped>
+.mainAreaPanel{
+  flex: 1 1 230px;
+  width: 230px;
+  margin:10px 10px 0 0;
+  padding: 10px;
+  background: #fff;
+}
+.listPanel{
+  flex: 1 1 auto;
+  width: calc(100% - 280px);
+}
+</style>

+ 123 - 0
src/system/moduleNormal/depManage/modules/addMainDep.vue

@@ -0,0 +1,123 @@
+<template>
+  <a-button class="mt-10"  @click="showDrawer" block>
+    <PlusOutlined/>添加部门
+  </a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="新建部门"
+    placement="right"
+    width="600"
+    :get-container="false"
+    :closable="false"
+    @close="onClose">
+    <a-form ref="formRef" :model="form"  size="small" layout="vertical">
+      <a-row :gutter="16">
+        <a-col :span="12">
+          <a-form-item label="部门名称" name="depname" :rules="[{ required: true, message: '请输入部门名称' }]">
+            <a-input v-model:value="form.depname" placeholder="请输入部门名称" autocomplete="off"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="部门编号" name="depno" :rules="[{ required: true, message: '请输入部门编号' }]">
+            <a-input v-model:value="form.depno" placeholder="请输入部门编号" autocomplete="off"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="部门描述" name="remarks">
+            <a-input v-model:value="form.remarks" placeholder="请输入部门描述" autocomplete="off"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="排序">
+            <a-input v-model:value="form.sequence" placeholder="请输入部门排序号" autocomplete="off"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="上级部门" name="depfullids" :rules="[{ required: false, message: '请选择所属部门' }]">
+            <a-cascader v-model:value="form.depfullids" :options="depOptions" placeholder="选择所属部门" :fieldNames="{label:'depname',value:'departmentid',children:'subdep'}" :multiple="false" change-on-select clear @change="onChange"/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="是否启用">
+            <a-select v-model:value="form.isused">
+              <a-select-option :value="1">是</a-select-option>
+              <a-select-option :value="0">否</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+    </a-form>
+    <template #extra>
+      <a-space>
+        <a-button @click="onClose">关闭</a-button>
+        <a-button type="primary" @click="submit">保存</a-button>
+      </a-space>
+    </template>
+  </a-drawer>
+</template>
+
+<script setup>
+import {ref,defineEmits,defineProps,defineExpose,onMounted} from 'vue'
+import {PlusOutlined} from '@ant-design/icons-vue';
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+const emit = defineEmits(['onSuccess'])
+let props = defineProps(['parentid','depfullid'])
+const visible = ref(false)
+const form = ref({
+  "departmentid":0,
+  "depfullids":[],
+  "depname":"",
+  "isused":1,
+  "depno":'',
+  "parentid":0,
+  "remarks":"",
+  "sequence":""
+})
+const showDrawer = ()=>{
+  visible.value = true
+  form.value.depfullids = props.depfullid.split('/').map(Number)
+}
+const onClose = () => {
+  visible.value = false;
+  formRef.value.resetFields();
+};
+const formRef = ref()
+const depOptions = ref([])
+const depData = async ()=>{
+  const res = await Api.requested({
+    id:20230608101802,
+    content:{
+      nocache:true
+    }
+  })
+  depOptions.value = res.data
+}
+
+const submit = async ()=>{
+  try {
+    const values = await formRef.value.validateFields();
+    form.value.parentid = form.value.depfullids[form.value.depfullids.length -1]
+    const res = await Api.requested({
+     "id":20230608102002,
+      "content": form.value
+    })
+    utils.message(res,'创建成功',()=>{
+      emit('onSuccess')
+      onClose()
+    })
+  } catch (errorInfo) {
+    console.log('Failed:', errorInfo);
+  }
+}
+onMounted(()=>{
+  depData()
+})
+defineExpose({
+  /*visible*/
+  showDrawer
+})
+</script>
+<style>
+</style>

+ 148 - 0
src/system/moduleNormal/depManage/modules/addWorker.vue

@@ -0,0 +1,148 @@
+<template>
+  <div>
+    <a-button type="primary" @click="showDrawer">新建员工</a-button>
+    <a-drawer
+      v-model:visible="visible"
+      class="custom-class"
+      title="员工信息"
+      placement="right"
+      width="600"
+      :closable="false"
+      @close="onClose"
+    >
+      <a-form ref="formRef" :model="form"  size="small" layout="vertical">
+        <a-row :gutter="16">
+          <a-col :span="12">
+            <a-form-item label="人员编号" name="hrcode" :rules="[{ required: true, message: '请输入人员编号' }]">
+              <a-input v-model:value="form.hrcode" placeholder="输入人员编号"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-item label="人员性别" name="name">
+              <a-select v-model:value="form.sex" style="width: 100%" placeholder="选择人员性别">
+                <a-select-option v-for="item in sexOptions" :key="item.index" :value="item.value">{{item.value}}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-item label="人员姓名" name="name" :rules="[{ required: true, message: '请输入姓名' }]">
+              <a-input v-model:value="form.name" placeholder="输入姓名"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-item label="所属部门" name="departmentids" :rules="[{ required: true, message: '请选择所属部门' }]">
+              <a-cascader v-model:value="form.departmentids" :options="depOptions" placeholder="选择所属部门" :fieldNames="{label:'depname',value:'departmentid',children:'subdep'}" :multiple="false" change-on-select clear @change="onChange"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-item label="职位" name="position">
+              <a-input v-model:value="form.position" placeholder="输入职位"></a-input>
+            </a-form-item>
+          </a-col>
+          <!-- <a-col :span="8">
+            <a-form-item label="汇报对象" name="reporthrid">
+              <a-input v-model:value="form.reporthrid" placeholder="输入汇报对象"></a-input>
+            </a-form-item>
+          </a-col> -->
+          <a-col :span="12">
+          <a-form-item label="是否部门负责人">
+            <a-select v-model:value="form.isleader">
+              <a-select-option :value="1">是</a-select-option>
+              <a-select-option :value="0">否</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="状态">
+            <a-select v-model:value="form.status">
+              <a-select-option :value="1">在职</a-select-option>
+              <a-select-option :value="0">离职</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        </a-row>
+      </a-form>
+      <template #extra>
+        <a-space>
+          <a-button @click="onClose">关闭</a-button>
+          <a-button type="primary" @click="submit">保存</a-button>
+        </a-space>
+      </template>
+    </a-drawer>
+  </div>
+</template>
+
+<script setup>
+import {ref,defineProps,defineEmits} from 'vue'
+import { storeToRefs } from 'pinia'
+import { useBaseStore } from '@/stores/modules/base'
+
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+const props = defineProps(['id'])
+const emit = defineEmits('onSuccess')
+const base = useBaseStore()
+const visible = ref(false)
+const form = ref({
+  userid:0,
+  hrid:0,
+  sex:'男',
+  phonenumber:'',
+  officetelephone:'',
+  idcard:'',
+  email:'',
+  birthday:'',
+  hrcode:"",
+  isleader:1,
+  isworker:1,
+  position:'',
+  remarks:'',
+  status:1
+})
+const Provinces = ref([])
+const formRef = ref()
+const showDrawer = async ()=>{
+  visible.value = true
+  sexData()
+  depData()
+}
+const onClose = () => {
+  visible.value = false;
+  formRef.value.resetFields();
+};
+const submit = async ()=>{
+  try {
+    const values = await formRef.value.validateFields();
+    const res = await Api.requested({
+     id:20230613102902,
+      content:form.value
+    })
+    utils.message(res,'添加成功',()=>{
+      emit('onSuccess')
+      onClose()
+    })
+  } catch (errorInfo) {
+    console.log('Failed:', errorInfo);
+  }
+}
+const onChange = (val)=>{
+  form.value.departmentid = form.value.departmentids.at(-1)
+}
+const sexOptions = ref([])
+const sexData = async () =>{
+  const res = await Api.optionstype('sex')
+  sexOptions.value = res.data
+}
+const depOptions = ref([])
+const depData = async ()=>{
+  const res = await Api.requested({
+    id:20230608101802,
+    content:{
+      nocache:true
+    }
+  })
+  depOptions.value = res.data
+}
+</script>
+<style>
+</style>

+ 150 - 0
src/system/moduleNormal/depManage/modules/editMainDep.vue

@@ -0,0 +1,150 @@
+<template>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="编辑部门"
+    placement="right"
+    width="600"
+    :get-container="false"
+    :closable="false"
+    @close="onClose"
+  >
+    <a-form ref="formRef" :model="form"  size="small" layout="vertical">
+      <a-row :gutter="16">
+        <a-col :span="12">
+          <a-form-item label="部门名称" name="depname" :rules="[{ required: true, message: '请输入部门名称' }]">
+            <a-input v-model:value="form.depname" placeholder="请输入部门名称" autocomplete="off"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="部门编号" name="depno" :rules="[{ required: true, message: '请输入部门编号' }]">
+            <a-input v-model:value="form.depno" placeholder="请输入部门编号" autocomplete="off"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="部门描述" name="remarks">
+            <a-input v-model:value="form.remarks" placeholder="请输入部门描述" autocomplete="off"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="排序">
+            <a-input v-model:value="form.sequence" placeholder="请输入部门排序号" autocomplete="off"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="上级部门" name="depfullids" :rules="[{ required: false, message: '请选择所属部门' }]">
+            <a-cascader v-model:value="form.depfullids" :options="depOptions" placeholder="选择所属部门" :fieldNames="{label:'depname',value:'departmentid',children:'subdep'}" :multiple="false" change-on-select clear @change="onChange"/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item label="是否启用">
+            <a-select v-model:value="form.isused">
+              <a-select-option :value="1">是</a-select-option>
+              <a-select-option :value="0">否</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+    </a-form>
+    <template #extra>
+      <a-space>
+        <a-button @click="onClose">取消</a-button>
+<!--        <a-button type="primary" @click="onDelete" danger>删除</a-button>-->
+        <a-button type="primary" @click="submit">保存</a-button>
+      </a-space>
+    </template>
+  </a-drawer>
+</template>
+
+<script setup>
+import {ref,defineEmits,defineProps,defineExpose} from 'vue'
+import {PlusOutlined} from '@ant-design/icons-vue';
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+const emit = defineEmits(['onSuccess','onClose'])
+const props = defineProps(['data'])
+const visible = ref(false)
+const form = ref({
+  "departmentid":0,
+  "depname":"",
+  "isused":1,
+  "depno":'',
+  "parentid":0,
+  "remarks":"",
+  "sequence":""
+})
+const showDrawer = ()=>{
+  console.log(props.data,'props')
+  let obj = {
+    departmentid:props.data.key,
+    parentid:props.data.parentid,
+    depname:props.data.title,
+    isused:props.data.isused,
+    remarks:props.data.remarks,
+    depno:props.data.depno,
+    sequence:props.data.sequence,
+    depfullids:props.data.depfullid
+  }
+  depData()
+  console.log(obj)
+  form.value = Object.assign({},form.value,obj)
+  form.value.depfullids = form.value.depfullids.split('/').map(Number)
+  visible.value = true
+}
+const depOptions = ref([])
+const depData = async ()=>{
+  const res = await Api.requested({
+    id:20230608101802,
+    content:{
+      nocache:true
+    }
+  })
+  depOptions.value = res.data
+}
+const onClose = () => {
+  visible.value = false;
+  emit('onClose')
+  formRef.value.resetFields();
+};
+const formRef = ref()
+
+const submit = async ()=>{
+  try {
+    const values = await formRef.value.validateFields();
+    form.value.parentid = form.value.depfullids[form.value.depfullids.length -1]
+    const res = await Api.requested({
+     "id":20230608102002,
+      "content": form.value
+    })
+    utils.message(res,'编辑成功',()=>{
+      emit('onSuccess')
+      onClose()
+    })
+  } catch (errorInfo) {
+    console.log('Failed:', errorInfo);
+  }
+}
+const onDelete = async ()=>{
+  form.value.isused = 0
+  await Api.requested({
+    "id":20230608102002,
+    "content":form.value
+  })
+
+  const res = await Api.requested({
+    "id":20230608102102,
+    "content":{
+      "departmentid":props.data.key
+    }
+  })
+  utils.message(res,'删除成功',()=>{
+    emit('onSuccess')
+    onClose()
+  })
+}
+defineExpose({
+  showDrawer
+})
+</script>
+<style>
+</style>

+ 179 - 0
src/system/moduleNormal/depManage/modules/mainDep.vue

@@ -0,0 +1,179 @@
+<template>
+  <div>
+    <a-tree
+      v-if="treeData.length"
+      :tree-data="treeData"
+      autoExpandParent
+      defaultExpandAll
+      showLine
+      blockNode
+      virtual
+      :height="getHeight"
+      style="height:calc(100vh - 210px)"
+      @select="onSelect">
+      <template #title="node">
+        <span v-if="node.key === '0-0-1-0'" style="color: #1890ff">{{ node.title }}</span>
+        <template v-else>
+          <a-badge :color="node.isused == 1?'green':'red'" :text="node.title" />&nbsp;
+          <a-dropdown :trigger="['click']" @click.stop="handleButtonClick(node)">
+            <EditOutlined/>
+            <template #overlay>
+              <a-menu @click="handleMenuClick">
+                <a-menu-item key="add">
+                  <small @click="showDrawer">
+                    <plus-outlined />&nbsp;
+                    新增下级
+                  </small>
+                </a-menu-item>
+                <a-menu-item key="edit">
+                  <small>
+                    <EditOutlined/>&nbsp;
+                    编 辑
+                  </small>
+                </a-menu-item>
+                <a-menu-item key="delete">
+                  <small @click="deleteArea(node)">
+                    <DeleteOutlined />&nbsp;
+                    删 除
+                  </small>
+                </a-menu-item>
+              </a-menu>
+            </template>
+          </a-dropdown>
+        </template>
+      </template>
+    </a-tree>
+    <add-main-area ref="add" :parentid="parentid" :depfullid="depfullid" @onSuccess="getMainClass"></add-main-area>
+    <edit-main-area ref="edit" :data="node" @onSuccess="getMainClass" @onClose="onClose"></edit-main-area>
+  </div>
+</template>
+
+<script setup>
+  import Api from '@/api/api'
+  import utils from '@/utils/utils'
+  import addMainArea from './addMainDep.vue'
+  import editMainArea from './editMainDep.vue'
+  import { EditOutlined ,PlusOutlined,DeleteOutlined} from '@ant-design/icons-vue';
+  import { ref,defineEmits } from 'vue'
+  import { onMounted,computed } from "vue";
+  import { Modal } from 'ant-design-vue';
+  import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
+  import { createVNode, defineComponent } from 'vue';
+  import {re} from "mathjs";
+  const emit = defineEmits(['onTreeSelect'])
+  const treeData = ref([])
+  const getHeight = computed(()=>{
+    return window.innerHeight - 200
+  })
+  const getMainClass = async ()=>{
+    const res = await Api.requested({
+      id:20230608101802,
+      content:{
+        nocache:true
+      }
+    })
+    treeData.value = createMenu(res.data)
+    emit('onTreeSelect',treeData.value[0].departmentid)
+  }
+  const createMenu = (array) => {
+    let arr = []
+    function convertToElementTree(node) {
+      // 新节点
+      var elNode = {
+        title: node["depname"],
+        parentid:node['parentid'],
+        depfullid:node['depfullid'],
+        departmentid:node["departmentid"],
+        key:node["departmentid"],
+        remarks:node["remarks"],
+        isused:node["isused"],
+        changedate:node['changedate'],
+        changeby:node['changeby'],
+        createdate:node['createdate'],
+        createby:node['createby'],
+        depno:node['depno'],
+        sequence:node['sequence'],
+        children: []
+      }
+
+      if (node.subdep && node.subdep.length > 0) {
+        // 如果存在子节点
+        for (var index = 0; index < node.subdep.length; index++) {
+        // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+        elNode.children.push(convertToElementTree(node.subdep[index]));
+        }
+      }
+      return elNode;
+    }
+    array.forEach((element) => {
+      arr.push(convertToElementTree(element))
+    });
+    return arr
+  }
+  let parentid = ref(0)
+  let departmentid = ref(0)
+  const node = ref({})
+  let depfullid = ref(0)
+  const handleButtonClick = e => {
+    console.log(e,'333')
+    parentid.value = e.key
+    depfullid.value = e.depfullid
+    node.value = e
+  };
+  const add = ref()
+  const edit = ref()
+  const handleMenuClick = e => {
+    switch (e.key) {
+      case 'add':
+        /*add.value.visible = true
+        add.value.form.value.parentid = '123'*/
+          add.value.showDrawer()
+        break;
+      case 'edit':
+        edit.value.showDrawer()
+        break;
+      default:
+        break;
+    }
+  };
+  const onSelect = (selectedKeys)=>{
+    console.log(selectedKeys)
+    if (selectedKeys[0])
+      return emit('onTreeSelect',selectedKeys[0])
+  }
+  const deleteArea = async (node)=>{
+    console.log(node)
+    Modal.confirm({
+      title: '删除部门',
+      icon: createVNode(ExclamationCircleOutlined),
+      content: '确定删除此部门吗?',
+      okText: '是',
+      okType: 'danger',
+      cancelText: '否',
+      onOk() {
+        onDel(node)
+      },
+      onCancel() {
+      },
+    });
+  }
+  const onDel = async(node)=>{
+    const res = await Api.requested({
+      "id":20230608102102,
+      "content":{
+        "departmentid":node.key
+      }
+    })
+    utils.message(res,'删除成功',()=>{
+      getMainClass()
+    })
+  }
+  const onClose = ()=>{
+    parentid.value= 0
+  }
+  onMounted (()=>{
+    getMainClass()
+  })
+</script>
+<style>
+</style>

+ 111 - 0
src/system/moduleNormal/tagManage/index.vue

@@ -0,0 +1,111 @@
+<template>
+  <div>
+    <listTemp ref="list" :param="param" :tableName="'dataTagDetailTable'" :searchType="searchType" :noAutoQuery="true">
+      <template #operation>
+        <add :id="param.content.where.sys_systemtagid" @onSuccess="onSuccess" ></add>
+      </template>
+      <template #tb_cell="{data}">
+        <template v-if="data.column.dataIndex === 'mutextags'">
+          <a-tag color="blue" v-for="item in data.record.mutextags" :key="item.index">{{item.tag}}</a-tag>
+        </template>
+        <template v-else-if="data.column.dataIndex === 'tag'">
+          {{data.record.tag}}
+          <a-tag style="margin-left: 10px" color="blue" v-if="data.record.issystem">系统</a-tag>
+        </template>
+        <template v-else-if="data.column.dataIndex === 'operation'">
+          <edit class="inline-block" :data="data.record" @onSuccess="onSuccess"></edit>
+          <a-popconfirm
+              title="确定删除当前数据吗?"
+              ok-text="是"
+              cancel-text="否"
+              @confirm="onDel(data.record.sys_systemtagdetailid)"
+          >
+            <a-button type="link" size="mini" v-if="showDel(data.record.issystem)">删 除</a-button>
+          </a-popconfirm>
+
+        </template>
+      </template>
+    </listTemp>
+  </div>
+</template>
+
+<script setup>
+  import {ref,onMounted} from "vue";
+  import listTemp from '@/components/listTemplate/index.vue';
+  import add from './modules/add.vue'
+  import edit from './modules/edit.vue'
+  import Api from '@/api/api'
+  import utils from '@/utils/utils'
+  import { useRouter } from "vue-router";
+  const router = useRouter()
+  const list = ref()
+  const dataSource = ref([])
+  const objectOptions = ref([])
+  const paramObject = ref({
+    "id": 20221013104301,
+    "content": {
+    }
+  })
+  const param = ref({
+    "content": {
+      "pageNumber": 1,
+      "pageSize": 100,
+      "where": {
+        "condition": "",
+        "sys_systemtagid":'',
+      }
+    },
+    "id": 20221013104401,
+  })
+  const defaultData = ref()
+  const searchType = ref()
+  const businessObject = async ()=>{
+    const res = await Api.requested(paramObject.value)
+    objectOptions.value = res.data.map(item=>{
+      return {
+        remarks:item.name,
+        value:item.sys_systemtagid
+      }
+    })
+    param.value.content.where.sys_systemtagid = objectOptions.value[0].value
+    defaultData.value = objectOptions.value[0].value
+    searchType.value = [
+      {label:'搜索',key:'condition',type:'input'},
+      {label: '业务对象',key:'sys_systemtagid',type: 'select',dataSource:objectOptions,defaultData:defaultData.value}
+    ]
+    searchType.value[1].defaultData = defaultData.value
+    list.value.tableData()
+  }
+  const onSuccess = ()=>{
+    list.value.tableData()
+  }
+  const onDel = async (id)=>{
+    try {
+      const res = await Api.requested({
+        "id":20221013104601,
+        "content": {
+          "sys_systemtagdetailids": [id],
+        }
+      })
+      utils.message(res,'删除成功',()=>{
+        list.value.tableData()
+      })
+    } catch (e) {
+      console.log('Failed:', e);
+    }
+  }
+  const showDel = (data)=>{
+    if (data){
+      return false
+    }else {
+      return true
+    }
+  }
+  onMounted(()=>{
+    businessObject()
+  })
+</script>
+
+<style>
+
+</style>

+ 132 - 0
src/system/moduleNormal/tagManage/modules/add.vue

@@ -0,0 +1,132 @@
+<template>
+  <div>
+    <a-button type="primary" @click="showDrawer">新 增</a-button>
+    <a-drawer
+        v-model:visible="visible"
+        class="custom-class"
+        title="新增标签"
+        placement="right"
+        width="600"
+        :closable="false"
+        @close="onClose"
+    >
+      <a-form :model="form" :rules="rules" ref="formRef"  size="small" layout="vertical">
+        <a-row :gutter="16">
+          <a-col :span="24">
+            <a-form-item label="新增标签" name="tag" >
+              <a-input v-model:value="form.tag"  placeholder="请输入标签名" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-item label="描述" name="helptips">
+              <a-textarea v-model:value="form.helptips" placeholder="请输入标签描述" :rows="4" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-item label="互斥范围" name="result">
+              <a-select
+                  ref="select"
+                  mode="multiple"
+                  v-model:value="form.result"
+                  placeholder="请选择标签"
+                  style="width: 100%"
+              >
+                <a-select-option v-for="item in tagData" :key="item.sys_systemtagdetailid" :value="item.sys_systemtagdetailid">{{item.tag}}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+      </a-form>
+      <template #extra>
+        <a-space>
+          <a-button @click="onClose">关闭</a-button>
+          <a-button type="primary" @click="submit">保存</a-button>
+        </a-space>
+      </template>
+    </a-drawer>
+  </div>
+</template>
+
+<script setup>
+  import {ref,defineEmits,defineProps} from "vue";
+  import Api from '@/api/api'
+  import utils from '@/utils/utils'
+  const visible = ref(false)
+  const emit = defineEmits(['onSuccess'])
+  const props = defineProps(['id'])
+  const onClose = ()=>{
+    visible.value = false
+    mutextags.value = ''
+    formRef.value.resetFields()
+  }
+  const form = ref({
+    sys_systemtagid: '',
+    sys_systemtagdetailid:0,
+    tag:"",
+    helptips:"",
+  })
+  const formRef = ref()
+  const rules = ref({
+    tag:[
+      { required: true, message: '请输入标签名', trigger: 'blur'},
+    ],
+  })
+  const tagData = ref()
+  const showDrawer = async()=>{
+    visible.value = true
+    param.value.content.where.sys_systemtagid = props.id
+    const res = await Api.requested(param.value)
+    tagData.value = res.data
+    console.log(res.data,'互斥标签可选')
+  }
+  const param = ref({
+    "content": {
+      "pageNumber": 1,
+      "pageSize": 100,
+      "where": {
+        "condition": "",
+        "sys_systemtagid":'',
+      }
+    },
+    "id": 20221013104401,
+  })
+  const mutextags = ref()
+  const submit = async ()=>{
+    try {
+      const values = await formRef.value.validateFields()
+      form.value.sys_systemtagid = props.id
+      const res = await Api.requested({
+        "id": "20221013104501",
+        "content": form.value
+      })
+      utils.message(res,'创建成功',async()=>{
+        if (form.value.result !== undefined){
+          mutextags.value = form.value.result.map(item => {
+            return {
+              "sys_systemtagdetailid": item,
+            }
+          })
+          if (mutextags.value.length > 0) {
+            let res2 = await Api.requested({
+              "id":20221014122501,
+              "content": {
+                "sys_systemtagid": res.data.sys_systemtagid,
+                "sys_systemtagdetailid": res.data.sys_systemtagdetailid,
+                "mutextags": mutextags.value,
+              }
+            })
+          }
+        }
+        onClose()
+        emit('onSuccess')
+      })
+
+    } catch (errorInfo) {
+      console.log('Failed:', errorInfo);
+    }
+  }
+</script>
+
+<style>
+
+</style>

+ 137 - 0
src/system/moduleNormal/tagManage/modules/edit.vue

@@ -0,0 +1,137 @@
+<template>
+  <div>
+    <a-button type="link" size="mini" @click="showDrawer">编 辑</a-button>
+    <a-drawer
+        v-model:visible="visible"
+        class="custom-class"
+        title="编辑标签"
+        placement="right"
+        width="600"
+        :closable="false"
+        @close="onClose"
+    >
+      <a-form :model="form" :rules="rules" ref="formRef"  size="small" layout="vertical">
+        <a-row :gutter="16">
+          <a-col :span="24">
+            <a-form-item label="新增标签" name="tag" >
+              <a-input v-model:value="form.tag"  placeholder="请输入标签名" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-item label="描述" name="helptips">
+              <a-textarea v-model:value="form.helptips" placeholder="请输入标签描述" :rows="4" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-item label="互斥范围" name="result">
+              <a-select
+                  ref="select"
+                  mode="multiple"
+                  v-model:value="form.result"
+                  placeholder="请选择标签"
+                  style="width: 100%"
+              >
+                <a-select-option v-for="item in tagData" :key="item.sys_systemtagdetailid" :value="item.sys_systemtagdetailid">
+                  {{item.tag}}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+      </a-form>
+      <template #extra>
+        <a-space>
+          <a-button @click="onClose">关闭</a-button>
+          <a-button type="primary" @click="submit">保存</a-button>
+        </a-space>
+      </template>
+    </a-drawer>
+  </div>
+</template>
+
+<script setup>
+  import {ref,defineEmits,defineProps} from "vue";
+  import Api from '@/api/api'
+  import utils from '@/utils/utils'
+  const visible = ref(false)
+  const emit = defineEmits(['onSuccess'])
+  const props = defineProps(['data'])
+  const onClose = ()=>{
+    visible.value = false
+    mutextags.value = ''
+    formRef.value.resetFields()
+  }
+  const form = ref({})
+  const formRef = ref()
+  const rules = ref({
+    tag:[
+      { required: true, message: '请输入标签名', trigger: 'blur'},
+    ],
+  })
+  const tagData = ref()
+  const showDrawer = async()=>{
+    visible.value = true
+    form.value = Object.assign({},form.value,props.data)
+    form.value.result = props.data.mutextags.map(e=>e.sys_systemtagdetailid)
+    param.value.content.where.sys_systemtagid = form.value.sys_systemtagid
+    const res = await Api.requested(param.value)
+    tagData.value = res.data
+    filters(props.data.tag)
+  }
+  const filters = (tag)=>{
+    tagData.value.forEach((item,index)=>{
+      if (item.tag === tag){
+        tagData.value.splice(index,1)
+      }
+    })
+  }
+  const param = ref({
+    "content": {
+      "pageNumber": 1,
+      "pageSize": 100,
+      "where": {
+        "condition": "",
+        "sys_systemtagid":'',
+      }
+    },
+    "id": 20221013104401,
+  })
+  const mutextags = ref()
+  const submit = async ()=>{
+    try {
+      const values = await formRef.value.validateFields()
+      const res = await Api.requested({
+        "id": "20221013104501",
+        "content": form.value
+      })
+      utils.message(res,'创建成功',async()=>{
+        mutextags.value = ''
+        if (form.value.result !== undefined){
+          mutextags.value = form.value.result.map(item => {
+            return {
+              "sys_systemtagdetailid": item,
+            }
+          })
+          console.log(mutextags.value)
+          let res2 = await Api.requested({
+            "id":20221014122501,
+            "content": {
+              "sys_systemtagid": form.value.sys_systemtagid,
+              "sys_systemtagdetailid": form.value.sys_systemtagdetailid,
+              "mutextags": mutextags.value,
+            }
+          })
+        }
+        onClose()
+        emit('onSuccess')
+      })
+
+    } catch (errorInfo) {
+      console.log('Failed:', errorInfo);
+    }
+  }
+</script>
+
+<style>
+
+</style>