snow 9 månader sedan
förälder
incheckning
cca52a161a
3 ändrade filer med 172 tillägg och 7 borttagningar
  1. BIN
      dist-zip/build.zip
  2. 20 7
      src/views/interest/role/index.vue
  3. 152 0
      src/views/interest/role/role-copy.vue

BIN
dist-zip/build.zip


+ 20 - 7
src/views/interest/role/index.vue

@@ -1,5 +1,5 @@
 <script setup lang="ts">
 <script setup lang="ts">
-import { reactive, ref, onMounted, watch } from "vue";
+import { reactive, ref, onMounted, watch, shallowRef } from "vue";
 import { useColumns } from "./columns";
 import { useColumns } from "./columns";
 import { httpList, httpStatus, httpDetail, httpAdd } from "/@/api/interest/role";
 import { httpList, httpStatus, httpDetail, httpAdd } from "/@/api/interest/role";
 import { type FormInstance } from "element-plus";
 import { type FormInstance } from "element-plus";
@@ -13,8 +13,13 @@ import { responseHandle } from "/@/utils/responseHandle";
 import { useUserStoreHook } from "/@/store/modules/user";
 import { useUserStoreHook } from "/@/store/modules/user";
 import addEdit from "./addEdit.vue";
 import addEdit from "./addEdit.vue";
 import { useCompany } from "/@/hooks/core/useCompany";
 import { useCompany } from "/@/hooks/core/useCompany";
+
+import RoleCopy from "./role-copy.vue"
+
 const { logout } = useNav();
 const { logout } = useNav();
 
 
+const visible = shallowRef(false)
+
 defineOptions({
 defineOptions({
   name: "role"
   name: "role"
 });
 });
@@ -149,6 +154,15 @@ async function setRoles() {
   }
   }
 }
 }
 
 
