ezhizao_zx 1 năm trước cách đây
mục cha
commit
bdb033c43a

+ 133 - 0
src/api/system/inItRole.js

@@ -0,0 +1,133 @@
+import request from '@/utils/request'
+
+// request.defaults.baseURL = '/ezhizao-yzbh-sys'
+// 查询角色列表
+export function listRole(query) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询角色详细
+export function getRole(roleId) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增角色
+export function addRole(data) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改角色
+export function updateRole(data) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole',
+    method: 'put',
+    data: data
+  })
+}
+
+// 角色数据权限
+export function dataScope(data) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole/dataScope',
+    method: 'put',
+    data: data
+  })
+}
+
+// 角色状态修改
+export function changeRoleStatus(roleId, status) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  const data = {
+    roleId,
+    status
+  }
+  return request({
+    url: '/system/inItRole/changeStatus',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除角色
+export function delRole(roleId) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole/' + roleId,
+    method: 'delete'
+  })
+}
+
+// 查询角色已授权用户列表
+export function allocatedUserList(query) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole/authUser/allocatedList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询角色未授权用户列表
+export function unallocatedUserList(query) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole/authUser/unallocatedList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 取消用户授权角色
+export function authUserCancel(data) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole/authUser/cancel',
+    method: 'put',
+    data: data
+  })
+}
+
+// 批量取消用户授权角色
+export function authUserCancelAll(data) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole/authUser/cancelAll',
+    method: 'put',
+    params: data
+  })
+}
+
+// 授权用户选择
+export function authUserSelectAll(data) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole/authUser/selectAll',
+    method: 'put',
+    params: data
+  })
+}
+
+// 根据角色ID查询部门树结构
+export function deptTreeSelect(roleId) {
+  request.defaults.baseURL = '/ezhizao-yzbh-sys'
+  return request({
+    url: '/system/inItRole/deptTree/' + roleId,
+    method: 'get'
+  })
+}

+ 2 - 2
src/store/modules/tagsView.js

