liujiaxin hace 2 meses
padre
commit
38a8008401

+ 6 - 3
pages_speaker/gradeApplication.vue

@@ -451,10 +451,13 @@
 					uni.hideLoading()
 					if (res.code === 200) {
 						uni.showToast({ icon: 'success', title: '提交成功' })
+						uni.redirectTo({
+							url: '/pages_task/success'
+						})
 						// 提交成功后返回上一页
-						setTimeout(() => {
-							uni.navigateBack()
-						}, 1500)
+						// setTimeout(() => {
+						// 	uni.navigateBack()
+						// }, 1500)
 					} else {
 						uni.showToast({ icon: 'none', title: res.message || '提交失败' })
 					}

+ 4 - 4
pages_speaker/index.vue

@@ -30,7 +30,7 @@
 			<view class="task-card" v-for="(item, index) in taskList" :key="index" @click="showDetail(item)">
 				<view class="card-header">
 					<view class="card-title">
-						<text>{{ item.doctorName }}</text>
+						<text>{{ item.doctorName||'未命名' }}</text>
 						<text class="title-little" v-if="item.account_type">{{item.account_type}}</text>
 						<view class="lable" v-if="item.doctorLevel">{{item.doctorLevel}}</view>
 					</view>
@@ -42,9 +42,9 @@
 
 				<view class="row">
 					<image class="icon" src="@/static/image/icon_hospital.png" mode=""></image>
-					<text>{{ item.institution }}</text>
+					<text>{{ item.institution ||'-'}}</text>
 					<view class="line"></view>
-					<text>{{ item.department }}</text>
+					<text>{{ item.department ||'-'}}</text>
 				</view>
 				<view class="row">
 					<image class="icon" src="/static/image/icon_user.png" mode=""></image>
@@ -73,7 +73,7 @@
 						 {{ item.productGroup }}
 					</view>
 				</view>
-				<view class="apply-button" @click.stop="applyLevel(item)">定级申请</view>
+				<view class="apply-button" v-if="item.status==0" @click.stop="applyLevel(item)">定级申请</view>
 			</view>
 		</scroll-view>
 

+ 23 - 19
pages_speaker/lecturerDetail.vue

@@ -15,10 +15,10 @@
 				<view class="profile-info">
 					<view class="profile-main">
 						<view class="name-section">
-							<text class="name">{{ lecturerInfo.name }}</text>
-							<text class="identity">{{ lecturerInfo.identity }}</text>
+							<text class="name">{{ lecturerInfo.doctorName||'未命名' }}</text>
+							<text class="identity" v-if="lecturerInfo.identity">{{ lecturerInfo.identity }}</text>
 						</view>
-						<text class="phone">{{ lecturerInfo.phone }}</text>
+						<text class="phone">{{ lecturerInfo.mobile ||'-'}}</text>
 					</view>
 					<image class="avatar" :src="lecturerInfo.avatar"></image>
 				</view>
@@ -33,19 +33,19 @@
 				<view class="info-list">
 					<view class="info-item">
 						<text class="info-label">身份证号:</text>
-						<text class="info-value">{{ lecturerInfo.idCard }}</text>
+						<text class="info-value">{{ lecturerInfo.idCard ||'-'}}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">公司:</text>
-						<text class="info-value">{{ lecturerInfo.company }}</text>
+						<text class="info-value">{{ lecturerInfo.companyName ||'-'}}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">机构名称:</text>
-						<text class="info-value">{{ lecturerInfo.institution }}</text>
+						<text class="info-value">{{ lecturerInfo.institution||'-' }}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">注册时间:</text>
-						<text class="info-value">{{ lecturerInfo.registerTime }}</text>
+						<text class="info-value">{{ lecturerInfo.registerTime||'-' }}</text>
 					</view>
 				</view>
 			</view>
@@ -59,23 +59,23 @@
 				<view class="info-list">
 					<view class="info-item">
 						<text class="info-label">地址:</text>
-						<text class="info-value">{{ lecturerInfo.address }}</text>
+						<text class="info-value">{{ lecturerInfo.provinceName ||'-'}}{{ lecturerInfo.cityName ||'-'}}{{ lecturerInfo.districtName ||'-'}}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">科室:</text>
-						<text class="info-value">{{ lecturerInfo.department }}</text>
+						<text class="info-value">{{ lecturerInfo.department ||'-'}}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">职称:</text>
-						<text class="info-value">{{ lecturerInfo.title }}</text>
+						<text class="info-value">{{ lecturerInfo.jobTitle }}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">第三方业务编码:</text>
-						<text class="info-value">{{ lecturerInfo.thirdPartyCode }}</text>
+						<text class="info-value">{{ lecturerInfo.thirdPartyCode||'-'}}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">研究者编码:</text>
-						<text class="info-value">{{ lecturerInfo.researcherCode }}</text>
+						<text class="info-value">{{ lecturerInfo.researcherCode ||'-'}}</text>
 					</view>
 				</view>
 			</view>
@@ -90,13 +90,17 @@
 					<view class="qualification-item">
 						<text class="qualification-label">医师执业证</text>
 						<view class="image-grid">
-							<image class="qualification-image" v-for="(img, index) in lecturerInfo.qualifications.medicalLicense" :key="index" :src="img"></image>
+							<image class="qualification-image"  :src=" lecturerInfo.licenseImage"></image>
+
+							<!-- <image class="qualification-image" v-for="(img, index) in lecturerInfo.qualifications.medicalLicense" :key="index" :src="img"></image> -->
 						</view>
 					</view>
 					<view class="qualification-item">
 						<text class="qualification-label">医师职称证/工牌</text>
 						<view class="image-grid">
-							<image class="qualification-image" v-for="(img, index) in lecturerInfo.qualifications.titleLicense" :key="index" :src="img"></image>
+							<image class="qualification-image"  :src=" lecturerInfo.titleCertImage"></image>
+
+							<!-- <image class="qualification-image" v-for="(img, index) in lecturerInfo.qualifications.titleLicense" :key="index" :src="img"></image> -->
 						</view>
 					</view>
 				</view>
@@ -111,19 +115,19 @@
 				<view class="info-list">
 					<view class="info-item">
 						<text class="info-label">签约协议状态:</text>
