liujiaxin 1 день тому
батько
коміт
5b11af553e
100 змінених файлів з 1108 додано та 1839 видалено
  1. 1 1
      api/speaker.js
  2. 1 9
      pages.json
  3. 3 3
      pages/auth/changePassword.vue
  4. 2 2
      pages/auth/forgetPassword.vue
  5. 8 23
      pages/auth/login.vue
  6. 4 4
      pages/home/index.vue
  7. 2 2
      pages/user/index.vue
  8. 112 82
      pages_speaker/gradeApplication.vue
  9. 3 2
      pages_speaker/index.vue
  10. 139 3
      pages_speaker/speakerInvitation.vue
  11. 1 1
      pages_task/approvalTaskDetail.vue
  12. 2 2
      pages_task/components/TaskBelongingPicker.vue
  13. 2 2
      pages_task/components/step.vue
  14. 3 3
      pages_task/editSelectCustomer.vue
  15. 95 26
      pages_task/fillTask.vue
  16. 0 457
      pages_task/medicationSurvey.vue
  17. 0 648
      pages_task/onlineLecture.vue
  18. 3 3
      pages_task/pointsSettings.vue
  19. 4 4
      pages_task/selectCustomer.vue
  20. 1 1
      pages_task/success.vue
  21. 1 1
      pages_task/taskDetail.vue
  22. 257 165
      pages_task/xlTask.vue
  23. 464 395
      pages_user/userInfo.vue
  24. BIN
      static/image/Iconly/Light/Calendar.png
  25. BIN
      static/image/approval.png
  26. BIN
      static/image/back.png
  27. BIN
      static/image/back_white.png
  28. BIN
      static/image/bg_bankcard.png
  29. BIN
      static/image/bg_bench.png
  30. BIN
      static/image/bg_invite.png
  31. BIN
      static/image/bg_login.png
  32. BIN
      static/image/bg_mine.png
  33. BIN
      static/image/bg_tab_login.png
  34. BIN
      static/image/bg_tab_login2.png
  35. BIN
      static/image/btn_add.png
  36. BIN
      static/image/btn_data.png
  37. BIN
      static/image/btn_sjtj.png
  38. BIN
      static/image/icon_ barrage_on.png
  39. BIN
      static/image/icon_Bold_Play.png
  40. BIN
      static/image/icon_admonish.png
  41. BIN
      static/image/icon_approval_no.png
  42. BIN
      static/image/icon_approval_yes.png
  43. BIN
      static/image/icon_attachment.png
  44. BIN
      static/image/icon_camera.png
  45. BIN
      static/image/icon_circle.png
  46. BIN
      static/image/icon_circle_sel.png
  47. BIN
      static/image/icon_clear.png
  48. BIN
      static/image/icon_close.png
  49. BIN
      static/image/icon_cross.png
  50. BIN
      static/image/icon_delete.png
  51. BIN
      static/image/icon_doctor.png
  52. BIN
      static/image/icon_doctor_fill.png
  53. BIN
      static/image/icon_down.png
  54. BIN
      static/image/icon_downlad.png
  55. BIN
      static/image/icon_example.png
  56. BIN
      static/image/icon_expand.png
  57. BIN
      static/image/icon_fullscreen.png
  58. BIN
      static/image/icon_fullscreen2.png
  59. BIN
      static/image/icon_goon.png
  60. BIN
      static/image/icon_hospital.png
  61. BIN
      static/image/icon_img_delete.png
  62. BIN
      static/image/icon_invisible.png
  63. BIN
      static/image/icon_live_pc.png
  64. BIN
      static/image/icon_live_phone.png
  65. BIN
      static/image/icon_longvideo.png
  66. BIN
      static/image/icon_more.png
  67. BIN
      static/image/icon_my_card.png
  68. BIN
      static/image/icon_my_information.png
  69. BIN
      static/image/icon_my_more.png
  70. BIN
      static/image/icon_my_password.png
  71. BIN
      static/image/icon_my_points.png
  72. BIN
      static/image/icon_my_servicelist.png
  73. BIN
      static/image/icon_my_set.png
  74. BIN
      static/image/icon_my_useragreement.png
  75. BIN
      static/image/icon_pass.png
  76. BIN
      static/image/icon_play.png
  77. BIN
      static/image/icon_refuse.png
  78. BIN
      static/image/icon_reject.png
  79. BIN
      static/image/icon_right.png
  80. BIN
      static/image/icon_search.png
  81. BIN
      static/image/icon_select.png
  82. BIN
      static/image/icon_share.png
  83. BIN
      static/image/icon_share_save.png
  84. BIN
      static/image/icon_share_wechat.png
  85. BIN
      static/image/icon_step_done.png
  86. BIN
      static/image/icon_task_kpcz.png
  87. BIN
      static/image/icon_task_zxjz.png
  88. BIN
      static/image/icon_time.png
  89. BIN
      static/image/icon_tobestart.png
  90. BIN
      static/image/icon_uplodeidcard.png
  91. BIN
      static/image/icon_user.png
  92. BIN
      static/image/icon_v.png
  93. BIN
      static/image/icon_v_fail.png
  94. BIN
      static/image/icon_v_ing.png
  95. BIN
      static/image/icon_video.png
  96. BIN
      static/image/icon_visible.png
  97. BIN
      static/image/icon_visitor.png
  98. BIN
      static/image/icon_wait.png
  99. BIN
      static/image/icon_warning.png
  100. BIN
      static/image/icon_wrong.png

+ 1 - 1
api/speaker.js

@@ -16,7 +16,7 @@ export function apply(data) {
  
  //邀请
 export function inviteDoctor(companyUserId,companyId) {
- 	 return request(`/doctor/doctor/invite_doctor?companyUserId=${companyUserId}&companyId=${companyId}`,{},'GET','application/json;charset=UTF-8');
+	 return request(`/doctor/doctor/invite_doctor?companyUserId=${companyUserId}&companyId=${companyId}`,{},'GET');
 } 
  
 

+ 1 - 9
pages.json

@@ -134,15 +134,7 @@
 						}
 					}
 				},
-				{
-					"path": "onlineLecture",
-					"style": {
-						"navigationBarTitleText": "在线讲座",
-						"app-plus": {
-							"titleNView": false
-						}
-					}
-				},
+				
 				{
 					"path": "science",
 					"style": {

+ 3 - 3
pages/auth/changePassword.vue

@@ -7,7 +7,7 @@
 					placeholder="请输入现有密码" />
 				<view class="img-box" @click="toggleOldPassword">
 					<image class="icon"
-						:src="showOldPassword?'/static/image/icon_visible.png':'/static/image/icon_invisible.png'"
+						:src="showOldPassword?'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_visible.png':'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_invisible.png'"
 						mode="aspectFill"></image>
 				</view>
 			</view>
@@ -17,7 +17,7 @@
 					placeholder="请输入8-20位字母、数字" />
 				<view class="img-box" @click="toggleNewPassword">
 					<image class="icon"
-						:src="showNewPassword?'/static/image/icon_visible.png':'/static/image/icon_invisible.png'"
+						:src="showNewPassword?'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_visible.png':'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_invisible.png'"
 						mode="aspectFill"></image>
 				</view>
 			</view>
@@ -27,7 +27,7 @@
 					placeholder="请再次输入新密码" />
 				<view class="img-box" @click="toggleConfirmPassword">
 					<image class="icon"
-						:src="showConfirmPassword?'/static/image/icon_visible.png':'/static/image/icon_invisible.png'"
+						:src="showConfirmPassword?'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_visible.png':'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_invisible.png'"
 						mode="aspectFill"></image>
 				</view>
 			</view>

+ 2 - 2
pages/auth/forgetPassword.vue

@@ -20,7 +20,7 @@
 					placeholder="请输入8-20位字母、数字" />
 				<view class="img-box" @click="toggleNewPassword">
 					<image class="icon"
-						:src="showNewPassword?'/static/image/icon_visible.png':'/static/image/icon_invisible.png'"
+						:src="showNewPassword?'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_visible.png':'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_invisible.png'"
 						mode="aspectFill"></image>
 				</view>
 			</view>
@@ -30,7 +30,7 @@
 					v-model="confirmPassword" placeholder="请再次输入新密码" />
 				<view class="img-box" @click="toggleConfirmPassword">
 					<image class="icon"
-						:src="showConfirmPassword?'/static/image/icon_visible.png':'/static/image/icon_invisible.png'"
+						:src="showConfirmPassword?'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_visible.png':'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_invisible.png'"
 						mode="aspectFill"></image>
 				</view>
 			</view>

+ 8 - 23
pages/auth/login.vue

@@ -1,17 +1,16 @@
 <template>
 	<view class="container">
 		<!-- #ifdef MP-WEIXIN -->
-		<image class="bg" src="@/static/image/bg_login.png" mode="widthFix"></image>
+		<image class="bg" src="/static/image/bg_login.png" mode="widthFix"></image>
 		<view class="force-login-wrap">
 			<view :style="{height:menuButtonInfo.height,marginTop:menuButtonInfo.top}" class="backImg">
-				<image @tap="goBack()" src="@/static/images/back.png"></image>
+				<image @tap="goBack()" src="/static/images/back.png"></image>
 			</view>
 			<view class="top-title">
 				<view class="title-text">欢迎登录<text class="blue">小蜜蜂</text></view>
 				<view class="login-notice">新用户首次登录即视为注册</view>
 			</view>
 			<view class="force-login__content">
-				<!-- <image class="bg-type" :src="current==0?'/static/image/bg_tab_login.png':'/static/image/bg_tab_login2.png'" mode="widthFix"></image> -->
 				<view class="logintype">
 					<view :class="current==0 ? 'logintype-item active':'logintype-item'" @click="changeType(0)">验证码登录
 					</view>
@@ -212,10 +211,6 @@
 					})
 					.catch(err => {
 						uni.hideLoading();
-						uni.showToast({
-							icon: 'none',
-							title: "发送验证码接口调用失败",
-						});
 					});
 		},
 			// 登录
@@ -290,7 +285,7 @@
 							title: "登录成功",
 						});
 						uni.setStorageSync('AppToken', res.data.token);
-						uni.setStorageSync('userInfo', JSON.stringify(res.data.user));
+						uni.setStorageSync('userInfo', res.data.user);
 						uni.$emit('refreshLogin');
 						uni.navigateBack({
 							delta: 1
@@ -304,10 +299,7 @@
 				})
 				.catch(err => {
 					uni.hideLoading();
-					uni.showToast({
-						icon: 'none',
-						title: "登录接口调用失败",
-					});
+					
 				});
 		},
 			// 密码登录
@@ -329,7 +321,7 @@
 								title: "登录成功",
 							});
 							uni.setStorageSync('AppToken', res.data.token);
-							uni.setStorageSync('userInfo', JSON.stringify(res.data.user));
+							uni.setStorageSync('userInfo', res.data.user);
 							uni.$emit('refreshLogin');
 							uni.navigateBack({
 								delta: 1
@@ -342,11 +334,9 @@
 						}
 					})
 					.catch(err => {
+						console.log(err)
 						uni.hideLoading();
-						uni.showToast({
-							icon: 'none',
-							title: "登录接口调用失败",
-						});
+						
 					});
 			},
 			checkWeixin() {
@@ -453,8 +443,7 @@
 													title: "登录成功",
 												});
 												uni.setStorageSync('AppToken', res.token);
-												uni.setStorageSync('userInfo', JSON.stringify(res
-													.user));
+												uni.setStorageSync('userInfo', res.user);
 												uni.hideLoading()
 												//that.getUserInfo()
 												uni.$emit('refreshLogin');
@@ -473,10 +462,6 @@
 										.catch(error => {
 											console.log(error)
 											uni.hideLoading();
-											uni.showToast({
-												icon: 'none',
-												title: "登录接口调用失败",
-											});
 										})
 
 								}

+ 4 - 4
pages/home/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="container">
-		<image class="bg" src="/static/image/bg_bench.png" mode="widthFix"></image>
+		<image class="bg" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/bg_bench.png" mode="widthFix"></image>
 		<view class="status_bar" :style="{height: statusBarHeight}"></view>
 		<view class="content">
 			<view class="title">工作台</view>
@@ -11,11 +11,11 @@
 				</view>
 				<view class="list">
 					<view class="item" @click="navTo('/pages_task/xlTask')">
-						<image class="icon" src="/static/image/xl.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/xl.png"></image>
 						<text>XL任务</text>
 					</view>
 					<view class="item" @click="navTo('/pages_speaker/index')">
-						<image class="icon" src="/static/image/speaker.png" ></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/speaker.png" ></image>
 						<text>讲者管理</text>
 					</view>
 				</view>
