sgc 2 месяцев назад
Родитель
Сommit
940e24050f

+ 1 - 1
src/api/indexStore.ts

@@ -20,7 +20,7 @@ export interface CustomAxiosRequestConfig extends InternalAxiosRequestConfig {
 
 const config = {
   // 默认地址请求地址,可在 .env.** 文件中修改
-  baseURL: import.meta.env.VITE_API_URL as string,
+  baseURL: import.meta.env.VITE_API_URL_PLATFORM as string,
   // 设置超时时间
   timeout: ResultEnum.TIMEOUT as number,
   // 跨域时候允许携带凭证

+ 114 - 24
src/api/modules/operationManagement.ts

@@ -3,6 +3,66 @@ import { PORT_NONE } from "@/api/config/servicePort";
 import http from "@/api";
 import http_store from "@/api/indexStore";
 import http_ai from "@/api/indexAi";
+import axios from "axios";
+import { ResultEnum } from "@/enums/httpEnum";
+import { useUserStore } from "@/stores/modules/user";
+import { ElMessage } from "element-plus";
+import { LOGIN_URL } from "@/config";
+import router from "@/routers";
+
+// 创建专门用于 STORE API 的 axios 实例(单例)
+const storeAxiosInstance = axios.create({
+  baseURL: import.meta.env.VITE_API_URL_STORE as string,
+  timeout: ResultEnum.TIMEOUT as number,
+  withCredentials: true
+});
+
+// 添加请求拦截器
+storeAxiosInstance.interceptors.request.use(
+  (config: any) => {
+    const userStore = useUserStore();
+    if (config.headers) {
+      config.headers.Authorization = userStore.token;
+    }
+    return config;
+  },
+  (error: any) => {
+    return Promise.reject(error);
+  }
+);
+
+// 添加响应拦截器
+storeAxiosInstance.interceptors.response.use(
+  (response: any) => {
+    const { data } = response;
+    const userStore = useUserStore();
+    
+    // 登录失效
+    if (data.code == ResultEnum.OVERDUE) {
+      userStore.setToken("");
+      router.replace(LOGIN_URL);
+      ElMessage.error(data.msg);
+      return Promise.reject(data);
+    }
+    // 全局错误信息拦截
+    if (data.code && data.code !== ResultEnum.SUCCESS) {
+      ElMessage.error(data.msg);
+      return Promise.reject(data);
+    }
+    return data;
+  },
+  async (error: any) => {
+    const { response } = error;
+    // 请求超时 && 网络错误单独判断
+    if (error.message.indexOf("timeout") !== -1) ElMessage.error("请求超时!请您稍后重试");
+    if (error.message.indexOf("Network Error") !== -1) ElMessage.error("网络错误!请您稍后重试");
+    // 根据服务器响应的错误状态码,做不同的处理
+    if (response?.data?.message) {
+      ElMessage.error(response.data.message);
+    }
+    return Promise.reject(error);
+  }
+);
 
 /**
  * 获取优惠券列表
@@ -95,52 +155,82 @@ export const generatePromotionImage = (params: { text: string }) => {
 };
 
 /**
- * 个人案例列表(上传情况、所属活动等)
- * @param params 请求参数
- * @returns 个人案例列表
+ * 活动案例列表(使用 VITE_API_URL_STORE)
+ * @param params { uploadStatus?: number, activityName?: string, pageNum?: number, pageSize?: number }
+ * @returns 活动案例列表
+ */
+export const getPersonCaseList = (params: {
+  storeId: number;
+  hasResult?: number; // 上传情况:0-未上传,1-已上传(非必填)
+  activityName?: string; // 所属活动/活动名称(非必填)
+  pageNum?: number; // 当前页(非必填)
+  pageSize?: number; // 每页条数(非必填)
+}) => {
+  // 此接口需要使用 VITE_API_URL_STORE,使用专门的 axios 实例
+  return storeAxiosInstance.post<ResPage<any>>(PORT_NONE + `/storeOperationalActivity/achievement/case/store/list`, params );
+};
+
+/**
+ * 查询报名人员列表
+ * @param params { storeId: number, status?: number, activityName?: string, pageNum?: number, pageSize?: number }
+ * @returns 报名人员列表
+ */
+export const getPersonnelList = (params: {
+  storeId: number; // 商户ID(必填)
+  status?: number; // 报名状态: 0-待审核, 1-拒绝, 2-通过(非必填)
+  activityName?: string; // 活动名称(模糊查询)(非必填)
+  pageNum?: number; // 页码,默认值:1(非必填)
+  pageSize?: number; // 每页大小,默认值:10(非必填)
+}) => {
+  return http.post<ResPage<any>>(PORT_NONE + `/operationalActivitySignup/queryList`, params);
+};
+
+/**
+ * 查询案例详情
+ * @param params { activityId: number, userId: number } - 活动ID(必填),用户ID(必填)
+ * @returns 案例详情信息
  */
-export const getPersonCaseList = (params: any) => {
-  return http.post<ResPage<any>>(PORT_NONE + `/operationalActivity/personCase/list`, params);
+export const getPersonCaseDetail = (params: { activityId: number; userId: number }) => {
+  return storeAxiosInstance.get<any>(PORT_NONE + `/storeOperationalActivity/achievement/case/detail`, {params});
 };
 
 /**
- * 个人案例详情(成果展示等)
- * @param params { id: string }
- * @returns 个人案例详情
+ * 查询报名人员详情
+ * @param params { id: number } - 报名ID(必填)
+ * @returns 报名人员详情信息
  */
-export const getPersonCaseDetail = (params: { id: string }) => {
-  return http.get<any>(PORT_NONE + `/operationalActivity/personCase/detail`, params);
+export const getPersonnelDetail = (params: { id: number }) => {
+  return http.post<any>(PORT_NONE + `/operationalActivitySignup/queryById`, params);
 };
 
 /**
  * 审核通过报名人员
- * @param params { id: string }
+ * @param params { id: number } - 报名ID(必填)
  * @returns 审核结果
  */
-export const approvePersonnel = (params: { id: string }) => {
-  return http.post<any>(PORT_NONE + `/operationalActivity/personCase/approve`, params);
+export const approvePersonnel = (params: { id: number }) => {
+  return http.post<any>(PORT_NONE + `/operationalActivitySignup/approve`, params);
 };
 
 /**
  * 审核拒绝报名人员
- * @param params { id: string, rejectReason?: string }
+ * @param params { id: number, rejectReason?: string } - 报名ID(必填),拒绝原因(非必填)
  * @returns 审核结果
  */
-export const rejectPersonnel = (params: { id: string; rejectReason?: string }) => {
-  return http.post<any>(PORT_NONE + `/operationalActivity/personCase/reject`, params);
+export const rejectPersonnel = (params: { id: number; rejectReason?: string }) => {
+  return http.post<any>(PORT_NONE + `/operationalActivitySignup/reject`, params);
 };
 
 /**
  * 上传活动结果
- * @param params { activityId: number, userId: number, signupId: number, achievementDesc?: string, mediaUrls?: string }
- * @returns 上传结果
+ * @param params 
+ * @returns 
  */
 export const uploadActivityResult = (params: {
-  activityId: number;
-  userId: number;
-  signupId: number;
-  achievementDesc?: string;
-  mediaUrls?: string;
+  id: number; // 活动ID(必填)
+  resultType: number; // 结果类型:0-文字,1-图片(必填)
+  resultText?: string; // 结果文字,当resultType=0时使用(非必填)
+  resultMediaUrl?: string; // 结果图片地址,当resultType=1时使用(非必填)
 }) => {
-  return http.post<any>(PORT_NONE + `/storeOperationalActivity/achievement/add`, params);
+  return http.post<any>(PORT_NONE + `/operationalActivity/uploadResult`, params);
 };

+ 5 - 5
src/views/operationManagement/activityDetail.vue

@@ -37,7 +37,7 @@
           </div>
 
           <!-- 评论有礼相关字段 -->
-          <template v-if="activityModel.activityType === 1">
+          <template v-if="activityModel.activityType == 1">
             <!-- 用户可参与次数 -->
             <div class="detail-item">
               <div class="detail-label">用户可参与次数</div>
@@ -69,13 +69,13 @@
           </template>
 
           <!-- 营销活动相关字段 -->
-          <template v-if="activityModel.activityType === 2">
+          <template v-if="activityModel.activityType == 2">
             <!-- 报名时间 -->
             <div class="detail-item">
               <div class="detail-label">报名时间</div>
               <div class="detail-value">
                 <span v-if="activityModel.signupStartTime && activityModel.signupEndTime">
-                  {{ formatDate(activityModel.signupStartTime) }} - {{ formatDate(activityModel.signupEndTime) }}
+                  {{ activityModel.signupStartTime.split(' ')[0] }} - {{ activityModel.signupEndTime.split(' ')[0] }}
                 </span>
                 <span v-else>--</span>
               </div>
@@ -277,8 +277,8 @@ const formatDate = (date: string) => {
  */
 const getActivityTypeLabel = (activityType: number) => {
   const typeMap: Record<number, string> = {
-    1: "评论有礼",
-    2: "营销活动"
+    1: "营销活动",
+    2: "评论有礼"
   };
   return typeMap[activityType] || "--";
 };

+ 129 - 123
src/views/operationManagement/activityList.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="table-box button-table">
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :init-param="initParam" :data-callback="dataCallback">
+    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :init-param="initParam"
+      :data-callback="dataCallback">
       <template #tableHeader="scope">
         <div class="action-buttons">
           <el-button :icon="Plus" class="button" type="primary" @click="newActivity" v-if="type"> 新建活动 </el-button>
@@ -9,37 +10,28 @@
       <!-- 表格操作 -->
       <template #operation="scope">
         <!-- 上架按钮 -->
-        <el-button
-          v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.上架)"
-          link
-          type="primary"
-          @click="changeStatus(scope.row, 1)"
-        >
+        <el-button v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.上架)" link type="primary"
+          @click="changeStatus(scope.row, 1)">
           上架
         </el-button>
         <!-- 下架按钮 -->
-        <el-button
-          v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.下架)"
-          link
-          type="primary"
-          @click="changeStatus(scope.row, 6)"
-        >
+        <el-button v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.下架)" link type="primary"
+          @click="changeStatus(scope.row, 6)">
           下架
         </el-button>
         <!-- 编辑按钮 -->
-        <el-button
-          v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.编辑)"
-          link
-          type="primary"
-          @click="editRow(scope.row)"
-        >
+        <el-button v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.编辑)" link type="primary"
+          @click="editRow(scope.row)">
           编辑
         </el-button>
         <!-- 查看详情按钮 -->
-        <el-button link type="primary" @click="toDetail(scope.row)"> 查看详情 </el-button>
+        <el-button v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.查看详情)" link type="primary"
+          @click="toDetail(scope.row)">
+          查看详情
+        </el-button>
         <!-- 上传活动结果按钮 -->
         <el-button