@@ -144,7 +144,7 @@ const useTagsViewStore = defineStore(
             if (i > -1) {
               this.cachedViews.splice(i, 1)
             }
-            if(item.meta.link) {
+            if (item.meta.link) {
               const fi = this.iframeViews.findIndex(v => v.path === item.path)
               this.iframeViews.splice(fi, 1)
             }
@@ -167,7 +167,7 @@ const useTagsViewStore = defineStore(
             if (i > -1) {
               this.cachedViews.splice(i, 1)
             }
-            if(item.meta.link) {
+            if (item.meta.link) {
               const fi = this.iframeViews.findIndex(v => v.path === item.path)
               this.iframeViews.splice(fi, 1)
             }

+ 1 - 1
src/views/business/crm/company/index.vue

@@ -129,7 +129,7 @@
   </div>
 </template>
 
-<script setup name="Company">
+<script setup name="Crm">
 import exportColumn from "./ExportColumn";
 import companyForm from "./form";
 import { listUser } from "@/api/system/user";

+ 19 - 0
src/views/business/crm/order/form.vue

@@ -1429,6 +1429,25 @@ function sourceValidator(rule, value, callback) {
 
 /** 提交按钮 */
 function submitForm() {
+  const query = { userId: form.value.signerId };
+  const users = [];
+  listUser(query).then((res) => {
+    console.log(res);
+    users.value = res.rows;
+    if (users.value.length == 1) {
+      if (
+        form.value.signerId == users.value[0].userId &&
+        form.value.signerName == users.value[0].nickName
+      ) {
+        console.log("正确");
+      } else {
+        proxy.$modal.msgError("请选择有效签单人");
+      }
+    } else {
+      proxy.$modal.msgError("请选择有效签单人");
+    }
+  });
+
   proxy.$refs["orderRef"].validate((valid) => {
     if (valid && detailValid() && amountValid()) {
       const formValue = form.value;

+ 1 - 1
src/views/business/crm/order/index.vue

@@ -180,7 +180,7 @@
   </div>
 </template>
 
-<script setup name="Company">
+<script setup name="Order">
 import { dissolutionOrder } from "../../../../api/business/crm/contract";
 import contractForm from "./form";
 import { listOrder, delOrder, exportOrder } from "@/api/business/crm/contract";

+ 9 - 8
src/views/business/crm/workorder/index.vue

@@ -221,17 +221,18 @@
         label="结束月"
         align="center"
         min-width="90"
-        prop="endMonth"
         :resizable="false"
       >
         <template #default="scope">
-          {{
-            scope.row.type === 1
-              ? scope.row.endMonth
-                ? moment(scope.row.endMonth).format("YYYY年MM月")
-                : ""
-              : "-"
-          }}
+          <div v-if="scope.row.monthNum > 0">
+            {{
+              scope.row.type === 1
+                ? scope.row.endMonth
+                  ? moment(scope.row.endMonth).format("YYYY年MM月")
+                  : ""
+                : "-"
+            }}
+          </div>
         </template>
       </el-table-column>
       <el-table-column

+ 44 - 1
src/views/business/financial/collection/index.vue

@@ -52,10 +52,14 @@
     </el-form>
 
     <!-- 列表区 -->
+    <!-- 
+      :summary-method="getSummaries" -->
     <el-table
       v-loading="loading"
       :data="orderList"
       size="small"
+      show-summary
+      :summary-method="getSummaries"
       border
       height="100%"
       @selection-change="handleSelectionChange"
@@ -96,7 +100,11 @@
         prop="amount"
         header-align="center"
         align="right"
-      />
+      >
+        <template #default="scope">
+          <span>{{ scope.row.amount.toFixed(2) }}</span>
+        </template>
+      </el-table-column>
       <el-table-column
         v-if="getShowStatus(9)"
         label="申请人"
@@ -263,6 +271,41 @@ function getList() {
   });
 }
 
+function getSummaries(param) {
+  // console.log("计算", param);
+  const { columns, data } = param;
+  const sums = [];
+  columns.forEach((column, index) => {
+    if (column.label != "收款金额") {
+      return;
+    }
+
+    const values = [];
+
+    data.map((item) => {
+      if (item.arriveStatus == 1) {
+        console.log(item);
+        if (item.paymentAmount) {
+          values.push(item.paymentAmount);
+        }
+      }
+    });
+
+    if (!values.every((value) => Number.isNaN(value))) {
+      sums[index] = ` ${values.reduce((prev, curr) => {
+        const value = Number(curr);
+        if (!Number.isNaN(value)) {
+          return Number(Number(prev) + value).toFixed(2);
+        } else {
+          return Number(prev).toFixed(2);
+        }
+      }, 0)}`;
+    }
+  });
+
+  return sums;
+}
+
 /** 搜索按钮操作 */
 function handleQuery() {
   queryParams.value.pageNum = 1;

+ 208 - 65
src/views/business/service/loop/index.vue

@@ -10,49 +10,119 @@
         </el-button>
         <template #dropdown>
           <el-dropdown-menu>
-            <el-dropdown-item icon="Download" @click="handleExport"
-              v-hasPermi="['business:customer:service:loop:export']">
-              导出</el-dropdown-item>
-            <el-dropdown-item icon="Operation" @click="setServiceHandler"
-              v-hasPermi="['business:customer:service:loop:transactor']">
-              设置执行人</el-dropdown-item>
+            <el-dropdown-item
+              icon="Download"
+              @click="handleExport"
+              v-hasPermi="['business:customer:service:loop:export']"
+            >
+              导出</el-dropdown-item
+            >
+            <el-dropdown-item
+              icon="Operation"
+              @click="setServiceHandler"
+              v-hasPermi="['business:customer:service:loop:transactor']"
+            >
+              设置执行人</el-dropdown-item
+            >
           </el-dropdown-menu>
         </template>
       </el-dropdown>
     </div>
     <!-- 搜索区 -->
-    <el-form class="list-search-container" size="small" :model="queryParams" ref="queryRef" :inline="true"
-      label-width="68px">
+    <el-form
+      class="list-search-container"
+      size="small"
+      :model="queryParams"
+      ref="queryRef"
+      :inline="true"
+      label-width="68px"
+    >
       <el-form-item label="客户名称:" prop="companyName">
-        <el-input style="width: 150px" v-model="queryParams.companyName" placeholder="请输入客户名称" clearable
-          @keyup.enter="handleQuery" />
+        <el-input
+          style="width: 150px"
+          v-model="queryParams.companyName"
+          placeholder="请输入客户名称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
       </el-form-item>
       <el-form-item label="月份:" prop="month">
-        <el-select v-model.trim="queryParams.month" size="small" placeholder="月份" :clearable="true" style="width: 130px"
-          @change="handleQuery">
-          <el-option v-for="item in selectMonths" :key="item.value" :label="item.label" :value="item.value" />
+        <el-select
+          v-model.trim="queryParams.month"
+          size="small"
+          placeholder="月份"
+          :clearable="true"
+          style="width: 130px"
+          @change="handleQuery"
+        >
+          <el-option
+            v-for="item in selectMonths"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="状态:" prop="status">
-        <el-select v-model.trim="queryParams.status" size="small" type="text" placeholder="状态" :clearable="true"
-          style="width: 130px" @clear="clearStatus">
-          <el-option v-for="item in selectStatus" :key="item.value" :label="item.label" :value="item.value" />
+        <el-select
+          v-model.trim="queryParams.status"
+          size="small"
+          type="text"
+          placeholder="状态"
+          :clearable="true"
+          style="width: 130px"
+          @clear="clearStatus"
+        >
+          <el-option
+            v-for="item in selectStatus"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="Search" @click="handleQuery"
+          >搜索</el-button
+        >
         <el-button icon="Refresh" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
 
     <!-- 列表区 -->
-    <el-table v-loading="loading" :data="serviceList" size="small" border height="100%"
-      @selection-change="handleSelectionChange">
+    <el-table
+      v-loading="loading"
+      :data="serviceList"
+      size="small"
+      border
+      height="100%"
+      @selection-change="handleSelectionChange"
+    >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="客户名称" align="center" min-width="250" prop="companyName" />
-      <el-table-column label="纳税性质" min-width="100" align="center" prop="taxType" />
-      <el-table-column label="税号" align="center" prop="socialCreditCode" min-width="180" />
-      <el-table-column label="项目" align="center" prop="taskTypeName" min-width="90">
+      <el-table-column
+        label="客户名称"
+        align="center"
+        min-width="250"
+        prop="companyName"
+      />
+      <el-table-column
+        label="纳税性质"
+        min-width="100"
+        align="center"
+        prop="taxType"
+      />
+      <el-table-column
+        label="税号"
+        align="center"
+        prop="socialCreditCode"
+        min-width="180"
+      />
+      <el-table-column
+        label="项目"
+        align="center"
+        prop="taskTypeName"
+        min-width="90"
+      >
         <template #default="scope">
           {{ scope.row.taskTypeName }}
         </template>
@@ -64,51 +134,82 @@
 
           {{
             scope.row.taskTypeId === "1"
-            ? moment().subtract(1, "month").format("YYYY年MM月")
-            : moment().format("YYYY年MM月")
+              ? moment().subtract(1, "month").format("YYYY年MM月")
+              : moment().format("YYYY年MM月")
           }}
         </template>
       </el-table-column>
       <el-table-column align="center">
         <template #header>
-          <div style="
+          <div
+            style="
               display: flex;
               flex-direction: row;
               justify-content: space-between;
-            ">
+            "
+          >
             <div style="display: flex; flex-direction: row">
-              <el-button link type="primary" size="small" icon="ArrowLeft" @click="prevYear" />
+              <el-button
+                link
+                type="primary"
+                size="small"
+                icon="ArrowLeft"
+                @click="prevYear"
+              />
               <el-link style="margin: 0 40px" :underline="false">{{
                 queryParams.year
               }}</el-link>
-              <el-button link type="primary" icon="ArrowRight" size="small" @click="nextYear" />
+              <el-button
+                link
+                type="primary"
+                icon="ArrowRight"
+                size="small"
+                @click="nextYear"
+              />
             </div>
             <div style="display: flex; flex-direction: row; margin-right: 20px">
-              <div v-for="item in selectStatus" :key="item.value"
-                style="display: flex; flex-direction: row; margin-right: 10px">
-                <div :style="{
-                  backgroundColor: item.color,
-                  width: '14px',
-                  height: '14px',
-                  margin: 'auto',
-                  borderRadius: '50%',
-                  border: item.color === '#fff' ? '1px solid #ddd' : 'none',
-                }" />
-                <div style="
+              <div
+                v-for="item in selectStatus"
+                :key="item.value"
+                style="display: flex; flex-direction: row; margin-right: 10px"
+              >
+                <div
+                  :style="{
+                    backgroundColor: item.color,
+                    width: '14px',
+                    height: '14px',
+                    margin: 'auto',
+                    borderRadius: '50%',
+                    border: item.color === '#fff' ? '1px solid #ddd' : 'none',
+                  }"
+                />
+                <div
+                  style="
                     display: inline-block;
                     margin-left: 10px;
                     line-height: 36px;
-                  ">
+                  "
+                >
                   {{ item.label }}
                 </div>
               </div>
             </div>
           </div>
         </template>
-        <el-table-column v-for="item in selectMonths" :key="item.value" min-width="50" :label="item.label" align="center">
+        <el-table-column
+          v-for="item in selectMonths"
+          :key="item.value"
+          min-width="50"
+          :label="item.label"
+          align="center"
+        >
           <template #default="scope">
-            <el-button size="small" :style="monthStatusStyle(scope.row, item.value)" circle
-              @click="handleByRow(scope.row, item.value)" />
+            <el-button
+              size="small"
+              :style="monthStatusStyle(scope.row, item.value)"
+              circle
+              @click="handleByRow(scope.row, item.value)"
+            />
           </template>
         </el-table-column>
       </el-table-column>
@@ -119,20 +220,33 @@
     <!-- </div>
     </div> -->
     <!-- <workorder-form ref="workOrderRef" :get-list="getList" /> -->
-    <el-dialog title="新增工单" v-model="formOpen" width="500px" append-to-body draggable>
+    <el-dialog
+      title="新增工单"
+      v-model="formOpen"
+      width="500px"
+      append-to-body
+      draggable
+    >
       <el-form ref="dictRef" :model="form" label-width="100">
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="客户名称" prop="companyName">
-              <el-autocomplete :fetch-suggestions="querySearchCompanyAsync" :trigger-on-focus="true"
-                v-model="form.companyName" placeholder="请输入客户名称" popper-class="my-autocomplete"
-                @select="handleSelectCompany">
+              <el-autocomplete
+                :fetch-suggestions="querySearchCompanyAsync"
+                :trigger-on-focus="true"
+                v-model="form.companyName"
+                placeholder="请输入客户名称"
+                popper-class="my-autocomplete"
+                @select="handleSelectCompany"
+              >
                 <template #default="{ item }">
-                  <div style="
+                  <div
+                    style="
                       display: flex;
                       flex-direction: row;
                       justify-content: space-between;
-                    ">
+                    "
+                  >
                     <div class="name" style="font-size: 12px">
                       {{ item.name }}
                     </div>
@@ -144,8 +258,14 @@
           </el-col>
           <el-col :span="24">
             <el-form-item label="备注:">
-              <el-input v-model.trim="form.remark" type="textarea" width="100%" size="small" placeholder="备注"
-                :clearable="true" />
+              <el-input
+                v-model.trim="form.remark"
+                type="textarea"
+                width="100%"
+                size="small"
+                placeholder="备注"
+                :clearable="true"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -158,8 +278,13 @@
       </template>
     </el-dialog>
     <!-- 分页 -->
-    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
-      @pagination="getList" />
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
     <service-form ref="serviceRef" :get-list="getList" />
     <housing-fund-form ref="housingFundFormRef" :get-list="getList" />
     <housing-fund-view ref="housingFundViewRef" :get-list="getList" />
@@ -380,11 +505,11 @@ function querySearchCompanyAsync(queryString, cb) {
   const query =
     queryString.length > 0
       ? {
-        keyword: queryString,
-        pageSize: 20,
-        pageNum: 1,
-        orderByColumn: "create_time",
-      }
+          keyword: queryString,
+          pageSize: 20,
+          pageNum: 1,
+          orderByColumn: "create_time",
+        }
       : { pageSize: 20, pageNum: 1, orderByColumn: "create_time" };
   listCompany(query).then((res) => {
     cb(res.rows);
@@ -460,13 +585,27 @@ function getTransactor(row) {
 }
 
 function handleByRow(row, item) {
+  console.log(row);
   const record = row.records.find(
     (v) =>
       v.fromId === "0" && v.year === queryParams.value.year && v.month === item
   );
-  const editable = permissions.includes(all_permission) || permissions.includes("business:customer:service:loop:edit") >= 0
-  const viewable = permissions.includes(all_permission) || permissions.includes("business:customer:service:loop:view") >= 0
-  if (record != null && record.status === 3 && (editable || viewable)) {
+  const editable =
+    permissions.includes(all_permission) ||
+    permissions.includes("business:customer:service:loop:edit") >= 0;
+  const viewable =
+    permissions.includes(all_permission) ||
+    permissions.includes("business:customer:service:loop:view") >= 0;
+  if (record == null && row.isStop == 1) {
+    proxy.$modal.msg("工单已终止");
+    return;
+  }
+  if (
+    record != null &&
+    record.status === 3 &&
+    (editable || viewable) &&
+    row.isStop == 1
+  ) {
     if (row.taskTypeId === "1") {
       keepAccountViewRef.value.open({
         workOrderId: row.id,
@@ -493,7 +632,11 @@ function handleByRow(row, item) {
       });
     } else if (row.taskTypeId === "4") {
     }
-  } else if (row.entrusts != null && row.entrusts.length > 0 && (editable || viewable)) {
+  } else if (
+    row.entrusts != null &&
+    row.entrusts.length > 0 &&
+    (editable || viewable)
+  ) {
     if (
       row.entrusts.findIndex(
         (v) =>
@@ -555,7 +698,7 @@ function handleByRow(row, item) {
       } else if (row.taskTypeId === "4") {
       }
     } else {
-      proxy.$modal.msg('没有编辑权限')
+      proxy.$modal.msg("没有编辑权限");
     }
   } else if (editable) {
     if (row.taskTypeId === "1") {
@@ -585,7 +728,7 @@ function handleByRow(row, item) {
     } else if (row.taskTypeId === "4") {
     }
   } else {
-    proxy.$modal.msg('没有编辑权限')
+    proxy.$modal.msg("没有编辑权限");
   }
 }
 

+ 12 - 2
src/views/business/service/once/index.vue

@@ -435,8 +435,18 @@ function handleByRow(row) {
   const viewable =
     permissions.includes(all_permission) ||
     permissions.includes("business:customer:service:loop:view") >= 0;
-  // console.log(record);
-  if (record != null && record.status === 3 && (editable || viewable)) {
+
+  if (record == null && row.isStop == 1) {
+    proxy.$modal.msg("工单已终止");
+    return;
+  }
+
+  if (
+    record != null &&
+    record.status === 3 &&
+    (editable || viewable) &&
+    row.isStop == 1
+  ) {
     viewRef.value.open({
       workOrderId: row.id,
       companyId: row.companyId,

+ 157 - 50
src/views/business/setting/account/index.vue

@@ -2,95 +2,208 @@
   <div class="page-container list-container">
     <!-- 功能按钮区 -->
     <div class="list-btns-container">
-      <el-button type="primary" size="small" icon="Plus" @click="handleAdd"
-        v-hasPermi="['business:account:add']">新增</el-button>
-      <el-button type="danger" size="small" icon="Delete" :disabled="multiple" @click="handleDelete"
-        v-hasPermi="['business:account:remove']">删除</el-button>
+      <el-button
+        type="primary"
+        size="small"
+        icon="Plus"
+        @click="handleAdd"
+        v-hasPermi="['business:account:add']"
+        >新增</el-button
+      >
+      <el-button
+        type="danger"
+        size="small"
+        icon="Delete"
+        :disabled="multiple"
+        @click="handleDelete"
+        v-hasPermi="['business:account:remove']"
+        >删除</el-button
+      >
       <el-dropdown>
         <el-button type="primary" size="small">
           其它<el-icon class="el-icon--right"><arrow-down /></el-icon>
         </el-button>
         <template #dropdown>
           <el-dropdown-menu>
-            <el-dropdown-item icon="Download" @click="handleExport" v-hasPermi="['business:account:export']">
-              导出</el-dropdown-item>
+            <el-dropdown-item
+              icon="Download"
+              @click="handleExport"
+              v-hasPermi="['business:account:export']"
+            >
+              导出</el-dropdown-item
+            >
           </el-dropdown-menu>
         </template>
       </el-dropdown>
     </div>
     <!-- 搜索区 -->
-    <el-form class="list-search-container" size="small" :model="queryParams" ref="queryRef" :inline="true"
-      label-width="68px">
+    <el-form
+      class="list-search-container"
+      size="small"
+      :model="queryParams"
+      ref="queryRef"
+      :inline="true"
+      label-width="68px"
+    >
       <el-form-item label="账户名称:" prop="name">
-        <el-input v-model="queryParams.name" placeholder="请输入账户名称" style="width: 150px" clearable
-          @keyup.enter="handleQuery" />
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入账户名称"
+          style="width: 150px"
+          clearable
+          @keyup.enter="handleQuery"
+        />
       </el-form-item>
       <el-form-item label="账号:" prop="accountNum">
-        <el-input v-model="queryParams.accountNum" placeholder="请输入账号" style="width: 150px" clearable
-          @keyup.enter="handleQuery" />
+        <el-input
+          v-model="queryParams.accountNum"
+          placeholder="请输入账号"
+          style="width: 150px"
+          clearable
+          @keyup.enter="handleQuery"
+        />
       </el-form-item>
       <el-form-item label="开户行:" prop="accountOpen">
-        <el-input v-model="queryParams.accountOpen" placeholder="请输入开户行" style="width: 150px" clearable
-          @keyup.enter="handleQuery" />
+        <el-input
+          v-model="queryParams.accountOpen"
+          placeholder="请输入开户行"
+          style="width: 150px"
+          clearable
+          @keyup.enter="handleQuery"
+        />
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="Search" @click="handleQuery"
+          >搜索</el-button
+        >
         <el-button icon="Refresh" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
 
     <!-- 列表区 -->
-    <el-table v-loading="loading" :data="accountList" size="small" border height="100%"
-      @selection-change="handleSelectionChange">
+    <el-table
+      v-loading="loading"
+      :data="accountList"
+      size="small"
+      border
+      height="100%"
+      @selection-change="handleSelectionChange"
+    >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="账户名称" align="center" prop="name">
         <template #default="scope">
-          <el-input v-if="scope.row.isAdd || scope.row.isEdit" v-model="scope.row.name" size="small"
-            placeholder="请输入内容"></el-input>
+          <el-input
+            v-if="scope.row.isAdd || scope.row.isEdit"
+            v-model="scope.row.name"
+            size="small"
+            placeholder="请输入内容"
+          ></el-input>
           <span v-else>{{ scope.row.name }}</span>
         </template>
       </el-table-column>
       <el-table-column label="账号" align="center" prop="accountNum">
         <template #default="scope">
-          <el-input v-if="scope.row.isAdd || scope.row.isEdit" size="small" v-model="scope.row.accountNum"
-            placeholder="请输入内容"></el-input>
+          <el-input
+            v-if="scope.row.isAdd || scope.row.isEdit"
+            size="small"
+            v-model="scope.row.accountNum"
+            placeholder="请输入内容"
+          ></el-input>
           <span v-else>{{ scope.row.accountNum }}</span>
         </template>
       </el-table-column>
       <el-table-column label="开户行" align="center" prop="accountOpen">
         <template #default="scope">
-          <el-input v-if="scope.row.isAdd || scope.row.isEdit" size="small" v-model="scope.row.accountOpen"
-            placeholder="请输入内容"></el-input>
+          <el-input
+            v-if="scope.row.isAdd || scope.row.isEdit"
+            size="small"
+            v-model="scope.row.accountOpen"
+            placeholder="请输入内容"
+          ></el-input>
           <span v-else>{{ scope.row.accountOpen }}</span>
         </template>
       </el-table-column>
 
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
         <template #default="scope">
-          <el-button v-show="!scope.row.isAdd &&
-            !scope.row.isEdit &&
-            scope.row.referrerDataSource == isReferrerDataSource
-            " link type="warning" size="small" @click="handleUpdate(scope.row)"
-            v-hasPermi="['business:account:edit']">修改</el-button>
-          <el-button v-show="!scope.row.isAdd &&
-            !scope.row.isEdit &&
-            scope.row.referrerDataSource == isReferrerDataSource
-            " link type="danger" size="small" @click="handleDelete(scope.row)"
-            v-hasPermi="['business:account:remove']">删除</el-button>
-          <el-button v-show="scope.row.isAdd ||
-            (scope.row.isEdit &&
-              scope.row.referrerDataSource == isReferrerDataSource)
-            " link type="primary" size="small" v-hasPermi="['business:account:edit', 'business:account:add']"
-            @click="handleSave(scope.row)">保存</el-button>
-          <el-button v-if="scope.row.isEdit || scope.row.isAdd" link size="small"
-            @click="handCancel(scope.row)">取消</el-button>
+          <template
+            v-if="
+              !scope.row.isAdd &&
+              !scope.row.isEdit &&
+              scope.row.referrerDataSource == isReferrerDataSource
+            "
+          >
+            <el-button
+              v-show="
+                !scope.row.isAdd &&
+                !scope.row.isEdit &&
+                scope.row.referrerDataSource == isReferrerDataSource
+              "
+              link
+              type="warning"
+              size="small"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['business:account:edit']"
+              >修改</el-button
+            >
+            <el-button
+              v-show="
+                !scope.row.isAdd &&
+                !scope.row.isEdit &&
+                scope.row.referrerDataSource == isReferrerDataSource
+              "
+              link
+              type="danger"
+              size="small"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['business:account:remove']"
+              >删除</el-button
+            >
+          </template>
+          <template
+            v-if="
+              scope.row.isAdd ||
+              (scope.row.isEdit &&
+                scope.row.referrerDataSource == isReferrerDataSource)
+            "
+          >
+            <el-button
+              v-show="
+                scope.row.isAdd ||
+                (scope.row.isEdit &&
+                  scope.row.referrerDataSource == isReferrerDataSource)
+              "
+              link
+              type="primary"
+              size="small"
+              v-hasPermi="['business:account:edit', 'business:account:add']"
+              @click="handleSave(scope.row)"
+              >保存</el-button
+            >
+            <el-button
+              v-show="scope.row.isEdit || scope.row.isAdd"
+              link
+              size="small"
+              @click="handCancel(scope.row)"
+              >取消</el-button
+            >
+          </template>
         </template>
       </el-table-column>
     </el-table>
 
     <!-- 分页 -->
-    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
-      @pagination="getList" />
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
 
     <!-- 表单 -->
     <account-form ref="accountRef" :get-list="getList"></account-form>
@@ -171,12 +284,6 @@ function handleSave(row) {
     proxy.$modal.msgError("账号不能为空!");
     return;
   }
-
-  if (row.accountOpen == null || row.accountOpen == "") {
-    proxy.$modal.msgError("开户行不能为空!");
-    return;
-  }
-
   if (row.isAdd) {
     addAccount(row).then((response) => {
       proxy.$modal.msgSuccess("添加成功");
@@ -237,7 +344,7 @@ function handleDelete(row) {
       getList();
       proxy.$modal.msgSuccess("删除成功!");
     })
-    .catch(() => { });
+    .catch(() => {});
 }
 
 /** 导出按钮操作 */

+ 274 - 182
src/views/business/tenant/init.vue

@@ -4,12 +4,21 @@
     <el-drawer :title="title" v-model="visible" direction="rtl" size="100%">
       <div class="page-container form-container">
         <div class="form-btns-container">
-          <span class="title-label"><el-icon>
+          <span class="title-label"
+            ><el-icon>
               <Document />
-            </el-icon> {{ tenant.accountName }} 企业初始化</span>
+            </el-icon>
+            {{ tenant.accountName }} 企业初始化</span
+          >
           <el-button-group>
-            <el-button v-hasPermi="['business:tenant:edit']" type="primary" size="small" icon="Finished"
-              @click="initHandler">开始初始化</el-button>
+            <el-button
+              v-hasPermi="['business:tenant:edit']"
+              type="primary"
+              size="small"
+              icon="Finished"
+              @click="initHandler"
+              >开始初始化</el-button
+            >
           </el-button-group>
           <div class="screen-btn" @click="handleScreen">
             <template v-if="!isFullscreen">
@@ -26,12 +35,21 @@
             <!-- <span>关闭</span> -->
           </div>
         </div>
-        <div class="Y-scrollbar" style="position: absolute top: 32px bottom: 0 width: 100% overflow: auto">
-        </div>
-        <el-form ref="tenantRef" class="master-container" size="size" :model="form" :rules="rules" label-width="140px">
+        <div
+          class="Y-scrollbar"
+          style="position: absolute top: 32px bottom: 0 width: 100% overflow: auto"
+        ></div>
+        <el-form
+          ref="tenantRef"
+          class="master-container"
+          size="size"
+          :model="form"
+          :rules="rules"
+          label-width="140px"
+        >
           <el-row :gutter="10">
             <el-col :span="24">
-              <el-card class="card" style="margin-bottom:10px">
+              <el-card class="card" style="margin-bottom: 10px">
                 <template #header><span>初始化流程</span></template>
                 <el-row :gutter="10">
                   <el-col :span="24">
@@ -46,32 +64,60 @@
                       </el-collapse-item> -->
                       <el-collapse-item name="1">
                         <template #title>
-                          <el-checkbox v-model="initAdminRole" />初始化管理员角色 <span
-                            :style="{ color: checkAdminRole ? 'green' : 'red', paddingLeft: '10px' }">{{ checkAdminRole ?
-                              '已初始化管理员角色' :
-                              '未初始化管理员角色' }}</span>
+                          <el-checkbox
+                            v-model="initAdminRole"
+                          />初始化管理员角色
+                          <span
+                            :style="{
+                              color: checkAdminRole ? 'green' : 'red',
+                              paddingLeft: '10px',
+                            }"
+                            >{{
+                              checkAdminRole
+                                ? "已初始化管理员角色"
+                                : "未初始化管理员角色"
+                            }}</span
+                          >
                         </template>
                       </el-collapse-item>
                       <el-collapse-item name="2">
                         <template #title>
                           <el-checkbox v-model="initAdminSysUser" />
                           初始化管理员
-                          <span :style="{ color: checkAdminRole ? 'green' : 'red', paddingLeft: '10px' }">{{ checkAdmin ?
-                            '已初始化管理员' : '未初始化管理员'
-                          }}
+                          <span
+                            :style="{
+                              color: checkAdmin ? 'green' : 'red',
+                              paddingLeft: '10px',
+                            }"
+                            >{{
+                              checkAdmin ? "已初始化管理员" : "未初始化管理员"
+                            }}
                           </span>
                         </template>
                         <template #default>
                           <el-form-item label="管理员账号">
-                            <el-input v-model="admin.userName" placeholder="请输入账号" />
+                            <el-input
+                              v-model="admin.userName"
+                              placeholder="请输入账号"
+                            />
                           </el-form-item>
                           <el-form-item label="管理员昵称">
-                            <el-input v-model="admin.nickName" placeholder="请输入" />
+                            <el-input
+                              v-model="admin.nickName"
+                              placeholder="请输入"
+                            />
                           </el-form-item>
                           <el-form-item label="性别">
-                            <el-select v-model="admin.gender" placeholder="请选择">
-                              <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label"
-                                :value="dict.value"></el-option>
+                            <el-select
+                              v-model="admin.gender"
+                              placeholder="请选择"
+                            >
+                              <el-option
+                                v-for="dict in sys_user_sex"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="dict.value"
+                              ></el-option>
                             </el-select>
                           </el-form-item>
                         </template>
@@ -80,32 +126,62 @@
                         <template #title>
                           <el-checkbox v-model="initDept" />
                           初始化默认部门
-                          <span :style="{ color: checkDept ? 'green' : 'red', paddingLeft: '10px' }">{{ checkDept ?
-                            '已初始化默认部门' : '未初始化默认部门'
-                          }}
+                          <span
+                            :style="{
+                              color: checkDept ? 'green' : 'red',
+                              paddingLeft: '10px',
+                            }"
+                            >{{
+                              checkDept
+                                ? "已初始化默认部门"
+                                : "未初始化默认部门"
+                            }}
                           </span>
                         </template>
                         <template #default>
                           <el-form-item label="部门名称">
-                            <el-input v-model="dept.deptName" placeholder="请输入账号" />
+                            <el-input
+                              v-model="dept.deptName"
+                              placeholder="请输入账号"
+                            />
                           </el-form-item>
                         </template>
                       </el-collapse-item>
                       <el-collapse-item name="4">
                         <template #title>
-                          <el-checkbox v-model="roleInit" />初始化默认角色 <span
-                            :style="{ color: checkRole ? 'green' : 'red', paddingLeft: '10px' }">{{ checkRole ? '已初始化默认角色'
-                              : '未初始化默认角色'
-                            }}</span>
+                          <el-checkbox v-model="roleInit" />初始化默认角色
+                          <span
+                            :style="{
+                              color: checkRole ? 'green' : 'red',
+                              paddingLeft: '10px',
+                            }"
+                            >{{
+                              checkRole
+                                ? "已初始化默认角色"
+                                : "未初始化默认角色"
+                            }}</span
+                          >
                         </template>
                         <template #default>
                           <el-row>
                             <el-col :span="8">
-                              <el-table ref="roleRef" :data="roleList" border fit highlight-current-row
-                                @row-click="rowClick" @selection-change="roleSelectionChange" size="small">
+                              <el-table
+                                ref="roleRef"
+                                :data="roleList"
+                                border
+                                fit
+                                highlight-current-row
+                                @row-click="rowClick"
+                                @selection-change="roleSelectionChange"
+                                size="small"
+                              >
                                 <el-table-column type="selection" width="55" />
                                 <el-table-column type="index" width="50" />
-                                <el-table-column label="角色名称" align="center" prop="roleName" />
+                                <el-table-column
+                                  label="角色名称"
+                                  align="center"
+                                  prop="roleName"
+                                />
                               </el-table>
                             </el-col>
                           </el-row>
@@ -115,12 +191,19 @@
                         <template #title>
                           <el-checkbox v-model="sourceInit" />
                           初始化其他默认数据
-                          <span :style="{ color: checkSource ? 'green' : 'red', paddingLeft: '10px' }">{{ checkSource ?
-                            '已初始化其他默认数据' : '未初始化其他默认数据'
-                          }}</span>
-                        </template>
-                        <template #default>
+                          <span
+                            :style="{
+                              color: checkSource ? 'green' : 'red',
+                              paddingLeft: '10px',
+                            }"
+                            >{{
+                              checkSource
+                                ? "已初始化其他默认数据"
+                                : "未初始化其他默认数据"
+                            }}</span
+                          >
                         </template>
+                        <template #default> </template>
                       </el-collapse-item>
                     </el-collapse>
                   </el-col>
@@ -134,230 +217,239 @@
   </div>
 </template>
 <script setup>
-import { checkTenantInit, initTenant } from "@/api/business/tenant"
+import { checkTenantInit, initTenant } from "@/api/business/tenant";
 import { ref } from "vue";
-const { proxy } = getCurrentInstance()
-const { sys_user_sex } = proxy.useDict('sys_user_sex')
+const { proxy } = getCurrentInstance();
+const { sys_user_sex } = proxy.useDict("sys_user_sex");
 /** 父组件传参 */
 const props = defineProps({
   getList: {
     type: Function,
-    default: () => { }
-  }
-})
-const { getList } = toRefs(props)
+    default: () => {},
+  },
+});
+const { getList } = toRefs(props);
 /** 字典数组区 */
 /** 表单抽屉 页变量 */
-const title = ref("")
-const loading = ref(false)
-const multiple = ref(true)
-const visible = ref(false)
-const editStatus = ref(false)
-const isFullscreen = ref(false)
-const checkAdminRole = ref(false)
-const checkAdmin = ref(false)
-const checkRole = ref(false)
-const initAdminRole = ref(false)
-const initAdminSysUser = ref(false)
-const initDept = ref(false)
-const userInit = ref(false)
-const sourceInit = ref(false)
-const initRoles = ref([])
-const roleSelections = ref([])
-const roleList = ref([])
-const roleInit = ref(false)
-const roleRef = ref(null)
-const tenantId = ref(null)
-const checkSource = ref(false)
-const checkDept = ref(false)
-const tenant = ref({})
-const dept = ref({})
+const title = ref("");
+const loading = ref(false);
+const multiple = ref(true);
+const visible = ref(false);
+const editStatus = ref(false);
+const isFullscreen = ref(false);
+const checkAdminRole = ref(false);
+const checkAdmin = ref(false);
+const checkRole = ref(false);
+const initAdminRole = ref(false);
+const initAdminSysUser = ref(false);
+const initDept = ref(false);
+const userInit = ref(false);
+const sourceInit = ref(false);
+const initRoles = ref([]);
+const roleSelections = ref([]);
+const roleList = ref([]);
+const roleInit = ref(false);
+const roleRef = ref(null);
+const tenantId = ref(null);
+const checkSource = ref(false);
+const checkDept = ref(false);
+const tenant = ref({});
+const dept = ref({});
 
-const versions = ref([])
-const admin = ref({})
-const adminRole = ref({})
+const versions = ref([]);
+const admin = ref({});
+const adminRole = ref({});
 const userEmpty = {
   id: null,
-  userName: '',
-  nickName: '',
-  gender: '男',
-  tenantId: ''
-}
+  userName: "",
+  nickName: "",
+  gender: "男",
+  tenantId: "",
+};
 const deptEmpty = {
   id: null,
-  deptName: '',
-}
+  deptName: "",
+};
 const roleEmpty = {
   id: null,
-  roleName: '',
+  roleName: "",
   isInit: 1,
   editDisable: 0,
   roleSort: 2,
   status: 0,
-}
+};
 const data = reactive({
   form: {},
-  rules: {}
-})
-const { form, rules } = toRefs(data)
+  rules: {},
+});
+const { form, rules } = toRefs(data);
 /***********************  方法区  ****************************/
 /** 打开抽屉 */
 function open(id) {
-  reset()
-  tenantId.value = id
-  visible.value = true
+  reset();
+  tenantId.value = id;
+  visible.value = true;
   if (id) {
-    checkTenantInit(id).then(res => {
-      checkAdminRole.value = res.data.checkAdminRole
-      checkAdmin.value = res.data.checkAdmin
-      admin.value = res.data.admin ? res.data.admin : JSON.parse(JSON.stringify(userEmpty))
-      adminRole.value = res.data.adminRole ? res.data.adminRole : JSON.parse(JSON.stringify(roleEmpty))
-      dept.value = res.data.initDept ? res.data.initDept : JSON.parse(JSON.stringify(deptEmpty))
-      adminRole.value.roleName = '管理员'
-      adminRole.value.roleKey = 'tenantAdmin'
-      adminRole.value.editDisable = '1'
-      checkSource.value = res.data.checkSource
-      checkDept.value = res.data.checkDept
-      initRoles.value = res.data.initRoles ? res.data.initRoles : []
-      roleList.value = res.data.initRoleData
-      tenant.value = res.data.tenant
-      setRoleSelection(res.data.initRoles)
+    checkTenantInit(id).then((res) => {
+      checkAdminRole.value = res.data.checkAdminRole;
+      checkAdmin.value = res.data.checkAdmin;
+      admin.value = res.data.admin
+        ? res.data.admin
+        : JSON.parse(JSON.stringify(userEmpty));
+      adminRole.value = res.data.adminRole
+        ? res.data.adminRole
+        : JSON.parse(JSON.stringify(roleEmpty));
+      dept.value = res.data.initDept
+        ? res.data.initDept
+        : JSON.parse(JSON.stringify(deptEmpty));
+      adminRole.value.roleName = "管理员";
+      adminRole.value.roleKey = "tenantAdmin";
+      adminRole.value.editDisable = "1";
+      checkSource.value = res.data.checkSource;
+      checkDept.value = res.data.checkDept;
+      initRoles.value = res.data.initRoles ? res.data.initRoles : [];
+      roleList.value = res.data.initRoleData;
+      tenant.value = res.data.tenant;
+      setRoleSelection(res.data.initRoles);
       // console.log(adminRole.value)
-    })
+    });
   }
 }
 
 /** 取消按钮 */
 function cancel() {
-  visible.value = false
-  reset()
+  visible.value = false;
+  reset();
 }
 
 /** 表单重置 */
 function reset() {
-  form.value = {}
-  checkAdmin.value = false
-  checkAdminRole.value = false
-  checkSource.value = false
-  checkRole.value = false
-  initAdminSysUser.value = false
-  initAdminRole.value = false
-  admin.value = {}
-  initRoles.value = []
-  roleList.value = []
-  adminRole.value = {}
-  roleSelections.value = []
-  tenant.value = {}
-  initDept.value = {}
-  roleInit.value = false
-  checkDept.value = false
-  proxy.resetForm("tenantRef")
+  form.value = {};
+  checkAdmin.value = false;
+  checkAdminRole.value = false;
+  checkSource.value = false;
+  checkRole.value = false;
+  initAdminSysUser.value = false;
+  initAdminRole.value = false;
+  admin.value = {};
+  initRoles.value = [];
+  roleList.value = [];
+  adminRole.value = {};
+  roleSelections.value = [];
+  tenant.value = {};
+  initDept.value = {};
+  roleInit.value = false;
+  checkDept.value = false;
+  proxy.resetForm("tenantRef");
 }
 
 /** 全屏缩放 */
 function handleScreen() {
-  const dom = document.querySelector('.list-container > .el-drawer__wrapper > .el-overlay')
-  isFullscreen.value = !isFullscreen.value
-  dom.style.position = isFullscreen.value ? 'fixed' : 'absolute'
+  const dom = document.querySelector(
+    ".list-container > .el-drawer__wrapper > .el-overlay"
+  );
+  isFullscreen.value = !isFullscreen.value;
+  dom.style.position = isFullscreen.value ? "fixed" : "absolute";
 }
 
-
 /** 提交按钮 */
 function initHandler() {
-  let initFlows = []
+  let initFlows = [];
   // 假设未创建管理员角色,单选中创建管理员却为选中创建管理员角色 则报错
   if (!checkAdminRole.value && !initAdminRole.value && initAdminSysUser.value) {
-    proxy.$message.error('未初始化管理角色,不能初始化管理员')
-    return
+    proxy.$message.error("未初始化管理角色,不能初始化管理员");
+    return;
   }
   if (initAdminSysUser.value && !admin.value.userName) {
-    proxy.$message.error('请输入管理员名称')
-    return
+    proxy.$message.error("请输入管理员名称");
+    return;
   }
   if (roleInit.value && roleSelections.length === 0) {
-    proxy.$message.error('请至少选择一个角色')
-    return
+    proxy.$message.error("请至少选择一个角色");
+    return;
   }
   if (tenant.value.status <= 1) {
-    const auditingTenant = {}
-    auditingTenant.tenantId = tenantId.value
-    auditingTenant.flowName = 'auditingTenant'
-    initFlows.push(auditingTenant)
-
+    const auditingTenant = {};
+    auditingTenant.tenantId = tenantId.value;
+    auditingTenant.flowName = "auditingTenant";
+    initFlows.push(auditingTenant);
   }
   if (initAdminRole.value) {
-    const adminRoleFlow = {}
-    adminRoleFlow.tenantId = tenantId.value
-    adminRoleFlow.adminRole = adminRole.value
-    adminRoleFlow.flowName = 'initAdminRole'
-    initFlows.push(adminRoleFlow)
+    const adminRoleFlow = {};
+    adminRoleFlow.tenantId = tenantId.value;
+    adminRoleFlow.adminRole = adminRole.value;
+    adminRoleFlow.flowName = "initAdminRole";
+    initFlows.push(adminRoleFlow);
   }
   if (initAdminSysUser.value) {
-    const adminFlow = {}
-    adminFlow.tenantId = tenantId.value
-    adminFlow.admin = admin.value
-    adminFlow.adminRole = adminRole.value
-    adminFlow.flowName = 'initAdminSysUser'
-    initFlows.push(adminFlow)
+    const adminFlow = {};
+    adminFlow.tenantId = tenantId.value;
+    adminFlow.admin = admin.value;
+    adminFlow.adminRole = adminRole.value;
+    adminFlow.flowName = "initAdminSysUser";
+    initFlows.push(adminFlow);
 
-    const adminAuthFlow = {}
-    adminAuthFlow.tenantId = tenantId.value
-    adminAuthFlow.flowName = 'initAdminAuth'
-    initFlows.push(adminAuthFlow)
+    const adminAuthFlow = {};
+    adminAuthFlow.tenantId = tenantId.value;
+    adminAuthFlow.flowName = "initAdminAuth";
+    initFlows.push(adminAuthFlow);
   }
   if (roleInit.value) {
-    const roleInitFlow = {}
-    roleInitFlow.tenantId = tenantId.value
-    roleInitFlow.initRoles = roleSelections.value
-    roleInitFlow.flowName = 'initRoles'
-    initFlows.push(roleInitFlow)
+    const roleInitFlow = {};
+    roleInitFlow.tenantId = tenantId.value;
+    roleInitFlow.initRoles = roleSelections.value;
+    roleInitFlow.flowName = "initRoles";
+    initFlows.push(roleInitFlow);
   }
   if (initDept.value) {
-    const deptInitFlow = {}
-    deptInitFlow.tenantId = tenantId.value
-    dept.value.deptName = dept.value.deptName.trim() == '' ? tenant.value.companyName : dept.value.deptName.trim()
-    deptInitFlow.dept = dept.value
-    deptInitFlow.flowName = 'initDept'
-    initFlows.push(deptInitFlow)
+    const deptInitFlow = {};
+    deptInitFlow.tenantId = tenantId.value;
+    dept.value.deptName =
+      dept.value.deptName.trim() == ""
+        ? tenant.value.companyName
+        : dept.value.deptName.trim();
+    deptInitFlow.dept = dept.value;
+    deptInitFlow.flowName = "initDept";
+    initFlows.push(deptInitFlow);
   }
   if (sourceInit.value) {
     const sourceInitFlow = {
       tenantId: tenantId.value,
-      flowName: 'initSource'
-    }
-    initFlows.push(sourceInitFlow)
+      flowName: "initSource",
+    };
+    initFlows.push(sourceInitFlow);
   }
 
-  initTenant(initFlows).then(res => {
-    getList.value()
-    cancel()
-  })
+  initTenant(initFlows).then((res) => {
+    getList.value();
+    cancel();
+  });
 }
 
 /** 查询表单信息  */
 function getForm() {
-  loading.value = true
-  getTenant(form.value.id).then(response => {
-    loading.value = false
-    form.value = response.data
-  })
+  loading.value = true;
+  getTenant(form.value.id).then((response) => {
+    loading.value = false;
+    form.value = response.data;
+  });
 }
 function setRoleSelection() {
-  roleList.value.forEach(l => {
-    if (initRoles.value.findIndex(v => l.initId === v.initId) >= 0) {
-      roleRef.value.toggleRowSelection(l, true)
+  roleList.value.forEach((l) => {
+    if (initRoles.value.findIndex((v) => l.initId === v.initId) >= 0) {
+      roleRef.value.toggleRowSelection(l, true);
     } else {
-      roleRef.value.toggleRowSelection(l, false)
+      roleRef.value.toggleRowSelection(l, false);
     }
-  })
+  });
 }
 
 function roleSelectionChange(selections) {
-  roleSelections.value = selections
+  roleSelections.value = selections;
 }
 
 /** 暴露给父组件的方法 */
 defineExpose({
-  open
-})
+  open,
+});
 </script>

+ 235 - 0
src/views/system/inItRole/authUser.vue

@@ -0,0 +1,235 @@
+
+<template>
+  <div class="page-container list-container">
+    <div class="list-btns-container">
+      <el-button
+        size="small"
+        type="primary"
+        icon="Plus"
+        @click="openSelectUser"
+        v-hasPermi="['system:role:add']"
+        >添加用户</el-button
+      >
+      <el-button
+        size="small"
+        type="danger"
+        icon="CircleClose"
+        :disabled="multiple"
+        @click="cancelAuthUserAll"
+        v-hasPermi="['system:role:remove']"
+        >批量取消授权</el-button
+      >
+      <el-button size="small" type="warning" icon="Close" @click="handleClose"
+        >关闭</el-button
+      >
+    </div>
+
+    <el-form
+      class="list-search-container"
+      :model="queryParams"
+      ref="queryRef"
+      v-show="showSearch"
+      :inline="true"
+    >
+      <el-form-item label="用户名称:" prop="userName">
+        <el-input
+          v-model="queryParams.userName"
+          placeholder="请输入用户名称"
+          size="small"
+          clearable
+          style="width: 240px"
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="手机号码:" prop="phonenumber">
+        <el-input
+          v-model="queryParams.phonenumber"
+          placeholder="请输入手机号码"
+          size="small"
+          clearable
+          style="width: 240px"
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          size="small"
+          icon="Search"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="Refresh" size="small" @click="resetQuery"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-table
+      v-loading="loading"
+      size="small"
+      border
+      :data="userList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column
+        label="用户名称"
+        prop="userName"
+        :show-overflow-tooltip="true"
+      />
+      <el-table-column
+        label="用户昵称"
+        prop="nickName"
+        :show-overflow-tooltip="true"
+      />
+      <el-table-column
+        label="邮箱"
+        prop="email"
+        :show-overflow-tooltip="true"
+      />
+      <el-table-column
+        label="手机"
+        prop="phonenumber"
+        :show-overflow-tooltip="true"
+      />
+      <el-table-column label="状态" align="center" prop="status">
+        <template #default="scope">
+          <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        width="180"
+      >
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template #default="scope">
+          <el-button
+            link
+            type="danger"
+            size="small"
+            icon="CircleClose"
+            @click="cancelAuthUser(scope.row)"
+            v-hasPermi="['system:role:remove']"
+            >取消授权</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <select-user
+      ref="selectRef"
+      :roleId="queryParams.roleId"
+      @ok="handleQuery"
+    />
+  </div>
+</template>
+
+<script setup name="AuthUser">
+import selectUser from "./selectUser";
+import {
+  allocatedUserList,
+  authUserCancel,
+  authUserCancelAll,
+} from "@/api/system/inItRole";
+
+const route = useRoute();
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+
+const userList = ref([]);
+const loading = ref(true);
+const showSearch = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const userIds = ref([]);
+
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 10,
+  roleId: route.params.roleId,
+  userName: undefined,
+  phonenumber: undefined,
+});
+
+/** 查询授权用户列表 */
+function getList() {
+  loading.value = true;
+  allocatedUserList(queryParams).then((response) => {
+    userList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+// 返回按钮
+function handleClose() {
+  const obj = { path: "/system/role" };
+  proxy.$tab.closeOpenPage(obj);
+}
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.pageNum = 1;
+  getList();
+}
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  userIds.value = selection.map((item) => item.userId);
+  multiple.value = !selection.length;
+}
+/** 打开授权用户表弹窗 */
+function openSelectUser() {
+  proxy.$refs["selectRef"].show();
+}
+/** 取消授权按钮操作 */
+function cancelAuthUser(row) {
+  proxy.$modal
+    .confirm('确认要取消该用户"' + row.userName + '"角色吗?')
+    .then(function () {
+      return authUserCancel({ userId: row.userId, roleId: queryParams.roleId });
+    })
+    .then(() => {
+      getList();
+      proxy.$modal.msgSuccess("取消授权成功");
+    })
+    .catch(() => {});
+}
+/** 批量取消授权按钮操作 */
+function cancelAuthUserAll(row) {
+  const roleId = queryParams.roleId;
+  const uIds = userIds.value.join(",");
+  proxy.$modal
+    .confirm("是否取消选中用户授权数据项?")
+    .then(function () {
+      return authUserCancelAll({ roleId: roleId, userIds: uIds });
+    })
+    .then(() => {
+      getList();
+      proxy.$modal.msgSuccess("取消授权成功");
+    })
+    .catch(() => {});
+}
+
+getList();
+</script>

+ 667 - 0
src/views/system/inItRole/index.vue

@@ -0,0 +1,667 @@
+<template>
+  <div class="page-container list-sontainer">
+    <div :gutter="10" class="list-btns-container">
+      <el-button
+        type="primary"
+        size="small"
+        icon="Plus"
+        @click="handleAdd"
+        v-hasPermi="['system:role:add']"
+        >新增</el-button
+      >
+
+      <el-button
+        type="success"
+        size="small"
+        icon="Edit"
+        :disabled="single"
+        @click="handleUpdate"
+        v-hasPermi="['system:role:edit']"
+        >修改</el-button
+      >
+
+      <el-button
+        type="danger"
+        size="small"
+        icon="Delete"
+        :disabled="multiple"
+        @click="handleDelete"
+        v-hasPermi="['system:role:remove']"
+        >删除</el-button
+      >
+
+      <!-- <el-button type="warning" size="small" icon="Download" @click="handleExport"
+        v-hasPermi="['system:role:export']">导出</el-button> -->
+
+      <!-- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> -->
+    </div>
+
+    <el-form
+      class="list-search-container"
+      :model="queryParams"
+      ref="queryRef"
+      v-show="showSearch"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="角色名称:" prop="roleName" style="width: 220px">
+        <el-input
+          size="small"
+          v-model="queryParams.roleName"
+          placeholder="请输入角色名称"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <!-- <el-form-item label="权限字符:" prop="roleKey" style="width: 220px">
+        <el-input size="small" v-model="queryParams.roleKey" placeholder="请输入权限字符" clearable @keyup.enter="handleQuery" />
+      </el-form-item> -->
+      <!-- <el-form-item label="状态:" prop="status" style="width: 220px">
+        <el-select size="small" v-model="queryParams.status" placeholder="角色状态" clearable>
+          <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item> -->
+      <!-- <el-form-item label="创建时间:" style="width: 260px">
+        <el-date-picker size="small" v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
+          start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
+      </el-form-item> -->
+      <el-form-item>
+        <el-button
+          size="small"
+          type="primary"
+          icon="Search"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button size="small" icon="Refresh" @click="resetQuery"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <!-- 表格数据 -->
+    <el-table
+      size="small"
+      v-loading="loading"
+      border
+      :data="roleList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <!--<el-table-column label="角色编号" prop="roleId" width="120" />-->
+      <el-table-column
+        label="角色名称"
+        align="center"
+        prop="roleName"
+        :show-overflow-tooltip="true"
+        width="150"
+      />
+      <el-table-column
+        label="权限字符"
+        align="center"
+        prop="roleKey"
+        :show-overflow-tooltip="true"
+        width="150"
+      />
+      <el-table-column
+        label="排序"
+        align="center"
+        prop="roleSort"
+        width="100"
+      />
+      <!-- <el-table-column label="状态" align="center" width="100">
+        <template #default="scope">
+          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
+            @change="handleStatusChange(scope.row)"></el-switch>
+        </template>
+      </el-table-column> -->
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        width="200"
+      >
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+        width="200"
+      >
+        <template #default="scope">
+          <el-button
+            link
+            size="small"
+            type="warning"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:role:edit']"
+          >
+            修改</el-button
+          >
+
+          <!-- <el-tooltip content="删除" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)"
+              v-hasPermi="['system:role:remove']"></el-button>
+          </el-tooltip> -->
+          <!-- <el-tooltip content="数据权限" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="success" icon="CircleCheck" @click="handleDataScope(scope.row)"
+              v-hasPermi="['system:role:edit']"></el-button>
+          </el-tooltip> -->
+          <!-- <el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)"
+              v-hasPermi="['system:role:edit']"></el-button>
+          </el-tooltip> -->
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改角色配置对话框 -->
+    <el-dialog
+      :title="title"
+      v-model="open"
+      width="500px"
+      append-to-body
+      draggable
+    >
+      <el-form ref="roleRef" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="角色名称" prop="roleName">
+          <el-input v-model="form.roleName" placeholder="请输入角色名称" />
+        </el-form-item>
+        <el-form-item prop="roleKey">
+          <template #label>
+            <span>
+              <el-tooltip
+                content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)"
+                placement="top"
+              >
+                <el-icon><question-filled /></el-icon>
+              </el-tooltip>
+              权限字符
+            </span>
+          </template>
+          <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
+        </el-form-item>
+        <el-form-item label="角色顺序" prop="roleSort">
+          <el-input-number
+            v-model="form.roleSort"
+            controls-position="right"
+            :min="0"
+          />
+        </el-form-item>
+        <!-- <el-form-item label="状态">
+          <el-radio-group v-model="form.status">
+            <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item> -->
+        <el-form-item label="菜单权限">
+          <el-checkbox
+            v-model="menuExpand"
+            @change="handleCheckedTreeExpand($event, 'menu')"
+            >展开/折叠</el-checkbox
+          >
+          <el-checkbox
+            v-model="menuNodeAll"
+            @change="handleCheckedTreeNodeAll($event, 'menu')"
+            >全选/全不选</el-checkbox
+          >
+          <el-checkbox
+            v-model="form.menuCheckStrictly"
+            @change="handleCheckedTreeConnect($event, 'menu')"
+            >父子联动</el-checkbox
+          >
+          <el-tree
+            class="tree-border"
+            :data="menuOptions"
+            show-checkbox
+            ref="menuRef"
+            node-key="id"
+            :check-strictly="!form.menuCheckStrictly"
+            empty-text="加载中,请稍候"
+            :props="{ label: 'label', children: 'children' }"
+          ></el-tree>
+        </el-form-item>
+        <el-form-item label="备注">
+          <el-input
+            v-model="form.remark"
+            type="textarea"
+            placeholder="请输入内容"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 分配角色数据权限对话框 -->
+    <el-dialog
+      :title="title"
+      v-model="openDataScope"
+      width="500px"
+      append-to-body
+      draggable
+    >
+      <el-form :model="form" label-width="80px">
+        <el-form-item label="角色名称">
+          <el-input v-model="form.roleName" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="权限字符">
+          <el-input v-model="form.roleKey" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="权限范围">
+          <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
+            <el-option
+              v-for="item in dataScopeOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数据权限" v-show="form.dataScope == 2">
+          <el-checkbox
+            v-model="deptExpand"
+            @change="handleCheckedTreeExpand($event, 'dept')"
+            >展开/折叠</el-checkbox
+          >
+          <el-checkbox
+            v-model="deptNodeAll"
+            @change="handleCheckedTreeNodeAll($event, 'dept')"
+            >全选/全不选</el-checkbox
+          >
+          <el-checkbox
+            v-model="form.deptCheckStrictly"
+            @change="handleCheckedTreeConnect($event, 'dept')"
+            >父子联动</el-checkbox
+          >
+          <el-tree
+            class="tree-border"
+            :data="deptOptions"
+            show-checkbox
+            default-expand-all
+            ref="deptRef"
+            node-key="id"
+            :check-strictly="!form.deptCheckStrictly"
+            empty-text="加载中,请稍候"
+            :props="{ label: 'label', children: 'children' }"
+          ></el-tree>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitDataScope">确 定</el-button>
+          <el-button @click="cancelDataScope">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Role">
+import {
+  addRole,
+  changeRoleStatus,
+  dataScope,
+  delRole,
+  getRole,
+  listRole,
+  updateRole,
+  deptTreeSelect,
+} from "@/api/system/inItRole";
+import {
+  roleMenuTreeselect,
+  treeselect as menuTreeselect,
+} from "@/api/system/menu";
+
+const router = useRouter();
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+
+const roleList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+const dateRange = ref([]);
+const menuOptions = ref([]);
+const menuExpand = ref(false);
+const menuNodeAll = ref(false);
+const deptExpand = ref(true);
+const deptNodeAll = ref(false);
+const deptOptions = ref([]);
+const openDataScope = ref(false);
+const menuRef = ref(null);
+const deptRef = ref(null);
+
+/** 数据范围选项
+const dataScopeOptions = ref([
+  { value: '1', label: '全部数据权限' },
+  { value: '2', label: '自定数据权限' },
+  { value: '3', label: '本部门数据权限' },
+  { value: '4', label: '本部门及以下数据权限' },
+  { value: '5', label: '仅本人数据权限' }
+])
+*/
+const dataScopeOptions = ref([
+  { value: "1", label: "全部数据权限" },
+  { value: "4", label: "租户内数据权限" },
+  { value: "5", label: "仅本人数据权限" },
+]);
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    roleName: undefined,
+    roleKey: undefined,
+    status: undefined,
+  },
+  rules: {
+    roleName: [
+      { required: true, message: "角色名称不能为空", trigger: "blur" },
+    ],
+    roleKey: [{ required: true, message: "权限字符不能为空", trigger: "blur" }],
+    roleSort: [
+      { required: true, message: "角色顺序不能为空", trigger: "blur" },
+    ],
+  },
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询角色列表 */
+function getList() {
+  loading.value = true;
+  listRole(proxy.addDateRange(queryParams.value, dateRange.value)).then(
+    (response) => {
+      roleList.value = response.rows;
+      total.value = response.total;
+      loading.value = false;
+    }
+  );
+}
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+/** 重置按钮操作 */
+function resetQuery() {
+  dateRange.value = [];
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const roleIds = row.roleId || ids.value;
+  proxy.$modal
+    .confirm("是否确认删除?")
+    .then(function () {
+      return delRole(roleIds);
+    })
+    .then(() => {
+      getList();
+      proxy.$modal.msgSuccess("删除成功");
+    })
+    .catch(() => {});
+}
+/** 导出按钮操作 */
+function handleExport() {
+  queryParams.value.ids = ids.value;
+  proxy.download(
+    "system/role/export",
+    {
+      ...queryParams.value,
+    },
+    `role_${new Date().getTime()}.xlsx`
+  );
+}
+/** 多选框选中数据 */
+function handleSelectionChange(selection) {
+  ids.value = selection.map((item) => item.roleId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+/** 角色状态修改 */
+function handleStatusChange(row) {
+  let text = row.status === "0" ? "启用" : "停用";
+  proxy.$modal
+    .confirm('确认要"' + text + '""' + row.roleName + '"角色吗?')
+    .then(function () {
+      return changeRoleStatus(row.roleId, row.status);
+    })
+    .then(() => {
+      proxy.$modal.msgSuccess(text + "成功");
+    })
+    .catch(function () {
+      row.status = row.status === "0" ? "1" : "0";
+    });
+}
+/** 更多操作 */
+function handleCommand(command, row) {
+  switch (command) {
+    case "handleDataScope":
+      handleDataScope(row);
+      break;
+    case "handleAuthUser":
+      handleAuthUser(row);
+      break;
+    default:
+      break;
+  }
+}
+/** 分配用户 */
+function handleAuthUser(row) {
+  router.push("/system/role-auth/user/" + row.roleId);
+}
+/** 查询菜单树结构 */
+function getMenuTreeselect() {
+  menuTreeselect().then((response) => {
+    menuOptions.value = response.data;
+  });
+}
+/** 所有部门节点数据 */
+function getDeptAllCheckedKeys() {
+  // 目前被选中的部门节点
+  let checkedKeys = deptRef.value.getCheckedKeys();
+  // 半选中的部门节点
+  let halfCheckedKeys = deptRef.value.getHalfCheckedKeys();
+  checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+  return checkedKeys;
+}
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if (menuRef.value != undefined) {
+    menuRef.value.setCheckedKeys([]);
+  }
+  menuExpand.value = false;
+  menuNodeAll.value = false;
+  deptExpand.value = true;
+  deptNodeAll.value = false;
+  form.value = {
+    roleId: undefined,
+    roleName: undefined,
+    roleKey: undefined,
+    roleSort: 0,
+    status: "0",
+    menuIds: [],
+    deptIds: [],
+    menuCheckStrictly: true,
+    deptCheckStrictly: true,
+    remark: undefined,
+  };
+  proxy.resetForm("roleRef");
+}
+/** 添加角色 */
+function handleAdd() {
+  reset();
+  getMenuTreeselect();
+  open.value = true;
+  title.value = "添加角色";
+}
+/** 修改角色 */
+function handleUpdate(row) {
+  reset();
+  const roleId = row.roleId || ids.value;
+  const roleMenu = getRoleMenuTreeselect(roleId);
+  getRole(roleId).then((response) => {
+    form.value = response.data;
+    form.value.roleSort = Number(form.value.roleSort);
+    open.value = true;
+    nextTick(() => {
+      roleMenu.then((res) => {
+        let checkedKeys = res.checkedKeys;
+        checkedKeys.forEach((v) => {
+          nextTick(() => {
+            menuRef.value.setChecked(v, true, false);
+          });
+        });
+      });
+    });
+    title.value = "修改角色";
+  });
+}
+/** 根据角色ID查询菜单树结构 */
+function getRoleMenuTreeselect(roleId) {
+  return roleMenuTreeselect(roleId).then((response) => {
+    menuOptions.value = response.menus;
+    return response;
+  });
+}
+/** 根据角色ID查询部门树结构 */
+function getDeptTree(roleId) {
+  return deptTreeSelect(roleId).then((response) => {
+    deptOptions.value = response.depts;
+    return response;
+  });
+}
+/** 树权限(展开/折叠)*/
+function handleCheckedTreeExpand(value, type) {
+  if (type == "menu") {
+    let treeList = menuOptions.value;
+    for (let i = 0; i < treeList.length; i++) {
+      menuRef.value.store.nodesMap[treeList[i].id].expanded = value;
+    }
+  } else if (type == "dept") {
+    let treeList = deptOptions.value;
+    for (let i = 0; i < treeList.length; i++) {
+      deptRef.value.store.nodesMap[treeList[i].id].expanded = value;
+    }
+  }
+}
+/** 树权限(全选/全不选) */
+function handleCheckedTreeNodeAll(value, type) {
+  if (type == "menu") {
+    menuRef.value.setCheckedNodes(value ? menuOptions.value : []);
+  } else if (type == "dept") {
+    deptRef.value.setCheckedNodes(value ? deptOptions.value : []);
+  }
+}
+/** 树权限(父子联动) */
+function handleCheckedTreeConnect(value, type) {
+  if (type == "menu") {
+    form.value.menuCheckStrictly = value ? true : false;
+  } else if (type == "dept") {
+    form.value.deptCheckStrictly = value ? true : false;
+  }
+}
+/** 所有菜单节点数据 */
+function getMenuAllCheckedKeys() {
+  // 目前被选中的菜单节点
+  let checkedKeys = menuRef.value.getCheckedKeys();
+  // 半选中的菜单节点
+  let halfCheckedKeys = menuRef.value.getHalfCheckedKeys();
+  checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+  return checkedKeys;
+}
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["roleRef"].validate((valid) => {
+    if (valid) {
+      if (form.value.roleId != undefined) {
+        form.value.menuIds = getMenuAllCheckedKeys();
+        updateRole(form.value).then((response) => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        form.value.menuIds = getMenuAllCheckedKeys();
+        addRole(form.value).then((response) => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+/** 取消按钮 */
+function cancel() {
+  open.value = false;
+  reset();
+}
+/** 选择角色权限范围触发 */
+function dataScopeSelectChange(value) {
+  if (value !== "2") {
+    deptRef.value.setCheckedKeys([]);
+  }
+}
+/** 分配数据权限操作 */
+function handleDataScope(row) {
+  reset();
+  const deptTreeSelect = getDeptTree(row.roleId);
+  getRole(row.roleId).then((response) => {
+    form.value = response.data;
+    openDataScope.value = true;
+    nextTick(() => {
+      deptTreeSelect.then((res) => {
+        nextTick(() => {
+          if (deptRef.value) {
+            deptRef.value.setCheckedKeys(res.checkedKeys);
+          }
+        });
+      });
+    });
+    title.value = "分配数据权限";
+  });
+}
+/** 提交按钮(数据权限) */
+function submitDataScope() {
+  if (form.value.roleId != undefined) {
+    form.value.deptIds = getDeptAllCheckedKeys();
+    dataScope(form.value).then((response) => {
+      proxy.$modal.msgSuccess("修改成功");
+      openDataScope.value = false;
+      getList();
+    });
+  }
+}
+/** 取消按钮(数据权限)*/
+function cancelDataScope() {
+  openDataScope.value = false;
+  reset();
+}
+
+getList();
+</script>

+ 196 - 0
src/views/system/inItRole/selectUser.vue

@@ -0,0 +1,196 @@
+<template>
+  <!-- 授权用户 -->
+  <el-dialog
+    title="选择用户"
+    v-model="visible"
+    width="1200px"
+    top="5vh"
+    append-to-body
+    draggable
+  >
+    <el-form :model="queryParams" ref="queryRef" :inline="true">
+      <el-form-item label="用户名称" prop="userName">
+        <el-input
+          v-model="queryParams.userName"
+          placeholder="请输入用户名称"
+          clearable
+          style="width: 200px"
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="手机号码" prop="phonenumber">
+        <el-input
+          v-model="queryParams.phonenumber"
+          placeholder="请输入手机号码"
+          clearable
+          style="width: 200px"
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          size="small"
+          icon="Search"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="Refresh" size="small" @click="resetQuery"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+    <el-row>
+      <el-table
+        @row-click="clickRow"
+        ref="refTable"
+        :data="userList"
+        @selection-change="handleSelectionChange"
+        height="260px"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column
+          label="用户名称"
+          prop="userName"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column
+          label="用户昵称"
+          prop="nickName"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column
+          label="邮箱"
+          prop="email"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column
+          label="手机"
+          prop="phonenumber"
+          :show-overflow-tooltip="true"
+        />
+        <!-- <el-table-column label="状态" align="center" prop="status">
+          <template #default="scope">
+            <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
+          </template>
+        </el-table-column> -->
+        <el-table-column
+          label="身份"
+          align="center"
+          prop="tenantAdmin"
+          width="100"
+        >
+          <template #default="scope">
+            <dict-tag :options="user_tenant" :value="scope.row.tenantAdmin" />
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="创建时间"
+          align="center"
+          prop="createTime"
+          width="180"
+        >
+          <template #default="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button type="primary" @click="handleSelectUser">确 定</el-button>
+        <el-button @click="visible = false">取 消</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup name="SelectUser">
+import { authUserSelectAll, unallocatedUserList } from "@/api/system/inItRole";
+
+const props = defineProps({
+  roleId: {
+    type: [Number, String],
+  },
+});
+
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+const { user_tenant } = proxy.useDict("user_tenant");
+const userList = ref([]);
+const visible = ref(false);
+const total = ref(0);
+const userIds = ref([]);
+
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 10,
+  roleId: undefined,
+  userName: undefined,
+  phonenumber: undefined,
+});
+
+function selectable(row, index) {
+  return row.tenantAdmin !== 1;
+}
+
+// 显示弹框
+function show() {
+  queryParams.roleId = props.roleId;
+  getList();
+  visible.value = true;
+}
+/**选择行 */
+function clickRow(row) {
+  proxy.$refs["refTable"].toggleRowSelection(row);
+}
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  userIds.value = selection.map((item) => item.userId);
+}
+// 查询表数据
+function getList() {
+  unallocatedUserList(queryParams).then((res) => {
+    userList.value = res.rows;
+    total.value = res.total;
+  });
+}
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.pageNum = 1;
+  getList();
+}
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+const emit = defineEmits(["ok"]);
+/** 选择授权用户操作 */
+function handleSelectUser() {
+  const roleId = queryParams.roleId;
+  const uIds = userIds.value.join(",");
+  if (uIds == "") {
+    proxy.$modal.msgError("请选择要分配的用户");
+    return;
+  }
+  authUserSelectAll({ roleId: roleId, userIds: uIds }).then((res) => {
+    proxy.$modal.msgSuccess(res.msg);
+    if (res.code === 200) {
+      visible.value = false;
+      emit("ok");
+    }
+  });
+}
+
+defineExpose({
+  show,
+});
+</script>