Explorar o código

调整字段,按钮权限等

sgc hai 3 semanas
pai
achega
f238183d54

+ 1 - 1
.env.test

@@ -28,4 +28,4 @@ VITE_PWA = false
 VITE_API_URL = /api
 
 # 生产环境跨域代理,支持配置多个
-VITE_PROXY = [["/api","http://localhost:8888"]]
+VITE_PROXY = [["/api","http://192.168.2.251:8899"]]

+ 1 - 0
src/api/interface/index.ts

@@ -52,6 +52,7 @@ export namespace Login {
   export interface ResLogin {
     token: string; // 登录令牌
     result: boolean; // 登录结果
+    roleId: string; // 角色ID
   }
   // 注册响应接口
   export interface ResRegister {

+ 10 - 0
src/api/modules/lawyer.ts

@@ -90,6 +90,16 @@ export const getLawyerDetails = (params: any) => {
 export const getOverview = (params: any) => {
   return http.get(url + `/lawyer/firm/reconciliation/getOverview`, params);
 };
+
+// 导出律所对账总览
+export const exportAllLawFirmList = (params?: any) => {
+  return http.get(url + `/lawyer/firm/reconciliation/exportAllLawFirmList`, params, { responseType: "blob" });
+};
+// 导出单个律所对账总览
+export const exportLawyerListWithName = (params?: any) => {
+  return http.get(url + `/lawyer/firm/reconciliation/exportLawyerListWithName`, params, { responseType: "blob" });
+};
+
 //////////////////////////// 导入导出 ////////////////////////////
 //  导入律所数据
 export const importData = (params: any) => {

+ 10 - 10
src/api/modules/login.ts

@@ -19,17 +19,17 @@ export const loginApi = (params: Login.ReqLoginForm): Promise<{ data: Login.ResL
 
 // 获取菜单列表
 export const getAuthMenuListApi = (params: any = {}) => {
-  // const userStore = useUserStore();
-  // const requestParams = { ...params };
-  // const loginAccount = userStore.userInfo?.name?.trim();
-  // if (loginAccount && loginAccount.toLowerCase() === "admin") {
-  //   requestParams.type = 1;
-  // } else {
-  //   requestParams.type = 0;
-  // }
-  // return http.get<Menu.MenuOptions[]>(PORT1 + `/routingInfo`, requestParams, { loading: false });
+  const userStore = useUserStore();
+  const requestParams = { ...params };
+  const loginAccount = userStore.userInfo?.name?.trim();
+  if (loginAccount && loginAccount.toLowerCase() === "admin") {
+    requestParams.type = 1;
+  } else {
+    requestParams.type = 0;
+  }
+  return http.get<Menu.MenuOptions[]>(PORT1 + `/routingInfo`, requestParams, { loading: false });
   // 如果想让菜单变为本地数据,注释上一行代码,并引入本地 authMenuList.json 数据
-  return authMenuList;
+  // return authMenuList;
 };
 
 // 获取按钮权限

+ 1 - 1
src/assets/json/authMenuList.json

@@ -79,7 +79,7 @@
             "icon": "Briefcase",
             "title": "专业领域",
             "isLink": "",
-            "isHide": false,
+            "isHide": true,
             "isFull": false,
             "isAffix": false,
             "isKeepAlive": false

+ 4 - 4
src/layouts/components/Header/components/Avatar.vue

@@ -5,12 +5,12 @@
     </div>
     <template #dropdown>
       <el-dropdown-menu>
-        <el-dropdown-item @click="openDialog('infoRef')">
+        <!-- <el-dropdown-item @click="openDialog('infoRef')">
           <el-icon><User /></el-icon>{{ $t("header.personalData") }}
         </el-dropdown-item>
         <el-dropdown-item @click="openDialog('passwordRef')">
           <el-icon><Edit /></el-icon>{{ $t("header.changePassword") }}
-        </el-dropdown-item>
+        </el-dropdown-item> -->
         <el-dropdown-item divided @click="logout">
           <el-icon><SwitchButton /></el-icon>{{ $t("header.logout") }}
         </el-dropdown-item>
@@ -18,9 +18,9 @@
     </template>
   </el-dropdown>
   <!-- infoDialog -->
-  <InfoDialog ref="infoRef"></InfoDialog>
+  <InfoDialog ref="infoRef" />
   <!-- passwordDialog -->
-  <PasswordDialog ref="passwordRef"></PasswordDialog>
+  <PasswordDialog ref="passwordRef" />
 </template>
 
 <script setup lang="ts">

+ 1 - 1
src/stores/interface/index.ts

@@ -31,7 +31,7 @@ export interface UserState {
   token: string;
   userInfo: {
     name: string;
-    firmId?: string | number;
+    roleId?: string | number;
   };
 }
 

+ 1 - 1
src/stores/modules/user.ts

@@ -6,7 +6,7 @@ export const useUserStore = defineStore({
   id: "geeker-user",
   state: (): UserState => ({
     token: "",
-    userInfo: { name: "Geeker", firmId: "" }
+    userInfo: { name: "Geeker", roleId: "" }
   }),
   getters: {},
   actions: {

+ 14 - 41
src/views/lawyerManagement/lawFirm/components/LawFirmDialog.vue

@@ -20,15 +20,7 @@
         </el-form-item>
         <el-form-item label="收款账号" prop="paymentAccount">
           <div class="bank-card-input">
-            <el-input v-model="bankCardDisplay" placeholder="请输入银行卡号" maxlength="23" clearable />
-            <el-button type="primary" link @click="handleAddCard"> 添加 </el-button>
-          </div>
-        </el-form-item>
-        <el-form-item>
-          <div class="bank-card-tags">
-            <el-tag v-for="(card, index) in bankCardList" :key="card" closable @close="removeCard(index)">
-              {{ formatCard(card) }}
-            </el-tag>
+            <el-input v-model="bankCardDisplay" placeholder="请输入银行卡号" maxlength="23" clearable :disabled="isEditMode" />
           </div>
         </el-form-item>
       </el-form>
@@ -68,7 +60,6 @@ const form = reactive({
   platformCommissionRatio: 3
 });
 const bankCardInput = ref("");
-const bankCardList = ref<string[]>([]);
 const bankCardReg = /^([1-9]\d{15}|\d{17}|\d{18}|\d{19})$/;
 
 const validateServiceFee = (_rule: any, value: number | string, callback: (err?: Error) => void) => {
@@ -94,11 +85,14 @@ const rules = reactive({
   address: [{ required: true, message: "请输入律所位置", trigger: "blur" }],
   creditCode: [{ required: true, message: "请输入社会统一信用代码", trigger: "blur" }],
   paymentAccount: [
-    { required: true, message: "请至少添加一张银行卡", trigger: "change" },
+    { required: true, message: "请输入收款账号", trigger: "blur" },
     {
       validator: (_rule, _value, callback) => {
-        if (!bankCardList.value.length) {
-          callback(new Error("请至少添加一张银行卡"));
+        const card = bankCardInput.value.trim();
+        if (!card) {
+          callback(new Error("请输入收款账号"));
+        } else if (!bankCardReg.test(card)) {
+          callback(new Error("请输入正确的银行卡号"));
         } else {
           callback();
         }
@@ -123,7 +117,6 @@ const resetForm = () => {
   form.paymentAccount = "";
   form.platformCommissionRatio = 3;
   bankCardInput.value = "";
-  bankCardList.value = [];
 };
 
 const open = (payload: DialogOptions) => {
@@ -131,17 +124,14 @@ const open = (payload: DialogOptions) => {
   options.value = payload;
   if (payload.row) {
     Object.assign(form, payload.row);
-    const cards = (form.paymentAccount || "")
-      .split(",")
-      .map(card => card.trim())
-      .filter(card => !!card);
-    bankCardList.value = cards.slice(0, 3);
-    form.paymentAccount = bankCardList.value.join(",");
+    bankCardInput.value = (form.paymentAccount || "").replace(/\s+/g, "");
     form.platformCommissionRatio = Number(payload.row.platformCommissionRatio ?? 3);
     form.creditCode = payload.row.creditCode || "";
   } else {
     form.platformCommissionRatio = 3;
     form.creditCode = "";
+    bankCardInput.value = "";
+    form.paymentAccount = "";
   }
   visible.value = true;
   nextTick(() => formRef.value?.clearValidate());
@@ -151,34 +141,17 @@ const emits = defineEmits<{
   success: [];
 }>();
 
-const syncPaymentAccount = () => {
-  form.paymentAccount = bankCardList.value.join(",");
-  formRef.value?.validateField("paymentAccount").catch(() => {});
-};
+const isEditMode = computed(() => !!form.id);
 
 const bankCardDisplay = computed({
   get: () => formatCard(bankCardInput.value),
   set: val => {
     bankCardInput.value = val.replace(/\s+/g, "");
+    form.paymentAccount = bankCardInput.value;
+    formRef.value?.validateField("paymentAccount").catch(() => {});
   }
 });
 
-const handleAddCard = () => {
-  const card = bankCardInput.value.trim();
-  if (!card) return ElMessage.warning("请输入银行卡号");
-  if (!bankCardReg.test(card)) return ElMessage.error("请输入正确的银行卡号");
-  if (bankCardList.value.includes(card)) return ElMessage.warning("银行卡号已存在");
-  if (bankCardList.value.length >= 3) return ElMessage.warning("最多可添加 3 张银行卡");
-  bankCardList.value.push(card);
-  bankCardInput.value = "";
-  syncPaymentAccount();
-};
-
-const removeCard = (index: number) => {
-  bankCardList.value.splice(index, 1);
-  syncPaymentAccount();
-};
-
 const formatCard = (card: string) => {
   return card
     .replace(/\s+/g, "")
@@ -187,7 +160,7 @@ const formatCard = (card: string) => {
 };
 
 const handleSubmit = () => {
-  syncPaymentAccount();
+  form.paymentAccount = bankCardInput.value;
   formRef.value?.validate(async valid => {
     if (!valid) return;
     loading.value = true;

+ 7 - 2
src/views/lawyerManagement/lawFirm/index.vue

@@ -58,7 +58,8 @@ import ImportDialog from "./components/ImportDialog.vue";
 import { useUserStore } from "@/stores/modules/user";
 
 const userStore = useUserStore();
-const isAdmin = computed(() => (userStore.userInfo?.name || "").toLowerCase() === "admin");
+const isAdmin = computed(() => userStore.userInfo?.name === "admin");
+const loginFirmId = computed(() => userStore.userInfo?.roleId || "");
 const ensureAdmin = () => {
   if (isAdmin.value) return true;
   ElMessage.warning("仅管理员可使用该功能");
@@ -97,9 +98,13 @@ const columns = reactive<ColumnProps<any>[]>([
 ]);
 
 const getTableList = async (params: any) => {
-  const newParams = { ...params, page: params.pageNum, size: params.pageSize };
+  const newParams: Record<string, any> = { ...params, page: params.pageNum, size: params.pageSize };
   delete newParams.pageNum;
   delete newParams.pageSize;
+  // 如果登录的不是管理员,则只查询当前登录的律所
+  if (!isAdmin.value && loginFirmId.value) {
+    newParams.firmId = loginFirmId.value;
+  }
   return getLawFirmPage(newParams);
 };
 

+ 5 - 5
src/views/lawyerManagement/lawyer/components/LawyerDialog.vue

@@ -17,11 +17,11 @@
             style="width: 100%"
           />
         </el-form-item>
-        <el-form-item label="专业领域" prop="expertiseAreaInfo">
+        <!-- <el-form-item label="专业领域" prop="expertiseAreaInfo">
           <el-select v-model="form.expertiseAreaInfo" placeholder="请选择专业领域" filterable style="width: 100%">
             <el-option v-for="item in props.professionalOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item label="法律场景" prop="firstLevelScenario">
           <el-tree-select
             v-model="form.firstLevelScenario"
@@ -83,7 +83,7 @@ const form = reactive({
   name: "",
   phone: "",
   practiceStartDate: "",
-  expertiseAreaInfo: "",
+  // expertiseAreaInfo: "",
   firstLevelScenario: "",
   status: 1,
   paymentNum: "",
@@ -97,7 +97,7 @@ const rules = reactive({
     { pattern: /^1\d{10}$/, message: "请输入正确手机号", trigger: "blur" }
   ],
   practiceStartDate: [{ required: true, message: "请输入从业时间", trigger: "blur" }],
-  expertiseAreaInfo: [{ required: true, message: "请输入专业领域", trigger: "blur" }],
+  // expertiseAreaInfo: [{ required: true, message: "请输入专业领域", trigger: "blur" }],
   firstLevelScenario: [{ required: true, message: "请选择法律场景", trigger: "change" }],
   paymentNum: [{ required: true, message: "请输入收款账号", trigger: "blur" }],
   lawFirmId: [{ required: true, message: "请选择所属律所", trigger: "change" }]
@@ -110,7 +110,7 @@ const resetForm = () => {
   form.name = "";
   form.phone = "";
   form.practiceStartDate = "";
-  form.expertiseAreaInfo = "";
+  // form.expertiseAreaInfo = "";
   form.firstLevelScenario = "";
   form.status = 1;
   form.paymentNum = "";

+ 8 - 5
src/views/lawyerManagement/lawyer/index.vue

@@ -44,7 +44,9 @@ const sceneOptions = ref<any[]>([]);
 const professionalOptions = ref<{ label: string; value: string | number }[]>([]);
 
 const userStore = useUserStore();
-const isAdmin = computed(() => (userStore.userInfo?.name || "").toLowerCase() === "admin");
+const isAdmin = computed(() => userStore.userInfo?.name === "admin");
+const loginFirmId = computed(() => userStore.userInfo?.roleId || "");
+
 const ensureAdmin = () => {
   if (isAdmin.value) return true;
   ElMessage.warning("仅管理员可使用该功能");
@@ -68,7 +70,7 @@ const columns = reactive<ColumnProps<any>[]>([
       }
     }
   },
-  { label: "专业领域", prop: "expertiseAreaInfo" },
+  // { label: "专业领域", prop: "expertiseAreaInfo" },
   { label: "法律场景", prop: "firstLevelScenario" },
   {
     label: "接单状态",
@@ -87,9 +89,12 @@ const columns = reactive<ColumnProps<any>[]>([
 ]);
 
 const getTableList = async (params: any) => {
-  const newParams = { ...params, page: params.pageNum, size: params.pageSize };
+  const newParams: Record<string, any> = { ...params, page: params.pageNum, size: params.pageSize };
   delete newParams.pageNum;
   delete newParams.pageSize;
+  if (!isAdmin.value && loginFirmId.value) {
+    newParams.firmId = loginFirmId.value;
+  }
   return getLawyerPage(newParams);
 };
 
@@ -148,7 +153,6 @@ const fetchLawFirmOptions = async () => {
       label: item.firmName,
       value: item.id
     }));
-    console.log("lawFirmOptions.value", lawFirmOptions.value);
   } catch (error) {
     console.error("获取律所列表失败", error);
     lawFirmOptions.value = [];
@@ -191,7 +195,6 @@ const fetchProfessionalOptions = async () => {
       label: item.expertiseAreaInfo,
       value: item.id
     }));
-    console.log("professionalOptions.value", professionalOptions.value);
   } catch (error) {
     console.error("获取专业领域失败", error);
     professionalOptions.value = [];

+ 26 - 3
src/views/lawyerManagement/reconciliation/index.vue

@@ -21,6 +21,7 @@
         >
           <template #tableHeader>
             <el-button type="primary" :icon="Download" :disabled="!canExport" @click="handleExport"> 导出 </el-button>
+            <el-button type="primary" :icon="Download" :disabled="!canExport" @click="handleExportAll"> 全部导出 </el-button>
           </template>
           <template #operation="scope">
             <el-button type="primary" link :icon="EditPen" @click="handleDetail(scope.row)"> 查看详情 </el-button>
@@ -37,7 +38,8 @@ import { useRouter } from "vue-router";
 import type { Course } from "@/api/interface";
 import ProTable from "@/components/ProTable/index.vue";
 import type { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
-import { getAllLawFirmList, getOverview, exportLawFirmReconciliation } from "@/api/modules/lawyer";
+import { getAllLawFirmList, getOverview, exportAllLawFirmList } from "@/api/modules/lawyer";
+import { useDownload } from "@/hooks/useDownload";
 import { useUserStore } from "@/stores/modules/user";
 import { Download, EditPen } from "@element-plus/icons-vue";
 
@@ -180,10 +182,31 @@ const handleDetail = (row: any) => {
   });
 };
 
+const buildExportParams = (override: Record<string, any> = {}) => {
+  const table = proTable.value;
+  const searchParam = table?.searchParam ? { ...table.searchParam } : {};
+  const pageable = table?.pageable
+    ? { pageNum: table.pageable.pageNum, pageSize: table.pageable.pageSize }
+    : { pageNum: 1, pageSize: 10 };
+  const baseParams = {
+    ...searchParam,
+    pageNum: pageable.pageNum,
+    pageSize: pageable.pageSize,
+    ...override
+  };
+  return buildQueryParams(baseParams);
+};
+
 const handleExport = async () => {
   if (!canExport.value) return;
-  const params = { ...(proTable.value?.searchParam || {}) };
-  await exportLawFirmReconciliation(params);
+  const params = buildExportParams();
+  await useDownload(exportAllLawFirmList, "对账数据", params);
+};
+
+const handleExportAll = async () => {
+  if (!canExport.value) return;
+  const params = buildExportParams({ pageNum: 1, pageSize: 999 });
+  await useDownload(exportAllLawFirmList, "对账数据-全部", params);
 };
 
 onMounted(() => {

+ 7 - 4
src/views/lawyerManagement/reconciliation/lawyerDetail.vue

@@ -53,10 +53,11 @@ import type { Course } from "@/api/interface";
 import ProTable from "@/components/ProTable/index.vue";
 import type { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
 import DetailDialog from "./detailDialog.vue";
-import { getLawyerList, getOverview, exportLawFirmReconciliation } from "@/api/modules/lawyer";
+import { getLawyerList, getOverview, exportLawyerListWithName } from "@/api/modules/lawyer";
 import { useUserStore } from "@/stores/modules/user";
 import { Download, EditPen } from "@element-plus/icons-vue";
 import { ElMessage } from "element-plus";
+import { useDownload } from "@/hooks/useDownload";
 
 const proTable = ref<ProTableInstance>();
 const detailDialog = ref<any>(null);
@@ -78,7 +79,7 @@ const summaryData = ref({
 });
 const isAdmin = computed(() => userStore.userInfo?.name === "admin");
 const routeFirmId = computed(() => (route.query.firmId as string) || "");
-const fallbackFirmId = computed(() => userStore.userInfo?.firmId || "");
+const fallbackFirmId = computed(() => userStore.userInfo?.roleId || "");
 const currentFirmId = computed(() => {
   if (routeFirmId.value) return routeFirmId.value;
   if (isAdmin.value) return fallbackFirmId.value;
@@ -205,8 +206,10 @@ const handleExport = async () => {
     ElMessage.warning("暂无可导出的数据");
     return;
   }
-  const params = { ...(proTable.value?.searchParam || {}), firmId: currentFirmId.value };
-  await exportLawFirmReconciliation(params);
+  const params: any = { ...(proTable.value?.searchParam || {}), firmId: currentFirmId.value };
+  params.page = 1;
+  params.size = 10;
+  await useDownload(exportLawyerListWithName, "对账数据", params);
 };
 
 onMounted(() => {

+ 1 - 4
src/views/login/components/LoginForm.vue

@@ -111,12 +111,9 @@ const login = (formEl: FormInstance | undefined) => {
         password: loginForm.password
       };
       const { data } = (await loginApi(loginPayload)) as { data: Login.ResLogin };
-      console.log(data);
       if (data.result) {
         userStore.setToken(data.token);
-        const extraInfo: any = data;
-        const firmId = extraInfo?.firmId ?? extraInfo?.lawFirmId ?? extraInfo?.userInfo?.firmId ?? "";
-        userStore.setUserInfo({ name: loginForm.username, firmId });
+        userStore.setUserInfo({ name: loginForm.username, roleId: data.roleId });
 
         // 2.添加动态路由
         await initDynamicRouter();

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 363 - 0
vite.config.ts.timestamp-1763779417748-5a73f5c2bd2c9.mjs


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio