Bläddra i källkod

📦 按要求增加自查评估表传承协议列表状态合并显示

快乐的梦鱼 2 veckor sedan
förälder
incheckning
87f7df18f7

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

@@ -158,6 +158,8 @@ export class UserAgreementListRow extends DataModel<UserAgreementListRow> {
       progress: { clientSide: 'number', serverSide: 'number' },
       level: { clientSide: 'number', serverSide: 'string' },
       rejectType: { clientSide: 'number', serverSide: 'number' },
+      checkFormId: { clientSide: 'number', serverSide: 'number' },
+      checkFormProgress: { clientSide: 'number', serverSide: 'number' },
     };
     this._convertKeyType = (key) => {
       if (key.endsWith('Text') || key.endsWith('_text')) {
@@ -205,6 +207,10 @@ export class UserAgreementListRow extends DataModel<UserAgreementListRow> {
   /** 退回状态: 0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门/省非遗中心退回,5=省文化和旅游厅退回 */
   rejectType = null as number|null;
   rejectReason = '' as string|null;
+  /** 已填写的自查评估表记录 ID */
+  checkFormId = null as number|null;
+  /** 自查评估表进度 */
+  checkFormProgress = null as number|null;
   createtime = '' as string|null;
   updatetime = '' as string|null;
   deletetime = '' as string|null;
@@ -240,6 +246,8 @@ export class InheritorCheckListRow extends DataModel<InheritorCheckListRow> {
       progress: { clientSide: 'number', serverSide: 'number' },
       level: { clientSide: 'number', serverSide: 'string' },
       rejectType: { clientSide: 'number', serverSide: 'number' },
+      agreementId: { clientSide: 'number', serverSide: 'number' },
+      agreementProgress: { clientSide: 'number', serverSide: 'number' },
     };
     this._convertKeyType = (key) => {
       if (key.endsWith('Text') || key.endsWith('_text')) {
@@ -289,6 +297,10 @@ export class InheritorCheckListRow extends DataModel<InheritorCheckListRow> {
   /** 退回状态: 0=无,1=自评阶段退回,2=项目保护单位退回,3=县(区)文旅部门退回,4=设区市文旅部门/省非遗中心退回,5=省文化和旅游厅退回 */
   rejectType = null as number|null;
   rejectReason = '' as string|null;
+  /** 已填写的传承协议记录 ID */
+  agreementId = null as number|null;
+  /** 传承协议进度: 0=草稿,1=已自评,2=项目保护单位审核完成,3=县(区)文旅部门审核完成,4=设区市文旅部门、省非遗中心审核完成,5=省文化和旅游厅审核完成 */
+  agreementProgress = null as number|null;
   flagText = '' as string;
   typeText = '' as string;
   openStatusText = '' as string;
@@ -976,6 +988,8 @@ export class AssessmentContentApi extends AppServerRequestModule<DataModel> {
     keywords?: string;
     page?: number;
     pageSize?: number;
+    checkFormId?: number;
+    checkFormProgress?: number;
   }) {
     const res = await this.post<KeyValue>('/ich/check/getUserAgreement', '传承人传承协议列表', {
       user_id: data.userId,
@@ -985,6 +999,8 @@ export class AssessmentContentApi extends AppServerRequestModule<DataModel> {
       keywords: data.keywords,
       page: data.page,
       pageSize: data.pageSize,
+      check_form_id: data.checkFormId,
+      check_form_progress: data.checkFormProgress,
     });
     return normalizePaginated<UserAgreementListRow>(UserAgreementListRow, res.requireData());
   }
@@ -1030,6 +1046,8 @@ export class AssessmentContentApi extends AppServerRequestModule<DataModel> {
     page?: number;
     pageSize?: number;
     logStatus?: number;
+    agreementId?: number;
+    agreementProgress?: number;
   }) {
     const res = await this.post<KeyValue>('/ich/check/getInheritorList', '传承人列表', {
       user_id: data.userId,
@@ -1040,6 +1058,8 @@ export class AssessmentContentApi extends AppServerRequestModule<DataModel> {
       page: data.page,
       pageSize: data.pageSize,
       log_status: data.logStatus,
+      agreement_id: data.agreementId,
+      agreement_progress: data.agreementProgress,
     });
     return normalizePaginated<InheritorCheckListRow>(InheritorCheckListRow, res.requireData());
   }

+ 1 - 1
src/assets/scss/colors.scss

@@ -12,7 +12,7 @@ $text-content-color: #654A38;
 $text-content-second-color: rgba(101, 74, 56, 0.6);
 
 $selection-max-width: 980px;
-$selection-max-width-large: 1280px;
+$selection-max-width-large: 1400px;
 
 $border-split-color:rgb(236, 236, 236);
 $border-grey-color: #b3b3b3;

+ 4 - 4
src/pages/admin.vue

@@ -121,13 +121,13 @@
           </a-tab-pane>
           <a-tab-pane key="7" tab="区级非遗传承人">
             <a-empty description="暂无数据" />
-          </a-tab-pane> -->
-          <a-tab-pane key="9" tab="传承协议签署">
-            <AgreementSignList ref="listRef" />
-          </a-tab-pane>
+          </a-tab-pane>  -->
           <a-tab-pane key="8" tab="自查评估表">
             <EvaluationFormList ref="listRef" />
           </a-tab-pane>
+          <a-tab-pane key="9" tab="传承协议">
+            <AgreementSignList ref="listRef" />
+          </a-tab-pane>
           <a-tab-pane v-if="false" key="4" tab="重点区域">
             <div class="flex justify-end">
               <a-button type="primary" :disabled="true" @click="router.push({ name: 'FormWork' })">+ 新增</a-button>

+ 104 - 26
src/pages/collect/assessment/argeement-sign-list.vue

@@ -46,33 +46,76 @@
       </div>
     </template>
     <template #itemRight="{ item }">
-      <a-popover v-if="item.rejectType && item.rejectType > 0" title="退回原因" trigger="hover">
-        <template #content>
-          <div style="max-width: 300px">{{ item.rejectReason || '无' }}</div>
-        </template>
-        <span class="mr-3 text-sm" style="color: #f5222d; cursor: pointer;">
-          <ExclamationCircleOutlined /> 已退回
-        </span>
-      </a-popover>
-      <span v-else class="mr-3 text-sm text-gray-600">{{ agreementProgressLabel(item.progress) }}</span>
-      <a-button type="link" @click.stop="handleEdit(item)">编辑</a-button>
-      <div v-if="item.agreementId && canReviewButPrevNotCompleted(item.progress)" class="flex flex-row items-center mr-3 text-sm">
-        <ExclamationCircleOutlined /> 上一阶段未审核完成
+      <div class="flex flex-col md:flex-row md:items-center shrink-0 mt-3 md:mt-2">
+        <!-- 自查评估表 状态与审核 -->
+        <div class="relative flex flex-row items-center flex-wrap">
+
+          <span class="text-xs text-gray-300 absolute -top-2 left-0">自查评估表状态</span>
+          <span 
+            class="text-sm text-gray-600 truncate max-w-35"
+            :title="checkFormProgressLabel(item.checkFormProgress)"
+          >
+            {{ checkFormProgressLabel(item.checkFormProgress) }}
+          </span>
+          <a-button type="link" @click.stop="handleEditCheckForm(item)">编辑</a-button>
+          <div v-if="item.checkFormId && canReviewButPrevNotCompleted(item.checkFormProgress)" class="flex flex-row items-center text-sm">
+            <ExclamationCircleOutlined /> 上一阶段未完成
+          </div>
+          <a-button
+            type="primary"
+            v-else-if="item.checkFormId && canReview(item.checkFormProgress)"
+            @click.stop="handleReviewCheckForm(item)"
+          >
+            审核
+          </a-button>
+          <a-button
+            type="primary"
+            disabled
+            v-else-if="item.checkFormId && isCurrentLevelReviewed(item.checkFormProgress)"
+          >
+            已审核
+          </a-button>
+        </div>
+        <!-- 分隔线(移动端横向 / 桌面端竖向) -->
+        <div class="my-3 border-t border-gray-300 md:my-0 md:mx-3 md:border-t-0 md:border-l md:h-6"></div>
+        <!-- 传承协议 状态与审核 -->
+        <div class="relative flex flex-row items-center flex-wrap">
+
+          <span class="text-xs text-gray-300 absolute -top-2 left-0">传承协议状态</span>
+          <a-popover v-if="item.rejectType && item.rejectType > 0" title="退回原因" trigger="hover">
+            <template #content>
+              <div style="max-width: 300px">{{ item.rejectReason || '无' }}</div>
+            </template>
+            <span class="text-sm" style="color: #f5222d; cursor: pointer;">
+              <ExclamationCircleOutlined /> 已退回
+            </span>
+          </a-popover>
+          <span v-else 
+            class="text-sm text-gray-600 truncate max-w-35"
+            :title="agreementProgressLabel(item.progress)"
+          >
+            {{ agreementProgressLabel(item.progress) }}
+          </span>
+          <a-button type="link" @click.stop="handleEdit(item)">编辑</a-button>
+          <div v-if="item.agreementId && canReviewButPrevNotCompleted(item.progress)" class="flex flex-row items-center text-sm">
+            <ExclamationCircleOutlined /> 上一阶段未完成
+          </div>
+          <a-button
+            type="primary"
+            v-else-if="item.agreementId && canReview(item.progress)"
+            @click.stop="handleReview(item)"
+          >
+            审核
+          </a-button>
+          <a-button
+            type="primary"
+            disabled
+            v-else-if="item.agreementId && isCurrentLevelReviewed(item.progress)"
+          >
+            已审核
+          </a-button>
+        </div>
       </div>
-      <a-button
-        type="primary"
-        v-else-if="item.agreementId && canReview(item.progress)"
-        @click.stop="handleReview(item)"
-      >
-        审核
-      </a-button>
-      <a-button
-        type="primary"
-        disabled
-        v-else-if="item.agreementId && isCurrentLevelReviewed(item.progress)"
-      >
-        已审核
-      </a-button>
     </template>
   </CommonListBlock>
 </template>
@@ -195,6 +238,41 @@ function agreementProgressLabel(progress: number | null | undefined) {
   return hit?.name ?? `进度 ${progress}`;
 }
 
+const checkFormProgressLabels: Record<number, string> = {
+  [-1]: '未提交',
+  [0]: '草稿',
+  [1]: '已提交审核',
+  [2]: '项目保护单位审核完成',
+  [3]: '县(区)文旅部门审核完成',
+  [4]: '设区市文旅部门/省非遗中心审核完成',
+  [5]: '省文化和旅游厅审核完成',
+};
+
+function checkFormProgressLabel(progress: number | null | undefined) {
+  if (progress === null || progress === undefined)
+    return '未填写';
+  return checkFormProgressLabels[progress] ?? `进度 ${progress}`;
+}
+
+function handleEditCheckForm(item: any) {
+  router.push({
+    name: 'CollectEvaluationForm',
+    query: { id: item.checkFormId ?? 0, userId: item.userId ?? 0 },
+  });
+}
+
+function handleReviewCheckForm(item: any) {
+  if (!item.checkFormId || !item.userId) return;
+  router.push({
+    name: 'CollectEvaluationFormReview',
+    query: {
+      id: String(item.checkFormId),
+      userId: String(item.userId),
+      ...(item.checkFormProgress != null ? { progress: String(item.checkFormProgress) } : {}),
+    },
+  });
+}
+
 async function loadAgreementSignAdminList(page: number, pageSize: number, searchText: string, dropDownValues: number[]) {
   const pv = dropDownValues?.[0];
   const lv = dropDownValues?.[1];

+ 112 - 37
src/pages/collect/assessment/evaluation-form-list-block.vue

@@ -26,7 +26,7 @@
   >
     <template #headLeft>
       <div class="flex flex-col gap-2">
-        <div class="flex flex-row items-center gap-2">
+        <div class="flex flex-row items-center gap-2 flex-wrap">
           <a-button type="primary" @click="openDownloadModal">打包下载</a-button>
           <a-button @click="openExportExcelModal">导出Excel</a-button>
           <a-button @click="openSummaryDownloadModal">审核结果汇总下载</a-button>
@@ -35,39 +35,78 @@
       </div>
     </template>
     <template #itemRight="{ item }">
-      <a-popover v-if="item.rejectType && item.rejectType > 0" title="退回原因" trigger="hover">
-        <template #content>
-          <div style="max-width: 300px">{{ item.rejectReason || '无' }}</div>
-        </template>
-        <span class="mr-3 text-sm" style="color: #f5222d; cursor: pointer;">
-          <ExclamationCircleOutlined /> 已退回
-        </span>
-      </a-popover>
-      <span 
-        v-else 
-        class="mr-3 text-sm text-gray-600"
-      >
-        {{ selfAssessmentProgressLabel(item.progress) }}
-      </span>
-      <a-button type="link" @click.stop="router.push({ name: 'CollectEvaluationForm', query: { id: item.checkId ?? item.id, userId: item.userId } })">编辑</a-button>
-      
-      <div v-if="item.checkId && canReviewButPrevNotCompleted(item.progress)" class="flex flex-row items-center mr-3 text-sm">
-        <ExclamationCircleOutlined /> 上一阶段未审核完成
+      <div class="flex flex-col md:flex-row md:items-center shrink-0 mt-3 md:mt-2">
+        <!-- 传承协议 状态与审核 -->
+        <div class="relative flex flex-row items-center flex-wrap">
+
+          <span class="text-xs text-gray-300 absolute -top-2 left-0">传承协议状态</span>
+          <span 
+            class="text-sm text-gray-600 truncate max-w-35"
+            :title="agreementProgressLabel(item.agreementProgress)"
+          >
+            {{ agreementProgressLabel(item.agreementProgress) }}
+          </span>
+          <a-button type="link" @click.stop="handleEditAgreement(item)">编辑</a-button>
+          <div v-if="item.agreementId && canReviewButPrevNotCompleted(item.agreementProgress)" class="flex flex-row items-center text-sm">
+            <ExclamationCircleOutlined /> 上一阶段未完成
+          </div>
+          <a-button
+            type="primary"
+            v-else-if="item.agreementId && canReview(item.agreementProgress)"
+            @click.stop="handleReviewAgreement(item)"
+          >
+            审核
+          </a-button>
+          <a-button
+            type="primary"
+            disabled
+            v-else-if="item.agreementId && isCurrentLevelReviewed(item.agreementProgress)"
+          >
+            已审核
+          </a-button>
+        </div>
+        <!-- 分隔线(移动端横向 / 桌面端竖向) -->
+        <div class="my-3 border-t border-gray-300 md:my-0 md:mx-3 md:border-t-0 md:border-l md:h-6"></div>
+        <!-- 自查评估表 状态与审核 -->
+        <div class="relative flex flex-row items-center flex-wrap">
+
+          <span class="text-xs text-gray-300 absolute -top-2 left-0">自查评估表状态</span>
+          <a-popover v-if="item.rejectType && item.rejectType > 0" title="退回原因" trigger="hover">
+            <template #content>
+              <div style="max-width: 300px">{{ item.rejectReason || '无' }}</div>
+            </template>
+            <span class="text-sm" style="color: #f5222d; cursor: pointer;">
+              <ExclamationCircleOutlined /> 已退回
+            </span>
+          </a-popover>
+          <span 
+            v-else 
+            class="text-sm text-gray-600 truncate max-w-35"
+            :title="selfAssessmentProgressLabel(item.progress)"
+          >
+            {{ selfAssessmentProgressLabel(item.progress) }}
+          </span>
+          <a-button type="link" @click.stop="router.push({ name: 'CollectEvaluationForm', query: { id: item.checkId ?? item.id, userId: item.userId } })">编辑</a-button>
+          
+          <div v-if="item.checkId && canReviewButPrevNotCompleted(item.progress)" class="flex flex-row items-center text-sm">
+            <ExclamationCircleOutlined /> 上一阶段未完成
+          </div>
+          <a-button
+            type="primary"
+            v-else-if="item.checkId && canReview(item.progress)"
+            @click.stop="handleReviewSelfAssessment(item)"
+          >
+            审核
+          </a-button>
+          <a-button
+            type="primary"
+            v-else-if="item.agreementId && isCurrentLevelReviewed(item.progress)"
+            disabled
+          >
+            已审核
+          </a-button>
+        </div>
       </div>
-      <a-button
-        type="primary"
-        v-else-if="item.checkId && canReview(item.progress)"
-        @click.stop="handleReviewSelfAssessment(item)"
-      >
-        审核
-      </a-button>
-      <a-button
-        type="primary"
-        v-else-if="item.agreementId && isCurrentLevelReviewed(item.progress)"
-        disabled
-      >
-        已审核
-      </a-button>
     </template>
   </CommonListBlock>
 
@@ -228,6 +267,42 @@ function selfAssessmentProgressLabel(progress: number | null | undefined) {
   return hit?.name ?? `进度 ${progress}`;
 }
 
+const agreementProgressLabels: Record<number, string> = {
+  [-1]: '未提交',
+  [0]: '草稿',
+  [1]: '已提交待审核',
+  [2]: '项目保护单位审核完成',
+  [3]: '县(区)文旅部门审核完成',
+  [4]: '设区市文旅部门、省非遗中心审核完成',
+  [5]: '省文化和旅游厅审核完成',
+};
+
+function agreementProgressLabel(progress: number | null | undefined) {
+  if (progress === null || progress === undefined)
+    return '未填写';
+  return agreementProgressLabels[progress] ?? `进度 ${progress}`;
+}
+
+function handleEditAgreement(item: any) {
+  console.log(item);
+  router.push({
+    name: 'CollectAgreementSign',
+    query: { id: item.agreementId && item.agreementId > 0 ? item.agreementId : 0, userId: item.userId ?? 0 },
+  });
+}
+
+function handleReviewAgreement(item: any) {
+  if (!item.agreementId || !item.userId) return;
+  router.push({
+    name: 'CollectAgreementSignReview',
+    query: {
+      id: String(item.agreementId),
+      userId: String(item.userId),
+      ...(item.agreementProgress != null ? { progress: String(item.agreementProgress) } : {}),
+    },
+  });
+}
+
 async function loadSelfAssessmentAdminList(page: number, pageSize: number, searchText: string, dropDownValues: number[]) {
   const pv = dropDownValues?.[0];
   const st = dropDownValues?.[1];
@@ -250,14 +325,14 @@ async function loadSelfAssessmentAdminList(page: number, pageSize: number, searc
       ...row,
       id: row.id,
       userId: row.userId,
-      title: row.title ?? '?',
-      desc: [row.mobile, row.unit, row.ichTitle].filter(Boolean).join(' · ') || '—',
+      title: [(row.title ?? '?') , (row.mobile ?? '')].join(' '),
+      desc: [row.unit, row.ichTitle].filter(Boolean).join(' · ') || '—',
     })),
   };
 }
 
 function handleReviewSelfAssessment(item: SelfAssessmentDetail) {
-  const cid = item.checkId;
+ /*  const cid = item.checkId;
   const uid = item.userId;
   if (!cid || !uid) {
     message.warning('缺少自查表 ID 或传承人用户 ID');
@@ -270,7 +345,7 @@ function handleReviewSelfAssessment(item: SelfAssessmentDetail) {
       userId: String(uid),
       ...(item.progress != null && item.progress !== undefined ? { progress: String(item.progress) } : {}),
     },
-  });
+  }); */
 }
 
 async function handleDownloadZip() {