-          v-if="Number(scope.row.status) === ACTIVITY_STATUS.已结束"
+          v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.上传活动结果) && !hasUploadedResult(scope.row)"
           link
           type="primary"
           @click="openUploadResultDrawer(scope.row)"
@@ -47,21 +39,13 @@
           上传活动结果
         </el-button>
         <!-- 删除按钮 -->
-        <el-button
-          v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.删除)"
-          link
-          type="primary"
-          @click="deleteRow(scope.row)"
-        >
+        <el-button v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.删除)" link type="primary"
+          @click="deleteRow(scope.row)">
           删除
         </el-button>
         <!-- 查看拒绝原因按钮 -->
-        <el-button
-          v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.查看拒绝原因)"
-          link
-          type="primary"
-          @click="viewRejectReason(scope.row)"
-        >
+        <el-button v-if="canShowButton(scope.row.status, OPERATION_PERMISSIONS.查看拒绝原因)" link type="primary"
+          @click="viewRejectReason(scope.row)">
           查看拒绝原因
         </el-button>
       </template>
@@ -96,28 +80,22 @@
         <div class="result-type-section">
           <div class="result-type-label">活动成果</div>
           <el-radio-group v-model="uploadResultForm.resultType">
-            <el-radio :label="1"> 文字 </el-radio>
-            <el-radio :label="2"> 图片 </el-radio>
+            <el-radio :label="0"> 文字 </el-radio>
+            <el-radio :label="1"> 图片 </el-radio>
           </el-radio-group>
         </div>
 
         <!-- 文字输入 -->
-        <div v-if="uploadResultForm.resultType === 1" class="result-content-section">
+        <div v-if="uploadResultForm.resultType === 0" class="result-content-section">
           <div class="result-content-label">文字</div>