-						<text class="info-value">{{ lecturerInfo.contractStatus }}</text>
+						<text class="info-value">{{ lecturerInfo.contractStatus === 0 ? '未签约' : lecturerInfo.contractStatus === 1 ? '已签约' : '-' }}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">银行卡号:</text>
-						<text class="info-value">{{ lecturerInfo.bankCard }}</text>
+						<text class="info-value">{{ lecturerInfo.bankCardNo||'-' }}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">开户银行:</text>
-						<text class="info-value">{{ lecturerInfo.bankName }}</text>
+						<text class="info-value">{{ lecturerInfo.bankName||'-' }}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">支行信息:</text>
-						<text class="info-value">{{ lecturerInfo.branchBank }}</text>
+						<text class="info-value">{{ lecturerInfo.bankBranch||'-' }}</text>
 					</view>
 				</view>
 			</view>
@@ -137,7 +141,7 @@
 				<view class="info-list">
 					<view class="info-item">
 						<text class="info-label">密码:</text>
-						<text class="info-value password">{{ maskedPassword }}</text>
+						<text class="info-value password">{{ lecturerInfo.pwd ||'-'}}</text>
 					</view>
 				</view>
 			</view>

+ 1 - 1
pages_task/approvalCenter.vue

@@ -256,7 +256,7 @@ import utils from '@/utils/common.js'
 			goDetails(item) {
 				console.log("跳转参数",item)
 				uni.navigateTo({
-					url: `/pages_task/approvalTaskDetail?taskId=${item.id}`
+					url: `/pages_task/approvalTaskDetail?taskId=${item.id}&businessType=${item.businessType}`
 				})
 			},
 			switchTopTab(index) {

+ 264 - 106
pages_task/approvalTaskDetail.vue

@@ -6,121 +6,110 @@
 			<text>任务详情</text>
 		</view>
 		<scroll-view class="content" scroll-y>
-			<!-- 任务卡片 -->
-			<view class="task-card" v-if="auditData">
-				<view class="card-header">
-					<view class="card-title">{{ auditData.projectVO.projectName }}</view>
-					<view class="card-lable" :class="'pending'">待审核</view>
+		
+
+			<!-- 审核表单(根据类型动态渲染) -->
+			<view v-if="auditData">
+				<!-- 只有完成任务审核和创建任务审核才涉及文章、短视频、长视频 -->
+				<view v-if="businessType === 'ADUIT_WCRWSH' || businessType === 'ADUIT_CJRW'">
+					<!-- 短视频审核 -->
+					<ShortVideoAudit v-if="auditData.shortVideoData" :data="auditData.shortVideoData" />
+					
+					<!-- 长视频审核 -->
+					<LongVideoAudit v-else-if="auditData.longVideoData" :data="auditData.longVideoData" />
+					
+					<!-- 文章审核 -->
+					<ArticleAudit v-else-if="auditData.articleData" :data="auditData.articleData" />
 				</view>
-				<view class="card-meta">
-					<view class="item">
-						<image src="/static/image/icon_user.png"></image>
-						{{ auditData.AuditTaskInfoVO.companyUserName }}</view>
-					<view class="item">
-						
-						<image src="/static/image/icon_time.png"></image>
-						{{ auditData.projectVO.startDate }}</view>
-				</view>
-			</view>
-
-			<!-- 任务信息 -->
-			<view class="info-section" v-if="auditData">
-				<view class="section-header">
-					<view class="section-indicator"></view>
-					<text class="section-title">任务信息</text>
-				</view>
-				<view class="info-list">
-					<view class="info-item">
-						<text class="info-label">任务名称</text>
-						<text class="info-value">{{ auditData.auditTaskInfoVO.projectName }}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">任务类型</text>
-						<text class="info-value">{{ auditData.auditTaskInfoVO.projectName }}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">归属部门</text>
-						<text class="info-value">{{ auditData.auditTaskInfoVO.deptName }}</text>
-					</view>
-				</view>
-			</view>
-<!-- 项目信息 -->
-			<view class="info-section" v-if="auditData">
-				<view class="section-header">
-					<view class="section-indicator"></view>
-					<text class="section-title">项目信息</text>
-				</view>
-				<view class="info-list">
-					<view class="info-item">
-						<text class="info-label">项目名称</text>
-						<text class="info-value">{{ auditData.projectVO.projectName }}</text>
+				
+				<!-- 讲者审核 -->
+				<SpeakerAudit v-else-if="businessType === 'ADUIT_JZSH'" :data="{ docterVO: auditData.docterVO, companyUserVO: auditData.companyUserVO }" />
+				
+				<!-- 提现审核 -->
+				<WithdrawAudit v-else-if="businessType === 'ADUIT_TXSH'" :data="auditData.withdrawData" />
+				
+				<!-- 服务单生成配置模板审核 -->
+				<view v-else-if="businessType === 'AUDIT_FWDRWSCPZ'" class="info-section">
+					<view class="section-header">
+						<view class="section-indicator"></view>
+						<text class="section-title">服务单生成配置模板信息</text>
 					</view>
-					<view class="info-item">
-						<text class="info-label">项目活动ID</text>
-						<text class="info-value">{{ auditData.projectVO.projectTypeId }}</text>
+					<view class="info-list">
+						<view class="info-item">
+							<text class="info-label">任务编号</text>
+							<text class="info-value">{{ auditData.auditTaskInfoVO && auditData.auditTaskInfoVO.taskNo ? auditData.auditTaskInfoVO.taskNo : '-' }}</text>
+						</view>
+						<view class="info-item">
+							<text class="info-label">任务名称</text>
+							<text class="info-value">{{ auditData.auditTaskInfoVO && auditData.auditTaskInfoVO.taskName ? auditData.auditTaskInfoVO.taskName : '-' }}</text>
+						</view>
+						<view class="info-item">
+							<text class="info-label">项目名称</text>
+							<text class="info-value">{{ auditData.auditTaskInfoVO && auditData.auditTaskInfoVO.projectName ? auditData.auditTaskInfoVO.projectName : '-' }}</text>
+						</view>
+						<view class="info-item">
+							<text class="info-label">归属部门</text>
+							<text class="info-value">{{ auditData.auditTaskInfoVO && auditData.auditTaskInfoVO.deptName ? auditData.auditTaskInfoVO.deptName : '-' }}</text>
+						</view>
+						<view class="info-item">
+							<text class="info-label">归属类型</text>
+							<text class="info-value">{{ auditData.auditTaskInfoVO && auditData.auditTaskInfoVO.belongTypeName ? auditData.auditTaskInfoVO.belongTypeName : '-' }}</text>
+						</view>
+						<view class="info-item">
+							<text class="info-label">任务数量</text>
+							<text class="info-value">{{ auditData.auditTaskInfoVO && auditData.auditTaskInfoVO.taskCount ? auditData.auditTaskInfoVO.taskCount : '-' }}</text>
+						</view>
+						<view class="info-item">
+							<text class="info-label">任务积分</text>
+							<text class="info-value">{{ auditData.auditTaskInfoVO && auditData.auditTaskInfoVO.taskIntegral ? auditData.auditTaskInfoVO.taskIntegral : '-' }}</text>
+						</view>
+						<view class="info-item">
+							<text class="info-label">计划开始时间</text>
+							<text class="info-value">{{ auditData.auditTaskInfoVO && auditData.auditTaskInfoVO.planStartTime ? auditData.auditTaskInfoVO.planStartTime : '-' }}</text>
+						</view>
+						<view class="info-item">
+							<text class="info-label">计划结束时间</text>
+							<text class="info-value">{{ auditData.auditTaskInfoVO && auditData.auditTaskInfoVO.planEndTime ? auditData.auditTaskInfoVO.planEndTime : '-' }}</text>
+						</view>
+						<view class="info-item">
+						<text class="info-label">申请人</text>
+						<text class="info-value">{{ auditData.auditTaskInfoVO && auditData.auditTaskInfoVO.companyUserName ? auditData.auditTaskInfoVO.companyUserName : '-' }}</text>
 					</view>
-					<!-- <view class="info-item">
-						<text class="info-label">任务备注</text>
-						<text class="info-value">{{ auditData.projectVO.thirdPartyCode }}</text>
-					</view> -->
-				</view>
-			</view>
-
-			<!-- 客户信息 -->
-			<view class="info-section" v-if="auditData">
-				<view class="section-header">
-					<view class="section-indicator"></view>
-					<text class="section-title">客户信息</text>
 				</view>
-				<view class="client-list">
-					<view class="client-item">
-						<view class="client-info">
-							<image class="avatar" src="/static/image/my_heads_icon.png"></image>
-							<view class="client-txt">
-								<view class="client-name">
-									{{ auditData.docterVO.doctorName }}
-									<text class="client-level">一级</text>
+				
+				<!-- 审核流程信息 -->
+					<view class="info-section" v-if="auditData.auditFlowVO && auditData.auditFlowVO.length > 0">
+						<view class="section-header">
+							<view class="section-indicator"></view>
+							<text class="section-title">审核流程信息</text>
+						</view>
+						<view class="flow-list">
+							<view v-for="(flow, index) in auditData.auditFlowVO" :key="index" class="flow-item">
+								<view class="flow-step">
+									<view class="step-number">{{ flow.stepNumber }}</view>
+									<view class="step-line" v-if="index < auditData.auditFlowVO.length - 1"></view>
 								</view>
-								<view class="client-hospital">
-									<text>{{ auditData.docterVO.institution }} </text>
-									<view class="line"></view>
-									<text>{{ auditData.docterVO.department || '-' }}</text>
+								<view class="flow-content">
+									<view class="flow-header">
+										<text class="flow-title">{{ flow.stepDescription }}</text>
+										<text class="flow-status" :class="{'status-pending': flow.status === 1, 'status-completed': flow.status === 2, 'status-submitted': flow.status === 0}">{{ flow.statusName }}</text>
+									</view>
+									<view class="flow-info">
+										<text>审核人:{{ flow.auditUserName || '-' }}</text>
+									</view>
+									<view class="flow-info" v-if="flow.auditTime">
+										<text>审核时间:{{ flow.auditTime }}</text>
+									</view>
+									<view class="flow-info" v-if="flow.comment">
+										<text>审核意见:{{ flow.comment }}</text>
+									</view>
 								</view>
 							</view>
 						</view>
-						<view class="client-stats">
-							<view class="stat-item"><text class="num">{{ auditData.auditTaskInfoVO.taskCount }} </text>任务</view>
-							<view class="stat-item"><text class="num">{{ auditData.auditTaskInfoVO.taskIntegral }} </text>积分</view>
-						</view>
 					</view>
-				</view>
 			</view>
-
-			<!-- 审批信息 -->
-			<view class="info-section" v-if="auditData">
-				<view class="section-header">
-					<view class="section-indicator"></view>
-					<text class="section-title">审批流程</text>
-				</view>
-				<view class="approval-list">
-					<view class="approval-item" v-for="(item, index) in auditData.auditFlowVO" :key="index">
-						<view class="left">
-							<view class="avatar-box">
-								<image class="avatar" src="/static/image/my_heads_icon.png"></image>
-								<image class="icon" v-if="item.status==1" src="/static/image/icon_wait.png"></image>
-								<image class="icon" v-if="item.status==0"  src="/static/image/icon_pass.png"></image>
-								<image class="icon" v-if="item.status==2"  src="/static/image/icon_refuse.png"></image>
-							</view>
-							<view class="approval-user">
-								<view class="user-name">{{ item.auditUserName }}</view>
-								<view class="user-status" :style="{ color: item.status === 0 ? '#4CAF50' : item.status === 1 ? '#FF9800' : '#F44336' }">{{ item.statusName }}</view>
-							</view>
-						</view>
-						<text class="approval-time">{{ item.auditTime || '' }}</text>
-						<view class="approval-line" v-if="index < auditData.auditFlowVO.length - 1"></view>
-					</view>
-				</view>
 			</view>
+
 		</scroll-view>
 
 		<view class="bottom-bar">
@@ -159,9 +148,20 @@
 
 <script>
 import { doAudit, getAuditFlows, getTaskFinishAuditInfo } from '@/api/audit.js'
-import image from 'uview-ui/libs/config/props/image';
+import ShortVideoAudit from './components/ShortVideoAudit.vue'
+import LongVideoAudit from './components/LongVideoAudit.vue'
+import ArticleAudit from './components/ArticleAudit.vue'
+import SpeakerAudit from './components/SpeakerAudit.vue'
+import WithdrawAudit from './components/WithdrawAudit.vue'
 
 export default {
+  components: {
+    ShortVideoAudit,
+    LongVideoAudit,
+    ArticleAudit,
+    SpeakerAudit,
+    WithdrawAudit
+  },
   data() {
     return {
 		userInfo:JSON.parse(uni.getStorageSync('userInfo')),
@@ -177,10 +177,17 @@ export default {
       // 接口返回的原始数据
       auditData: null,
       // 审批信息
-      approvalInfo: []
+      approvalInfo: [],
+	  businessType:null
     }
   },
   onLoad(options) {
+	console.log("options参数",options)
+
+	if(options.businessType){
+		this.businessType = options.businessType
+	}
+
     if (options.taskId) {
       this.taskId = options.taskId
       this.loadData()
@@ -366,6 +373,157 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+	// 通用信息部分样式
+	.info-section {
+		background: #fff;
+		border-radius: 16rpx;
+		padding: 32rpx;
+		margin-bottom: 20rpx;
+		box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
+	}
+
+	.section-header {
+		display: flex;
+		align-items: center;
+		margin-bottom: 24rpx;
+	}
+
+	.section-indicator {
+		width: 8rpx;
+		height: 24rpx;
+		background: #1989fa;
+		border-radius: 4rpx;
+		margin-right: 12rpx;
+	}
+
+	.section-title {
+		font-size: 28rpx;
+		font-weight: 600;
+		color: #333;
+	}
+
+	.info-list {
+		width: 100%;
+	}
+
+	.info-item {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 16rpx 0;
+		border-bottom: 1rpx solid #f2f2f2;
+	}
+
+	.info-item:last-child {
+		border-bottom: none;
+	}
+
+	.info-label {
+		font-size: 26rpx;
+		color: #666;
+		flex: 1;
+	}
+
+	.info-value {
+		font-size: 26rpx;
+		color: #333;
+		flex: 2;
+		text-align: right;
+		word-break: break-all;
+	}
+
+	// 审核流程样式
+	.flow-list {
+		position: relative;
+	}
+
+	.flow-item {
+		display: flex;
+		margin-bottom: 32rpx;
+		position: relative;
+	}
+
+	.flow-step {
+		width: 40rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		position: relative;
+	}
+
+	.step-number {
+		width: 40rpx;
+		height: 40rpx;
+		border-radius: 50%;
+		background: #1989fa;
+		color: #fff;
+		font-size: 24rpx;
+		font-weight: bold;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		z-index: 2;
+	}
+
+	.step-line {
+		width: 2rpx;
+		height: 100%;
+		background: #e5e5e5;
+		position: absolute;
+		top: 40rpx;
+		left: 19rpx;
+		z-index: 1;
+	}
+
+	.flow-content {
+		flex: 1;
+		margin-left: 24rpx;
+		background: #f9f9f9;
+		border-radius: 12rpx;
+		padding: 24rpx;
+		position: relative;
+	}
+
+	.flow-header {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		margin-bottom: 16rpx;
+	}
+
+	.flow-title {
+		font-size: 26rpx;
+		font-weight: 600;
+		color: #333;
+	}
+
+	.flow-status {
+		font-size: 24rpx;
+		padding: 4rpx 16rpx;
+		border-radius: 12rpx;
+	}
+
+	.status-pending {
+		background: #fff7e6;
+		color: #fa8c16;
+	}
+
+	.status-completed {
+		background: #f0f9eb;
+		color: #52c41a;
+	}
+
+	.status-submitted {
+		background: #e6f7ff;
+		color: #1890ff;
+	}
+
+	.flow-info {
+		font-size: 24rpx;
+		color: #666;
+		margin-bottom: 8rpx;
+	}
+
 	// 弹窗样式
 	.reject-popup-content {
 		padding: 32rpx;

+ 247 - 0
pages_task/components/ArticleAudit.vue

@@ -0,0 +1,247 @@
+<template>
+  <view class="article-audit" v-if="data">
+    <!-- 文章审核表单 -->
+    <view class="info-section">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">文章信息</text>
+      </view>
+      <view class="info-list">
+        <!-- 基本信息 -->
+        <view class="info-item">
+          <text class="info-label">标题</text>
+          <text class="info-value">{{ data.title || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">公司</text>
+          <text class="info-value">{{ data.companyName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">作者</text>
+          <text class="info-value">{{ data.authorName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">分组</text>
+          <text class="info-value">{{ data.groupName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">标签</text>
+          <text class="info-value">{{ data.tags || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">摘要</text>
+          <text class="info-value">{{ data.summary || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">上下架</text>
+          <text class="info-value">{{ data.isPublish ? '上架' : '下架' }}</text>
+        </view>
+      </view>
+    </view>
+
+    <!-- 文章内容 -->
+    <view class="info-section" v-if="data.articleContent || data.articleUrl">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">文章内容</text>
+      </view>
+      <view class="article-content" v-if="data.articleContent">
+        <!-- 直接显示文章内容 -->
+        <view class="content-preview" @click="browseArticle">
+          <rich-text :nodes="data.articleContent"></rich-text>
+          <view class="browse-btn">
+            <text>点击浏览全文</text>
+          </view>
+        </view>
+      </view>
+      <view class="article-url" v-else-if="data.articleUrl">
+        <!-- 文章链接 -->
+        <view class="url-container" @click="openArticleUrl(data.articleUrl)">
+          <text class="url-text">{{ data.articleUrl }}</text>
+          <view class="open-btn">
+            <text>打开链接</text>
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <!-- 封面图 -->
+    <view class="info-section" v-if="data.coverImageUrl">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">封面图</text>
+      </view>
+      <view class="image-container">
+        <image 
+          :src="data.coverImageUrl" 
+          style="width: 200rpx; height: 200rpx;"
+          mode="aspectFill"
+          @click="previewImage(data.coverImageUrl)"
+        ></image>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'ArticleAudit',
+  props: {
+    data: {
+      type: Object,
+      default: null
+    }
+  },
+  methods: {
+    // 浏览文章
+    browseArticle() {
+      if (this.data.articleContent) {
+        // 这里可以实现浏览全文的逻辑,例如打开新页面或弹窗显示完整文章
+        uni.showToast({
+          title: '浏览文章功能开发中',
+          icon: 'none'
+        })
+      }
+    },
+    
+    // 打开文章链接
+    openArticleUrl(url) {
+      if (url) {
+        uni.navigateTo({
+          url: `/pages/common/webview?url=${encodeURIComponent(url)}`
+        })
+      }
+    },
+    
+    // 预览图片
+    previewImage(url) {
+      uni.previewImage({
+        urls: [url],
+        current: url
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.info-section {
+  margin-bottom: 24rpx;
+  background: #fff;
+  border-radius: 16rpx;
+  padding: 24rpx;
+
+  .section-header {
+    display: flex;
+    align-items: center;
+    margin-bottom: 24rpx;
+
+    .section-indicator {
+      width: 8rpx;
+      height: 32rpx;
+      background: #388BFF;
+      border-radius: 4rpx;
+      margin-right: 16rpx;
+    }
+
+    .section-title {
+      font-size: 32rpx;
+      font-weight: 500;
+      color: #333;
+    }
+  }
+
+  .info-list {
+    .info-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: flex-start;
+      margin-bottom: 20rpx;
+      padding-bottom: 20rpx;
+      border-bottom: 1rpx solid #F0F0F0;
+
+      &:last-child {
+        margin-bottom: 0;
+        padding-bottom: 0;
+        border-bottom: none;
+      }
+
+      .info-label {
+        font-size: 28rpx;
+        color: #666;
+        width: 200rpx;
+      }
+
+      .info-value {
+        font-size: 28rpx;
+        color: #333;
+        flex: 1;
+        text-align: right;
+        word-break: break-all;
+      }
+    }
+  }
+
+  .article-content {
+    .content-preview {
+      border: 1rpx solid #F0F0F0;
+      border-radius: 8rpx;
+      padding: 20rpx;
+      background-color: #F9F9F9;
+      cursor: pointer;
+
+      rich-text {
+        font-size: 28rpx;
+        color: #333;
+      }
+
+      .browse-btn {
+        margin-top: 20rpx;
+        text-align: center;
+        color: #388BFF;
+        font-size: 28rpx;
+      }
+    }
+  }
+
+  .article-url {
+    .url-container {
+      border: 1rpx solid #F0F0F0;
+      border-radius: 8rpx;
+      padding: 20rpx;
+      background-color: #F9F9F9;
+      cursor: pointer;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+
+      .url-text {
+        font-size: 28rpx;
+        color: #388BFF;
+        flex: 1;
+        word-break: break-all;
+      }
+
+      .open-btn {
+        margin-left: 20rpx;
+        padding: 10rpx 20rpx;
+        background-color: #388BFF;
+        color: #fff;
+        border-radius: 4rpx;
+        font-size: 24rpx;
+      }
+    }
+  }
+
+  .image-container {
+    margin-top: 16rpx;
+    display: flex;
+    gap: 16rpx;
+
+    image {
+      border-radius: 8rpx;
+      cursor: pointer;
+    }
+  }
+}
+</style>

+ 182 - 0
pages_task/components/LongVideoAudit.vue

@@ -0,0 +1,182 @@
+<template>
+  <view class="long-video-audit" v-if="data">
+    <!-- 长视频审核表单 -->
+    <view class="info-section">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">长视频信息</text>
+      </view>
+      <view class="info-list">
+        <!-- 基本信息 -->
+        <view class="info-item">
+          <text class="info-label">视频标题</text>
+          <text class="info-value">{{ data.videoTitle || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">公司</text>
+          <text class="info-value">{{ data.companyName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">作者</text>
+          <text class="info-value">{{ data.authorName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">是否原创</text>
+          <text class="info-value">{{ data.isOriginal ? '是' : '否' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">分组</text>
+          <text class="info-value">{{ data.groupName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">标签</text>
+          <text class="info-value">{{ data.tags || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">摘要</text>
+          <text class="info-value">{{ data.summary || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">上下架</text>
+          <text class="info-value">{{ data.isPublish ? '上架' : '下架' }}</text>
+        </view>
+      </view>
+    </view>
+
+    <!-- 视频预览 -->
+    <view class="info-section" v-if="data.videoUrl">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">视频预览</text>
+      </view>
+      <view class="video-container">
+        <video 
+          :src="data.videoUrl" 
+          :poster="data.coverImageUrl || ''"
+          style="width: 100%; height: 400rpx; background-color: #000;"
+          controls
+          @error="videoError"
+        ></video>
+      </view>
+    </view>
+
+    <!-- 封面图 -->
+    <view class="info-section" v-if="data.coverImageUrl">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">封面图</text>
+      </view>
+      <view class="image-container">
+        <image 
+          :src="data.coverImageUrl" 
+          style="width: 200rpx; height: 200rpx;"
+          mode="aspectFill"
+          @click="previewImage(data.coverImageUrl)"
+        ></image>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'LongVideoAudit',
+  props: {
+    data: {
+      type: Object,
+      default: null
+    }
+  },
+  methods: {
+    // 视频播放错误处理
+    videoError(err) {
+      console.error('视频播放错误:', err)
+    },
+    
+    // 预览图片
+    previewImage(url) {
+      uni.previewImage({
+        urls: [url],
+        current: url
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.info-section {
+  margin-bottom: 24rpx;
+  background: #fff;
+  border-radius: 16rpx;
+  padding: 24rpx;
+
+  .section-header {
+    display: flex;
+    align-items: center;
+    margin-bottom: 24rpx;
+
+    .section-indicator {
+      width: 8rpx;
+      height: 32rpx;
+      background: #388BFF;
+      border-radius: 4rpx;
+      margin-right: 16rpx;
+    }
+
+    .section-title {
+      font-size: 32rpx;
+      font-weight: 500;
+      color: #333;
+    }
+  }
+
+  .info-list {
+    .info-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: flex-start;
+      margin-bottom: 20rpx;
+      padding-bottom: 20rpx;
+      border-bottom: 1rpx solid #F0F0F0;
+
+      &:last-child {
+        margin-bottom: 0;
+        padding-bottom: 0;
+        border-bottom: none;
+      }
+
+      .info-label {
+        font-size: 28rpx;
+        color: #666;
+        width: 200rpx;
+      }
+
+      .info-value {
+        font-size: 28rpx;
+        color: #333;
+        flex: 1;
+        text-align: right;
+        word-break: break-all;
+      }
+    }
+  }
+
+  .video-container {
+    margin-top: 16rpx;
+    border-radius: 8rpx;
+    overflow: hidden;
+  }
+
+  .image-container {
+    margin-top: 16rpx;
+    display: flex;
+    gap: 16rpx;
+
+    image {
+      border-radius: 8rpx;
+      cursor: pointer;
+    }
+  }
+}
+</style>

+ 182 - 0
pages_task/components/ShortVideoAudit.vue

@@ -0,0 +1,182 @@
+<template>
+  <view class="short-video-audit" v-if="data">
+    <!-- 短视频审核表单 -->
+    <view class="info-section">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">短视频信息</text>
+      </view>
+      <view class="info-list">
+        <!-- 基本信息 -->
+        <view class="info-item">
+          <text class="info-label">视频标题</text>
+          <text class="info-value">{{ data.videoTitle || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">公司</text>
+          <text class="info-value">{{ data.companyName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">作者</text>
+          <text class="info-value">{{ data.authorName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">是否原创</text>
+          <text class="info-value">{{ data.isOriginal ? '是' : '否' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">分组</text>
+          <text class="info-value">{{ data.groupName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">标签</text>
+          <text class="info-value">{{ data.tags || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">摘要</text>
+          <text class="info-value">{{ data.summary || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">上下架</text>
+          <text class="info-value">{{ data.isPublish ? '上架' : '下架' }}</text>
+        </view>
+      </view>
+    </view>
+
+    <!-- 视频预览 -->
+    <view class="info-section" v-if="data.videoUrl">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">视频预览</text>
+      </view>
+      <view class="video-container">
+        <video 
+          :src="data.videoUrl" 
+          :poster="data.coverImageUrl || ''"
+          style="width: 100%; height: 400rpx; background-color: #000;"
+          controls
+          @error="videoError"
+        ></video>
+      </view>
+    </view>
+
+    <!-- 封面图 -->
+    <view class="info-section" v-if="data.coverImageUrl">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">封面图</text>
+      </view>
+      <view class="image-container">
+        <image 
+          :src="data.coverImageUrl" 
+          style="width: 200rpx; height: 200rpx;"
+          mode="aspectFill"
+          @click="previewImage(data.coverImageUrl)"
+        ></image>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'ShortVideoAudit',
+  props: {
+    data: {
+      type: Object,
+      default: null
+    }
+  },
+  methods: {
+    // 视频播放错误处理
+    videoError(err) {
+      console.error('视频播放错误:', err)
+    },
+    
+    // 预览图片
+    previewImage(url) {
+      uni.previewImage({
+        urls: [url],
+        current: url
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.info-section {
+  margin-bottom: 24rpx;
+  background: #fff;
+  border-radius: 16rpx;
+  padding: 24rpx;
+
+  .section-header {
+    display: flex;
+    align-items: center;
+    margin-bottom: 24rpx;
+
+    .section-indicator {
+      width: 8rpx;
+      height: 32rpx;
+      background: #388BFF;
+      border-radius: 4rpx;
+      margin-right: 16rpx;
+    }
+
+    .section-title {
+      font-size: 32rpx;
+      font-weight: 500;
+      color: #333;
+    }
+  }
+
+  .info-list {
+    .info-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: flex-start;
+      margin-bottom: 20rpx;
+      padding-bottom: 20rpx;
+      border-bottom: 1rpx solid #F0F0F0;
+
+      &:last-child {
+        margin-bottom: 0;
+        padding-bottom: 0;
+        border-bottom: none;
+      }
+
+      .info-label {
+        font-size: 28rpx;
+        color: #666;
+        width: 200rpx;
+      }
+
+      .info-value {
+        font-size: 28rpx;
+        color: #333;
+        flex: 1;
+        text-align: right;
+        word-break: break-all;
+      }
+    }
+  }
+
+  .video-container {
+    margin-top: 16rpx;
+    border-radius: 8rpx;
+    overflow: hidden;
+  }
+
+  .image-container {
+    margin-top: 16rpx;
+    display: flex;
+    gap: 16rpx;
+
+    image {
+      border-radius: 8rpx;
+      cursor: pointer;
+    }
+  }
+}
+</style>

+ 187 - 0
pages_task/components/SpeakerAudit.vue

@@ -0,0 +1,187 @@
+<template>
+  <view class="speaker-audit" v-if="data">
+    <!-- 讲者审核表单 -->
+    <view class="info-section">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">讲者信息</text>
+      </view>
+      <view class="info-list">
+        <!-- 基本信息 -->
+        <view class="info-item">
+          <text class="info-label">公司</text>
+          <text class="info-value">{{ data.companyUserVO && data.companyUserVO.companyName ? data.companyUserVO.companyName : '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">医生</text>
+          <text class="info-value">{{ data.docterVO && data.docterVO.doctorName ? data.docterVO.doctorName : '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">学术头衔</text>
+          <text class="info-value">{{ data.docterVO && data.docterVO.jobTitle ? data.docterVO.jobTitle : '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">学位</text>
+          <text class="info-value">{{ data.docterVO && data.docterVO.degree ? data.docterVO.degree : '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">学术研究</text>
+          <text class="info-value">{{ data.docterVO && data.docterVO.academicResearch ? data.docterVO.academicResearch : '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">申请级别</text>
+          <text class="info-value">{{ data.docterVO && data.docterVO.applyLevel ? data.docterVO.applyLevel : '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">临床年数</text>
+          <text class="info-value">{{ data.docterVO && data.docterVO.clinicalYears ? data.docterVO.clinicalYears : '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">国际论文/著作</text>
+          <text class="info-value">{{ data.docterVO && data.docterVO.internationalPapers ? data.docterVO.internationalPapers : '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">全国论文/著作</text>
+          <text class="info-value">{{ data.docterVO && data.docterVO.nationalPapers ? data.docterVO.nationalPapers : '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">学术任职</text>
+          <text class="info-value">{{ data.docterVO && data.docterVO.academicPositions ? data.docterVO.academicPositions : '-' }}</text>
+        </view>
+      </view>
+    </view>
+
+    <!-- 证明材料 -->
+    <view class="info-section" v-if="(data.docterVO && data.docterVO.licenseImage) || (data.docterVO && data.docterVO.titleCertImage)">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">证明材料</text>
+      </view>
+      <view class="proof-materials">
+        <!-- 执业证书 -->
+        <view class="material-item" v-if="data.docterVO && data.docterVO.licenseImage" @click="previewImage(data.docterVO.licenseImage, [data.docterVO.licenseImage])">
+          <image 
+            :src="data.docterVO.licenseImage" 
+            style="width: 200rpx; height: 200rpx;"
+            mode="aspectFill"
+          ></image>
+          <text class="material-name">执业证书</text>
+        </view>
+        <!-- 职称证书 -->
+        <view class="material-item" v-if="data.docterVO && data.docterVO.titleCertImage" @click="previewImage(data.docterVO.titleCertImage, [data.docterVO.titleCertImage])">
+          <image 
+            :src="data.docterVO.titleCertImage" 
+            style="width: 200rpx; height: 200rpx;"
+            mode="aspectFill"
+          ></image>
+          <text class="material-name">职称证书</text>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'SpeakerAudit',
+  props: {
+    data: {
+      type: Object,
+      default: null
+    }
+  },
+  methods: {
+    // 预览图片
+    previewImage(current, urls) {
+      uni.previewImage({
+        urls: urls,
+        current: current
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.info-section {
+  margin-bottom: 24rpx;
+  background: #fff;
+  border-radius: 16rpx;
+  padding: 24rpx;
+
+  .section-header {
+    display: flex;
+    align-items: center;
+    margin-bottom: 24rpx;
+
+    .section-indicator {
+      width: 8rpx;
+      height: 32rpx;
+      background: #388BFF;
+      border-radius: 4rpx;
+      margin-right: 16rpx;
+    }
+
+    .section-title {
+      font-size: 32rpx;
+      font-weight: 500;
+      color: #333;
+    }
+  }
+
+  .info-list {
+    .info-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: flex-start;
+      margin-bottom: 20rpx;
+      padding-bottom: 20rpx;
+      border-bottom: 1rpx solid #F0F0F0;
+
+      &:last-child {
+        margin-bottom: 0;
+        padding-bottom: 0;
+        border-bottom: none;
+      }
+
+      .info-label {
+        font-size: 28rpx;
+        color: #666;
+        width: 200rpx;
+      }
+
+      .info-value {
+        font-size: 28rpx;
+        color: #333;
+        flex: 1;
+        text-align: right;
+        word-break: break-all;
+      }
+    }
+  }
+
+  .proof-materials {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 20rpx;
+
+    .material-item {
+      width: 200rpx;
+      margin-bottom: 20rpx;
+      cursor: pointer;
+
+      image {
+        border-radius: 8rpx;
+        margin-bottom: 10rpx;
+      }
+
+      .material-name {
+        font-size: 24rpx;
+        color: #666;
+        text-align: center;
+        word-break: break-all;
+      }
+    }
+  }
+}
+</style>

+ 169 - 0
pages_task/components/WithdrawAudit.vue

@@ -0,0 +1,169 @@
+<template>
+  <view class="withdraw-audit" v-if="data">
+    <!-- 提现审核表单 -->
+    <view class="info-section">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">提现信息</text>
+      </view>
+      <view class="info-list">
+        <!-- 基本信息 -->
+        <view class="info-item">
+          <text class="info-label">公司</text>
+          <text class="info-value">{{ data.companyName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">医生</text>
+          <text class="info-value">{{ data.doctorName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">提现金额</text>
+          <text class="info-value">{{ data.amount || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">申请时间</text>
+          <text class="info-value">{{ data.applyTime || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">提现积分</text>
+          <text class="info-value">{{ data.points || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">审核时间</text>
+          <text class="info-value">{{ data.auditTime || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">打款时间</text>
+          <text class="info-value">{{ data.paymentTime || '-' }}</text>
+        </view>
+      </view>
+    </view>
+
+    <!-- 银行回执 -->
+    <view class="info-section" v-if="data.bankReceipts && data.bankReceipts.length > 0">
+      <view class="section-header">
+        <view class="section-indicator"></view>
+        <text class="section-title">银行回执</text>
+      </view>
+      <view class="bank-receipts">
+        <view class="receipt-item" 
+          v-for="(receipt, index) in data.bankReceipts" 
+          :key="index"
+          @click="previewImage(receipt.url, data.bankReceipts.map(item => item.url))"
+        >
+          <image 
+            :src="receipt.url" 
+            style="width: 200rpx; height: 200rpx;"
+            mode="aspectFill"
+          ></image>
+          <text class="receipt-name">{{ receipt.name || `回执${index + 1}` }}</text>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'WithdrawAudit',
+  props: {
+    data: {
+      type: Object,
+      default: null
+    }
+  },
+  methods: {
+    // 预览图片
+    previewImage(current, urls) {
+      uni.previewImage({
+        urls: urls,
+        current: current
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.info-section {
+  margin-bottom: 24rpx;
+  background: #fff;
+  border-radius: 16rpx;
+  padding: 24rpx;
+
+  .section-header {
+    display: flex;
+    align-items: center;
+    margin-bottom: 24rpx;
+
+    .section-indicator {
+      width: 8rpx;
+      height: 32rpx;
+      background: #388BFF;
+      border-radius: 4rpx;
+      margin-right: 16rpx;
+    }
+
+    .section-title {
+      font-size: 32rpx;
+      font-weight: 500;
+      color: #333;
+    }
+  }
+
+  .info-list {
+    .info-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: flex-start;
+      margin-bottom: 20rpx;
+      padding-bottom: 20rpx;
+      border-bottom: 1rpx solid #F0F0F0;
+
+      &:last-child {
+        margin-bottom: 0;
+        padding-bottom: 0;
+        border-bottom: none;
+      }
+
+      .info-label {
+        font-size: 28rpx;
+        color: #666;
+        width: 200rpx;
+      }
+
+      .info-value {
+        font-size: 28rpx;
+        color: #333;
+        flex: 1;
+        text-align: right;
+        word-break: break-all;
+      }
+    }
+  }
+
+  .bank-receipts {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 20rpx;
+
+    .receipt-item {
+      width: 200rpx;
+      margin-bottom: 20rpx;
+      cursor: pointer;
+
+      image {
+        border-radius: 8rpx;
+        margin-bottom: 10rpx;
+      }
+
+      .receipt-name {
+        font-size: 24rpx;
+        color: #666;
+        text-align: center;
+        word-break: break-all;
+      }
+    }
+  }
+}
+</style>

+ 30 - 15
pages_task/xlTask.vue

@@ -42,16 +42,16 @@
 				<view class="card-content">
 					<!-- 讲者信息 -->
 					<view class="speaker-info">
-						<text class="speaker-name">{{ item.speaker }}</text>
-						<view class="level-tag">{{ item.level }}</view>
+						<text class="speaker-name">{{ item.doctorName||'未命名' }}</text>
+						<view class="level-tag" v-if="item.level">{{ item.level }}</view>
 					</view>
 
 					<!-- 医院+科室 -->
 					<view class="org-info">
 						<image class="org-icon" src="@/static/image/icon_hospital.png" mode="widthFix"></image>
-						<text>{{ item.hospital }}</text>
+						<text>{{ item.hospital ||'-' }}</text>
 						<view class="line"></view>
-						<text>{{ item.department }}</text>
+						<text>{{ item.department||'-' }}</text>
 					</view>
 
 					<!-- 标签组 -->
@@ -60,7 +60,7 @@
 							<view class="tag-item video-tag" v-if="item.videoType">
 								<image class="video-tag-icon" src="@/static/image/icon_longvideo.png" mode="widthFix">
 								</image>
-								<text>{{ item.videoType }}</text>
+								<text>{{ item.videoType ||'-'}}</text>
 							</view>
 							<view class="tag-item category-tag" v-if="item.category">
 								{{ item.category }}
@@ -68,8 +68,8 @@
 						</view>
 
 						<view class="tag-right-group">
-							<view class="tag-item points-tag">{{ item.points }}积分</view>
-							<view class="tag-item count-tag">{{ item.count }}个</view>
+							<view class="tag-item points-tag">{{ item.points||'0' }}积分</view>
+							<view class="tag-item count-tag">{{ item.count ||'0' }}个</view>
 							<view class="tag-item count-tag">院内</view>
 						</view>
 					</view>
@@ -78,11 +78,11 @@
 					<view class="time-info">
 						<view class="time-item">
 							<text>申请时间:</text>
-							<text>{{ item.applyTime }}</text>
+							<text>{{ item.applyTime ||'-'}}</text>
 						</view>
 						<view class="time-item" v-if="currentTopTab === 'task'">
 							<text>完成时间:</text>
-							<text>{{ item.finishTime || '-' }}</text>
+							<text>{{ item.updateTime || '-' }}</text>
 						</view>
 						<view class="time-item" v-if="currentTopTab === 'task'">
 							<text>完成审核:</text>
@@ -136,9 +136,9 @@
 					<view class="filter-section">
 						<view class="section-label">任务申请时间</view>
 						<view class="time-range">
-							<input class="time-input" placeholder="开始时间" v-model="filters.applyTimeStart" />
+							<view class="time-input" @click="openDatePicker('applyTimeStart')">{{ filters.applyTimeStart || '开始时间' }}</view>
 							<view class="time-separator">-</view>
-							<input class="time-input" placeholder="结束时间" v-model="filters.applyTimeEnd" />
+							<view class="time-input" @click="openDatePicker('applyTimeEnd')">{{ filters.applyTimeEnd || '结束时间' }}</view>
 						</view>
 					</view>
 
@@ -146,9 +146,9 @@
 					<view class="filter-section" v-if="currentTopTab === 'audit'">
 						<view class="section-label">任务完成时间</view>
 						<view class="time-range">
-							<input class="time-input" placeholder="开始时间" v-model="filters.finishTimeStart" />
+							<view class="time-input" @click="openDatePicker('finishTimeStart')">{{ filters.finishTimeStart || '开始时间' }}</view>
 							<view class="time-separator">-</view>
-							<input class="time-input" placeholder="结束时间" v-model="filters.finishTimeEnd" />
+							<view class="time-input" @click="openDatePicker('finishTimeEnd')">{{ filters.finishTimeEnd || '结束时间' }}</view>
 						</view>
 					</view>
 
@@ -156,9 +156,9 @@
 					<view class="filter-section" v-if="currentTopTab === 'audit'">
 						<view class="section-label">完成审核时间</view>
 						<view class="time-range">
-							<input class="time-input" placeholder="开始时间" v-model="filters.auditTimeStart" />
+							<view class="time-input" @click="openDatePicker('auditTimeStart')">{{ filters.auditTimeStart || '开始时间' }}</view>
 							<view class="time-separator">-</view>
-							<input class="time-input" placeholder="结束时间" v-model="filters.auditTimeEnd" />
+							<view class="time-input" @click="openDatePicker('auditTimeEnd')">{{ filters.auditTimeEnd || '结束时间' }}</view>
 						</view>
 					</view>
 
@@ -471,6 +471,21 @@
 				// 根据筛选条件重新加载数据
 				this.loadData();
 			},
+			// 打开日期选择器
+			openDatePicker(field) {
+				const currentValue = this.filters[field];
+				const defaultDate = currentValue ? new Date(currentValue) : new Date();
+				
+				uni.datePicker({
+					type: 'date',
+					start: '2020-01-01',
+					end: new Date().toISOString().split('T')[0],
+					current: currentValue || new Date().toISOString().split('T')[0],
+					success: (res) => {
+						this.filters[field] = res.value;
+					}
+				});
+			},
 			handleShare(item) {
 				uni.showToast({
 					title: '分享功能待实现',