+function onCopy(){
+  if(!currentCompany.value.companyNo){
+    ElMessage.warning('请选择一家业务公司')
+    return 
+  }
+
+  visible.value = true
+}
+
 onMounted(() => {
 onMounted(() => {
   powers.value = useUserStoreHook().getMenuActions("role");
   powers.value = useUserStoreHook().getMenuActions("role");
   if (powers.value.some(i => i == "001")) {
   if (powers.value.some(i => i == "001")) {
@@ -164,8 +178,6 @@ watch(
 
 
 <template>
 <template>
   <div class="main role">
   <div class="main role">
-    <el-button @click="setRoles">设置角色</el-button>
-
     <div v-show="powers.some(i => i == '001')">
     <div v-show="powers.some(i => i == '001')">
       <el-form ref="formRef" :inline="true" :model="form" size="small" :label-width="0"
       <el-form ref="formRef" :inline="true" :model="form" size="small" :label-width="0"
         class="bg-white w-99/100 pl-8 pt-4">
         class="bg-white w-99/100 pl-8 pt-4">
@@ -190,11 +202,10 @@ watch(
 
 
       <TableProBar title="公司角色管理" :loading="loading" :dataList="dataList" @refresh="onSearch">
       <TableProBar title="公司角色管理" :loading="loading" :dataList="dataList" @refresh="onSearch">
         <template #buttons>
         <template #buttons>
-          <el-button type="primary" size="small" v-if="powers.some(i => i == '002')" :icon="useRenderIcon('add')"
-            @click="editItem('', 'add')">
-            新增角色
-          </el-button>
+          <el-button size="small" @click="onCopy">复制角色</el-button>
+          <el-button type="primary" size="small" v-if="powers.some(i => i == '002')" :icon="useRenderIcon('add')" @click="editItem('', 'add')">新增角色</el-button>
         </template>
         </template>
+
         <template v-slot="{ size, checkList }">
         <template v-slot="{ size, checkList }">
           <PureTable border align="left" showOverflowTooltip table-layout="auto" size="small" :data="dataList"
           <PureTable border align="left" showOverflowTooltip table-layout="auto" size="small" :data="dataList"
             :columns="columns" :checkList="checkList" :pagination="pagination"
             :columns="columns" :checkList="checkList" :pagination="pagination"
@@ -223,6 +234,8 @@ watch(
       <addEdit :itemId="itemId" :isDetails="isDetails" :show-model="showModel" @refresh="submitRefresh"
       <addEdit :itemId="itemId" :isDetails="isDetails" :show-model="showModel" @refresh="submitRefresh"
         @cancel="submitCancel" />
         @cancel="submitCancel" />
     </div>
     </div>
+
+    <RoleCopy v-model:visible="visible" @refresh="onSearch" />
     <NoAuth v-show="!powers.some(i => i == '001')" />
     <NoAuth v-show="!powers.some(i => i == '001')" />
   </div>
   </div>
 </template>
 </template>

+ 152 - 0
src/views/interest/role/role-copy.vue

@@ -0,0 +1,152 @@
+<script lang="ts" setup>
+import { ref, watch, shallowRef } from "vue"
+import { useVModel } from "@vueuse/core"
+import { useCompany } from "/@/hooks/core/useCompany";
+import { BusinessQuery } from "/@/components/BasicForm";
+import { httpList } from "/@/api/interest/role";
+
+import { httpDetail, httpAdd } from "/@/api/interest/role";
+
+import { ElMessage } from "element-plus"
+
+const props = defineProps<{
+  visible: boolean
+}>()
+
+const emit = defineEmits(['refresh'])
+
+
+const visible = useVModel(props, 'visible')
+const formRef = ref<any>(null)
+const { currentCompany } = useCompany();
+
+
+const roles = ref<any[]>([])
+const loading = shallowRef(false)
+
+const initialData = {
+  name: '',
+  companyNo: '',
+  sourceRoleId: '',
+  sourceCompanyNo: ''
+}
+
+const formData = ref({ ...initialData })
+
+
+watch(
+  () => currentCompany.value,
+  () => formData.value.companyNo = currentCompany.value.companyNo
+);
+
+async function requestRoles(companyNo: string) {
+  loading.value = true;
+  const { code, data, message } = await httpList({
+    size: 1000,
+    level: "2",
+    companyNo
+  });
+
+  if (code === 0) {
+    const { list, count } = data;
+    roles.value = list
+  }
+
+  loading.value = false;
+}
+
+watch(() => formData.value.sourceCompanyNo, (value) => {
+  roles.value = []
+  formData.value.sourceRoleId = ""
+  if (!formData.value.sourceCompanyNo) { return }
+  requestRoles(formData.value.sourceCompanyNo)
+}, {
+  immediate: true
+})
+
+const rules = {
+  "name": [{ required: true, message: '请输入角色名称', trigger: 'change' }],
+  "sourceCompanyNo": [{ required: true, message: '请选择来源业务公司', trigger: 'change' }],
+  "sourceRoleId": [{ required: true, message: '请选择来源角色', trigger: 'change' }],
+}
+
+function handleClose() {
+  formData.value = { ...initialData }
+  visible.value = false
+}
+
+async function requestRole() {
+  try {
+    const { sourceCompanyNo, sourceRoleId } = formData.value
+    const { data, code } = await httpDetail({ companyNo: sourceCompanyNo, roleid: sourceRoleId });
+    if (code === 0) {
+      return data
+    } else {
+      throw new Error('读取角色失败..')
+    }
+  } catch (err) {
+    throw new Error('读取角色失败..')
+  }
+}
+
+async function createRole(params = {}) {
+  try {
+    const { data, code } = await httpAdd(params);
+    if (code !== 0) { throw new Error('创建角色失败..') }
+  } catch (err) {
+    throw new Error('创建角色失败..')
+  }
+}
+
+async function onSubmit() {
+  try {
+    loading.value = true
+    await formRef.value.validate();
+    const { sourceCompanyNo, sourceRoleId, companyNo, name } = formData.value
+    ElMessage.info('正在读取来源角色信息(1/3)...')
+    const detail = await requestRole()
+    ElMessage.info('读取角色信息成功,正在创建角色(2/3)...')
+    const { action, private_data, role_name } = detail;
+    const params = {
+      companyNo,
+      level: 2,
+      role_name:name,
+      action: Array.isArray(action) ? action : action.split(','),
+      private_data:( Array.isArray(private_data) ? private_data : private_data.split(',')).filter(item => !!item)
+    };
+    await createRole(params)
+    loading.value = false
+    ElMessage.success('角色复制成功(3/3)...')
+    emit('refresh')
+    visible.value = false
+  } catch (err) {
+    ElMessage.warning(err)
+    loading.value = false
+  }
+}
+</script>
+
+<template>
+  <ElDialog title="复制角色" center v-model="visible" @close="handleClose">
+    <ElForm :model="formData" :rules="rules" ref="formRef" v-loading="loading">
+      <ElFormItem prop="name" label="角色名称">
+        <ElInput v-model="formData.name" placeholder="角色名称" />
+      </ElFormItem>
+
+      <ElFormItem prop="sourceCompanyNo" label="来源公司">
+        <BusinessQuery v-model="formData.sourceCompanyNo" placeholder="来源公司" />
+      </ElFormItem>
+
+      <ElFormItem prop="sourceRoleId" label="来源角色">
+        <ElSelect v-model="formData.sourceRoleId" style="width:100%" placeholder="来源角色"
+          :disabled="!formData.sourceCompanyNo">
+          <ElOption v-for="role in roles" :key="role.id" :value="role.id" :label="role.role_name" />
+        </ElSelect>
+      </ElFormItem>
+
+      <div class="w-full flex justify-end">
+        <ElButton type="primary" @click="onSubmit">保存</ElButton>
+      </div>
+    </ElForm>
+  </ElDialog>
+</template>