-          <el-input
-            v-model="uploadResultForm.textContent"
-            type="textarea"
-            :rows="8"
-            placeholder="请输入"
-            maxlength="1000"
-            show-word-limit
-          />
+          <el-input v-model="uploadResultForm.resultText" type="textarea" :rows="8" placeholder="请输入" maxlength="1000"
+            show-word-limit />
         </div>
 
         <!-- 图片上传 -->
-        <div v-if="uploadResultForm.resultType === 2" class="result-content-section">
+        <div v-if="uploadResultForm.resultType === 1" class="result-content-section">
           <div class="result-content-label">图片</div>
-          <div class="upload-area-wrapper">
+          <div class="upload-area-wrapper" :class="{ 'has-file': resultImageFileList.length >= 1 }">
             <el-upload
               v-model:file-list="resultImageFileList"
               :accept="'.jpg,.jpeg,.png'"
@@ -130,14 +108,9 @@
               :before-remove="handleResultImageBeforeRemove"
               list-type="picture-card"
             >
-              <template #trigger>
-                <div v-if="resultImageFileList.length < 1" class="upload-trigger-card el-upload--picture-card">
-                  <el-icon>
-                    <Plus />
-                  </el-icon>
-                  <div class="upload-count">({{ resultImageFileList.length }}/1)</div>
-                </div>
-              </template>
+              <el-icon>
+                <Plus />
+              </el-icon>
             </el-upload>
           </div>
         </div>
@@ -151,12 +124,8 @@
     </el-drawer>
 
     <!-- 图片预览 -->
-    <el-image-viewer
-      v-if="resultImageViewerVisible"
-      :url-list="resultImageViewerUrlList"
-      :initial-index="resultImageViewerInitialIndex"
-      @close="resultImageViewerVisible = false"
-    />
+    <el-image-viewer v-if="resultImageViewerVisible" :url-list="resultImageViewerUrlList"
+      :initial-index="resultImageViewerInitialIndex" @close="resultImageViewerVisible = false" />
   </div>
 </template>
 