@@ -25,7 +25,7 @@
 				</view>
 				<view class="list">
 					<view class="item" @click="navTo('/pages_task/approvalCenter')">
-						<image class="icon" src="/static/image/approval.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/approval.png"></image>
 						<text>审批中心</text>
 					</view>
 				</view>

+ 2 - 2
pages/user/index.vue

@@ -1,7 +1,7 @@
 <template>
 	<view>
 		<view class="top-cont">
-			<image class="bg" src="@/static/image/bg_mine.png" mode="widthFix"></image>
+			<image class="bg" src="/static/image/bg_mine.png" mode="widthFix"></image>
 			<view class="top-inner">
 				<!-- 这里是状态栏 -->
 				<view class="status_bar" :style="{height: statusBarHeight}"></view>
@@ -34,7 +34,7 @@
 								<view class="title-l">{{item.name||''}}</view>
 							</view>
 							<view class="right">
-								<image src="@/static/image/icon_my_more.png" mode=""></image>
+								<image src="/static/image/icon_my_more.png" mode=""></image>
 							</view>
 						</view>
 					</view>

+ 112 - 82
pages_speaker/gradeApplication.vue

@@ -10,41 +10,41 @@
 			<!-- 基本信息 -->
 			<view class="form-section">
 				<view class="form-item">
-				<view class="form-label">
-					<text class="required">*</text>
-					<text>学术头衔</text>
-				</view>
-				<view class="form-input picker-input" :class="{ placeholder: !formData.academicTitle }"
-					@click="showPicker('学术头衔', 'doctor_academic_title')">
-					{{ formData.academicTitle || '请选择' }}
-					<image class="icon" src="/static/image/icon_more.png"></image>
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>学术头衔</text>
+					</view>
+					<view class="form-input picker-input" :class="{ placeholder: !formData.academicTitle }"
+						@click="showPicker('学术头衔', 'doctor_academic_title')">
+						{{ formData.academicTitle || '请选择' }}
+						<image class="icon" src="/static/image/icon_more.png"></image>
+					</view>
 				</view>
-			</view>
 
-			<view class="form-item">
-				<view class="form-label">
-					<text class="required">*</text>
-					<text>学术任职(多选)</text>
-				</view>
-				<view class="form-input picker-input" :class="{ placeholder: !formData.academicPositions }"
-					@click="showPicker('学术任职', 'doctor_academic_position')">
-					{{ formData.academicPositions || '请选择' }}
-					<image class="icon" src="/static/image/icon_more.png"></image>
+				<view class="form-item">
+					<view class="form-label">
+						<text class="required">*</text>
+						<text>学术任职(多选)</text>
+					</view>
+					<view class="form-input picker-input" :class="{ placeholder: !formData.academicPositions }"
+						@click="showPicker('学术任职', 'doctor_academic_position')">
+						{{ formData.academicPositions || '请选择' }}
+						<image class="icon" src="/static/image/icon_more.png"></image>
+					</view>
 				</view>
-			</view>
 				<view class="form-item">
 					<view class="form-label">
 						<text class="required">*</text>
 						<text>国际性期刊论文/著作数</text>
 					</view>
-					<input type="number" class="input" v-model="formData.internationalPapers" ></input>
+					<input type="number" class="input" v-model="formData.internationalPapers"></input>
 				</view>
 				<view class="form-item">
 					<view class="form-label">
 						<text class="required">*</text>
 						<text>全国性期刊论文/著作数</text>
 					</view>
-					<input type="number" class="input" v-model="formData.nationalPapers" ></input>
+					<input type="number" class="input" v-model="formData.nationalPapers"></input>
 				</view>
 				<view class="form-item">
 					<view class="form-label">
@@ -100,15 +100,12 @@
 								<image :src="image" mode="aspectFill"></image>
 								<view class="image-delete" @click.stop="deleteProofImage(index)">×</view>
 							</view>
-							<!-- <view class="upload-more" @click="chooseProofImages">
-								<image src="/static/image/icon_camera.png" mode="aspectFill"></image>
-							</view> -->
 							<view class="upload-placeholder">
 								<image src="/static/image/icon_camera.png" mode="aspectFill"></image>
-						</view>
+							</view>
 						</view>
 						<view v-else class="upload-placeholder">
-								<image src="/static/image/icon_camera.png" mode="aspectFill"></image>
+							<image src="/static/image/icon_camera.png" mode="aspectFill"></image>
 						</view>
 					</view>
 				</view>
@@ -128,10 +125,8 @@
 				</view>
 				<view class="popup-body">
 					<view class="tag-group">
-						<view v-for="(item, index) in multiSelectData" :key="index" 
-							class="tag-item" 
-							:class="{ active: selectedItems.includes(item) }" 
-							@click="toggleItem(item)">
+						<view v-for="(item, index) in multiSelectData" :key="index" class="tag-item"
+							:class="{ active: selectedItems.includes(item) }" @click="toggleItem(item)">
 							{{ item }}
 						</view>
 					</view>
@@ -155,13 +150,13 @@
 	export default {
 		data() {
 			return {
-				academicTitle: [],//学术头衔
-				academicPosition: [],//学术任职
-				academicResearch: [],//学术研究
-				degree: [],//学位
-				applyLevel: [],//申请级别
+				academicTitle: [], //学术头衔
+				academicPosition: [], //学术任职
+				academicResearch: [], //学术研究
+				degree: [], //学位
+				applyLevel: [], //申请级别
+
 
-				
 				showPickerVisible: false,
 				pickerData: [],
 				pickerTitle: '',
@@ -191,18 +186,18 @@
 				pickerTitle: '默认标题',
 				pickerData: [],
 				userInfo: {},
-				doctorId:null
+				doctorId: null
 			}
 		},
 		onLoad: async function(options) {
 			try {
-				console.log("options",options)
-				this.doctorId=options.doctorId;
-				this.academicTitle = await utils.getDicts("doctor_academic_title");//学术头衔
-				this.academicPosition = await utils.getDicts("doctor_academic_position");//学术任职
-				this.academicResearch = await utils.getDicts("doctor_academic_research");//学术研究
-				this.degree = await utils.getDicts("doctor_degree");//学位
-				this.applyLevel = await utils.getDicts("doctor_apply_level");//申请级别
+				console.log("options", options)
+				this.doctorId = options.doctorId;
+				this.academicTitle = await utils.getDicts("doctor_academic_title"); //学术头衔
+				this.academicPosition = await utils.getDicts("doctor_academic_position"); //学术任职
+				this.academicResearch = await utils.getDicts("doctor_academic_research"); //学术研究
+				this.degree = await utils.getDicts("doctor_degree"); //学位
+				this.applyLevel = await utils.getDicts("doctor_apply_level"); //申请级别
 			} catch (e) {
 				console.log('获取字典数据失败:', e)
 			}
@@ -212,7 +207,7 @@
 				this.rejectionInfo = decodeURIComponent(options.rejectionInfo)
 			}
 			// 获取用户信息
-			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}')
+			this.userInfo = uni.getStorageSync('userInfo') || '{}'
 		},
 		methods: {
 			// 选择证明材料图片
@@ -230,7 +225,9 @@
 			// 上传图片
 			async uploadImages(tempFilePaths) {
 				try {
-					uni.showLoading({ title: '上传中...' })
+					uni.showLoading({
+						title: '上传中...'
+					})
 					const uploadedImages = []
 					// 从storage获取动态域名
 					const baseUrl = uni.getStorageSync('requestPath')
@@ -269,10 +266,16 @@
 					// 更新表单数据
 					this.formData.proofImages = [...this.formData.proofImages, ...uploadedImages]
 					uni.hideLoading()
-					uni.showToast({ icon: 'success', title: '上传成功' })
+					uni.showToast({
+						icon: 'success',
+						title: '上传成功'
+					})
 				} catch (e) {
 					uni.hideLoading()
-					uni.showToast({ icon: 'none', title: '上传失败' })
+					uni.showToast({
+						icon: 'none',
+						title: '上传失败'
+					})
 				}
 			},
 
@@ -280,7 +283,7 @@
 			deleteProofImage(index) {
 				this.formData.proofImages.splice(index, 1)
 			},
-			
+
 			// 显示选择器
 			showPicker(title, type) {
 				// 处理多选情况
@@ -292,26 +295,27 @@
 					} else if (type === 'doctor_research_area') {
 						dictData = this.academicResearch.map(item => item.dictLabel)
 					}
-					
+
 					// 设置多选数据
 					this.multiSelectData = dictData
 					this.multiSelectTitle = title
 					this.currentMultiSelectType = type
-					
+
 					// 初始化已选项
 					if (type === 'doctor_academic_position') {
-						this.selectedItems = this.formData.academicPositions ? this.formData.academicPositions.split(',') : []
+						this.selectedItems = this.formData.academicPositions ? this.formData.academicPositions.split(',') :
+							[]
 					} else if (type === 'doctor_research_area') {
 						this.selectedItems = this.formData.researchAreas ? this.formData.researchAreas.split(',') : []
 					}
-					
+
 					// 显示多选弹窗
 					this.showMultiSelectPopup = true
 				} else {
 					// 单选情况,保持原有逻辑
 					// 先隐藏选择器,确保下次显示时重新创建
 					this.showPickerVisible = false
-					
+
 					// 根据字典类型获取对应的数据
 					let dictData = []
 					if (type === 'doctor_academic_title') {
@@ -321,18 +325,18 @@
 					} else if (type === 'doctor_apply_level') {
 						dictData = this.applyLevel.map(item => item.dictLabel)
 					}
-					
+
 					// 设置数据
 					this.pickerData = [dictData]
 					this.pickerTitle = title
-					
+
 					// 延迟显示选择器,确保数据已更新
 					setTimeout(() => {
 						this.showPickerVisible = true
 					}, 50)
 				}
 			},
-			
+
 			// 选择器确认
 			confirm(e) {
 				if (e.value && e.value.length > 0) {
@@ -351,13 +355,13 @@
 				// 关闭选择器
 				this.showPickerVisible = false
 			},
-			
+
 			// 选择器取消
 			cancel() {
 				// 关闭选择器
 				this.showPickerVisible = false
 			},
-			
+
 			// 多选相关方法
 			// 切换选项
 			toggleItem(item) {
@@ -370,42 +374,54 @@
 					this.selectedItems.push(item)
 				}
 			},
-			
+
 			// 关闭多选弹窗
 			closeMultiSelectPopup() {
 				this.showMultiSelectPopup = false
 			},
-			
+
 			// 确认多选结果
 			confirmMultiSelect() {
 				const selectedValues = this.selectedItems.join(',')
-				
+
 				if (this.currentMultiSelectType === 'doctor_academic_position') {
 					this.formData.academicPositions = selectedValues
 				} else if (this.currentMultiSelectType === 'doctor_research_area') {
 					this.formData.researchAreas = selectedValues
 				}
-				
+
 				this.showMultiSelectPopup = false
 			},
-			
+
 			// 提交表单
 			submitForm() {
 				// 验证表单数据
 				if (!this.formData.academicTitle) {
-					uni.showToast({ icon: 'none', title: '请选择学术头衔' })
+					uni.showToast({
+						icon: 'none',
+						title: '请选择学术头衔'
+					})
 					return
 				}
 				if (!this.formData.degree) {
-					uni.showToast({ icon: 'none', title: '请选择学位' })
+					uni.showToast({
+						icon: 'none',
+						title: '请选择学位'
+					})
 					return
 				}
 				if (!this.formData.applicationLevel) {
-					uni.showToast({ icon: 'none', title: '请选择申请级别' })
+					uni.showToast({
+						icon: 'none',
+						title: '请选择申请级别'
+					})
 					return
 				}
 				if (this.formData.proofImages.length === 0) {
-					uni.showToast({ icon: 'none', title: '请上传证明材料' })
+					uni.showToast({
+						icon: 'none',
+						title: '请上传证明材料'
+					})
 					return
 				}
 
@@ -413,7 +429,7 @@
 				const formData = {
 					// 基础字段
 					id: 0,
-					doctorId: this.doctorId|| '',
+					doctorId: this.doctorId || '',
 					companyId: this.userInfo.companyId || 0,
 					companyName: this.userInfo.companyName || '',
 					// 学术信息
@@ -446,11 +462,16 @@
 				}
 
 				// 调用apply接口提交表单
-				uni.showLoading({ title: '提交中...' })
+				uni.showLoading({
+					title: '提交中...'
+				})
 				apply(formData).then(res => {
 					uni.hideLoading()
 					if (res.code === 200) {
-						uni.showToast({ icon: 'success', title: '提交成功' })
+						uni.showToast({
+							icon: 'success',
+							title: '提交成功'
+						})
 						uni.redirectTo({
 							url: '/pages_task/success'
 						})
@@ -459,11 +480,17 @@
 						// 	uni.navigateBack()
 						// }, 1500)
 					} else {
-						uni.showToast({ icon: 'none', title: res.message || '提交失败' })
+						uni.showToast({
+							icon: 'none',
+							title: res.message || '提交失败'
+						})
 					}
 				}).catch(err => {
 					uni.hideLoading()
-					uni.showToast({ icon: 'none', title: '网络错误,请重试' })
+					uni.showToast({
+						icon: 'none',
+						title: '网络错误,请重试'
+					})
 				})
 			}
 		}
