fix(aihr): align app case permissions with brd

This commit is contained in:
2026-07-14 11:15:07 +08:00
parent 7c3d367421
commit b8be1bb6e4
9 changed files with 51 additions and 3 deletions
+24 -2
View File
@@ -25,7 +25,7 @@
<button class="primary-button login-button" @click="goLogin">去登录</button>
</view>
<view v-else class="panel">
<view v-else-if="canSubmitCases" class="panel">
<text class="panel-title">提交素材</text>
<view class="file-box" :class="{ 'has-file': Boolean(selectedFile) }">
<text class="file-title">{{ selectedFile?.name || '未选择音频' }}</text>
@@ -39,6 +39,11 @@
</view>
</view>
<view v-else-if="loggedIn" class="panel permission-panel">
<text class="panel-title">案例学习</text>
<text class="muted block">当前岗位可查看本项目已入库案例;提交案例素材需要主管或项目负责人权限。</text>
</view>
<view v-if="uploadResult" class="panel">
<text class="panel-title">ASR 转写</text>
<view class="tag-row">
@@ -117,7 +122,7 @@
import { computed, ref } from 'vue';
import { onShow } from '@dcloudio/uni-app';
import type { CaseCurateResponse, CaseDetailResponse, CaseOrganizeResponse, CaseRecord, CaseSelectedFile, CaseUploadResponse } from '@/types/api';
import { chooseCaseAudio, curateCase, getCaseDetail, getCaseRecords, organizeCase, uploadCaseAudio } from '@/services/case';
import { chooseCaseAudio, curateCase, getCaseCapabilities, getCaseDetail, getCaseRecords, organizeCase, uploadCaseAudio } from '@/services/case';
import { isLoggedIn, rememberLoginRedirect } from '@/services/auth';
import { navigateBackToToday, resetPageScroll } from '@/services/navigation';
import { ensureEmployeePosition } from '@/services/position';
@@ -129,6 +134,7 @@ const organizeResult = ref<CaseOrganizeResponse | null>(null);
const curateResult = ref<CaseCurateResponse | null>(null);
const records = ref<CaseRecord[]>([]);
const caseDetail = ref<CaseDetailResponse | null>(null);
const canSubmitCases = ref(false);
const status = ref<'idle' | 'uploading' | 'organizing' | 'curating'>('idle');
const recordsLoading = ref(false);
const caseDetailLoading = ref(false);
@@ -151,6 +157,7 @@ const clearCaseData = () => {
selectedFile.value = null;
records.value = [];
caseDetail.value = null;
canSubmitCases.value = false;
resetResult();
};
@@ -196,6 +203,20 @@ const loadRecords = async () => {
}
};
const loadCaseCapabilities = async () => {
if (!loggedIn.value) {
canSubmitCases.value = false;
return;
}
try {
const capabilities = await getCaseCapabilities();
canSubmitCases.value = Boolean(capabilities.canSubmit);
} catch (error) {
canSubmitCases.value = false;
handleRequestError(error, '案例权限加载失败', true);
}
};
const refreshRecords = () => {
if (!loggedIn.value) {
goLogin();
@@ -256,6 +277,7 @@ const handleShow = async () => {
if (!(await ensureEmployeePosition('/pages/user/cases/index'))) {
return;
}
void loadCaseCapabilities();
void loadRecords();
} else {
clearCaseData();
+8
View File
@@ -1,5 +1,6 @@
import type {
CaseCurateResponse,
CaseCapabilities,
CaseDetailResponse,
CaseOrganizeResponse,
CaseRecord,
@@ -73,6 +74,13 @@ export const curateCase = (caseId: string) =>
timeout: 30000
});
export const getCaseCapabilities = () =>
apiRequest<CaseCapabilities>({
url: '/api/knowledge/case/capabilities',
method: 'GET',
timeout: 15000
});
export const getCaseRecords = () =>
apiRequest<CaseRecord[]>({
url: '/api/knowledge/case/records?limit=10',
+5
View File
@@ -105,6 +105,11 @@ export interface KnowledgeSearchResponse {
reviewId?: number | null;
}
export interface CaseCapabilities {
canSubmit: boolean;
canView: boolean;
}
export interface PositionSopTopic {
category: string;
question: string;