|  | @@ -224,6 +224,240 @@
 | 
	
		
			
				|  |  |        </div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      </el-dialog>
 | 
	
		
			
				|  |  | +  <!-- 查看详情弹窗 -->
 | 
	
		
			
				|  |  | +  <el-dialog
 | 
	
		
			
				|  |  | +    title="营销活动详情"
 | 
	
		
			
				|  |  | +    :visible.sync="viewDialogVisible"
 | 
	
		
			
				|  |  | +    width="80%"
 | 
	
		
			
				|  |  | +    append-to-body
 | 
	
		
			
				|  |  | +    @close="handleCloseViewDialog"
 | 
	
		
			
				|  |  | +    class="activity-detail-dialog"
 | 
	
		
			
				|  |  | +  >
 | 
	
		
			
				|  |  | +    <div v-loading="detailLoading" class="activity-detail-container">
 | 
	
		
			
				|  |  | +      <div v-if="currentViewActivity" class="activity-detail-content">
 | 
	
		
			
				|  |  | +        <!-- 基本信息 -->
 | 
	
		
			
				|  |  | +        <div class="detail-section">
 | 
	
		
			
				|  |  | +          <h3 class="section-title">基本信息</h3>
 | 
	
		
			
				|  |  | +          <el-row :gutter="20">
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>活动编码:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.activityCode }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>活动标题:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.title }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>活动类型:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.activityType }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>审批状态:</label>
 | 
	
		
			
				|  |  | +                <el-tag :type="getApprovalStatusType(currentViewActivity.approvalStatus)" size="small">
 | 
	
		
			
				|  |  | +                  {{ getApprovalStatusText(currentViewActivity.approvalStatus) }}
 | 
	
		
			
				|  |  | +                </el-tag>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>开始时间:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.startTime }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>结束时间:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.endTime }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>促销价格:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.promotionPrice }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>创建时间:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.createTime }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +          </el-row>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <!-- 客户信息 -->
 | 
	
		
			
				|  |  | +        <div class="detail-section">
 | 
	
		
			
				|  |  | +          <h3 class="section-title">客户信息</h3>
 | 
	
		
			
				|  |  | +          <el-row :gutter="20">
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>客户编码:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.customerCode }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>客户名称:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.customerName }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>联系人:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.contactName }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>联系电话:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.contactPhone }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +          </el-row>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <!-- 活动描述 -->
 | 
	
		
			
				|  |  | +        <div class="detail-section" v-if="currentViewActivity.description">
 | 
	
		
			
				|  |  | +          <h3 class="section-title">活动描述</h3>
 | 
	
		
			
				|  |  | +          <div class="description-content">
 | 
	
		
			
				|  |  | +            {{ currentViewActivity.description }}
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <!-- 审批信息 -->
 | 
	
		
			
				|  |  | +        <div class="detail-section" v-if="currentViewActivity.approverName">
 | 
	
		
			
				|  |  | +          <h3 class="section-title">审批信息</h3>
 | 
	
		
			
				|  |  | +          <el-row :gutter="20">
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>审批人:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.approverName }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="12">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>审批时间:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.approvalTime }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +            <el-col :span="24" v-if="currentViewActivity.approvalRemark">
 | 
	
		
			
				|  |  | +              <div class="detail-item">
 | 
	
		
			
				|  |  | +                <label>审批备注:</label>
 | 
	
		
			
				|  |  | +                <span>{{ currentViewActivity.approvalRemark }}</span>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </el-col>
 | 
	
		
			
				|  |  | +          </el-row>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <!-- 相关附件 -->
 | 
	
		
			
				|  |  | +        <div class="detail-section">
 | 
	
		
			
				|  |  | +          <h3 class="section-title">相关附件</h3>
 | 
	
		
			
				|  |  | +          <el-table
 | 
	
		
			
				|  |  | +            :data="attachmentsList"
 | 
	
		
			
				|  |  | +            v-loading="attachmentsLoading"
 | 
	
		
			
				|  |  | +            stripe
 | 
	
		
			
				|  |  | +            border
 | 
	
		
			
				|  |  | +            style="width: 100%"
 | 
	
		
			
				|  |  | +            empty-text="暂无相关附件"
 | 
	
		
			
				|  |  | +            size="small"
 | 
	
		
			
				|  |  | +          >
 | 
	
		
			
				|  |  | +            <el-table-column
 | 
	
		
			
				|  |  | +              label="文件类型"
 | 
	
		
			
				|  |  | +              width="80"
 | 
	
		
			
				|  |  | +              align="center"
 | 
	
		
			
				|  |  | +            >
 | 
	
		
			
				|  |  | +              <template slot-scope="scope">
 | 
	
		
			
				|  |  | +                <i :class="getFileTypeIcon(scope.row.fileType)" style="font-size: 20px; color: #666;"></i>
 | 
	
		
			
				|  |  | +              </template>
 | 
	
		
			
				|  |  | +            </el-table-column>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            <el-table-column
 | 
	
		
			
				|  |  | +              prop="fileName"
 | 
	
		
			
				|  |  | +              label="文件名称"
 | 
	
		
			
				|  |  | +              min-width="200"
 | 
	
		
			
				|  |  | +              show-overflow-tooltip
 | 
	
		
			
				|  |  | +            >
 | 
	
		
			
				|  |  | +              <template slot-scope="scope">
 | 
	
		
			
				|  |  | +                <span :title="scope.row.fileName">{{ scope.row.fileName }}</span>
 | 
	
		
			
				|  |  | +              </template>
 | 
	
		
			
				|  |  | +            </el-table-column>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            <el-table-column
 | 
	
		
			
				|  |  | +              prop="attachType"
 | 
	
		
			
				|  |  | +              label="附件类型"
 | 
	
		
			
				|  |  | +              width="120"
 | 
	
		
			
				|  |  | +              align="center"
 | 
	
		
			
				|  |  | +            >
 | 
	
		
			
				|  |  | +              <template slot-scope="scope">
 | 
	
		
			
				|  |  | +                <el-tag size="mini" type="info">{{ scope.row.attachType }}</el-tag>
 | 
	
		
			
				|  |  | +              </template>
 | 
	
		
			
				|  |  | +            </el-table-column>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            <el-table-column
 | 
	
		
			
				|  |  | +              prop="fileSize"
 | 
	
		
			
				|  |  | +              label="文件大小"
 | 
	
		
			
				|  |  | +              width="100"
 | 
	
		
			
				|  |  | +              align="center"
 | 
	
		
			
				|  |  | +            >
 | 
	
		
			
				|  |  | +              <template slot-scope="scope">
 | 
	
		
			
				|  |  | +                {{ formatFileSize(scope.row.fileSize) }}
 | 
	
		
			
				|  |  | +              </template>
 | 
	
		
			
				|  |  | +            </el-table-column>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            <el-table-column
 | 
	
		
			
				|  |  | +              prop="createTime"
 | 
	
		
			
				|  |  | +              label="上传时间"
 | 
	
		
			
				|  |  | +              width="160"
 | 
	
		
			
				|  |  | +              align="center"
 | 
	
		
			
				|  |  | +            >
 | 
	
		
			
				|  |  | +              <template slot-scope="scope">
 | 
	
		
			
				|  |  | +                {{ scope.row.createTime }}
 | 
	
		
			
				|  |  | +              </template>
 | 
	
		
			
				|  |  | +            </el-table-column>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            <el-table-column
 | 
	
		
			
				|  |  | +              label="操作"
 | 
	
		
			
				|  |  | +              width="120"
 | 
	
		
			
				|  |  | +              align="center"
 | 
	
		
			
				|  |  | +              fixed="right"
 | 
	
		
			
				|  |  | +            >
 | 
	
		
			
				|  |  | +              <template slot-scope="scope">
 | 
	
		
			
				|  |  | +                <el-button
 | 
	
		
			
				|  |  | +                  type="text"
 | 
	
		
			
				|  |  | +                  size="mini"
 | 
	
		
			
				|  |  | +                  icon="el-icon-view"
 | 
	
		
			
				|  |  | +                  @click="handleViewAttachment(scope.row)"
 | 
	
		
			
				|  |  | +                  title="预览"
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                  预览
 | 
	
		
			
				|  |  | +                </el-button>
 | 
	
		
			
				|  |  | +                <el-button
 | 
	
		
			
				|  |  | +                  type="text"
 | 
	
		
			
				|  |  | +                  size="mini"
 | 
	
		
			
				|  |  | +                  icon="el-icon-download"
 | 
	
		
			
				|  |  | +                  @click="handleDownloadAttachment(scope.row)"
 | 
	
		
			
				|  |  | +                  title="下载"
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                  下载
 | 
	
		
			
				|  |  | +                </el-button>
 | 
	
		
			
				|  |  | +              </template>
 | 
	
		
			
				|  |  | +            </el-table-column>
 | 
	
		
			
				|  |  | +          </el-table>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    <div slot="footer" class="dialog-footer">
 | 
	
		
			
				|  |  | +      <el-button @click="handleCloseViewDialog">关闭</el-button>
 | 
	
		
			
				|  |  | +    </div>
 | 
	
		
			
				|  |  | +  </el-dialog>
 | 
	
		
			
				|  |  |    </basic-container>
 | 
	
		
			
				|  |  |  </template>
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -234,9 +468,11 @@ import {
 | 
	
		
			
				|  |  |    update,
 | 
	
		
			
				|  |  |    approveWithSmartRecord,
 | 
	
		
			
				|  |  |    getApprovalRecords,
 | 
	
		
			
				|  |  | +  getApprovalRecordDetail,
 | 
	
		
			
				|  |  |    addApprovalRecord,
 | 
	
		
			
				|  |  |    updateApprovalRecord,
 | 
	
		
			
				|  |  | -  saveApprovalRecord
 | 
	
		
			
				|  |  | +  saveApprovalRecord,
 | 
	
		
			
				|  |  | +  getActivityAttachments
 | 
	
		
			
				|  |  |  } from '@/api/order/marketing-activity'
 | 
	
		
			
				|  |  |  import { mapGetters } from 'vuex'
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -279,6 +515,37 @@ import { mapGetters } from 'vuex'
 | 
	
		
			
				|  |  |  export default {
 | 
	
		
			
				|  |  |    data() {
 | 
	
		
			
				|  |  |      return {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 查看弹窗显示状态
 | 
	
		
			
				|  |  | +     * @type {boolean}
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    viewDialogVisible: false,
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 当前查看的活动详情
 | 
	
		
			
				|  |  | +     * @type {MarketingActivityItem|null}
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    currentViewActivity: null,
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 附件列表数据
 | 
	
		
			
				|  |  | +     * @type {ActivityAttachmentItem[]}
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    attachmentsList: [],
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 附件加载状态
 | 
	
		
			
				|  |  | +     * @type {boolean}
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    attachmentsLoading: false,
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 详情加载状态
 | 
	
		
			
				|  |  | +     * @type {boolean}
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    detailLoading: false,
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |        /**
 | 
	
		
			
				|  |  |         * 审批记录对话框配置
 | 
	
		
			
				|  |  |         * @type {Object}
 | 
	
	
		
			
				|  | @@ -554,6 +821,148 @@ export default {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    methods: {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 关闭查看弹窗
 | 
	
		
			
				|  |  | +   * @returns {void}
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  handleCloseViewDialog() {
 | 
	
		
			
				|  |  | +    this.viewDialogVisible = false
 | 
	
		
			
				|  |  | +    this.currentViewActivity = null
 | 
	
		
			
				|  |  | +    this.attachmentsList = []
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 加载活动附件列表
 | 
	
		
			
				|  |  | +   * @param {string|number} activityId - 活动ID
 | 
	
		
			
				|  |  | +   * @returns {Promise<void>}
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  async loadActivityAttachments(activityId) {
 | 
	
		
			
				|  |  | +    if (!activityId) return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    this.attachmentsLoading = true
 | 
	
		
			
				|  |  | +    try {
 | 
	
		
			
				|  |  | +      const response = await getActivityAttachments(1, 100, activityId)
 | 
	
		
			
				|  |  | +      if (response.data.success) {
 | 
	
		
			
				|  |  | +        this.attachmentsList = response.data.data.records || []
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        this.$message.error('获取附件列表失败')
 | 
	
		
			
				|  |  | +        this.attachmentsList = []
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    } catch (error) {
 | 
	
		
			
				|  |  | +      console.error('获取附件列表失败:', error)
 | 
	
		
			
				|  |  | +      this.$message.error('获取附件列表失败')
 | 
	
		
			
				|  |  | +      this.attachmentsList = []
 | 
	
		
			
				|  |  | +    } finally {
 | 
	
		
			
				|  |  | +      this.attachmentsLoading = false
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 预览附件
 | 
	
		
			
				|  |  | +   * @param {ActivityAttachmentItem} attachment - 附件信息
 | 
	
		
			
				|  |  | +   * @returns {void}
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  handleViewAttachment(attachment) {
 | 
	
		
			
				|  |  | +    if (attachment.fileUrl) {
 | 
	
		
			
				|  |  | +      window.open(attachment.fileUrl.trim(), '_blank')
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      this.$message.warning('文件链接不存在')
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 下载附件
 | 
	
		
			
				|  |  | +   * @param {ActivityAttachmentItem} attachment - 附件信息
 | 
	
		
			
				|  |  | +   * @returns {void}
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  handleDownloadAttachment(attachment) {
 | 
	
		
			
				|  |  | +    if (attachment.fileUrl) {
 | 
	
		
			
				|  |  | +      const link = document.createElement('a')
 | 
	
		
			
				|  |  | +      link.href = attachment.fileUrl.trim()
 | 
	
		
			
				|  |  | +      link.download = attachment.fileName
 | 
	
		
			
				|  |  | +      link.target = '_blank'
 | 
	
		
			
				|  |  | +      document.body.appendChild(link)
 | 
	
		
			
				|  |  | +      link.click()
 | 
	
		
			
				|  |  | +      document.body.removeChild(link)
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      this.$message.warning('文件链接不存在')
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 格式化文件大小
 | 
	
		
			
				|  |  | +   * @param {number} bytes - 文件大小(字节)
 | 
	
		
			
				|  |  | +   * @returns {string} 格式化后的文件大小
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  formatFileSize(bytes) {
 | 
	
		
			
				|  |  | +    if (!bytes || bytes === 0) return '0 B'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const k = 1024
 | 
	
		
			
				|  |  | +    const sizes = ['B', 'KB', 'MB', 'GB', 'TB']
 | 
	
		
			
				|  |  | +    const i = Math.floor(Math.log(bytes) / Math.log(k))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 获取文件类型图标
 | 
	
		
			
				|  |  | +   * @param {string} fileType - 文件类型
 | 
	
		
			
				|  |  | +   * @returns {string} 图标类名
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  getFileTypeIcon(fileType) {
 | 
	
		
			
				|  |  | +    if (!fileType) return 'el-icon-document'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const type = fileType.toLowerCase()
 | 
	
		
			
				|  |  | +    const iconMap = {
 | 
	
		
			
				|  |  | +      pdf: 'el-icon-document',
 | 
	
		
			
				|  |  | +      doc: 'el-icon-document',
 | 
	
		
			
				|  |  | +      docx: 'el-icon-document',
 | 
	
		
			
				|  |  | +      xls: 'el-icon-s-grid',
 | 
	
		
			
				|  |  | +      xlsx: 'el-icon-s-grid',
 | 
	
		
			
				|  |  | +      ppt: 'el-icon-present',
 | 
	
		
			
				|  |  | +      pptx: 'el-icon-present',
 | 
	
		
			
				|  |  | +      jpg: 'el-icon-picture',
 | 
	
		
			
				|  |  | +      jpeg: 'el-icon-picture',
 | 
	
		
			
				|  |  | +      png: 'el-icon-picture',
 | 
	
		
			
				|  |  | +      gif: 'el-icon-picture',
 | 
	
		
			
				|  |  | +      bmp: 'el-icon-picture',
 | 
	
		
			
				|  |  | +      txt: 'el-icon-document',
 | 
	
		
			
				|  |  | +      zip: 'el-icon-folder-opened',
 | 
	
		
			
				|  |  | +      rar: 'el-icon-folder-opened',
 | 
	
		
			
				|  |  | +      '7z': 'el-icon-folder-opened'
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return iconMap[type] || 'el-icon-document'
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 获取审批状态文本
 | 
	
		
			
				|  |  | +   * @param {number} status - 审批状态
 | 
	
		
			
				|  |  | +   * @returns {string} 状态文本
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  getApprovalStatusText(status) {
 | 
	
		
			
				|  |  | +    const statusMap = {
 | 
	
		
			
				|  |  | +      1: '待审批',
 | 
	
		
			
				|  |  | +      2: '审批通过',
 | 
	
		
			
				|  |  | +      3: '审批拒绝'
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return statusMap[status] || '未知状态'
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 获取审批状态类型
 | 
	
		
			
				|  |  | +   * @param {number} status - 审批状态
 | 
	
		
			
				|  |  | +   * @returns {string} 状态类型
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  getApprovalStatusType(status) {
 | 
	
		
			
				|  |  | +    const typeMap = {
 | 
	
		
			
				|  |  | +      1: 'warning',
 | 
	
		
			
				|  |  | +      2: 'success',
 | 
	
		
			
				|  |  | +      3: 'danger'
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return typeMap[status] || 'info'
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 查看审批记录
 | 
	
		
			
				|  |  |       * @param {MarketingActivityRecord} row - 营销活动记录
 | 
	
	
		
			
				|  | @@ -644,37 +1053,58 @@ export default {
 | 
	
		
			
				|  |  |       * @param {number} status - 审批状态
 | 
	
		
			
				|  |  |       * @returns {string} 状态文本
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  | -    getApprovalStatusText(status) {
 | 
	
		
			
				|  |  | -      const statusMap = {
 | 
	
		
			
				|  |  | -        1: '待审批',
 | 
	
		
			
				|  |  | -        2: '审批通过',
 | 
	
		
			
				|  |  | -        3: '审批拒绝'
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      return statusMap[status] || '未知状态'
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | +    // getApprovalStatusText(status) {
 | 
	
		
			
				|  |  | +    //   const statusMap = {
 | 
	
		
			
				|  |  | +    //     1: '待审批',
 | 
	
		
			
				|  |  | +    //     2: '审批通过',
 | 
	
		
			
				|  |  | +    //     3: '审批拒绝'
 | 
	
		
			
				|  |  | +    //   }
 | 
	
		
			
				|  |  | +    //   return statusMap[status] || '未知状态'
 | 
	
		
			
				|  |  | +    // },
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 获取审批状态标签类型
 | 
	
		
			
				|  |  |       * @param {number} status - 审批状态
 | 
	
		
			
				|  |  |       * @returns {string} 标签类型
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  | -    getApprovalStatusType(status) {
 | 
	
		
			
				|  |  | -      const typeMap = {
 | 
	
		
			
				|  |  | -        1: 'warning',
 | 
	
		
			
				|  |  | -        2: 'success',
 | 
	
		
			
				|  |  | -        3: 'danger'
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      return typeMap[status] || 'info'
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | +    // getApprovalStatusType(status) {
 | 
	
		
			
				|  |  | +    //   const typeMap = {
 | 
	
		
			
				|  |  | +    //     1: 'warning',
 | 
	
		
			
				|  |  | +    //     2: 'success',
 | 
	
		
			
				|  |  | +    //     3: 'danger'
 | 
	
		
			
				|  |  | +    //   }
 | 
	
		
			
				|  |  | +    //   return typeMap[status] || 'info'
 | 
	
		
			
				|  |  | +    // },
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 查看详情
 | 
	
		
			
				|  |  | -     * @param {MarketingActivityRecord} row - 行数据
 | 
	
		
			
				|  |  | -     * @returns {void}
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    handleView(row) {
 | 
	
		
			
				|  |  | -      this.$refs.crud.rowView(row)
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 查看详情
 | 
	
		
			
				|  |  | +   * @param {MarketingActivityRecord} row - 行数据
 | 
	
		
			
				|  |  | +   * @returns {Promise<void>}
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  async handleView(row) {
 | 
	
		
			
				|  |  | +    this.viewDialogVisible = true
 | 
	
		
			
				|  |  | +    this.currentViewActivity = null
 | 
	
		
			
				|  |  | +    this.attachmentsList = []
 | 
	
		
			
				|  |  | +    this.detailLoading = true
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    try {
 | 
	
		
			
				|  |  | +      // 获取活动详情
 | 
	
		
			
				|  |  | +      const detailRes = await getDetail(row.id)
 | 
	
		
			
				|  |  | +      if (detailRes.data.success) {
 | 
	
		
			
				|  |  | +        this.currentViewActivity = detailRes.data.data
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 同时加载附件数据
 | 
	
		
			
				|  |  | +        await this.loadActivityAttachments(row.id)
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        this.$message.error('获取活动详情失败')
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    } catch (error) {
 | 
	
		
			
				|  |  | +      console.error('获取活动详情失败:', error)
 | 
	
		
			
				|  |  | +      this.$message.error('获取活动详情失败')
 | 
	
		
			
				|  |  | +    } finally {
 | 
	
		
			
				|  |  | +      this.detailLoading = false
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 处理审批操作
 | 
	
	
		
			
				|  | @@ -1031,4 +1461,131 @@ export default {
 | 
	
		
			
				|  |  |  .dialog-footer {
 | 
	
		
			
				|  |  |    text-align: right;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +/* 查看详情弹窗样式 */
 | 
	
		
			
				|  |  | +.activity-detail-dialog .el-dialog__body {
 | 
	
		
			
				|  |  | +  padding: 20px;
 | 
	
		
			
				|  |  | +  max-height: 70vh;
 | 
	
		
			
				|  |  | +  overflow-y: auto;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.activity-detail-container {
 | 
	
		
			
				|  |  | +  min-height: 200px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.activity-detail-content {
 | 
	
		
			
				|  |  | +  padding: 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.detail-section {
 | 
	
		
			
				|  |  | +  margin-bottom: 30px;
 | 
	
		
			
				|  |  | +  padding: 20px;
 | 
	
		
			
				|  |  | +  background: #fafafa;
 | 
	
		
			
				|  |  | +  border-radius: 6px;
 | 
	
		
			
				|  |  | +  border: 1px solid #e8e8e8;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.detail-section:last-child {
 | 
	
		
			
				|  |  | +  margin-bottom: 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.section-title {
 | 
	
		
			
				|  |  | +  margin: 0 0 20px 0;
 | 
	
		
			
				|  |  | +  padding-bottom: 10px;
 | 
	
		
			
				|  |  | +  font-size: 16px;
 | 
	
		
			
				|  |  | +  font-weight: 600;
 | 
	
		
			
				|  |  | +  color: #333;
 | 
	
		
			
				|  |  | +  border-bottom: 2px solid #409eff;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.detail-item {
 | 
	
		
			
				|  |  | +  margin-bottom: 15px;
 | 
	
		
			
				|  |  | +  display: flex;
 | 
	
		
			
				|  |  | +  align-items: center;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.detail-item:last-child {
 | 
	
		
			
				|  |  | +  margin-bottom: 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.detail-item label {
 | 
	
		
			
				|  |  | +  min-width: 100px;
 | 
	
		
			
				|  |  | +  font-weight: 500;
 | 
	
		
			
				|  |  | +  color: #666;
 | 
	
		
			
				|  |  | +  margin-right: 10px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.detail-item span {
 | 
	
		
			
				|  |  | +  color: #333;
 | 
	
		
			
				|  |  | +  word-break: break-all;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.description-content {
 | 
	
		
			
				|  |  | +  padding: 15px;
 | 
	
		
			
				|  |  | +  background: #fff;
 | 
	
		
			
				|  |  | +  border-radius: 4px;
 | 
	
		
			
				|  |  | +  border: 1px solid #ddd;
 | 
	
		
			
				|  |  | +  line-height: 1.6;
 | 
	
		
			
				|  |  | +  color: #333;
 | 
	
		
			
				|  |  | +  white-space: pre-wrap;
 | 
	
		
			
				|  |  | +  word-break: break-word;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* 附件表格样式 */
 | 
	
		
			
				|  |  | +.detail-section .el-table {
 | 
	
		
			
				|  |  | +  margin-top: 10px;
 | 
	
		
			
				|  |  | +  font-size: 13px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.detail-section .el-table th {
 | 
	
		
			
				|  |  | +  background-color: #f5f7fa;
 | 
	
		
			
				|  |  | +  color: #333;
 | 
	
		
			
				|  |  | +  font-weight: 600;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.detail-section .el-table td {
 | 
	
		
			
				|  |  | +  padding: 8px 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.detail-section .el-button--text {
 | 
	
		
			
				|  |  | +  padding: 0;
 | 
	
		
			
				|  |  | +  margin: 0 4px;
 | 
	
		
			
				|  |  | +  font-size: 12px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.detail-section .el-tag {
 | 
	
		
			
				|  |  | +  border-radius: 2px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* 弹窗底部按钮 */
 | 
	
		
			
				|  |  | +.dialog-footer {
 | 
	
		
			
				|  |  | +  text-align: center;
 | 
	
		
			
				|  |  | +  padding: 20px 0 10px 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* 响应式设计 */
 | 
	
		
			
				|  |  | +@media (max-width: 768px) {
 | 
	
		
			
				|  |  | +  .activity-detail-dialog {
 | 
	
		
			
				|  |  | +    width: 95% !important;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .detail-item {
 | 
	
		
			
				|  |  | +    flex-direction: column;
 | 
	
		
			
				|  |  | +    align-items: flex-start;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .detail-item label {
 | 
	
		
			
				|  |  | +    min-width: auto;
 | 
	
		
			
				|  |  | +    margin-bottom: 5px;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .detail-section .el-table {
 | 
	
		
			
				|  |  | +    font-size: 12px;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@media (max-width: 1200px) {
 | 
	
		
			
				|  |  | +  .activity-detail-dialog {
 | 
	
		
			
				|  |  | +    width: 90% !important;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  </style>
 |