ReleaseModal.vue 4.79 KB
<template>
  <a-modal
    :visible="visible"
    title="已通过版本记录"
    width="80%"
    :footer="null"
    @cancel="handleCancel"
    @update:visible="(val) => emit('update:visible', val)"
  >
    <div v-if="loading" class="loading-container">
      <a-spin />
    </div>
    <div v-else>
      <div v-if="tableData.length === 0" class="empty-data">
        <a-empty description="没有找到已通过版本的记录" />
      </div>
      <BasicTable 
        v-else
        :dataSource="tableData" 
        :columns="columns" 
        :pagination="false"
        bordered
        showIndexColumn
        :canResize="false"
        :loading="loading"
      >
        <template #bodyCell="{ column, record }">
          <template v-if="column.key === 'action'">
            <TableAction
              :actions="[
                {
                  icon: 'ant-design:eye-outlined',
                  tooltip: '查看',
                  onClick: handleView.bind(null, record),
                }
              ]"
            />
          </template>
        </template>
      </BasicTable>
    </div>
  </a-modal>
  
  <!-- 查看详情抽屉 -->
  <QuestDrawer @register="registerDrawer" />
</template>

<script lang="ts" setup name="ReleaseModal">
  import { ref, watch } from 'vue';
  import { getQuestReleaseData } from '/@/api/project/quest';
  import { BasicTable, TableAction } from '/@/components/Table';
  import { useMessage } from '/@/hooks/web/useMessage';
  import { useDrawer } from '/@/components/Drawer';
  import QuestDrawer from './QuestDrawer.vue';
  
  const props = defineProps({
    visible: {
      type: Boolean,
      default: false,
    },
    recordId: {
      type: Number,
      default: undefined,
    },
  });
  
  const emit = defineEmits(['update:visible', 'cancel']);
  const { createMessage } = useMessage();
  const loading = ref(false);
  const tableData = ref<any[]>([]);
  
  // 注册抽屉
  const [registerDrawer, { openDrawer }] = useDrawer();
  
  // 表格列定义
  const columns = [
    {
      title: '标题',
      dataIndex: 'title',
      key: 'title',
      width: 400,
      customHeaderCell: () => ({ style: { color: 'red', fontSize: '16px' } }),
    },
    {
      title: '内容',
      dataIndex: 'contentText',
      key: 'contentText',
      width: 500,
      customRender: ({ text }) => {
        if (!text) return '';
        const div = document.createElement('div');
        div.innerHTML = text;
        const plainText = div.textContent || div.innerText || '';
        return plainText.length > 30 ? plainText.substring(0, 30) + '...' : plainText;
      },
      customHeaderCell: () => ({ style: { color: 'red', fontSize: '16px' } }),
    },
    {
      title: '操作',
      dataIndex: 'action',
      width: 100,
      key: 'action',
      fixed: 'right',
    },
  ];
  
  // 监听visible变化,加载数据
  watch(() => props.visible, async (newVisible) => {
    if (newVisible && props.recordId) {
      await loadReleaseData(props.recordId);
    }
  });
  
  // 加载已通过版本数据
  async function loadReleaseData(id: number) {
    loading.value = true;
    tableData.value = [];
    
    try {
      const response = await getQuestReleaseData(id);
      
      // 简化数据处理逻辑
      if (Array.isArray(response)) {
        // 如果返回的是数组,直接使用
        tableData.value = response;
      } else if (response && Array.isArray(response.items)) {
        // 如果返回的是包含items属性的对象
        tableData.value = response.items;
      } else if (response && Array.isArray(response.records)) {
        // 如果返回的是包含records属性的对象
        tableData.value = response.records;
      } else if (response && typeof response === 'object' && !Array.isArray(response)) {
        // 如果返回的是单个对象
        tableData.value = [response];
      }
      
      // 显示空数据提示
      if (tableData.value.length === 0) {
        createMessage.info('没有找到已通过版本的记录');
      }
    } catch (error) {
      createMessage.error('获取已通过版本数据失败: ' + error.message);
    } finally {
      loading.value = false;
    }
  }
  
  // 取消
  function handleCancel() {
    emit('update:visible', false);
    emit('cancel');
  }
  
  // 查看详情
  function handleView(record) {
    openDrawer(true, {
      record,
      isUpdate: true,
      isView: true, // 标记为查看模式
    });
  }
</script>

<style lang="less" scoped>
  .loading-container {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 200px;
  }
  
  .empty-data {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 300px;
    background-color: #fafafa;
    border-radius: 4px;
  }
</style>

<script lang="ts">
export default {
  name: 'ReleaseModal',
};
</script>