@@ -596,22 +623,24 @@
 								}
 							}
 
-							
+
 						}
 
 						.upload-placeholder {
 							width: 160rpx;
-height: 160rpx;
-					background: #F7F8FA;		
+							height: 160rpx;
+							background: #F7F8FA;
 							border-radius: 16rpx;
 							display: flex;
 							flex-direction: column;
 							align-items: center;
 							justify-content: center;
-image{
-	width: 48rpx;
-	height: 48rpx;
-}
+
+							image {
+								width: 48rpx;
+								height: 48rpx;
+							}
+
 							.camera-icon {
 								font-size: 48rpx;
 								color: #CCCCCC;
@@ -727,16 +756,17 @@ image{
 		.popup-footer {
 			display: flex;
 		}
+
 		.popup-btn {
 			flex: 1;
 			gap: 20rpx;
-            text-align: center;
+			text-align: center;
 			height: 88rpx;
 			line-height: 88rpx;
 			border: none;
 			font-size: 28rpx;
 			cursor: pointer;
-			border-radius:40rpx;
+			border-radius: 40rpx;
 		}
 
 		.cancel-btn {

+ 3 - 2
pages_speaker/index.vue

@@ -178,7 +178,8 @@
 		},
 		data() {
 			return {
-				userInfo: JSON.parse(uni.getStorageSync('userInfo') || '{}'),
+				// userInfo: JSON.parse(uni.getStorageSync('userInfo') || '{}'),
+			    userInfo :{},
 				productData: [{
 						assistant: '王小明',
 						products: ['302', '403', '202', '301']
@@ -256,6 +257,7 @@
 			}
 		},
 		async onLoad() {
+			this.userInfo = uni.getStorageSync('userInfo') || '{}';
 			this.loadData();
 			try {
 				this.identity = await utils.getDicts("doctor_account_identity_type");//学术头衔
@@ -332,7 +334,6 @@
 					uni.showLoading({
 						title: '加载中...'
 					})
-					this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
 					console.log("userInfo内容", this.userInfo)
 					const res = await speakerList({
 						companyId: this.userInfo.companyId,

+ 139 - 3
pages_speaker/speakerInvitation.vue

@@ -27,7 +27,7 @@
 
 				<!-- 二维码区域:白色边框+圆角 -->
 				<view class="qrcode-box">
-					<image class="qrcode-img" src="@/static/image/bg_invite.png"></image>
+					<image class="qrcode-img" :src="qscode" @longpress="saveQrcode"></image>
 				</view>
 				<!-- 扫码提示文字 -->
 				<view class="scan-tip">扫一扫,注册学苑</view>
@@ -45,11 +45,12 @@ import { inviteDoctor } from '@/api/speaker.js'
 				// 仅获取微信小程序状态栏高度,无多余逻辑
 				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
 				userInfo: {},
+				qscode:''
 
 			};
 		},
 		onLoad() {
-				this.userInfo=JSON.parse(uni.getStorageSync('userInfo'));
+				this.userInfo=uni.getStorageSync('userInfo')||{};
 			this.inviteDoctor();
 		},
 		methods: {
@@ -59,9 +60,144 @@ import { inviteDoctor } from '@/api/speaker.js'
 				});
 			},
 
+			saveQrcode() {
+				if (!this.qscode) {
+					uni.showToast({
+						icon: 'none',
+						title: '二维码未加载'
+					});
+					return;
+				}
+				
+				uni.showLoading({
+					title: '保存中...'
+				});
+				
+				// 如果是base64格式的图片,需要先转换为临时文件
+				if (this.qscode.startsWith('data:image')) {
+					const base64Data = this.qscode.replace(/^data:image\/\w+;base64,/, '');
+					const filePath = `${wx.env.USER_DATA_PATH}/qrcode_${Date.now()}.png`;
+					
+					const fs = wx.getFileSystemManager();
+					try {
+						fs.writeFileSync(filePath, base64Data, 'base64');
+						
+						uni.saveImageToPhotosAlbum({
+							filePath: filePath,
+							success: () => {
+								uni.hideLoading();
+								uni.showToast({
+									icon: 'success',
+									title: '保存成功'
+								});
+							},
+							fail: (err) => {
+								uni.hideLoading();
+								if (err.errMsg.includes('auth')) {
+									uni.showModal({
+										title: '提示',
+										content: '需要您授权保存图片到相册',
+										success: (modalRes) => {
+											if (modalRes.confirm) {
+												uni.openSetting({
+													success: (settingRes) => {
+														if (settingRes.authSetting['scope.writePhotosAlbum']) {
+															this.saveQrcode();
+														}
+													}
+												});
+											}
+										}
+									});
+								} else {
+									uni.showToast({
+										icon: 'none',
+										title: '保存失败'
+									});
+								}
+							}
+						});
+					} catch (e) {
+						uni.hideLoading();
+						uni.showToast({
+							icon: 'none',
+							title: '保存失败'
+						});
+					}
+				} else {
+					// 如果是网络图片URL
+					uni.downloadFile({
+						url: this.qscode,
+						success: (res) => {
+							if (res.statusCode === 200) {
+								uni.saveImageToPhotosAlbum({
+									filePath: res.tempFilePath,
+									success: () => {
+										uni.hideLoading();
+										uni.showToast({
+											icon: 'success',
+											title: '保存成功'
+										});
+									},
+									fail: (err) => {
+										uni.hideLoading();
+										if (err.errMsg.includes('auth')) {
+											uni.showModal({
+												title: '提示',
+												content: '需要您授权保存图片到相册',
+												success: (modalRes) => {
+													if (modalRes.confirm) {
+														uni.openSetting({
+															success: (settingRes) => {
+																if (settingRes.authSetting['scope.writePhotosAlbum']) {
+																	this.saveQrcode();
+																}
+															}
+														});
+													}
+												}
+											});
+										} else {
+											uni.showToast({
+												icon: 'none',
+												title: '保存失败'
+											});
+										}
+									}
+								});
+							}
+						},
+						fail: () => {
+							uni.hideLoading();
+							uni.showToast({
+								icon: 'none',
+								title: '下载失败'
+							});
+						}
+					});
+				}
+			},
+
 			inviteDoctor() {
 				inviteDoctor(this.userInfo.userId,this.userInfo.companyId).then(res => {
-					console.log(res);
+					console.log('inviteDoctor返回数据:', res);
+					if (res.code === 200) {
+						// 将arraybuffer转换为base64
+						const arrayBuffer = res.data;
+						const base64 = uni.arrayBufferToBase64(arrayBuffer);
+						this.qscode = 'data:image/png;base64,' + base64;
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg || '获取二维码失败'
+						});
+					}
+				}).catch(err => {
+					console.error('获取二维码失败:', err);
+					uni.showToast({
+						icon: 'none',
+						title: '获取二维码失败'
+					});
 				});
 			}
 		}

+ 1 - 1
pages_task/approvalTaskDetail.vue

@@ -164,7 +164,7 @@ import image from 'uview-ui/libs/config/props/image';
 export default {
   data() {
     return {
-		userInfo:JSON.parse(uni.getStorageSync('userInfo')),
+		userInfo:uni.getStorageSync('userInfo'),
 
       // 弹窗默认隐藏
       showRejectPopup: false,

+ 2 - 2
pages_task/components/TaskBelongingPicker.vue

@@ -8,7 +8,7 @@
 				<view class="trigger-value" :class="{ placeholder: !displayValue }">
 					{{ displayValue || placeholder }}
 				</view>
-				<image class="trigger-icon" src="/static/image/icon_more.png"></image>
+				<image class="trigger-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
 			</view>
 		</slot>
 
@@ -59,7 +59,7 @@
 
 					<!-- 空状态 -->
 					<view v-if="currentOptions.length === 0" class="empty-state">
-						<image class="empty-icon" src="/static/image/empty.png"></image>
+						<image class="empty-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/empty.png"></image>
 						<text class="empty-text">暂无数据</text>
 					</view>
 				</scroll-view>

+ 2 - 2
pages_task/components/step.vue

@@ -12,7 +12,7 @@
 					<!-- 已完成的步骤显示完成图标 -->
 					<image v-if="currentStep > step.stepNumber" 
 						class="icon" 
-						:src="step.doneIcon || '/static/image/icon_step_done.png'">
+						:src="step.doneIcon || 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_step_done.png'">
 					</image>
 					<!-- 当前和未完成的步骤显示数字 -->
 					<text v-else>{{ step.stepNumber }}</text>
@@ -57,7 +57,7 @@
 			// 完成图标(可覆盖单个步骤的配置)
 			doneIcon: {
 				type: String,
-				default: '/static/image/icon_step_done.png'
+				default: 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_step_done.png'
 			}
 		},
 		data() {

+ 3 - 3
pages_task/editSelectCustomer.vue

@@ -21,7 +21,7 @@
 								@input="onIntegralInput(customer)" />
 							<view v-if="customer.integral" class="clear-icon-wrapper"
 								@click.stop="clearIntegral(customer)">
-								<image class="clear-icon" src="/static/image/icon_clear.png"></image>
+								<image class="clear-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_clear.png"></image>
 							</view>
 						</view>
 					</view>
@@ -38,7 +38,7 @@
 				<view class="popup-header">
 					<text class="popup-title">概览</text>
 					<view class="close-btn" @click="closeOverviewPopup">
-						<image class="close-icon" src="/static/image/icon_close.png"></image>
+						<image class="close-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_close.png"></image>
 					</view>
 				</view>
 
@@ -98,7 +98,7 @@
 		<!-- 底部操作栏 -->
 		<view class="bottom-bar">
 			<view class="del-box" @click="deleteSelected">
-				<image class="w40 h40" src="/static/image/icon_delete.png"></image>
+				<image class="w40 h40" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_delete.png"></image>
 				<text>删除</text>
 			</view>
 			<view class="action-buttons">

+ 95 - 26
pages_task/fillTask.vue

@@ -18,7 +18,7 @@
 					<view class="form-input picker-input" :class="{ placeholder: !formData.deptId }"
 						@click="showPicker('任务归属',companyData)">
 						{{ institutionDisplayText || '请选择任务归属' }}
-						<image class="icon" src="/static/image/icon_more.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
 					</view>
 				</view>
 
@@ -30,7 +30,7 @@
 					<view class="form-input picker-input" :class="{ placeholder: !formData.projectId }"
 						@click="showPicker('归属项目',companyList)">
 						{{ belongingProjectDisplayText || '请选择归属项目' }}
-						<image class="icon" src="/static/image/icon_more.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
 					</view>
 				</view>
 				<view class="form-item">
@@ -41,7 +41,7 @@
 					<view class="form-input picker-input" :class="{ placeholder: !formData.productId }"
 						@click="showPicker('产品代码',productList)">
 						{{ productNameDisplayText || '请选择产品代码' }}
-						<image class="icon" src="/static/image/icon_more.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
 					</view>
 				</view>
 				<view class="form-item">
@@ -52,17 +52,19 @@
 					<view class="form-input picker-input" :class="{ placeholder: !formData.costShareId }"
 						@click="showPicker('费用分摊',companyData)">
 						{{ costAllocationDisplayText || '请选择费用分摊主体' }}
-						<image class="icon" src="/static/image/icon_more.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
 					</view>
 				</view>
 
 				<view class="form-item">
 					<view class="form-label">
-						<text class="required">*</text>
 						<text>添加任务备注</text>
 					</view>
 					<EvanSwitch v-model="formData.addRemark"></EvanSwitch>
 				</view>
+				<view class="form-item" v-if="formData.addRemark">
+					<textarea class="form-textarea" v-model="formData.remark" placeholder="请输入任务备注" rows="4"></textarea>
+				</view>
 				<view class="form-item">
 					<view class="form-label">
 						<text class="required">*</text>
@@ -71,7 +73,7 @@
 					<view class="form-input picker-input" :class="{ placeholder: !formData.belongType }"
 						@click="showPicker('归属类型',dictTypeColumns)">
 						{{ belongTypeDisplayText || '请选择归属类型' }}
-						<image class="icon" src="/static/image/icon_more.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
 					</view>
 				</view>
 
@@ -83,7 +85,7 @@
 					<view class="form-input picker-input" :class="{ placeholder: !formData.taskType }"
 						@click="showPicker('任务类型',taskTypeColumns)">
 						{{ taskTypeDisplayText || '请选择任务类型' }}
-						<image class="icon" src="/static/image/icon_more.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
 					</view>
 				</view>
 
@@ -95,7 +97,7 @@
 					<view class="form-input picker-input" :class="{ placeholder: !formData.planStartTime }"
 						@click="showStartTimePicker = true">
 						{{ formData.planStartTime || '请选择计划开始时间' }}
-						<image class="icon" src="/static/image/icon_more.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
 					</view>
 				</view>
 
@@ -107,7 +109,7 @@
 					<view class="form-input picker-input" :class="{ placeholder: !formData.planEndTime }"
 						@click="showEndTimePicker = true">
 						{{ formData.planEndTime || '请选择计划结束时间' }}
-						<image class="icon" src="/static/image/icon_more.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
 					</view>
 				</view>
 
@@ -121,15 +123,15 @@
 						<label class="radio-item" :class="{ active: formData.viewMode === '公开' }"
 							@click="formData.viewMode = '公开'">
 							<image class="radio-circle" v-if="formData.viewMode === '公开'"
-								src="/static/image/icon_circle_sel.png"></image>
-							<image class="radio-circle" v-else src="/static/image/icon_circle.png"></image>
+								src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_circle_sel.png"></image>
+							<image class="radio-circle" v-else src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_circle.png"></image>
 							<text>公开</text>
 						</label>
 						<label class="radio-item" :class="{ active: formData.viewMode === '加密' }"
 							@click="formData.viewMode = '加密'">
 							<image class="radio-circle" v-if="formData.viewMode === '加密'"
-								src="/static/image/icon_circle_sel.png"></image>
-							<image class="radio-circle" v-else src="/static/image/icon_circle.png"></image>
+								src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_circle_sel.png"></image>
+							<image class="radio-circle" v-else src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_circle.png"></image>
 							<text>加密</text>
 						</label>
 					</view>
@@ -145,15 +147,15 @@
 						<label class="radio-item" :class="{ active: formData.viewRequire === '登录账户' }"
 							@click="formData.viewRequire = '登录账户'">
 							<image class="radio-circle" v-if="formData.viewRequire === '登录账户'"
-								src="/static/image/icon_circle_sel.png"></image>
-							<image class="radio-circle" v-else src="/static/image/icon_circle.png"></image>
+								src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_circle_sel.png"></image>
+							<image class="radio-circle" v-else src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_circle.png"></image>
 							<text>登录账户</text>
 						</label>
 						<label class="radio-item" :class="{ active: formData.viewRequire === '认证客户' }"
 							@click="formData.viewRequire = '认证客户'">
 							<image class="radio-circle" v-if="formData.viewRequire === '认证客户'"
-								src="/static/image/icon_circle_sel.png"></image>
-							<image class="radio-circle" v-else src="/static/image/icon_circle.png"></image>
+								src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_circle_sel.png"></image>
+							<image class="radio-circle" v-else src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_circle.png"></image>
 							<text>认证客户</text>
 						</label>
 					</view>
@@ -179,13 +181,14 @@
 						<view v-else class="upload-placeholder">
 							<text>点击上传封面图</text>
 						</view>
-						<image v-if="formData.coverImage" class="delete-icon" src="/static/image/icon_cross.png"
+						<image v-if="formData.coverImage" class="delete-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_cross.png"
 							@click.stop="deleteCoverImage" />
 					</view>
 				</view>
 			</view> -->
-			<view class="form-section">
 				<!-- 申请补充讲者任务 -->
+
+			<!-- <view class="form-section">
 				<view class="form-item">
 					<view class="form-label">
 						<text class="required">*</text>
@@ -193,7 +196,7 @@
 					</view>
 					<EvanSwitch v-model="formData.applySpeaker"></EvanSwitch>
 				</view>
-			</view>
+			</view> -->
 		</scroll-view>
 		<view class="next-button" @click="toNext">下一步</view>
 		<u-picker :title='pickerTitle' :show="showPickerVisible" confirmColor='#576B95' ref="uPicker"
@@ -215,7 +218,7 @@
 				</view>
 
 				<view class="search-box">
-					<image class="icon" src="/static/image/search.png"></image>
+					<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/search.png"></image>
 					<u-input v-model="searchKeyword" placeholder="请输入归属项目" border="none" clearable />
 				</view>
 
@@ -223,7 +226,7 @@
 					<view v-for="(project, index) in filteredProjects" :key="index" class="project-item"
 						:class="{ active: selectedIndex === index }" @tap="selectProject(project, index)">
 						<text class="project-name">{{ project.name }}</text>
-						<image class="icon" src="/static/image/icon_right.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_right.png"></image>
 					</view>
 				</scroll-view>
 			</view>
@@ -233,7 +236,7 @@
 			<view class="popup-content">
 				<view class="popup-header">
 					<text class="popup-title">任务归属</text>
-					<image class="close-icon" src="/static/image/icon_cross.png" @click="showTaskPopup=false"></image>
+					<image class="close-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_cross.png" @click="showTaskPopup=false"></image>
 				</view>
 				<view class="two-level-container">
 					<scroll-view class="primary-list" scroll-y>
@@ -273,14 +276,14 @@
 					<text class="title">归属项目</text>
 				</view>
 				<view class="search-box">
-					<image class="icon" src="/static/image/search.png"></image>
+					<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/search.png"></image>
 					<u-input v-model="searchKeyword" placeholder="请输入归属项目" border="none" clearable />
 				</view>
 				<scroll-view scroll-y class="project-list">
 					<view v-for="(project, index) in filteredProjects" :key="index" class="project-item"
 						:class="{ active: selectedIndex === index }" @tap="selectProject(project, index)">
 						<text class="project-name">{{ project.name }}</text>
-						<image class="icon" src="/static/image/icon_right.png"></image>
+						<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_right.png"></image>
 					</view>
 				</scroll-view>
 			</view>
@@ -291,7 +294,7 @@
 			<view class="popup-content">
 				<view class="popup-header">
 					<text class="popup-title">任务归属</text>
-					<image class="close-icon" src="/static/image/icon_cross.png" @click="showTaskPopup=false"></image>
+					<image class="close-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_cross.png" @click="showTaskPopup=false"></image>
 				</view>
 				<view class="two-level-container">
 					<scroll-view class="primary-list" scroll-y>
@@ -369,6 +372,7 @@ import { info, queryAllData, queryAllProduct, getAllData, company } from '@/api/
 						taskType: '',
 						belongType: '',
 						addRemark: false,
+						remark: '',
 						viewMode: '公开', // 观看方式默认值
 						viewRequire: '登录账户', // 观看要求默认值
 						roomTitle: '', // 直播间标题
@@ -884,6 +888,71 @@ import { info, queryAllData, queryAllProduct, getAllData, company } from '@/api/
 				},
 				// 下一步
 				toNext() {
+					// 表单验证
+					if (!this.formData.deptId) {
+						uni.showToast({
+							title: '请选择任务归属',
+							icon: 'none'
+						})
+						return
+					}
+					if (!this.formData.projectId) {
+						uni.showToast({
+							title: '请选择归属项目',
+							icon: 'none'
+						})
+						return
+					}
+					if (!this.formData.productId) {
+						uni.showToast({
+							title: '请选择产品代码',
+							icon: 'none'
+						})
+						return
+					}
+					if (!this.formData.costShareId) {
+						uni.showToast({
+							title: '请选择费用分摊',
+							icon: 'none'
+						})
+						return
+					}
+					if (!this.formData.belongType) {
+						uni.showToast({
+							title: '请选择归属类型',
+							icon: 'none'
+						})
+						return
+					}
+					if (!this.formData.taskType) {
+						uni.showToast({
+							title: '请选择任务类型',
+							icon: 'none'
+						})
+						return
+					}
+					if (!this.formData.planStartTime) {
+						uni.showToast({
+							title: '请选择计划开始时间',
+							icon: 'none'
+						})
+						return
+					}
+					if (!this.formData.planEndTime) {
+						uni.showToast({
+							title: '请选择计划结束时间',
+							icon: 'none'
+						})
+						return
+					}
+					// 如果开启了任务备注,则备注为必填
+					if (this.formData.addRemark && !this.formData.remark) {
+						uni.showToast({
+							title: '请输入任务备注',
+							icon: 'none'
+						})
+						return
+					}
 					console.log('去编辑积分:', this.doctorId);
 					console.log('去编辑积分formData:', this.formData);
 					// 保存表单数据到本地存储,以便 editSelectCustomer.vue 页面使用

+ 0 - 457
pages_task/medicationSurvey.vue

@@ -1,457 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 状态栏占位 -->
-		<view class="status-bar" :style="{height: statusBarHeight}"></view>
-		
-		<!-- 顶部导航栏 -->
-		<view class="header">
-			<view class="back-btn" @click="goBack">
-				<image src="@/static/image/back.png" mode="aspectFill"></image>
-			</view>
-			<view class="title">用药调研</view>
-			<view class="header-right">
-				<text class="more-icon">⋯</text>
-				<text class="more-icon">○</text>
-			</view>
-		</view>
-		
-		<!-- 标签栏 -->
-		<view class="tabs-bar">
-			<view class="tab-item" 
-				:class="{ active: currentTab === item.value }" 
-				v-for="(item, index) in tabs" 
-				:key="index"
-				@click="switchTab(item.value)">
-				{{ item.label }}
-			</view>
-		</view>
-		
-		<!-- 调研列表 -->
-		<scroll-view class="content" scroll-y>
-			<view class="survey-card" v-for="(item, index) in surveyList" :key="index" @click="goToDetail(item)">
-				<!-- 卡片头部背景 -->
-				<view class="card-header-bg" :style="{ backgroundImage: `url(${item.bannerImage})` }">
-					<view class="banner-content">
-						<view class="banner-title">{{ item.bannerTitle }}</view>
-						<view class="banner-subtitle" v-if="item.bannerSubtitle">{{ item.bannerSubtitle }}</view>
-						<view class="banner-info" v-if="item.bannerInfo">{{ item.bannerInfo }}</view>
-					</view>
-				</view>
-				
-				<!-- 卡片内容 -->
-				<view class="card-body">
-					<view class="collection-time">
-						征集时间: {{ item.collectionStartTime }} 至 {{ item.collectionEndTime }}
-					</view>
-					<view class="description">{{ item.description }}</view>
-					<view class="progress-section">
-						<view class="progress-bar">
-							<view class="progress-fill" :style="{ width: item.progressPercent + '%' }"></view>
-						</view>
-						<view class="progress-text">{{ item.completedCount }}/{{ item.totalCount }}</view>
-					</view>
-					<view class="card-action">
-						<view class="action-btn" :class="item.buttonClass" @click.stop="handleAction(item)">
-							{{ item.buttonText }}
-						</view>
-					</view>
-				</view>
-			</view>
-			
-			<view class="no-more">没有更多了~</view>
-		</scroll-view>
-	</view>
-</template>
-
-<script>
-import { getMedicationSurveyList } from '@/api-js/medicationSurvey'
-export default {
-	data() {
-		return {
-			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
-			currentTab: 'incomplete',
-			tabs: [
-				{ label: '未完成', value: 'incomplete' },
-				{ label: '未开始', value: 'notStarted' },
-				{ label: '已结束', value: 'ended' }
-			],
-			surveyList: []
-		}
-	},
-	onLoad() {
-		this.loadData()
-	},
-	onReachBottom() {
-		this.loadMore()
-	},
-	methods: {
-		goBack() {
-			uni.navigateBack()
-		},
-		switchTab(tab) {
-			this.currentTab = tab
-			this.loadData()
-		},
-		goToDetail(item) {
-			uni.navigateTo({
-				url: `/pages_task/activityDetail?id=${item.id}`
-			})
-		},
-		handleAction(item) {
-			if (item.status === 'notStarted') {
-				uni.showToast({
-					icon: 'none',
-					title: '活动未开始'
-				})
-			} else if (item.status === 'ended') {
-				uni.showToast({
-					icon: 'none',
-					title: '活动已结束'
-				})
-			} else {
-				// 跳转到填写问卷或上传病例页面
-				uni.navigateTo({
-					url: `/pages_task/caseCollection?activityId=${item.id}`
-				})
-			}
-		},
-		async loadData() {
-			try {
-				uni.showLoading({ title: '加载中...' })
-				const res = await getMedicationSurveyList({
-					status: this.currentTab,
-					page: 1,
-					pageSize: 20
-				})
-				uni.hideLoading()
-				if (res.code === 200 && res.data) {
-					this.surveyList = res.data.list || this.getDefaultData()
-				} else {
-					this.surveyList = this.getDefaultData()
-				}
-			} catch (e) {
-				uni.hideLoading()
-				console.error('加载数据失败', e)
-				this.surveyList = this.getDefaultData()
-			}
-		},
-		async loadMore() {
-			// 加载更多数据
-		},
-		getDefaultData() {
-			if (this.currentTab === 'notStarted') {
-				return [
-					{
-						id: 1,
-						bannerImage: '',
-						bannerTitle: '正规医院体检',
-						bannerSubtitle: '守护您的健康',
-						collectionStartTime: '2025-05-29 00:00',
-						collectionEndTime: '2025-05-29 00:00',
-						description: '全国14家医院抗菌药物合理用药调研',
-						completedCount: 0,
-						totalCount: 3,
-						progressPercent: 0,
-						status: 'notStarted',
-						buttonText: '未开始',
-						buttonClass: 'not-started'
-					},
-					{
-						id: 2,
-						bannerImage: '',
-						bannerTitle: '2025广东省医师协会眼科医师分会',
-						bannerSubtitle: '眼外伤与眼眶病学术会议',
-						bannerInfo: '·暨眼外伤诊疗新进展学习班·',
-						collectionStartTime: '2025-05-29 00:00',
-						collectionEndTime: '2025-05-29 00:00',
-						description: '全国14家医院抗菌药物合理用药调研',
-						completedCount: 0,
-						totalCount: 3,
-						progressPercent: 0,
-						status: 'notStarted',
-						buttonText: '未开始',
-						buttonClass: 'not-started'
-					}
-				]
-			} else if (this.currentTab === 'incomplete') {
-				return [
-					{
-						id: 3,
-						bannerImage: '',
-						bannerTitle: '正规医院体检',
-						bannerSubtitle: '守护您的健康',
-						collectionStartTime: '2025-05-29 00:00',
-						collectionEndTime: '2025-05-29 00:00',
-						description: '全国14家医院抗菌药物合理用药调研',
-						completedCount: 0,
-						totalCount: 3,
-						progressPercent: 0,
-						status: 'incomplete',
-						buttonText: '填写问卷',
-						buttonClass: 'fill-questionnaire'
-					},
-					{
-						id: 4,
-						bannerImage: '',
-						bannerTitle: '2025广东省医师协会眼科医师分会',
-						bannerSubtitle: '眼外伤与眼眶病学术会议',
-						bannerInfo: '·暨眼外伤诊疗新进展学习班·',
-						collectionStartTime: '2025-05-29 00:00',
-						collectionEndTime: '2025-05-29 00:00',
-						description: '全国14家医院抗菌药物合理用药调研',
-						completedCount: 1,
-						totalCount: 3,
-						progressPercent: 33,
-						status: 'incomplete',
-						buttonText: '填写问卷',
-						buttonClass: 'fill-questionnaire'
-					}
-				]
-			} else {
-				return [
-					{
-						id: 5,
-						bannerImage: '',
-						bannerTitle: '正规医院体检',
-						bannerSubtitle: '守护您的健康',
-						collectionStartTime: '2025-05-29 00:00',
-						collectionEndTime: '2025-05-29 00:00',
-						description: '全国14家医院抗菌药物合理用药调研',
-						completedCount: 0,
-						totalCount: 3,
-						progressPercent: 0,
-						status: 'ended',
-						buttonText: '活动已结束',
-						buttonClass: 'ended'
-					},
-					{
-						id: 6,
-						bannerImage: '',
-						bannerTitle: '2025广东省医师协会眼科医师分会',
-						bannerSubtitle: '眼外伤与眼眶病学术会议',
-						bannerInfo: '·暨眼外伤诊疗新进展学习班·',
-						collectionStartTime: '2025-05-29 00:00',
-						collectionEndTime: '2025-05-29 00:00',
-						description: '全国14家医院抗菌药物合理用药调研',
-						completedCount: 0,
-						totalCount: 3,
-						progressPercent: 0,
-						status: 'ended',
-						buttonText: '活动已结束',
-						buttonClass: 'ended'
-					}
-				]
-			}
-		}
-	}
-}
-</script>
-
-<style lang="scss" scoped>
-.container {
-	min-height: 100vh;
-	background: #f5f5f5;
-	display: flex;
-	flex-direction: column;
-}
-
-.status-bar {
-	width: 100%;
-	background: #fff;
-}
-
-.header {
-	position: relative;
-	height: 88rpx;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	background: #fff;
-	border-bottom: 1rpx solid #f0f0f0;
-	
-	.back-btn {
-		position: absolute;
-		left: 24rpx;
-		width: 40rpx;
-		height: 40rpx;
-		
-		image {
-			width: 100%;
-			height: 100%;
-		}
-	}
-	
-	.title {
-		font-size: 36rpx;
-		font-weight: bold;
-		color: #333;
-	}
-	
-	.header-right {
-		position: absolute;
-		right: 24rpx;
-		display: flex;
-		align-items: center;
-		gap: 16rpx;
-		
-		.more-icon {
-			font-size: 32rpx;
-			color: #333;
-		}
-	}
-}
-
-.tabs-bar {
-	display: flex;
-	background: #fff;
-	border-bottom: 1rpx solid #f0f0f0;
-	
-	.tab-item {
-		flex: 1;
-		height: 88rpx;
-		line-height: 88rpx;
-		text-align: center;
-		font-size: 28rpx;
-		color: #666;
-		position: relative;
-		
-		&.active {
-			color: #388BFF;
-			font-weight: bold;
-			
-			&::after {
-				content: '';
-				position: absolute;
-				bottom: 0;
-				left: 0;
-				right: 0;
-				height: 4rpx;
-				background: #388BFF;
-			}
-		}
-	}
-}
-
-.content {
-	flex: 1;
-	padding: 24rpx;
-}
-
-.survey-card {
-	background: #fff;
-	border-radius: 16rpx;
-	margin-bottom: 24rpx;
-	overflow: hidden;
-	
-	.card-header-bg {
-		position: relative;
-		height: 240rpx;
-		background: linear-gradient(135deg, #87CEEB 0%, #98D8C8 100%);
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		padding: 24rpx;
-		
-		.banner-content {
-			width: 100%;
-			text-align: center;
-			
-			.banner-title {
-				font-size: 36rpx;
-				font-weight: bold;
-				color: #fff;
-				margin-bottom: 8rpx;
-			}
-			
-			.banner-subtitle {
-				font-size: 32rpx;
-				font-weight: bold;
-				color: #fff;
-				margin-bottom: 8rpx;
-			}
-			
-			.banner-info {
-				font-size: 24rpx;
-				color: #fff;
-				margin-bottom: 8rpx;
-			}
-		}
-	}
-	
-	.card-body {
-		padding: 24rpx;
-		
-		.collection-time {
-			font-size: 24rpx;
-			color: #999;
-			margin-bottom: 16rpx;
-		}
-		
-		.description {
-			font-size: 28rpx;
-			color: #333;
-			margin-bottom: 16rpx;
-		}
-		
-		.progress-section {
-			display: flex;
-			align-items: center;
-			gap: 16rpx;
-			margin-bottom: 16rpx;
-			
-			.progress-bar {
-				flex: 1;
-				height: 8rpx;
-				background: #f0f0f0;
-				border-radius: 4rpx;
-				overflow: hidden;
-				
-				.progress-fill {
-					height: 100%;
-					background: #388BFF;
-					border-radius: 4rpx;
-					transition: width 0.3s;
-				}
-			}
-			
-			.progress-text {
-				font-size: 24rpx;
-				color: #388BFF;
-				min-width: 60rpx;
-			}
-		}
-		
-		.card-action {
-			display: flex;
-			justify-content: flex-end;
-			
-			.action-btn {
-				padding: 12rpx 32rpx;
-				border-radius: 8rpx;
-				font-size: 26rpx;
-				color: #fff;
-				
-				&.fill-questionnaire {
-					background: #388BFF;
-				}
-				
-				&.not-started {
-					background: #ccc;
-				}
-				
-				&.ended {
-					background: #999;
-				}
-			}
-		}
-	}
-}
-
-.no-more {
-	text-align: center;
-	padding: 48rpx 0;
-	font-size: 24rpx;
-	color: #999;
-}
-</style>
-

+ 0 - 648
pages_task/onlineLecture.vue

@@ -1,648 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 搜索栏 -->
-		<view class="search-bar">
-			<view class="search-input-wrapper">
-				<text class="search-icon">🔍</text>
-				<input 
-					class="search-input" 
-					v-model="keyword" 
-					placeholder="请输入关键字"
-					@confirm="doSearch"
-				/>
-			</view>
-		</view>
-		
-		<!-- 标签栏 -->
-		<view class="tabs-bar">
-			<view class="tab-item" 
-				:class="{ active: currentTab === 'incomplete' }" 
-				@click="switchTab('incomplete')">
-				未完成
-			</view>
-			<view class="tab-item" 
-				:class="{ active: currentTab === 'completed' }" 
-				@click="switchTab('completed')">
-				已完成
-			</view>
-		</view>
-		
-		<!-- 讲座列表 -->
-		<scroll-view class="content" scroll-y>
-			<view class="lecture-card" v-for="(item, index) in lectureList" :key="index">
-				<view class="card-thumbnail">
-					<image class="thumbnail-img" :src="item.thumbnail" mode="aspectFill"></image>
-					<view class="thumbnail-status" v-if="item.status === 'inProgress'">
-						<text class="status-text">进行中</text>
-					</view>
-					<view class="thumbnail-date" v-else-if="item.scheduledTime">
-						<text class="date-icon">🕐</text>
-						<text class="date-text">{{ item.scheduledTime }}</text>
-					</view>
-				</view>
-				
-				<view class="card-content">
-					<view class="card-title">{{ item.title }}</view>
-					<view class="card-tags">
-						<view class="tag-item">{{ item.category }}</view>
-						<view class="tag-item">{{ item.type }}</view>
-					</view>
-					<view class="card-points">{{ item.points }} 积分</view>
-					<view class="card-views" v-if="currentTab === 'completed'">
-						<text class="eye-icon">👁</text>
-						<text>{{ item.viewCount }}</text>
-					</view>
-					<view class="card-action">
-						<view class="action-btn" 
-							v-if="item.status === 'inProgress' || item.status === 'scheduled'"
-							@click.stop="openChannelPicker(item)">
-							{{ item.status === 'inProgress' ? '继续开播' : '去开播' }}
-						</view>
-					</view>
-				</view>
-			</view>
-			
-			<view class="no-more">没有更多了~</view>
-		</scroll-view>
-		
-		<!-- 选择开播渠道弹窗 -->
-		<view class="channel-picker-popup" v-if="showChannelPicker" @click="showChannelPicker = false">
-			<view class="channel-picker-content" @click.stop>
-				<view class="picker-header">
-					<view class="picker-title">选择开播渠道</view>
-					<view class="picker-close" @click="showChannelPicker = false">×</view>
-				</view>
-				
-				<!-- 电脑浏览器开播 -->
-				<view class="channel-option">
-					<view class="option-icon">💻</view>
-					<view class="option-content">
-						<view class="option-title">电脑浏览器开播</view>
-						<view class="option-url-wrapper">
-							<text class="option-url">{{ broadcastUrl }}</text>
-							<view class="copy-btn" @click="copyUrl">复制链接</view>
-						</view>
-						<view class="option-tips">复制至谷歌浏览器,登录账号即可开播</view>
-					</view>
-				</view>
-				
-				<!-- 微信小程序开播 -->
-				<view class="channel-option">
-					<view class="option-icon wechat">💬</view>
-					<view class="option-content">
-						<view class="option-title">微信小程序开播</view>
-						<view class="option-action">
-							<view class="enter-btn" @click="enterMiniProgram">立即进入</view>
-						</view>
-					</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-// import { getOnlineLectureList, getBroadcastUrl, enterMiniProgram } from '@/api-js/onlineLecture'
-export default {
-	data() {
-		return {
-			statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
-			keyword: '',
-			currentTab: 'incomplete',
-			showChannelPicker: false,
-			broadcastUrl: 'https://www.test.coe.huahua...',
-			currentLecture: null,
-			lectureList: []
-		}
-	},
-	onLoad() {
-		this.loadData()
-	},
-	onReachBottom() {
-		this.loadMore()
-	},
-	methods: {
-		goBack() {
-			uni.navigateBack()
-		},
-		doSearch() {
-			this.loadData()
-		},
-		switchTab(tab) {
-			this.currentTab = tab
-			this.loadData()
-		},
-		async openChannelPicker(item) {
-			this.currentLecture = item
-			// try {
-			// 	const res = await getBroadcastUrl({ lectureId: item.id })
-			// 	if (res.code === 200 && res.data) {
-			// 		this.broadcastUrl = res.data.url
-			// 	}
-			// } catch (e) {
-			// 	console.error('获取开播链接失败', e)
-			// }
-			this.showChannelPicker = true
-		},
-		copyUrl() {
-			uni.setClipboardData({
-				data: this.broadcastUrl,
-				success: () => {
-					uni.showToast({
-						icon: 'success',
-						title: '链接已复制'
-					})
-				}
-			})
-		},
-		async enterMiniProgram() {
-			try {
-				const res = await enterMiniProgram({ lectureId: this.currentLecture.id })
-				if (res.code === 200 && res.data) {
-					// 跳转到微信小程序
-					uni.navigateToMiniProgram({
-						appId: res.data.appId,
-						path: res.data.path,
-						success: () => {
-							this.showChannelPicker = false
-						}
-					})
-				}
-			} catch (e) {
-				uni.showToast({
-					icon: 'none',
-					title: '进入失败'
-				})
-			}
-		},
-		async loadData() {
-			try {
-				uni.showLoading({ title: '加载中...' })
-				const res = await getOnlineLectureList({
-					keyword: this.keyword,
-					status: this.currentTab,
-					page: 1,
-					pageSize: 20
-				})
-				uni.hideLoading()
-				if (res.code === 200 && res.data) {
-					this.lectureList = res.data.list || this.getDefaultData()
-				} else {
-					this.lectureList = this.getDefaultData()
-				}
-			} catch (e) {
-				uni.hideLoading()
-				console.error('加载数据失败', e)
-				this.lectureList = this.getDefaultData()
-			}
-		},
-		async loadMore() {
-			// 加载更多数据
-		},
-		getDefaultData() {
-			if (this.currentTab === 'incomplete') {
-				return [
-					{
-						id: 1,
-						title: '康复医学概论',
-						thumbnail: '/static/image/lecture1.png',
-						category: '学术讲座',
-						type: '单人讲座',
-						points: '32.50',
-						status: 'inProgress',
-						scheduledTime: ''
-					},
-					{
-						id: 2,
-						title: '中医养生至冬病夏天治...',
-						thumbnail: '/static/image/lecture2.png',
-						category: '学术讲座',
-						type: '单人讲座',
-						points: '32.50',
-						status: 'scheduled',
-						scheduledTime: '05-12 12:00'
-					},
-					{
-						id: 3,
-						title: '康复医学概论',
-						thumbnail: '/static/image/lecture3.png',
-						category: '学术讲座',
-						type: '单人讲座',
-						points: '32.50',
-						status: 'scheduled',
-						scheduledTime: '05-24 16:00'
-					}
-				]
-			} else {
-				return [
-					{
-						id: 4,
-						title: '康复医学概论',
-						thumbnail: '/static/image/lecture1.png',
-						category: '学术讲座',
-						type: '单人讲座',
-						points: '32.50',
-						viewCount: '123',
-						scheduledTime: '05-12 12:00'
-					},
-					{
-						id: 5,
-						title: '康复医学概论',
-						thumbnail: '/static/image/lecture2.png',
-						category: '学术讲座',
-						type: '单人讲座',
-						points: '32.50',
-						viewCount: '123',
-						scheduledTime: '05-12 12:00'
-					},
-					{
-						id: 6,
-						title: '康复医学概论',
-						thumbnail: '/static/image/lecture3.png',
-						category: '学术讲座',
-						type: '单人讲座',
-						points: '32.50',
-						viewCount: '123',
-						scheduledTime: '05-12 12:00'
-					}
-				]
-			}
-		}
-	}
-}
-</script>
-
-<style lang="scss" scoped>
-.container {
-	min-height: 100vh;
-	background: #f5f5f5;
-	display: flex;
-	flex-direction: column;
-}
-
-.status-bar {
-	width: 100%;
-	background: #fff;
-}
-
-.header {
-	position: relative;
-	height: 88rpx;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	background: #fff;
-	border-bottom: 1rpx solid #f0f0f0;
-	
-	.back-btn {
-		position: absolute;
-		left: 24rpx;
-		width: 40rpx;
-		height: 40rpx;
-		
-		image {
-			width: 100%;
-			height: 100%;
-		}
-	}
-	
-	.title {
-		font-size: 36rpx;
-		font-weight: bold;
-		color: #333;
-	}
-	
-	.header-right {
-		position: absolute;
-		right: 24rpx;
-		display: flex;
-		align-items: center;
-		gap: 16rpx;
-		
-		.more-icon {
-			font-size: 32rpx;
-			color: #333;
-		}
-	}
-}
-
-.search-bar {
-	padding: 24rpx;
-	background: #fff;
-	border-bottom: 1rpx solid #f0f0f0;
-	
-	.search-input-wrapper {
-		display: flex;
-		align-items: center;
-		height: 72rpx;
-		background: #f5f5f5;
-		border-radius: 36rpx;
-		padding: 0 24rpx;
-		
-		.search-icon {
-			font-size: 32rpx;
-			margin-right: 16rpx;
-			color: #999;
-		}
-		
-		.search-input {
-			flex: 1;
-			font-size: 28rpx;
-			color: #333;
-		}
-	}
-}
-
-.tabs-bar {
-	display: flex;
-	background: #fff;
-	border-bottom: 1rpx solid #f0f0f0;
-	
-	.tab-item {
-		flex: 1;
-		height: 88rpx;
-		line-height: 88rpx;
-		text-align: center;
-		font-size: 28rpx;
-		color: #666;
-		position: relative;
-		
-		&.active {
-			color: #388BFF;
-			font-weight: bold;
-			
-			&::after {
-				content: '';
-				position: absolute;
-				bottom: 0;
-				left: 0;
-				right: 0;
-				height: 4rpx;
-				background: #388BFF;
-			}
-		}
-	}
-}
-
-.content {
-	flex: 1;
-	padding: 24rpx;
-}
-
-.lecture-card {
-	display: flex;
-	background: #fff;
-	border-radius: 16rpx;
-	padding: 24rpx;
-	margin-bottom: 24rpx;
-	
-	.card-thumbnail {
-		position: relative;
-		width: 240rpx;
-		height: 180rpx;
-		border-radius: 12rpx;
-		overflow: hidden;
-		margin-right: 24rpx;
-		flex-shrink: 0;
-		
-		.thumbnail-img {
-			width: 100%;
-			height: 100%;
-		}
-		
-		.thumbnail-status {
-			position: absolute;
-			top: 8rpx;
-			left: 8rpx;
-			padding: 4rpx 12rpx;
-			background: #FF9800;
-			border-radius: 4rpx;
-			
-			.status-text {
-				font-size: 20rpx;
-				color: #fff;
-			}
-		}
-		
-		.thumbnail-date {
-			position: absolute;
-			top: 8rpx;
-			left: 8rpx;
-			display: flex;
-			align-items: center;
-			gap: 4rpx;
-			padding: 4rpx 12rpx;
-			background: rgba(0, 0, 0, 0.5);
-			border-radius: 4rpx;
-			
-			.date-icon {
-				font-size: 20rpx;
-			}
-			
-			.date-text {
-				font-size: 20rpx;
-				color: #fff;
-			}
-		}
-	}
-	
-	.card-content {
-		flex: 1;
-		display: flex;
-		flex-direction: column;
-		justify-content: space-between;
-		
-		.card-title {
-			font-size: 30rpx;
-			font-weight: bold;
-			color: #333;
-			margin-bottom: 12rpx;
-			overflow: hidden;
-			text-overflow: ellipsis;
-			white-space: nowrap;
-		}
-		
-		.card-tags {
-			display: flex;
-			align-items: center;
-			gap: 12rpx;
-			margin-bottom: 12rpx;
-			
-			.tag-item {
-				padding: 4rpx 12rpx;
-				background: #f5f5f5;
-				border-radius: 4rpx;
-				font-size: 22rpx;
-				color: #666;
-			}
-		}
-		
-		.card-points {
-			font-size: 26rpx;
-			color: #333;
-			margin-bottom: 12rpx;
-		}
-		
-		.card-views {
-			display: flex;
-			align-items: center;
-			gap: 4rpx;
-			font-size: 24rpx;
-			color: #999;
-			margin-bottom: 12rpx;
-			
-			.eye-icon {
-				font-size: 24rpx;
-			}
-		}
-		
-		.card-action {
-			display: flex;
-			justify-content: flex-end;
-			
-			.action-btn {
-				padding: 12rpx 32rpx;
-				background: #388BFF;
-				border-radius: 8rpx;
-				font-size: 26rpx;
-				color: #fff;
-			}
-		}
-	}
-}
-
-.no-more {
-	text-align: center;
-	padding: 48rpx 0;
-	font-size: 24rpx;
-	color: #999;
-}
-
-.channel-picker-popup {
-	position: fixed;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	background: rgba(0, 0, 0, 0.5);
-	z-index: 999;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-}
-
-.channel-picker-content {
-	width: 90%;
-	max-width: 600rpx;
-	background: #fff;
-	border-radius: 24rpx;
-	padding: 24rpx;
-	
-	.picker-header {
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		margin-bottom: 32rpx;
-		
-		.picker-title {
-			font-size: 32rpx;
-			font-weight: bold;
-			color: #333;
-		}
-		
-		.picker-close {
-			width: 48rpx;
-			height: 48rpx;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			font-size: 40rpx;
-			color: #999;
-		}
-	}
-	
-	.channel-option {
-		display: flex;
-		align-items: flex-start;
-		margin-bottom: 32rpx;
-		
-		&:last-child {
-			margin-bottom: 0;
-		}
-		
-		.option-icon {
-			width: 64rpx;
-			height: 64rpx;
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			font-size: 48rpx;
-			margin-right: 24rpx;
-			flex-shrink: 0;
-			
-			&.wechat {
-				background: #07C160;
-				border-radius: 8rpx;
-			}
-		}
-		
-		.option-content {
-			flex: 1;
-			
-			.option-title {
-				font-size: 30rpx;
-				font-weight: bold;
-				color: #333;
-				margin-bottom: 16rpx;
-			}
-			
-			.option-url-wrapper {
-				display: flex;
-				align-items: center;
-				gap: 16rpx;
-				margin-bottom: 12rpx;
-				
-				.option-url {
-					flex: 1;
-					padding: 12rpx 16rpx;
-					background: #f5f5f5;
-					border-radius: 8rpx;
-					font-size: 24rpx;
-					color: #666;
-					overflow: hidden;
-					text-overflow: ellipsis;
-					white-space: nowrap;
-				}
-				
-				.copy-btn {
-					padding: 12rpx 24rpx;
-					background: #388BFF;
-					border-radius: 8rpx;
-					font-size: 24rpx;
-					color: #fff;
-					white-space: nowrap;
-				}
-			}
-			
-			.option-tips {
-				font-size: 22rpx;
-				color: #999;
-			}
-			
-			.option-action {
-				display: flex;
-				justify-content: flex-end;
-				
-				.enter-btn {
-					padding: 12rpx 32rpx;
-					background: #388BFF;
-					border-radius: 8rpx;
-					font-size: 28rpx;
-					color: #fff;
-				}
-			}
-		}
-	}
-}
-</style>
-

+ 3 - 3
pages_task/pointsSettings.vue

@@ -21,7 +21,7 @@
 								@input="onIntegralInput(customer)" />
 							<view v-if="customer.integral" class="clear-icon-wrapper"
 								@click.stop="clearIntegral(customer)">
-								<image class="clear-icon" src="/static/image/icon_clear.png"></image>
+								<image class="clear-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_clear.png"></image>
 							</view>
 						</view>
 					</view>
@@ -40,7 +40,7 @@
 				<view class="popup-header">
 					<text class="popup-title">概览</text>
 					<view class="close-btn" @click="closeOverviewPopup">
-						<image class="close-icon" src="/static/image/icon_close.png"></image>
+						<image class="close-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_close.png"></image>
 					</view>
 				</view>
 
@@ -100,7 +100,7 @@
 		<!-- 底部操作栏 -->
 		<view class="bottom-bar">
 			<view class="del-box" @click="deleteSelected">
-				<image class="w40 h40" src="/static/image/icon_delete.png"></image>
+				<image class="w40 h40" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_delete.png"></image>
 				<text>删除</text>
 			</view>
 			<view class="action-buttons">

+ 4 - 4
pages_task/selectCustomer.vue

@@ -6,10 +6,10 @@
 			<!-- 搜索栏 -->
 			<view class="search-section">
 				<view class="search-input-wrapper">
-					<image class="search-icon" src="/static/image/icon_search.png"></image>
+					<image class="search-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_search.png"></image>
 					<input class="search-input" type="text" placeholder="输入客户名称" v-model="searchKeyword"
 						@input="handleSearch" />
-					<image class="clear-icon" src="/static/image/icon_clear.png" v-if="searchKeyword"
+					<image class="clear-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_clear.png" v-if="searchKeyword"
 						@click="clearSearch"></image>
 				</view>
 				<view class="section-title">已选择 {{ selectedCustomers.length||'0' }} 人:</view>
@@ -32,7 +32,7 @@
 				<view class="customer-item" :class="{ active: isSelected(customer.id) }"
 					v-for="(customer, index) in filteredCustomers" :key="customer.id" @click="toggleCustomer(customer)">
 					<view class="left">
-						<image class="head" src="/static/image/my_heads_icon.png"></image>
+						<image class="head" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/my_heads_icon.png"></image>
 						<view class="customer-info">
 							<view class="customer-header">
 								<view class="customer-name">{{ customer.doctorName ||'-'}}</view>
@@ -53,7 +53,7 @@
 		<!-- 底部操作栏 -->
 		<view class="bottom-bar">
 			<view class="del-box" @click="deleteSelected">
-				<image class="w40 h40" src="/static/image/icon_delete.png"></image>
+				<image class="w40 h40" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_delete.png"></image>
 				<text>删除</text>
 			</view>
 			<view class="action-buttons">

+ 1 - 1
pages_task/success.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="container">
-		<image class="img" src="/static/image/img_admitsuccess.png"></image>
+		<image class="img" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/img_admitsuccess.png"></image>
 		<view class="title">定级材料提交成功!</view>
 		<view class="txt">预计1-2个工作日完成审核,请耐心等待</view>
 		<view class="return" @click="goBack">返回</view>

+ 1 - 1
pages_task/taskDetail.vue

@@ -327,7 +327,7 @@ import { info } from '@/api/task.js';
 
 			// 初始化 auditStatus
 			this.auditStatus = this.createStatus;
-			this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
+			this.userInfo = uni.getStorageSync('userInfo')
 
 
 			

+ 257 - 165
pages_task/xlTask.vue

@@ -3,11 +3,11 @@
 		<!-- 搜索+筛选栏 -->
 		<view class="top-box">
 			<view class="input-item">
-				<image class="icon search-icon" src="@/static/image/search.png" mode="widthFix"></image>
+				<image class="icon search-icon" src="/static/image/search.png" mode="widthFix"></image>
 				<input placeholder="请输入客户姓名/机构名称" placeholder-class="placeholder" />
 			</view>
 			<view class="filter-item" @click="showFilter = true">
-				<image class="filter-icon" src="@/static/image/icon_select.png" mode="widthFix"></image>
+				<image class="filter-icon" src="/static/image/icon_select.png" mode="widthFix"></image>
 				<text>筛选</text>
 			</view>
 		</view>
@@ -31,7 +31,7 @@
 		</view>
 
 		<!-- 列表内容 -->
-		<scroll-view class="content" scroll-y>
+		<scroll-view class="content" scroll-y @scrolltolower="loadMore" @refresherrefresh="refresh" refresher-enabled="true" refresher-threshold="80" refresher-default-style="black">
 			<!-- 任务列表 -->
 			<view v-if="currentTopTab === 'task'">
 				<view class="task-card" v-for="(item, index) in currentList" :key="index" @click="goDetails(item)">
@@ -50,7 +50,7 @@
 
 						<!-- 医院+科室 -->
 						<view class="org-info">
-							<image class="org-icon" src="@/static/image/icon_hospital.png" mode="widthFix"></image>
+							<image class="org-icon" src="/static/image/icon_hospital.png" mode="widthFix"></image>
 							<text>{{ item.deptName ||'-' }}</text>
 							<view class="line"></view>
 							<text>{{ item.deptName||'-' }}</text>
@@ -60,7 +60,7 @@
 						<view class="card-tags">
 							<view class="tag-left-group">
 								<view class="tag-item video-tag" v-if="item.taskTypeName">
-									<image class="video-tag-icon" src="@/static/image/icon_longvideo.png" mode="widthFix">
+									<image class="video-tag-icon" src="/static/image/icon_longvideo.png" mode="widthFix">
 									</image>
 									<text>{{ item.taskTypeName ||'-'}}</text>
 								</view>
@@ -129,7 +129,7 @@
 
 						<!-- 医院+科室 -->
 						<view class="org-info">
-							<image class="org-icon" src="@/static/image/icon_hospital.png" mode="widthFix"></image>
+							<image class="org-icon" src="/static/image/icon_hospital.png" mode="widthFix"></image>
 							<text>{{ item.businessData.taskInfo.doctorVO.institution ||'-' }}</text>
 							<view class="line"></view>
 							<text>{{ item.businessData.taskInfo.doctorVO.department||'-' }}</text>
@@ -139,7 +139,7 @@
 						<view class="card-tags">
 							<view class="tag-left-group">
 								<view class="tag-item video-tag" v-if="item.businessData.taskInfo.taskTypeName">
-									<image class="video-tag-icon" src="@/static/image/icon_longvideo.png" mode="widthFix">
+									<image class="video-tag-icon" src="/static/image/icon_longvideo.png" mode="widthFix">
 									</image>
 									<text>{{ item.businessData.taskInfo.taskTypeName ||'-'}}</text>
 								</view>
@@ -167,7 +167,7 @@
 						<!-- 操作按钮 -->
 						<view class="operate-btn-group">
 							<view class="share-btn" @click="handleShare(item)">
-								<image class="share-icon" src="@/static/image/icon_user.png" mode="widthFix"></image>
+								<image class="share-icon" src="/static/image/icon_user.png" mode="widthFix"></image>
 								<text>{{ item.initiatorName || '未命名' }}</text>
 							</view>
 							<view class="btn-group">
@@ -196,7 +196,7 @@
 			<view class="filter-content" @click.stop>
 				<view class="filter-header">
 					<view class="filter-title">筛选</view>
-					<image class="filter-close-btn" src="@/static/image/icon_close.png" @click="closeFilter"
+					<image class="filter-close-btn" src="/static/image/icon_close.png" @click="closeFilter"
 						mode="widthFix"></image>
 				</view>
 
@@ -330,12 +330,23 @@ import { getPendingAuditList } from '@/api/audit.js';
 					taskBelong: [],
 				taskType: [],
 				taskAuditStatus: [],
-				auditStatus: []
+				auditStatus: [],
+				// 分页参数
+				page: 1,
+				pageSize: 20,
+				hasMore: true,
+				auditPage: 1,
+				auditPageSize: 20,
+				auditHasMore: true,
+				// 加载状态
+				isLoadingMore: false
 			}
 		},
 		onLoad: async function(options) {
 			// 先获取用户信息
-			this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+			this.userInfo =uni.getStorageSync('userInfo') || '{}';
+			// this.userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}');
+
 			
 			try {
 				// 并行获取所有字典数据,提高性能
@@ -404,84 +415,100 @@ import { getPendingAuditList } from '@/api/audit.js';
 						});}})},
 
 			//审批列表