@@ -187,11 +156,10 @@ const rejectReasonData = ref<any>({
 const uploadResultDrawerVisible = ref(false);
 const uploadResultSubmitting = ref(false);
 const currentActivityId = ref<number>(0);
-const currentSignupId = ref<number>(0);
 const uploadResultForm = ref({
-  resultType: 1, // 1-文字,2-图片
-  textContent: "",
-  imageUrl: ""
+  resultType: 0, // 0-文字,1-图片
+  resultText: "",
+  resultMediaUrl: ""
 });
 const resultImageFileList = ref<UploadFile[]>([]);
 const resultImageViewerVisible = ref(false);
@@ -220,20 +188,37 @@ const statusEnum = [
   { label: "审核通过", value: "8" }
 ];
 
-// 操作按钮权限配置
+// 活动类型选项(用于搜索)
+const activityTypeEnum = [
+  { label: "评论有礼", value: 2 },
+  { label: "营销活动", value: 1 }
+];
+
+// 操作按钮权限配置(根据状态-操作映射表)
 const OPERATION_PERMISSIONS = {
   查看详情: [
     ACTIVITY_STATUS.待审核,
     ACTIVITY_STATUS.未开始,
     ACTIVITY_STATUS.进行中,
     ACTIVITY_STATUS.已下架,
-    ACTIVITY_STATUS.已结束
+    ACTIVITY_STATUS.已结束,
+    ACTIVITY_STATUS.审核驳回
   ],
   上架: [ACTIVITY_STATUS.已下架],
   下架: [ACTIVITY_STATUS.进行中],
-  编辑: [ACTIVITY_STATUS.未开始, ACTIVITY_STATUS.审核驳回, ACTIVITY_STATUS.已下架, ACTIVITY_STATUS.已结束],
-  删除: [ACTIVITY_STATUS.未开始, ACTIVITY_STATUS.已结束, ACTIVITY_STATUS.已下架],
-  查看拒绝原因: [ACTIVITY_STATUS.审核驳回]
+  编辑: [
+    ACTIVITY_STATUS.未开始,
+    ACTIVITY_STATUS.审核驳回,
+    ACTIVITY_STATUS.已下架,
+    ACTIVITY_STATUS.已结束
+  ],
+  删除: [
+    ACTIVITY_STATUS.未开始,
+    ACTIVITY_STATUS.已下架,
+    ACTIVITY_STATUS.已结束
+  ],
+  查看拒绝原因: [ACTIVITY_STATUS.审核驳回],
+  上传活动结果: [ACTIVITY_STATUS.已结束]
 } as const;
 
 // 判断按钮是否显示的工具函数
@@ -241,6 +226,22 @@ const canShowButton = (status: number, allowedStatuses: readonly number[]) => {
   return allowedStatuses.includes(status);
 };
 
+// 判断活动是否已上传结果
+const hasUploadedResult = (row: any) => {
+  // 检查是否有结果标识字段(可能的后端返回字段名:hasResult, resultUploaded, achievementUploaded, resultId等)
+  // 或者检查是否有结果内容字段(resultText, resultMediaUrl等)
+  return !!(
+    row.hasResult ||
+    row.resultUploaded ||
+    row.achievementUploaded ||
+    row.resultId ||
+    row.resultText ||
+    row.resultMediaUrl ||
+    row.achievementDesc ||
+    row.mediaUrls
+  );
+};
+
 // 获取状态标签
 const getStatusLabel = (status: number) => {
   const statusMap: Record<number, string> = {
@@ -258,12 +259,30 @@ const getStatusLabel = (status: number) => {
 // 表格列配置
 const columns = reactive<ColumnProps<any>[]>([
   {
+    prop: "activityType",
+    label: "活动类型",
+    width: 120,
+    isShow:false,
+    enum: activityTypeEnum,
+    fieldNames: { label: "label", value: "value" },
+    search: {
+      el: "select",
+      props: { placeholder: "请选择所属活动" },
+      order: 1
+    },
+    render: (scope: any) => {
+      const type = scope.row.activityType;
+      const typeItem = activityTypeEnum.find(item => item.value === type);
+      return typeItem ? typeItem.label : "-";
+    }
+  },
+  {
     prop: "activityName",
-    label: "活动名称"
-    // search: {
-    //   el: "input",
-    //   props: { placeholder: "请输入" }
-    // }
+    label: "活动名称",
+    search: {
+      el: "input",
+      props: { placeholder: "请输入" }
+    }
   },
   {
     prop: "id",
@@ -289,7 +308,7 @@ const columns = reactive<ColumnProps<any>[]>([
   },
   {
     prop: "status",
-    label: "状态",
+    label: "活动状态",
     render: (scope: any) => {
       return getStatusLabel(scope.row.status);
     },
@@ -384,13 +403,10 @@ const closeRejectReasonDialog = () => {
 // 打开上传活动结果抽屉
 const openUploadResultDrawer = (row: any) => {
   currentActivityId.value = Number(row.id);
-  // 假设 signupId 可以从活动数据中获取,如果没有则需要查询或让用户选择
-  // 这里先使用 row.signupId,如果不存在可能需要从其他地方获取
-  currentSignupId.value = row.signupId ? Number(row.signupId) : 0;
   uploadResultForm.value = {
-    resultType: 1,
-    textContent: "",
-    imageUrl: ""
+    resultType: 0, // 默认选择文字
+    resultText: "",
+    resultMediaUrl: ""
   };
   resultImageFileList.value = [];
   uploadResultDrawerVisible.value = true;
@@ -400,9 +416,9 @@ const openUploadResultDrawer = (row: any) => {
 const closeUploadResultDrawer = () => {
   uploadResultDrawerVisible.value = false;
   uploadResultForm.value = {
-    resultType: 1,
-    textContent: "",
-    imageUrl: ""
+    resultType: 0, // 默认选择文字
+    resultText: "",
+    resultMediaUrl: ""
   };
   resultImageFileList.value = [];
 };
@@ -445,7 +461,7 @@ const handleResultImageChange: UploadProps["onChange"] = async (uploadFile: Uplo
       if (imageUrl) {
         uploadFile.status = "success";
         uploadFile.url = imageUrl;
-        uploadResultForm.value.imageUrl = imageUrl;
+        uploadResultForm.value.resultMediaUrl = imageUrl;
       } else {
         throw new Error("上传失败:未获取到图片URL");
       }
@@ -491,51 +507,37 @@ const handleResultImageBeforeRemove: UploadProps["beforeRemove"] = async () => {
 
 // 删除活动结果图片
 const handleResultImageRemove: UploadProps["onRemove"] = () => {
-  uploadResultForm.value.imageUrl = "";
+  uploadResultForm.value.resultMediaUrl = "";
   ElMessage.success("图片已删除");
 };
 
 // 提交上传活动结果
 const submitUploadResult = async () => {
-  if (uploadResultForm.value.resultType === 1) {
+  // 验证必填字段
+  if (uploadResultForm.value.resultType === 0) {
     // 文字类型
-    if (!uploadResultForm.value.textContent || uploadResultForm.value.textContent.trim() === "") {
+    if (!uploadResultForm.value.resultText || uploadResultForm.value.resultText.trim() === "") {
       ElMessage.warning("请输入文字内容");
       return;
     }
-  } else {
+  } else if (uploadResultForm.value.resultType === 1) {
     // 图片类型
-    if (!uploadResultForm.value.imageUrl) {
+    if (!uploadResultForm.value.resultMediaUrl) {
       ElMessage.warning("请上传图片");
       return;
     }
   }
 
-  // 获取用户ID
-  const geekerUser = localGet("geeker-user");
-  const userId = geekerUser?.userInfo?.id || geekerUser?.userInfo?.userId;
-  if (!userId) {
-    ElMessage.error("无法获取用户信息,请重新登录");
-    return;
-  }
-
-  // 检查 signupId
-  if (!currentSignupId.value || currentSignupId.value === 0) {
-    ElMessage.warning("缺少报名ID,无法上传活动结果");
-    return;
-  }
-
   try {
     uploadResultSubmitting.value = true;
     const params: any = {
-      activityId: currentActivityId.value,
-      userId: Number(userId),
-      signupId: currentSignupId.value,
-      achievementDesc: uploadResultForm.value.resultType === 1 ? uploadResultForm.value.textContent : undefined,
-      mediaUrls: uploadResultForm.value.resultType === 2 ? uploadResultForm.value.imageUrl : undefined
+      id: currentActivityId.value, // 活动ID
+      resultType: uploadResultForm.value.resultType, // 0-文字,1-图片
+      resultText: uploadResultForm.value.resultType === 0 ? uploadResultForm.value.resultText : undefined,
+      resultMediaUrl: uploadResultForm.value.resultType === 1 ? uploadResultForm.value.resultMediaUrl : undefined
     };
-    const res = await uploadActivityResult(params);
-    if (res && res.code == 200) {
+    const res: any = await uploadActivityResult(params);
+    if (res.code == 200) {
       ElMessage.success("上传成功");
       closeUploadResultDrawer();
       proTable.value?.getTableList();
@@ -563,18 +565,23 @@ onMounted(async () => {
   flex: 0 0 auto;
   gap: 10px;
   margin-right: 20px;
+
   .button {
     margin-bottom: 0;
   }
 }
+
 .reject-reason-content {
   padding: 20px 0;
+
   .reject-reason-item {
     display: flex;
     margin-bottom: 20px;
+
     &:last-child {
       margin-bottom: 0;
     }
+
     .reject-reason-label {
       flex-shrink: 0;
       min-width: 100px;
@@ -582,11 +589,13 @@ onMounted(async () => {
       font-weight: 500;
       color: #606266;
     }
+
     .reject-reason-value {
       flex: 1;
       font-size: 14px;
       color: #303133;
       word-break: break-word;
+
       &.reject-reason-text {
         min-height: 80px;
         padding: 12px;
@@ -602,8 +611,10 @@ onMounted(async () => {
 // 上传活动结果抽屉样式
 .upload-result-content {
   padding: 20px 0;
+
   .result-type-section {
     margin-bottom: 24px;
+
     .result-type-label {
       margin-bottom: 12px;
       font-size: 14px;
@@ -611,6 +622,7 @@ onMounted(async () => {
       color: #606266;
     }
   }
+
   .result-content-section {
     .result-content-label {
       margin-bottom: 12px;
@@ -618,24 +630,18 @@ onMounted(async () => {
       font-weight: 500;
       color: #606266;
     }
+
     .upload-area-wrapper {
-      .upload-trigger-card {
-        position: relative;
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-        justify-content: center;
-        width: 100%;
-        height: 100%;
-        .upload-count {
-          margin-top: 8px;
-          font-size: 12px;
-          color: #909399;
+      // 当有文件时,隐藏上传框
+      &.has-file {
+        :deep(.el-upload--picture-card) {
+          display: none !important;
         }
       }
     }
   }
 }
+
 .drawer-footer {
   display: flex;
   gap: 12px;

+ 103 - 50
src/views/operationManagement/caseDetail.vue

@@ -6,39 +6,37 @@
     </div>
     <el-card v-loading="loading">
       <template v-if="detail">
-        <el-descriptions :column="2" border>
-          <el-descriptions-item label="所属活动">
-            {{ detail.activityName || detail.activityTitle || "-" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="用户昵称">
-            {{ detail.nickname ?? "------" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="姓名">
-            {{ detail.name ?? "------" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="联系方式">
-            {{ detail.phone || "-" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="报名时间" :span="2">
-            {{ formatTime(detail.registrationTime || detail.signUpTime) }}
-          </el-descriptions-item>
-        </el-descriptions>
-
-        <div class="result-section">
+        <div class="detail-list">
+          <div class="detail-item">
+            <div class="detail-label">所属活动 : {{ detail.activityName || detail.activityTitle || "-" }}</div>
+          </div>
+          <div class="detail-item">
+            <div class="detail-label">用户昵称 : {{ detail.nickName || detail.nickname || "-" }}</div>
+          </div>
+          <div class="detail-item">
+            <div class="detail-label">姓名 : {{ detail.userName || "-" }}</div>
+          </div>
+          <div class="detail-item">
+            <div class="detail-label">联系方式 : {{ detail.phone || "-" }}</div>
+          </div>
+          <div class="detail-item">
+            <div class="detail-label">报名时间 : {{ formatTime(detail.createdTime) }}</div>
+          </div>
+        </div>
+
+        <div class="result-section" v-if="detail.achievementList">
           <div class="result-title">成果展示</div>
-          <el-descriptions :column="2" border>
-            <el-descriptions-item label="更新时间" :span="2">
-              {{ formatTime(detail.updateTime || detail.updatedAt) }}
-            </el-descriptions-item>
-            <el-descriptions-item label="成果描述" :span="2">
-              <div v-if="detail.resultDesc || detail.description" class="result-desc">
-                {{ detail.resultDesc || detail.description }}
-              </div>
-              <span v-else>-</span>
-            </el-descriptions-item>
-            <el-descriptions-item label="图片与视频" :span="2">
-              <div v-if="mediaList.length > 0" class="media-grid">
-                <template v-for="(item, index) in mediaList" :key="index">
+          <div class="detail-list">
+            <div class="detail-item">
+              <div class="detail-label">更新时间 : {{ formatTime(detail.achievementList[0].updatedTime) }}</div>
+            </div>
+            <div class="detail-item">
+              <div class="detail-label">成果描述 : {{ detail.achievementList[0].achievementDesc || '-' }}</div>
+            </div>
+            <div class="detail-item" v-if="detail.achievementList[0].mediaUrlList">
+              <div class="detail-label">图片与视频 :</div>
+              <div class="media-grid">
+                <template v-for="(item, index) in detail.achievementList[0].mediaUrlList" :key="index">
                   <div v-if="item.type === 'video'" class="media-item video-item" @click="playVideo(item.url)">
                     <div class="media-placeholder">
                       <el-icon class="play-icon">
@@ -46,26 +44,25 @@
                       </el-icon>
                     </div>
                   </div>
-                  <div v-else class="media-item image-item" @click="previewImage(item.url, index)">
-                    <el-image
-                      :src="item.url"
-                      fit="cover"
-                      class="media-image"
-                      :preview-src-list="imageList"
-                      :initial-index="getImageIndex(item.url)"
-                    >
+                  <div v-else class="media-item image-item" @click="previewImage(item, index)">
+                    <el-image :src="item" fit="cover" class="media-image"
+                      :preview-src-list="detail.achievementList[0].mediaUrlList" :initial-index="getImageIndex(item)">
                       <template #error>
                         <div class="image-slot">
-                          <el-icon><Picture /></el-icon>
+                          <el-icon>
+                            <Picture />
+                          </el-icon>
                         </div>
                       </template>
                     </el-image>
                   </div>
                 </template>
               </div>
-              <span v-else>-</span>
-            </el-descriptions-item>
-          </el-descriptions>
+            </div>
+            <div class="detail-item" v-else>
+              <div class="detail-label">暂无成果展示</div>
+            </div>
+          </div>
         </div>
       </template>
       <el-empty v-else-if="!loading" description="暂无数据" />
@@ -90,7 +87,8 @@ const detail = ref<any>(null);
 const videoDialogVisible = ref(false);
 const previewVideo = ref("");
 
-const id = computed(() => route.query.id as string);
+const activityId = computed(() => route.query.activityId as string);
+const userId = computed(() => route.query.userId as string);
 
 const goBack = () => {
   router.push({ path: "/operationManagement/cases" });
@@ -117,16 +115,28 @@ type MediaItem = { type: "image" | "video"; url: string };
 const mediaList = computed<MediaItem[]>(() => {
   if (!detail.value) return [];
   const list: MediaItem[] = [];
+
+  // 处理 mediaList 字段(可能是数组或对象数组)
   const raw = detail.value.mediaList ?? detail.value.images ?? detail.value.videos ?? [];
   const arr = Array.isArray(raw) ? raw : [raw];
   for (const it of arr) {
-    if (typeof it === "string") list.push({ type: "image", url: it });
-    else if (it?.url) list.push({ type: it.type === "video" ? "video" : "image", url: it.url });
+    if (typeof it === "string") {
+      list.push({ type: "image", url: it });
+    } else if (it?.url) {
+      list.push({ type: it.type === "video" ? "video" : "image", url: it.url });
+    } else if (it?.mediaUrl) {
+      // 处理 mediaUrl 字段
+      const mediaType = it.mediaType === "video" || it.type === "video" ? "video" : "image";
+      list.push({ type: mediaType, url: it.mediaUrl });
+    }
   }
+
+  // 处理单独的图片和视频数组
   if (detail.value.resultImages && Array.isArray(detail.value.resultImages))
     detail.value.resultImages.forEach((u: string) => list.push({ type: "image", url: u }));
   if (detail.value.resultVideos && Array.isArray(detail.value.resultVideos))
     detail.value.resultVideos.forEach((u: string) => list.push({ type: "video", url: u }));
+
   return list.filter(Boolean);
 });
 
@@ -136,7 +146,7 @@ const getImageIndex = (url: string) => {
   return imageList.value.indexOf(url);
 };
 
-const previewImage = (url: string, index: number) => {
+const previewImage = (url: string, index: any) => {
   // el-image 的 preview-src-list 会自动处理预览
 };
 
@@ -146,10 +156,13 @@ const playVideo = (url: string) => {
 };
 
 onMounted(async () => {
-  if (!id.value) return;
+  if (!activityId.value || !userId.value) return;
   loading.value = true;
   try {
-    const res = await getPersonCaseDetail({ id: id.value });
+    const res = await getPersonCaseDetail({
+      activityId: Number(activityId.value),
+      userId: Number(userId.value)
+    });
     detail.value = res?.data ?? res ?? null;
   } catch {
     detail.value = null;
@@ -165,36 +178,69 @@ onMounted(async () => {
   padding: 16px;
   background: #ffffff;
 }
+
 .header {
   display: flex;
   gap: 16px;
   align-items: center;
   margin-bottom: 16px;
 }
+
 .title {
   margin: 0;
   font-size: 18px;
   font-weight: 600;
 }
+
+.detail-list {
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
+}
+
+.detail-item {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.detail-label {
+  font-size: 14px;
+  color: #606266;
+  font-weight: 500;
+}
+
+.detail-value {
+  font-size: 14px;
+  color: #303133;
+  word-break: break-all;
+}
+
 .result-section {
   margin-top: 24px;
 }
+
 .result-title {
   margin-bottom: 12px;
   font-size: 16px;
   font-weight: 600;
 }
+
 .result-desc {
+  font-size: 14px;
+  color: #303133;
   line-height: 1.6;
   word-break: break-all;
   white-space: pre-wrap;
 }
+
 .media-grid {
   display: grid;
   grid-template-columns: repeat(3, 1fr);
   gap: 12px;
   margin-top: 8px;
 }
+
 .media-item {
   position: relative;
   aspect-ratio: 1;
@@ -203,22 +249,26 @@ onMounted(async () => {
   background: #f5f7fa;
   border-radius: 8px;
 }
+
 .image-item {
   width: 100%;
   height: 100%;
 }
+
 .media-image {
   display: block;
   width: 100%;
   height: 100%;
   object-fit: cover;
 }
+
 .video-item {
   display: flex;
   align-items: center;
   justify-content: center;
   background: #000000;
 }
+
 .media-placeholder {
   display: flex;
   align-items: center;
@@ -227,9 +277,11 @@ onMounted(async () => {
   height: 100%;
   color: #909399;
 }
+
 .play-icon {
   font-size: 40px;
 }
+
 .image-slot {
   display: flex;
   align-items: center;
@@ -239,6 +291,7 @@ onMounted(async () => {
   color: #909399;
   background: #f5f7fa;
 }
+
 .dialog-video {
   display: block;
   width: 100%;

+ 39 - 11
src/views/operationManagement/cases.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="table-box button-table">
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :init-param="initParam" :data-callback="dataCallback">
+    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :init-param="initParam"
+      :data-callback="dataCallback">
       <template #operation="scope">
         <el-button type="primary" link @click="toDetail(scope.row)"> 查看详情 </el-button>
       </template>
@@ -19,29 +20,39 @@ import { localGet } from "@/utils";
 const router = useRouter();
 const proTable = ref<ProTableInstance>();
 
+// 上传情况枚举
 const uploadStatusEnum = [
   { label: "未上传", value: 0 },
   { label: "已上传", value: 1 }
 ];
 
 const columns = reactive<ColumnProps<any>[]>([
-  { prop: "name", label: "姓名", minWidth: 120 },
-  { prop: "phone", label: "联系方式", width: 130 },
+  { prop: "nickName", label: "姓名", minWidth: 300 },
+  { prop: "phone", label: "联系方式", width: 300 },
   {
     prop: "activityName",
     label: "所属活动",
-    minWidth: 140,
-    search: { el: "input", props: { placeholder: "请输入" }, order: 2 }
+    minWidth: 300,
+    search: {
+      el: "input",
+      props: { placeholder: "请输入" },
+      order: 2
+    }
   },
   {
-    prop: "uploadStatus",
+    prop: "hasResult",
     label: "上传情况",
-    width: 110,
+    width: 300,
     enum: uploadStatusEnum,
     fieldNames: { label: "label", value: "value" },
-    search: { el: "select", props: { placeholder: "请选择" }, order: 1 }
+    search: { el: "select", props: { placeholder: "请选择" }, order: 1 },
+    render: (scope: any) => {
+      const status = scope.row.hasResult;
+      const statusItem = uploadStatusEnum.find(item => item.value === status);
+      return statusItem ? statusItem.label : "-";
+    }
   },
-  { prop: "operation", label: "操作", fixed: "right", width: 120 }
+  { prop: "operation", label: "操作", fixed: "right", width: 300 }
 ]);
 
 const initParam = reactive({
@@ -53,9 +64,26 @@ const dataCallback = (data: any) => ({
   total: data?.total ?? 0
 });
 
-const getTableList = (params: any) => getPersonCaseList(params);
+const getTableList = (params: any) => {
+  // 转换参数格式以匹配新接口
+  const newParams: any = {
+    storeId: params.storeId || localGet("createdId"),
+    pageNum: params.page || params.pageNum || 1,
+    pageSize: params.size || params.pageSize || 10
+  };
+
+  // 上传情况筛选(未上传0 / 已上传1)
+  newParams.hasResult = params.hasResult;
+
+  // 所属活动(活动名称)筛选
+  if (params.activityName) {
+    newParams.activityName = params.activityName.trim();
+  }
+
+  return getPersonCaseList(newParams);
+};
 
 const toDetail = (row: any) => {
-  router.push(`/operationManagement/caseDetail?id=${row.id}`);
+  router.push(`/operationManagement/caseDetail?activityId=${row.activityId}&userId=${row.userId}`);
 };
 </script>

+ 1 - 1
src/views/operationManagement/newActivity.vue

@@ -12,8 +12,8 @@
             <!-- 活动类型 -->
             <el-form-item label="活动类型" prop="activityType">
               <el-select v-model="activityModel.activityType" class="form-input" clearable placeholder="请选择">
-                <el-option label="营销活动" :value="1" />
                 <el-option label="评论有礼" :value="2" />
+                <el-option label="营销活动" :value="1" />
               </el-select>
             </el-form-item>
 

+ 69 - 32
src/views/operationManagement/personnel.vue

@@ -1,10 +1,11 @@
 <template>
   <div class="table-box button-table">
-    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :init-param="initParam" :data-callback="dataCallback">
+    <ProTable ref="proTable" :columns="columns" :request-api="getTableList" :init-param="initParam"
+      :data-callback="dataCallback">
       <template #operation="scope">
         <el-button type="primary" link @click="toDetail(scope.row)"> 查看详情 </el-button>
         <!-- 待审核状态显示通过和拒绝按钮 -->
-        <template v-if="isPending(scope.row.auditStatus || scope.row.status)">
+        <template v-if="scope.row.status == 0">
           <el-button type="success" link @click="handleApprove(scope.row)"> 通过 </el-button>
           <el-button type="danger" link @click="handleReject(scope.row)"> 拒绝 </el-button>
         </template>
@@ -19,43 +20,49 @@ import { useRouter } from "vue-router";
 import { ElMessage, ElMessageBox } from "element-plus";
 import ProTable from "@/components/ProTable/index.vue";
 import { ColumnProps, ProTableInstance } from "@/components/ProTable/interface";
-import { getPersonCaseList, approvePersonnel, rejectPersonnel } from "@/api/modules/operationManagement";
+import { getPersonnelList, approvePersonnel, rejectPersonnel } from "@/api/modules/operationManagement";
 import { localGet } from "@/utils";
 
 const router = useRouter();
 const proTable = ref<ProTableInstance>();
 
-// 报名情况枚举:通过(1)、拒绝(2)、待审核(0或null)
+// 报名情况枚举:0-待审核, 1-拒绝, 2-通过
 const registrationStatusEnum = [
-  { label: "通过", value: 1 },
-  { label: "拒绝", value: 2 },
-  { label: "待审核", value: 0 }
+  { label: "待审核", value: 0 },
+  { label: "拒绝", value: 1 },
+  { label: "通过", value: 2 }
 ];
 
 const columns = reactive<ColumnProps<any>[]>([
-  { prop: "name", label: "姓名", minWidth: 120 },
-  { prop: "phone", label: "联系方式", width: 130 },
+  { prop: "userName", label: "姓名", minWidth: 220 },
+  { prop: "phone", label: "联系方式", width: 300 },
   {
     prop: "activityName",
     label: "所属活动",
-    minWidth: 140,
-    search: { el: "input", props: { placeholder: "请输入" }, order: 2 }
+    width: 300,
+    fieldNames: { label: "label", value: "value" },
+    search: {
+      el: "input",
+      props: { placeholder: "请输入活动名称" },
+      order: 2
+    },
   },
   {
-    prop: "auditStatus",
+    prop: "status",
     label: "报名情况",
-    width: 110,
+    width: 300,
     enum: registrationStatusEnum,
     fieldNames: { label: "label", value: "value" },
     search: { el: "select", props: { placeholder: "请选择" }, order: 1 },
     render: (scope: any) => {
-      const status = scope.row.auditStatus ?? scope.row.status;
-      if (status === 1 || status === "1" || status === "通过") return "通过";
-      if (status === 2 || status === "2" || status === "拒绝") return "拒绝";
+      // 状态值:0-待审核, 1-拒绝, 2-通过
+      const status = scope.row.status;
+      if (status == 2) return "通过";
+      if (status == 1) return "拒绝";
       return "待审核";
     }
   },
-  { prop: "operation", label: "操作", fixed: "right", width: 200 }
+  { prop: "operation", label: "操作", fixed: "right", minWidth: 200 }
 ]);
 
 const initParam = reactive({
@@ -67,17 +74,34 @@ const dataCallback = (data: any) => ({
   total: data?.total ?? 0
 });
 
-const getTableList = (params: any) => getPersonCaseList(params);
+const getTableList = (params: any) => {
+  // 转换参数格式以匹配新接口
+  const newParams: any = {
+    storeId: params.storeId || localGet("createdId"),
+    pageNum: params.page || params.pageNum || 1,
+    pageSize: params.size || params.pageSize || 10
+  };
 
-const toDetail = (row: any) => {
-  router.push(`/operationManagement/personnelDetail?id=${row.id}`);
+  // 如果有状态筛选,添加状态参数(注意:搜索字段名是 status)
+  if (params.status) {
+    newParams.status = params.status;
+  }
+
+  // 如果有活动类型筛选,添加活动类型参数
+  if (params.activityType) {
+    newParams.activityType = params.activityType;
+  }
+
+  // 如果有活动名称筛选,添加活动名称参数
+  if (params.activityName) {
+    newParams.activityName = params.activityName;
+  }
+
+  return getPersonnelList(newParams);
 };
 
-// 判断是否为待审核状态
-const isPending = (status: number | string | null | undefined) => {
-  if (status === null || status === undefined) return true;
-  const statusNum = Number(status);
-  return statusNum === 0 || status === "0" || status === "待审核";
+const toDetail = (row: any) => {
+  router.push(`/operationManagement/personnelDetail?id=${row.id}`);
 };
 
 // 审核通过
@@ -88,8 +112,8 @@ const handleApprove = async (row: any) => {
       cancelButtonText: "取消",
       type: "warning"
     });
-    const res = await approvePersonnel({ id: row.id });
-    if (res.code === 200 || res.code === "200") {
+    const res: any = await approvePersonnel({ id: Number(row.id) });
+    if (res.code == 200) {
       ElMessage.success("审核通过成功");
       proTable.value?.getTableList();
     } else {
@@ -109,13 +133,26 @@ const handleReject = async (row: any) => {
       confirmButtonText: "确定",
       cancelButtonText: "取消",
       inputType: "textarea",
-      inputPlaceholder: "请输入拒绝原因"
+      inputPlaceholder: "请输入拒绝原因",
+      inputValidator: (value: string) => {
+        if (!value || value.trim() === "") {
+          return "拒绝原因不能为空";
+        }
+        return true;
+      }
     });
-    const res = await rejectPersonnel({
-      id: row.id,
-      rejectReason: rejectReason || ""
+    
+    // 再次验证拒绝原因(防止用户绕过验证)
+    if (!rejectReason || rejectReason.trim() === "") {
+      ElMessage.warning("拒绝原因不能为空");
+      return;
+    }
+    
+    const res: any = await rejectPersonnel({
+      id: Number(row.id),
+      rejectReason: rejectReason.trim()
     });
-    if (res.code === 200 || res.code === "200") {
+    if (res.code == 200) {
       ElMessage.success("审核拒绝成功");
       proTable.value?.getTableList();
     } else {

+ 68 - 69
src/views/operationManagement/personnelDetail.vue

@@ -6,48 +6,40 @@
     </div>
     <el-card v-loading="loading">
       <template v-if="detail">
-        <el-descriptions :column="2" border>
-          <el-descriptions-item label="所属活动">
-            {{ detail.activityName || detail.activityTitle || "-" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="用户昵称">
-            {{ detail.nickname ?? "------" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="姓名">
-            {{ detail.name ?? "------" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="联系方式">
-            {{ detail.phone || "-" }}
-          </el-descriptions-item>
-          <el-descriptions-item label="报名时间" :span="2">
-            {{ formatTime(detail.registrationTime || detail.signUpTime) }}
-          </el-descriptions-item>
-        </el-descriptions>
-
-        <!-- 审核状态部分 -->
-        <div class="audit-section">
-          <el-descriptions :column="2" border>
-            <el-descriptions-item label="审核状态" :span="2">
-              <el-tag :type="getAuditStatusType(detail.auditStatus || detail.status)" size="default">
-                {{ getAuditStatusText(detail.auditStatus || detail.status) }}
-              </el-tag>
-            </el-descriptions-item>
-            <!-- 审核通过:显示审核时间 -->
-            <template v-if="isAuditApproved(detail.auditStatus || detail.status)">
-              <el-descriptions-item label="审核时间" :span="2">
-                {{ formatTime(detail.auditTime || detail.approvedTime) }}
-              </el-descriptions-item>
-            </template>
-            <!-- 审核拒绝:显示审核拒绝原因和审核时间 -->
-            <template v-if="isAuditRejected(detail.auditStatus || detail.status)">
-              <el-descriptions-item label="审核拒绝原因" :span="2">
-                {{ detail.rejectReason || detail.auditReason || "-" }}
-              </el-descriptions-item>
-              <el-descriptions-item label="审核时间" :span="2">
-                {{ formatTime(detail.auditTime || detail.rejectedTime) }}
-              </el-descriptions-item>
-            </template>
-          </el-descriptions>
+        <div class="detail-list">
+          <div class="detail-item">
+            <div class="detail-label">所属活动 : {{ detail.activityName || "-" }}</div>
+          </div>
+          <div class="detail-item">
+            <div class="detail-label">用户昵称 : {{ detail.nickName || detail.nickname || "-" }}</div>
+          </div>
+          <div class="detail-item">
+            <div class="detail-label">姓名 : {{ detail.userName || "-" }}</div>
+          </div>
+          <div class="detail-item">
+            <div class="detail-label">联系方式 : {{ detail.phone || "-" }}</div>
+          </div>
+          <div class="detail-item">
+            <div class="detail-label">报名时间 : {{ formatTime(detail.signupTime) }}</div>
+          </div>
+          <div class="detail-item">
+            <div class="detail-label">审核状态 : {{ getAuditStatusText(detail.status) }}</div>
+          </div>
+          <!-- 审核通过:显示审核时间 -->
+          <template v-if="detail.status == 2">
+            <div class="detail-item">
+              <div class="detail-label">审核时间 : {{ formatTime(detail.auditTime) }}</div>
+            </div>
+          </template>
+          <!-- 审核拒绝:显示审核拒绝原因和审核时间 -->
+          <template v-if="detail.status == 1">
+            <div class="detail-item">
+              <div class="detail-label">审核拒绝原因 : {{ detail.rejectReason || "-" }}</div>
+            </div>
+            <div class="detail-item">
+              <div class="detail-label">审核时间 : {{ formatTime(detail.auditTime) }}</div>
+            </div>
+          </template>
         </div>
       </template>
       <el-empty v-else-if="!loading" description="暂无数据" />
@@ -58,7 +50,7 @@
 <script setup lang="ts" name="personnelDetail">
 import { ref, onMounted, computed } from "vue";
 import { useRoute, useRouter } from "vue-router";
-import { getPersonCaseDetail } from "@/api/modules/operationManagement";
+import { getPersonnelDetail } from "@/api/modules/operationManagement";
 
 const route = useRoute();
 const router = useRouter();
@@ -87,40 +79,24 @@ const formatTime = (time: string | null | undefined) => {
   }
 };
 
-// 审核状态相关函数
-const getAuditStatusText = (status: number | string | null | undefined) => {
-  if (status === null || status === undefined) return "待审核";
-  const statusNum = Number(status);
-  if (statusNum === 1 || status === "1" || status === "审核通过") return "审核通过";
-  if (statusNum === 2 || status === "2" || status === "审核拒绝") return "审核拒绝";
+// 审核状态相关函数(状态值:0-待审核, 1-拒绝, 2-通过)
+const getAuditStatusText = (status: number | string) => {
+  if (status == "2") return "通过";
+  if (status == "1") return "拒绝";
   return "待审核";
 };
 
-const getAuditStatusType = (status: number | string | null | undefined) => {
-  if (status === null || status === undefined) return "info";
-  const statusNum = Number(status);
-  if (statusNum === 1 || status === "1" || status === "审核通过") return "success";
-  if (statusNum === 2 || status === "2" || status === "审核拒绝") return "danger";
+const getAuditStatusType = (status: number | string) => {
+  if (status == "2") return "success";
+  if (status == "1") return "danger";
   return "info";
 };
 
-const isAuditApproved = (status: number | string | null | undefined) => {
-  if (status === null || status === undefined) return false;
-  const statusNum = Number(status);
-  return statusNum === 1 || status === "1" || status === "审核通过";
-};
-
-const isAuditRejected = (status: number | string | null | undefined) => {
-  if (status === null || status === undefined) return false;
-  const statusNum = Number(status);
-  return statusNum === 2 || status === "2" || status === "审核拒绝";
-};
-
 onMounted(async () => {
   if (!id.value) return;
   loading.value = true;
   try {
-    const res = await getPersonCaseDetail({ id: id.value });
+    const res = await getPersonnelDetail({ id: Number(id.value) });
     detail.value = res?.data ?? res ?? null;
   } catch {
     detail.value = null;
@@ -136,18 +112,41 @@ onMounted(async () => {
   padding: 16px;
   background: #ffffff;
 }
+
 .header {
   display: flex;
   gap: 16px;
   align-items: center;
   margin-bottom: 16px;
 }
+
 .title {
   margin: 0;
   font-size: 18px;
   font-weight: 600;
 }
-.audit-section {
-  margin-top: 24px;
+
+.detail-list {
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
+}
+
+.detail-item {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.detail-label {
+  font-size: 14px;
+  color: #606266;
+  font-weight: 500;
+}
+
+.detail-value {
+  font-size: 14px;
+  color: #303133;
+  word-break: break-all;
 }
 </style>