Forráskód Böngészése

📦 对接审核结果建议汇总接口

快乐的梦鱼 4 hete
szülő
commit
f401bd4175

+ 112 - 0
src/api/collect/AssessmentContent.ts

@@ -716,6 +716,40 @@ export interface IchCheckReviewPayload {
   sendMsg?: boolean;
 }
 
+/** 自查评估表审核(新)请求体(POST /ich/check/reviewOnly) */
+export interface SelfAssessmentReviewOnlyPayload {
+  /** 自查表 ID */
+  checkId: number;
+  /** 审核角色组 ID */
+  groupId: string;
+  /** 退回状态:0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门、省非遗中心退回,5=省文化和旅游厅退回 */
+  rejectType: number;
+  /** 审核退回意见 */
+  rejectReason?: string;
+  /** 评估级别: 1=优秀,2=合格,3=不合格,4=丧失传承能力,5=取消资格 */
+  opinion?: number;
+  /** 评分 */
+  points?: number;
+  /** 发送短信:0=否,1=是 */
+  sendMsg?: number;
+}
+
+/** 自查评估表审核(新)返回结果 */
+export interface SelfAssessmentReviewOnlyResult {
+  /** 操作级别 */
+  operateLevel: number;
+  /** 操作角色组ID */
+  targetGroupId: string;
+  /** 短信内容 */
+  smsInfo: string;
+  /** 是否退回 */
+  isFormalReject: boolean;
+  /** 是否改变进度 */
+  canChangeProgress: boolean;
+  /** 新进度 */
+  newProgress: number;
+}
+
 /** 证明材料修改与新增请求体(POST /ich/check/saveAnnex) */
 export interface SaveCheckAnnexPayload {
   id?: number;
@@ -1048,6 +1082,22 @@ export class AssessmentContentApi extends AppServerRequestModule<DataModel> {
     });
   }
 
+  /**
+   * 自查评估表审核(新)
+   * POST `/ich/check/reviewOnly`
+   */
+  async reviewOnly(payload: SelfAssessmentReviewOnlyPayload) {
+    return this.post<SelfAssessmentReviewOnlyResult>('/ich/check/reviewOnly', '自查评估表审核(新)', {
+      check_id: payload.checkId,
+      group_id: payload.groupId,
+      reject_type: payload.rejectType,
+      reject_reason: payload.rejectReason,
+      opinion: payload.opinion,
+      points: payload.points,
+      send_msg: payload.sendMsg,
+    });
+  }
+
   async downloadSelfAssessmentPdf(id: number) {
     await downloadPdfBlob('/pdf/create', id, this.config.baseUrl, `self-assessment-${id}.pdf`);
   }
@@ -1207,6 +1257,68 @@ export class AssessmentContentApi extends AppServerRequestModule<DataModel> {
     document.body.removeChild(a);
     URL.revokeObjectURL(objectUrl);
   }
+
+  /**
+   * 审核结果建议汇总 PDF 导出
+   * @see pdf/exportSummaryPdf
+   */
+  private buildSummaryPdfUrl(data: { year?: number; level?: string; region?: string }) {
+    const auth = useAuthStore();
+    let url = `${this.config.baseUrl}/pdf/exportSummaryPdf`;
+    url = appendGetUrlParams(url, 'main_body_id', ApiCofig.mainBodyId);
+    url = appendGetUrlParams(url, 'token', auth.token);
+    if (data.year) url = appendGetUrlParams(url, 'year', String(data.year));
+    if (data.level !== undefined && data.level !== '') url = appendGetUrlParams(url, 'level', data.level);
+    if (data.region !== undefined && data.region !== '') url = appendGetUrlParams(url, 'region', data.region);
+    return url;
+  }
+
+  /**
+   * 预览审核结果建议汇总 PDF
+   * @returns PDF Blob URL
+   */
+  async previewSummaryPdf(data: { year?: number; level?: string; region?: string }) {
+    const url = this.buildSummaryPdfUrl(data);
+    const auth = useAuthStore();
+    const res = await fetch(url, {
+      method: 'POST',
+      headers: {
+        token: auth.token,
+        __token__: auth.token,
+      },
+    });
+    if (!res.ok)
+      throw new Error('预览失败,状态码:' + res.status);
+    const blob = await res.blob();
+    return URL.createObjectURL(blob);
+  }
+
+  /**
+   * 下载审核结果建议汇总 PDF
+   */
+  async downloadSummaryPdf(data: { year?: number; level?: string; region?: string }) {
+    const url = this.buildSummaryPdfUrl(data);
+    const auth = useAuthStore();
+    const res = await fetch(url, {
+      method: 'POST',
+      headers: {
+        token: auth.token,
+        __token__: auth.token,
+      },
+    });
+    if (!res.ok)
+      throw new Error('下载失败,状态码:' + res.status);
+    const blob = await res.blob();
+    const objectUrl = URL.createObjectURL(blob);
+    const a = document.createElement('a');
+    a.href = objectUrl;
+    a.download = `审核结果建议汇总-${data.year || '全部'}.pdf`;
+    a.rel = 'noopener';
+    document.body.appendChild(a);
+    a.click();
+    document.body.removeChild(a);
+    URL.revokeObjectURL(objectUrl);
+  }
 }
 
 export default new AssessmentContentApi();