-			getAuditList() {
-				// 构建请求参数
-				const params = {
-					userId: this.userInfo.userId,
-				    taskStatus: this.currentSubTab || '',
-					status:'',
-				    companyId:this.userInfo.companyId,
-					templateCode: this.templateCode||'',
-					pageNum:1,
-					pageSize:10,
-					// 任务申请时间
-					applyStartTime: this.filters.applyTimeStart || '',
-					applyEndTime: this.filters.applyTimeEnd || '',
-					// 任务完成时间
-					taskFinishTimeStart: this.filters.finishTimeStart || '',
-					taskFinishTimeEnd: this.filters.finishTimeEnd || '',
-					// 任务完成审核时间
-					finishAuditTimeStart: this.filters.auditTimeStart || '',
-					finishAuditTimeEnd: this.filters.auditTimeEnd || '',
-					// 完结状态
-					finishStatus: this.filters.finishStatus === 'unfinished' ? 0 : this.filters.finishStatus === 'finished' ? 1 : ''
-				};
-				
-				// 避免重复请求
-				if (this.isLoading) return;
-				
-				this.isLoading = true;
-				uni.showLoading({
-					title: '加载中...'
-				});
-				
-				getPendingAuditList(params).then(res => {
-					this.isLoading = false;
-					uni.hideLoading();
-					if (res.code === 200 && res.rows) {
-						// 处理审核列表数据
-						this.auditList = res.rows.map(item => {
-							// 从businessData.taskInfo中获取任务信息
-							const taskInfo = item.businessData?.taskInfo || {};
-							return {
-								id: item.id,
-								auditName: item.auditName,
-								initiatorName: taskInfo.doctorName || item.initiatorName || '未知',
-								createTime: item.createTime,
-								statusText: this.getAuditStatusText(item.status),
-								statusClass: this.getAuditStatusClass(item.status),
-								doctorName: taskInfo.doctorName || item.initiatorName || '未知',
-								initiatorId: item.initiatorId || '',
-								sealImg: item.status === 1 ? '/static/image/img_finish.png' : '/static/image/img_unfinish.png',
-								businessData: item.businessData || {},
-								// 从taskInfo中获取其他需要的字段
-								taskTitle: taskInfo.taskName || item.auditName,
-								hospital: taskInfo.deptName || '-',
-								department: taskInfo.deptName || '-',
-								videoType: taskInfo.taskTypeName || '-',
-								category: taskInfo.taskTypeName || '-',
-								points: taskInfo.taskIntegral || 0,
-								count: taskInfo.taskCount || 0,
-								applyTime: item.createTime
-							};
+				getAuditList() {
+					// 构建请求参数
+					const params = {
+						userId: this.userInfo.userId,
+					    taskStatus: this.currentSubTab || '',
+						status:'',
+					    companyId:this.userInfo.companyId,
+						templateCode: this.templateCode||'',
+						pageNum: this.auditPage,
+						pageSize: this.auditPageSize,
+						// 任务申请时间
+						applyStartTime: this.filters.applyTimeStart || '',
+						applyEndTime: this.filters.applyTimeEnd || '',
+						// 任务完成时间
+						taskFinishTimeStart: this.filters.finishTimeStart || '',
+						taskFinishTimeEnd: this.filters.finishTimeEnd || '',
+						// 任务完成审核时间
+						finishAuditTimeStart: this.filters.auditTimeStart || '',
+						finishAuditTimeEnd: this.filters.auditTimeEnd || '',
+						// 完结状态
+						finishStatus: this.filters.finishStatus === 'unfinished' ? 0 : this.filters.finishStatus === 'finished' ? 1 : ''
+					};
+					
+					// 避免重复请求
+					if (this.isLoading) return;
+					
+					this.isLoading = true;
+					if (!this.isLoadingMore) {
+						uni.showLoading({
+							title: '加载中...'
 						});
-						console.log("审核列表数据",this.auditList);
-
-
-					} else {
+					}
+					
+					getPendingAuditList(params).then(res => {
+						this.isLoading = false;
+						this.isLoadingMore = false;
+						uni.hideLoading();
+						if (res.code === 200 && res.rows) {
+							// 处理审核列表数据
+							const newAuditList = res.rows.map(item => {
+								// 从businessData.taskInfo中获取任务信息
+								const taskInfo = item.businessData?.taskInfo || {};
+								return {
+									id: item.id,
+									auditName: item.auditName,
+									initiatorName: taskInfo.doctorName || item.initiatorName || '未知',
+									createTime: item.createTime,
+									statusText: this.getAuditStatusText(item.status),
+									statusClass: this.getAuditStatusClass(item.status),
+									doctorName: taskInfo.doctorName || item.initiatorName || '未知',
+									initiatorId: item.initiatorId || '',
+									sealImg: item.status === 1 ? '/static/image/img_finish.png' : '/static/image/img_unfinish.png',
+									businessData: item.businessData || {},
+									// 从taskInfo中获取其他需要的字段
+									taskTitle: taskInfo.taskName || item.auditName,
+									hospital: taskInfo.deptName || '-',
+									department: taskInfo.deptName || '-',
+									videoType: taskInfo.taskTypeName || '-',
+									category: taskInfo.taskTypeName || '-',
+									points: taskInfo.taskIntegral || 0,
+									count: taskInfo.taskCount || 0,
+									applyTime: item.createTime
+								};
+							});
+							// 如果是加载更多,则追加数据
+							if (this.isLoadingMore) {
+								this.auditList = [...this.auditList, ...newAuditList];
+							} else {
+								// 否则替换数据
+								this.auditList = newAuditList;
+							}
+							// 判断是否还有更多数据
+							this.auditHasMore = res.rows.length === this.auditPageSize;
+							console.log("审核列表数据",this.auditList);
+						} else {
+							// 如果是加载更多,则保持原有数据
+							if (!this.isLoadingMore) {
+								uni.showToast({
+									title: '获取数据失败',
+									icon: 'none'
+								});
+							}
+							this.auditHasMore = false;
+						}
+					}).catch(err => {
+						this.isLoading = false;
+						this.isLoadingMore = false;
+						uni.hideLoading();
 						uni.showToast({
-							title: '获取数据失败',
+							title: '网络错误',
 							icon: 'none'
 						});
-					}
-				}).catch(err => {
-					uni.hideLoading();
-					uni.showToast({
-						title: '网络错误',
-						icon: 'none'
 					});
-				});
-			},
+				},
 			dicts() {
 				dicts('task_status').then(res => {
 					if (res.code === 200 ) {
@@ -501,74 +528,127 @@ import { getPendingAuditList } from '@/api/audit.js';
 				});
 			},
 			loadData() {
-				// 根据当前标签加载对应数据
-				if (this.currentTopTab === 'task') {
-					this.getTaskList();
-				} else if (this.currentTopTab === 'audit') {
-					this.getAuditList();
-				}
-				// 只在首次加载时获取公司项目设置
-				if (!this.companySettingsLoaded) {
-					this.getCompanySettings();
-					this.companySettingsLoaded = true;
-				}
-			},
+					// 根据当前标签加载对应数据
+					if (this.currentTopTab === 'task') {
+						this.getTaskList();
+					} else if (this.currentTopTab === 'audit') {
+						this.getAuditList();
+					}
+					// 只在首次加载时获取公司项目设置
+					if (!this.companySettingsLoaded) {
+						this.getCompanySettings();
+						this.companySettingsLoaded = true;
+					}
+				},
+				// 下拉刷新
+				refresh() {
+					// 重置分页参数
+					if (this.currentTopTab === 'task') {
+						this.page = 1;
+						this.hasMore = true;
+						this.taskList = [];
+					} else if (this.currentTopTab === 'audit') {
+						this.auditPage = 1;
+						this.auditHasMore = true;
+						this.auditList = [];
+					}
+					// 重新加载数据
+					this.loadData();
+				},
+				// 加载更多
+				loadMore() {
+					// 检查是否正在加载或没有更多数据
+					if (this.isLoading || this.isLoadingMore) return;
+					
+					if (this.currentTopTab === 'task') {
+						if (!this.hasMore) return;
+						// 增加页码并加载更多
+						this.page++;
+						this.isLoadingMore = true;
+						this.getTaskList();
+					} else if (this.currentTopTab === 'audit') {
+						if (!this.auditHasMore) return;
+						// 增加页码并加载更多
+						this.auditPage++;
+						this.isLoadingMore = true;
+						this.getAuditList();
+					}
+				},
 			//任务列表
-			getTaskList() {
-				// 构建请求参数
-				const params = {
-					...this.filters,
-					type: this.currentTopTab,
-					taskStatus: this.currentSubTab
-				};
-				
-				// 避免重复请求
-				if (this.isLoading) return;
-				
-				this.isLoading = true;
-				uni.showLoading({
-					title: '加载中...'
-				});
-				
-				list(params).then(res => {
-					this.isLoading = false;
-					uni.hideLoading();
-					if (res.code === 200 && res.rows) {
-						// 处理任务列表数据
-						this.taskList = res.rows.map(item => ({
-							id: item.id,
-							doctorName: item.doctorName,
-							taskName: item.taskName,
-							statusText: this.getStatusText(item.taskStatus),
-							statusClass: this.getStatusClass(item.taskStatus),
-							level: '', // 接口返回数据中没有level字段
-							deptName: item.deptName, // 使用deptName作为deptName
-							taskTypeName: item.taskTypeName, 
-							taskIntegral: item.taskIntegral,
-							taskCount: item.taskCount,
-							createTime: item.createTime,
-							finishAuditTime: item.finishAuditTime || '-',
-							auditStatus: this.getAuditStatusText(item.finishAuditStatus),
-							showDelete: true,
-							sealImg: item.taskStatus === 1 ? '/static/image/img_finish.png' : '/static/image/img_unfinish.png',
-							finishAuditInstanceId: item.finishAuditInstanceId || '-',
-							createAuditInstanceId: item.createAuditInstanceId || '-',
-						}));
-					} else {
-						uni.showToast({
-							title: '获取数据失败',
-							icon: 'none'
+				getTaskList() {
+					// 构建请求参数
+					const params = {
+						...this.filters,
+						type: this.currentTopTab,
+						taskStatus: this.currentSubTab,
+						page: this.page,
+						pageSize: this.pageSize
+					};
+					
+					// 避免重复请求
+					if (this.isLoading) return;
+					
+					this.isLoading = true;
+					if (!this.isLoadingMore) {
+						uni.showLoading({
+							title: '加载中...'
 						});
 					}
-				}).catch(err => {
-					this.isLoading = false;
-					uni.hideLoading();
-					uni.showToast({
-						title: '网络错误',
-						icon: 'none'
+					
+					list(params).then(res => {
+						this.isLoading = false;
+						this.isLoadingMore = false;
+						uni.hideLoading();
+						if (res.code === 200 && res.rows) {
+							// 处理任务列表数据
+							const newTaskList = res.rows.map(item => ({
+								id: item.id,
+								doctorName: item.doctorName,
+								taskName: item.taskName,
+								statusText: this.getStatusText(item.taskStatus),
+								statusClass: this.getStatusClass(item.taskStatus),
+								level: '', // 接口返回数据中没有level字段
+								deptName: item.deptName, // 使用deptName作为deptName
+								taskTypeName: item.taskTypeName, 
+								taskIntegral: item.taskIntegral,
+								taskCount: item.taskCount,
+								createTime: item.createTime,
+								finishAuditTime: item.finishAuditTime || '-',
+								auditStatus: this.getAuditStatusText(item.finishAuditStatus),
+								showDelete: true,
+								sealImg: item.taskStatus === 1 ? '/static/image/img_finish.png' : '/static/image/img_unfinish.png',
+								finishAuditInstanceId: item.finishAuditInstanceId || '-',
+								createAuditInstanceId: item.createAuditInstanceId || '-',
+							}));
+							// 如果是加载更多,则追加数据
+							if (this.isLoadingMore) {
+								this.taskList = [...this.taskList, ...newTaskList];
+							} else {
+								// 否则替换数据
+								this.taskList = newTaskList;
+							}
+							// 判断是否还有更多数据
+							this.hasMore = res.rows.length === this.pageSize;
+						} else {
+							// 如果是加载更多,则保持原有数据
+							if (!this.isLoadingMore) {
+								uni.showToast({
+									title: '获取数据失败',
+									icon: 'none'
+								});
+							}
+							this.hasMore = false;
+						}
+					}).catch(err => {
+						this.isLoading = false;
+						this.isLoadingMore = false;
+						uni.hideLoading();
+						uni.showToast({
+							icon: 'none',
+							title: '网络错误'
+						});
 					});
-				});
-			},
+				},
 			getCompanySettings() {
 				// 获取公司项目设置
 				if (this.userInfo.companyId) {
@@ -659,24 +739,36 @@ import { getPendingAuditList } from '@/api/audit.js';
 				});
 			},
 			selectSubTab(value) {
-				this.currentSubTab = value;
-				// 根据当前的 topTab 类型调用对应的方法
-				if (this.currentTopTab === 'task') {
-					this.getTaskList();
-				} else if (this.currentTopTab === 'audit') {
-					this.getAuditList();
-				}
-			},
+					this.currentSubTab = value;
+					// 重置分页参数
+					if (this.currentTopTab === 'task') {
+						this.page = 1;
+						this.hasMore = true;
+						this.taskList = [];
+						this.getTaskList();
+					} else if (this.currentTopTab === 'audit') {
+						this.auditPage = 1;
+						this.auditHasMore = true;
+						this.auditList = [];
+						this.getAuditList();
+					}
+				},
 			switchTopTab(type) {
-				this.currentTopTab = type;
-				this.currentSubTab = '';
-				// 根据标签类型调用相应的加载方法
-				if (type === 'task') {
-					this.getTaskList();
-				} else if (type === 'audit') {
-					this.getAuditList();
-				}
-			},
+					this.currentTopTab = type;
+					this.currentSubTab = '';
+					// 重置分页参数
+					if (type === 'task') {
+						this.page = 1;
+						this.hasMore = true;
+						this.taskList = [];
+						this.getTaskList();
+					} else if (type === 'audit') {
+						this.auditPage = 1;
+						this.auditHasMore = true;
+						this.auditList = [];
+						this.getAuditList();
+					}
+				},
 			closeFilter() {
 				this.showFilter = false
 			},

Різницю між файлами не показано, бо вона завелика
+ 464 - 395
pages_user/userInfo.vue


BIN
static/image/Iconly/Light/Calendar.png


BIN
static/image/approval.png


BIN
static/image/back.png


BIN
static/image/back_white.png


BIN
static/image/bg_bankcard.png


BIN
static/image/bg_bench.png


BIN
static/image/bg_invite.png


BIN
static/image/bg_login.png


BIN
static/image/bg_mine.png


BIN
static/image/bg_tab_login.png


BIN
static/image/bg_tab_login2.png


BIN
static/image/btn_add.png


BIN
static/image/btn_data.png


BIN
static/image/btn_sjtj.png


BIN
static/image/icon_ barrage_on.png


BIN
static/image/icon_Bold_Play.png


BIN
static/image/icon_admonish.png


BIN
static/image/icon_approval_no.png


BIN
static/image/icon_approval_yes.png


BIN
static/image/icon_attachment.png


BIN
static/image/icon_camera.png


BIN
static/image/icon_circle.png


BIN
static/image/icon_circle_sel.png


BIN
static/image/icon_clear.png


BIN
static/image/icon_close.png


BIN
static/image/icon_cross.png


BIN
static/image/icon_delete.png


BIN
static/image/icon_doctor.png


BIN
static/image/icon_doctor_fill.png


BIN
static/image/icon_down.png


BIN
static/image/icon_downlad.png


BIN
static/image/icon_example.png


BIN
static/image/icon_expand.png


BIN
static/image/icon_fullscreen.png


BIN
static/image/icon_fullscreen2.png


BIN
static/image/icon_goon.png


BIN
static/image/icon_hospital.png


BIN
static/image/icon_img_delete.png


BIN
static/image/icon_invisible.png


BIN
static/image/icon_live_pc.png


BIN
static/image/icon_live_phone.png


BIN
static/image/icon_longvideo.png


BIN
static/image/icon_more.png


BIN
static/image/icon_my_card.png


BIN
static/image/icon_my_information.png


BIN
static/image/icon_my_more.png


BIN
static/image/icon_my_password.png


BIN
static/image/icon_my_points.png


BIN
static/image/icon_my_servicelist.png


BIN
static/image/icon_my_set.png


BIN
static/image/icon_my_useragreement.png


BIN
static/image/icon_pass.png


BIN
static/image/icon_play.png


BIN
static/image/icon_refuse.png


BIN
static/image/icon_reject.png


BIN
static/image/icon_right.png


BIN
static/image/icon_search.png


BIN
static/image/icon_select.png


BIN
static/image/icon_share.png


BIN
static/image/icon_share_save.png


BIN
static/image/icon_share_wechat.png


BIN
static/image/icon_step_done.png


BIN
static/image/icon_task_kpcz.png


BIN
static/image/icon_task_zxjz.png


BIN
static/image/icon_time.png


BIN
static/image/icon_tobestart.png


BIN
static/image/icon_uplodeidcard.png


BIN
static/image/icon_user.png


BIN
static/image/icon_v.png


BIN
static/image/icon_v_fail.png


BIN
static/image/icon_v_ing.png


BIN
static/image/icon_video.png


BIN
static/image/icon_visible.png


BIN
static/image/icon_visitor.png


BIN
static/image/icon_wait.png


BIN
static/image/icon_warning.png


BIN
static/image/icon_wrong.png


Деякі файли не було показано, через те що забагато файлів було змінено