+ 66 - 0
src/pages/collect/assessment/evaluation-form-list-block.vue

@@ -28,6 +28,7 @@
       <div class="flex flex-row items-center gap-2">
         <a-button type="primary" @click="openDownloadModal">打包下载</a-button>
         <a-button @click="openExportExcelModal">导出Excel</a-button>
+        <a-button @click="openSummaryDownloadModal">审核结果汇总下载</a-button>
         <span>{{ progressHint }}</span>
       </div>
     </template>
@@ -113,6 +114,32 @@
       </a-form-item>
     </a-form>
   </a-modal>
+
+  <a-modal
+    v-model:open="showSummaryDownloadModal"
+    title="审核结果汇总下载"
+    @ok="handleSummaryDownload"
+    :confirmLoading="summaryDownloading"
+    okText="下载"
+    cancelText="取消"
+  >
+    <a-form layout="vertical">
+      <a-form-item label="年份">
+        <a-input-number v-model:value="summaryYear" :min="2020" :max="2030" style="width: 100%" />
+      </a-form-item>
+      <a-form-item label="级别">
+        <span v-if="props.level != null">{{ selfAssessmentLevelOptions.find((opt) => opt.id === props.level)?.name }}</span>
+        <a-select v-else v-model:value="summaryLevel" style="width: 100%">
+          <a-select-option v-for="opt in selfAssessmentLevelOptions" :key="opt.id" :value="opt.id">{{ opt.name }}</a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item label="地区">
+        <a-select v-model:value="summaryRegion" style="width: 100%">
+          <a-select-option v-for="opt in selfAssessmentRegionOptions.content.value" :key="opt.id" :value="opt.id">{{ opt.title }}</a-select-option>
+        </a-select>
+      </a-form-item>
+    </a-form>
+  </a-modal>
 </template>
 
 <script setup lang="ts">
@@ -125,6 +152,8 @@ import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
 import  AssessmentContentApi, { SelfAssessmentDetail } from '@/api/collect/AssessmentContent';
 import CommonListBlock, { type DropdownCommonItem } from '@/components/content/CommonListBlock.vue';
 import { LEVEL_NATIONAL, LEVEL_PROVINCE, LEVEL_DISTRICT } from '@/api/collect/AssessmentConsts';
+import { useSimpleDataLoader } from '@/composeables/useSimpleDataLoader';
+import CommonContent from '@/api/CommonContent';
 
 const router = useRouter();
 const route = useRoute();
@@ -146,6 +175,12 @@ const exportYear = ref(new Date().getFullYear() - 1);
 const exportLevel = ref(props.level ?? 0);
 const exportProgress = ref(-100);
 
+const showSummaryDownloadModal = ref(false);
+const summaryDownloading = ref(false);
+const summaryYear = ref(new Date().getFullYear() - 1);
+const summaryLevel = ref(props.level ?? 0);
+const summaryRegion = ref('');
+
 const { variable: lastSelfAssessmentProgress } = useMemorizeVar('adminSelfAssessmentProgress', -100);
 const { variable: lastSelfAssessmentLevel } = useMemorizeVar('adminSelfAssessmentLevel', 0);
 
@@ -158,6 +193,10 @@ const selfAssessmentLevelOptions: DropdownCommonItem[] = [
   { id: LEVEL_DISTRICT, name: '市级' },
 ];
 
+const selfAssessmentRegionOptions = useSimpleDataLoader(() => {
+  return CommonContent.getCategoryChildList(5);
+})
+
 const selfAssessmentProgressOptions: DropdownCommonItem[] = [
   { id: -100, name: '全部状态' },
   { id: -1, name: '未提交' },
@@ -263,6 +302,13 @@ function openExportExcelModal() {
   showExportExcelModal.value = true;
 }
 
+function openSummaryDownloadModal() {
+  summaryYear.value = new Date().getFullYear() - 1;
+  summaryLevel.value = props.level ?? lastSelfAssessmentLevel.value ?? 0;
+  summaryRegion.value = '';
+  showSummaryDownloadModal.value = true;
+}
+
 async function handleExportExcel() {
   exporting.value = true;
   try {
@@ -282,9 +328,29 @@ async function handleExportExcel() {
   }
 }
 
+async function handleSummaryDownload() {
+  summaryDownloading.value = true;
+  try {
+    const level = summaryLevel.value > 0 ? String(summaryLevel.value) : undefined;
+    const region = summaryRegion.value?.trim() || undefined;
+    await AssessmentContentApi.downloadSummaryPdf({
+      year: summaryYear.value,
+      level,
+      region,
+    });
+    showSummaryDownloadModal.value = false;
+    message.success('下载成功');
+  } catch (e: any) {
+    message.error(e?.message || '下载失败');
+  } finally {
+    summaryDownloading.value = false;
+  }
+}
+
 watch(() => props.level, () => {
   list2Ref.value?.reload();
   exportLevel.value = props.level ?? 0;
+  summaryLevel.value = props.level ?? 0;
 }, { immediate: true });
 
 defineExpose({