liujiaxin 1 tydzień temu
rodzic
commit
e048c67bd6

+ 6 - 1
api/audit.js

@@ -34,4 +34,9 @@ export function getTaskFinishAuditInfo(data) {
  //审核
 export function detail(data) {
  	 return request('/company/audit/detail',data,'GET','application/json;charset=UTF-8');
-} 
+} 
+
+//查询公司下的待审核任务数量
+export function pendingCount(data) {
+	 return request('/company/audit/cus/pendingCount',data,'POST','application/json;charset=UTF-8');
+}

+ 5 - 0
api/speaker.js

@@ -27,6 +27,11 @@ export function checkIntegralLimit(data) {
 	 return request('/project/standard/checkIntegralLimit',data,'GET','application/json;charset=UTF-8');
 }
 
+
+// 查询讲者定级申请的申请级别
+export function getDoctorDataList(data) {
+	 return request('/doctor/data/list',data,'GET','application/json;charset=UTF-8');
+}
  
  
  

+ 31 - 0
api/task.js

@@ -80,3 +80,34 @@ export function getCompanyIntegralRanges(data) {
 export function getAppliedList(companyId) {
 	 return request(`/doctor/doctor/appliedList?companyId=${companyId}`,null,'GET','application/json;charset=UTF-8');
 }
+//查询公司下的待审核任务列表
+export function pendingtaskAudtList(data) {
+	 return request('/company/audit/cus/pendingtaskAudtList',data,'POST','application/json;charset=UTF-8');
+}
+
+//获取统计摘要
+export function getStatisticsSummary(data) {
+	 return request('/app/statistics/serviceOrder/summary',data,'GET','application/json;charset=UTF-8');
+}
+
+// 获取任务类型
+export function getProjectTypeList(data) {
+	 return request('/project/type/list',data,'GET','application/json;charset=UTF-8');
+}
+
+// 创建任务公开课选项
+export function getTaskLiveList(data) {
+	 return request(`/task/info/liveList?companyId=${data}`,data,'GET','application/json;charset=UTF-8');
+}
+
+// 创建任务用药调研选项
+export function getDrugResearchList(data) {
+	 return request(`/task/info/getDrugResearchList?companyId=${data}`,data,'GET','application/json;charset=UTF-8');
+}
+
+// 创建任务问卷调查选项
+export function getSurveyTaskList(data) {
+	 return request(`/task/info/getSurveyTaskList?companyId=${data}`,data,'GET','application/json;charset=UTF-8');
+}
+
+

+ 38 - 1
api/user.js

@@ -7,7 +7,7 @@ export function login(data) {
 } 
 // 修改密码
 export function changePWD(data) {
- 	 return request('/app/user/changePWD',data,'POST','application/json;charset=UTF-8');
+ 	 return request('/app/user/changePwd',data,'POST','application/json;charset=UTF-8');
 } 
 
 
@@ -51,4 +51,41 @@ export function getCompanyUserList(data) {
 	 return request('/app/user/getCompanyUserList',data,'GET','application/json;charset=UTF-8');
 } 
 
+//注册
+export function getCompanyUser(data) {
+	 return request('/company/companyUser',data,'PUT','application/json;charset=UTF-8');
+} 
+
+
+export function company(data) {
+	 return request('/app/user/getCompanyUserList',data,'GET','application/json;charset=UTF-8');
+} 
  
+//获取所有角色列表
+export function getCompanyRoleList(data) {
+	 return request('/company/companyRole/list',data,'GET','application/json;charset=UTF-8');
+} 
+//获取所有产品列表
+export function productList(data) {
+	 return request('/company/product/list',data,'GET','application/json;charset=UTF-8');
+} 
+
+//查询用户信息
+export function getCompanyuserInfo(data) {
+	 return request(`/company/companyUser/${data}`,data,'GET','application/json;charset=UTF-8');
+} 
+
+//注册
+export function smsRegister(data) {
+	 return request('/app/user/smsRegister',data,'POST','application/json;charset=UTF-8');
+} 
+
+
+//角色绑定-获取部门
+export function deptList(data) {
+	 return request('/company/companyDept/list',data,'GET','application/json;charset=UTF-8');
+} 
+//角色绑定-获取公司
+export function companyList(data) {
+	 return request('/company/companyDept/CompanyList',data,'GET','application/json;charset=UTF-8');
+} 

+ 2 - 2
common/request.js

@@ -3,8 +3,8 @@ export default class Request {
 	http(router, data = {}, method,contentType) {
 		let that = this;
 		// let path = 'http://132.232.83.221:7771';//向董董
-		// let path = 'https://user.his.ifeiyu100.com';//向董董
-		let path = 'https://5743146i9x.goho.co';//贾源江
+		let path = 'https://user.his.ifeiyu100.com';//向董董
+		// let path = 'https://5743146i9x.goho.co';//贾源江
 
 		// let path = 'https://user.his.ifeiyu100.com/';
 

+ 6 - 0
common/utils.js

@@ -0,0 +1,6 @@
+// 工具函数
+const utils = {
+	// 这里可以添加其他工具函数
+};
+
+export default utils;

+ 52 - 28
components/StatisticsTable.vue

@@ -1,21 +1,22 @@
 <template>
-  <scroll-view class="content" scroll-y @scrolltolower="loadMore">
+  <view class="content">
     <!-- 数据汇总 -->
     <view class="summary-section x-bc">
       <view class="summary-header">
         <view class="summary-indicator"></view>
-        <text class="summary-title">{{ summaryTitle||'' }}</text>
+        <text class="summary-title">{{ summaryTitle||'-' }}</text>
       </view>
       <view class="summary-stats">
         <view class="stat-item" v-for="stat in summaryStats" :key="stat.label">
-          <text class="stat-label">{{ stat.label||'未定义' }}</text>
-          <text class="stat-value">{{ stat.value||'' }}</text>
+          <text class="stat-label">{{ stat.label||'-' }}</text>
+          <text class="stat-value">{{ stat.value||'-' }}</text>
         </view>
       </view>
     </view>
     
     <!-- 数据表格 -->
     <view class="table-section">
+      <scroll-view class="table-header-scroll" scroll-x>
       <view class="table-header">
         <view 
           class="table-col" 
@@ -23,32 +24,31 @@
           :key="index"
           :style="{ width: column.width }"
         >
-          {{ column.title ||''}}
+          {{ column.title ||'-'}}
         </view>
       </view>
-      <view class="table-body">
-        <view class="table-row" v-for="(item, index) in tableData" :key="index">
-          <view 
-            class="table-col" 
-            v-for="(column, colIndex) in columns" 
-            :key="colIndex"
-            :style="{ width: column.width }"
-          >
-            <!-- 直接显示数据,不使用插槽,避免同名插槽警告 -->
-            <template v-if="column.key === 'statusText'">
-              <text class="status-tag" :class="item.status">{{ item[column.key]||'' }}</text>
-            </template>
-            <template v-else>
-              {{ item[column.key] ||''}}
-            </template>
+      </scroll-view>
+      <scroll-view class="table-body-scroll" scroll-y @scrolltolower="loadMore" :style="{ maxHeight: height }">
+        <view class="table-body">
+          <view class="table-row" v-for="(item, index) in tableData" :key="index">
+            <view 
+              class="table-col" 
+              v-for="(column, colIndex) in columns" 
+              :key="colIndex"
+              :style="{ width: column.width }"
+            >
+              <template v-if="column.key === 'statusText'">
+                <text class="status-tag" :class="item.status">{{ item[column.key]||'-' }}</text>
+              </template>
+              <template v-else>
+                {{ item[column.key] ||'-'}}
+              </template>
+            </view>
           </view>
         </view>
-      </view>
+      </scroll-view>
     </view>
-    
-    <!-- 底部提示 -->
-    <!-- <view class="no-more" v-if="showNoMore">{{ noMoreText }}</view> -->
-  </scroll-view>
+  </view>
 </template>
 <script>
 export default {
@@ -84,6 +84,11 @@ export default {
       type: Boolean,
       default: false
     }
+    ,
+    height: {
+      type: String,
+      default: '600rpx'
+    }
   },
   methods: {
     loadMore() {
@@ -152,25 +157,39 @@ export default {
   background: #fff;
   padding: 0 24rpx;
   
+  .table-header-scroll {
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch;
+  }
+  
   .table-header {
     display: flex;
     background: #E3EFFF;
     padding: 24rpx 16rpx;
+      border-radius: 8rpx;
+      box-shadow: inset 0 -1rpx 0 0 #d7e4ff;
     
     .table-col {
+        flex: 0 0 auto;
+        box-sizing: border-box;
+        padding: 0 8rpx;
       font-family: PingFang SC, PingFang SC;
       font-weight: 500;
       font-size: 26rpx;
       color: #333333;
       line-height: 40rpx;
       text-align: left;
+        white-space: nowrap;
+        overflow: visible;
     }
   }
   
   .table-body {
     .table-row {
       display: flex;
+      align-items: flex-start;
       padding: 24rpx 16rpx;
+      border-bottom: 1rpx solid #F0F2F5;
       
       &:nth-child(2n) {
         background: #F7F8FA;
@@ -178,14 +197,19 @@ export default {
       }
       
       .table-col {
+        flex: 0 0 auto;
+        box-sizing: border-box;
+        padding-right: 8rpx;
         font-size: 26rpx;
         color: #333;
         display: flex;
-        align-items: center;
+        align-items: flex-start;
         text-align: left;
+        white-space: normal;
+        word-break: break-word;
+        overflow: visible;
         font-family: PingFang SC, PingFang SC;
         font-weight: 400;
-        font-size: 26rpx;
         line-height: 40rpx;
       }
     }
@@ -198,4 +222,4 @@ export default {
   font-size: 24rpx;
   color: #999;
 }
-</style>
+</style>

+ 3 - 1
main.js

@@ -32,7 +32,9 @@ function checkNeedLogin(targetPath) {
     'auth/setting',
     'common/launch',
     'pages_user/userAgreement',
-    'pages_user/privacyPolicy'
+    'pages_user/privacyPolicy',
+    'pages/auth/register',
+    'pages/auth/registerUser',
   ]
   
   // 移除路径中的斜杠和协议,只保留核心路径部分

+ 20 - 6
pages.json

@@ -41,6 +41,12 @@
 				}
 			}
 		},
+		{
+			"path": "pages/auth/register",
+			"style": {
+				"navigationBarTitleText": "角色绑定"
+			}
+		},
 		{
 			"path": "pages/auth/changePassword",
 			"style": {
@@ -58,6 +64,13 @@
 			"style": {
 				"navigationBarTitleText": "设置中心"
 			}
+		},
+		{
+			"path": "pages/auth/registerUser",
+			"style": {
+				"navigationBarTitleText": "注册",
+				"navigationStyle": "custom"
+			}
 		}
 	],
 	"subPackages": [
@@ -134,7 +147,6 @@
 						}
 					}
 				},
-				
 				{
 					"path": "science",
 					"style": {
@@ -147,7 +159,7 @@
 				{
 					"path": "xlTask",
 					"style": {
-						"navigationBarTitleText": "XL任务",
+						"navigationBarTitleText": "任务申请",
 						"app-plus": {
 							"titleNView": false
 						}
@@ -213,18 +225,19 @@
 					"style": {
 						"navigationBarTitleText": "个人信息"
 					}
-				},{
+				},
+				{
 					"path": "userAgreement",
 					"style": {
 						"navigationBarTitleText": "用户协议"
 					}
-				},{
+				},
+				{
 					"path": "privacyPolicy",
 					"style": {
 						"navigationBarTitleText": "隐私政策"
 					}
 				}
-				
 			]
 		},
 		{
@@ -239,7 +252,8 @@
 							"titleNView": false
 						}
 					}
-				},	{
+				},
+				{
 					// lecturerDetail 讲师信息
 					"path": "lecturerDetail",
 					"style": {

+ 9 - 3
pages/auth/changePassword.vue

@@ -125,7 +125,7 @@
 					
 					if (res.code === 200) {
 						uni.showToast({
-							title: '密码修改成功',
+							title: '密码修改成功,将退出登录',
 							icon: 'success'
 						});
 						
@@ -134,9 +134,15 @@
 						this.newPassword = '';
 						this.confirmPassword = '';
 						
-						// 跳转到其他页面或返回
+						// 清除登录状态
+						uni.removeStorageSync('AppToken');
+						uni.removeStorageSync('userInfo');
+						
+						// 跳转到登录页面
 						setTimeout(() => {
-							uni.navigateBack();
+							uni.navigateTo({
+								url: '/pages/auth/login'
+							});
 						}, 1500);
 					} else {
 						uni.showToast({

+ 2 - 2
pages/auth/forgetPassword.vue

@@ -163,7 +163,7 @@
 						} else {
 							uni.showToast({
 								icon: 'none',
-								title: res.message || "发送验证码失败",
+								title: res.msg || "发送验证码失败",
 							});
 						}
 					})
@@ -171,7 +171,7 @@
 						uni.hideLoading();
 						uni.showToast({
 							icon: 'none',
-							title: "发送验证码接口调用失败",
+							title: res.msg || "发送验证码失败",
 						});
 					});
 		},

+ 635 - 583
pages/auth/login.vue

@@ -1,28 +1,32 @@
 <template>
 	<view class="container">
 		<!-- #ifdef MP-WEIXIN -->
-		<image class="bg" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/bg_login.png" mode="widthFix"></image>
+		<image class="bg" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/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="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/back_white.png"></image>
+			<view :style="{ height: menuButtonInfo.height, marginTop: menuButtonInfo.top }" class="backImg">
+				<image @tap="goBack()" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/back_white.png">
+				</image>
 			</view>
 			<view class="top-title">
-				<view class="title-text">欢迎登录<text class="blue">一咻学术</text></view>
+				<view class="title-text">欢迎登录<text class="blue">文依学术</text></view>
 				<view class="login-notice">新用户首次登录即视为注册</view>
 			</view>
 			<view class="force-login__content">
 				<view class="logintype">
-					<view :class="current==0 ? 'logintype-item active':'logintype-item'" @click="changeType(0)">验证码登录
+					<view :class="current == 0 ? 'logintype-item active' : 'logintype-item'" @click="changeType(0)">
+						验证码登录
 					</view>
 					<view class="line"></view>
-					<view :class="current==1 ? 'logintype-item active':'logintype-item'" @click="changeType(1)">密码登录
+					<view :class="current == 1 ? 'logintype-item active' : 'logintype-item'" @click="changeType(1)">密码登录
 					</view>
 				</view>
 
 				<view class="input-form">
 					<view class="input-item">
-						<input v-if="current == 0" class="input-field" type="number" v-model="phone" placeholder="请输入手机号" maxlength="11" />
-						<input v-else  class="input-field"  v-model="account" placeholder="请输入账号"  />
+						<input v-if="current == 0" class="input-field" type="number" v-model="phone"
+							placeholder="请输入手机号" maxlength="11" />
+						<input v-else class="input-field" v-model="account" placeholder="请输入账号" />
 
 					</view>
 					<view class="input-item code-input-item">
@@ -31,28 +35,33 @@
 						<view v-else class="mima">
 							<input class="input-field code-input" type="text" :password="showPassword"
 								v-model="password" placeholder="请输入密码" />
-							<image @click="closePwd"
-								:src="showPassword?'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_invisible.png':'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_visible.png'"
-								mode="aspectFill"></image>
+							<view class="pwd-toggle" @click="closePwd">
+								<image
+									:src="showPassword ? 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_invisible.png' : 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_visible.png'"
+									mode="aspectFill"></image>
+							</view>
 						</view>
 						<view v-if="current == 0" class="get-code-btn" @click="getVerifyCode">
 							{{ codeText }}
 						</view>
 					</view>
 				</view>
-				<view class="forgot" v-if="current==1" @click="toForgetPassword">忘记密码?</view>
-				<view class="encoding">企业编码:-</view>
+				<view class="tips-group">
+					<view class="tips-item" @click="toRegister">立即注册?</view>
+					<view class="tips-item" v-if="current == 1" @click="toForgetPassword">忘记密码?</view>
+				</view>
+				<!-- <view class="encoding">企业编码:-</view> -->
 				<view class="login-btn-wrap">
 					<!-- <button class="login-btn" @click="handleLogin">{{ current == 0 ? '登录/注册用户' : '登录' }}</button> -->
 					<button class="login-btn" @click="handleLogin">登录</button>
 				</view>
 
 				<view class="tips">
-				<checkbox :checked="isAgreement" @click="handleAgreement()" />
-				<view class="tips-text" @click="handleAgreement()">已阅读并接受</view>
-				<view class="btn" @click.stop="navTo('/pages_user/userAgreement')">《用户注册协议》</view>
-				<view class="btn" @click.stop="navTo('/pages_user/privacyPolicy')">《隐私保护政策》</view>
-			</view>
+					<checkbox :checked="isAgreement" @click="handleAgreement()" />
+					<view class="tips-text" @click="handleAgreement()">已阅读并接受</view>
+					<view class="btn" @click.stop="navTo('/pages_user/userAgreement')">《用户注册协议》</view>
+					<view class="btn" @click.stop="navTo('/pages_user/privacyPolicy')">《隐私保护政策》</view>
+				</view>
 			</view>
 		</view>
 		<!-- #endif -->
@@ -60,109 +69,112 @@
 </template>
 
 <script>
-	import {
-		sendSmsCode,//发送短信验证码
-		smsLogin, // 校验短信验证码
-		login, // 密码登录
-	} from '@/api/user'
-	// import {
-	// 	loginByMiniApp,
-	// 	getUserInfo,
-	// 	loginByMp
-	// } from '@/api/user'
-	export default {
-		data() {
-			return {
-				account:null,
-				code: null, // 微信登录code
-				isAgreement: false,
-				current: 0, // 0-验证码登录 1-密码登录
-				menuButtonInfo: {},
-				phone: '', // 手机号
-				verifyCode: '', // 验证码
-				password: '', // 密码
-				codeText: '获取验证码', // 验证码按钮文字
-				countdown: 0, // 倒计时
-				countdownTimer: null, // 倒计时定时器
-				showPassword: true // 是否显示密码
-			}
-		},
-		computed: {},
-		onLoad(option) {
-			this.getMenuButtonInfo()
-			// #ifdef MP-WEIXIN
-			uni.$on('refreshLogin', () => {
-				uni.navigateBack({
-					delta: 1
-				})
+import {
+	sendSmsCode, //发送短信验证码
+	smsLogin, // 校验短信验证码
+	login, // 密码登录
+} from '@/api/user'
+// import {
+// 	loginByMiniApp,
+// 	getUserInfo,
+// 	loginByMp
+// } from '@/api/user'
+export default {
+	data() {
+		return {
+			account: null,
+			code: null, // 微信登录code
+			isAgreement: false,
+			current: 0, // 0-验证码登录 1-密码登录
+			menuButtonInfo: {},
+			phone: '', // 手机号
+			verifyCode: '', // 验证码
+			password: '', // 密码
+			codeText: '获取验证码', // 验证码按钮文字
+			countdown: 0, // 倒计时
+			countdownTimer: null, // 倒计时定时器
+			showPassword: true // 是否显示密码
+		}
+	},
+	computed: {},
+	onLoad(option) {
+		this.getMenuButtonInfo()
+		// #ifdef MP-WEIXIN
+		uni.$on('refreshLogin', () => {
+			uni.navigateBack({
+				delta: 1
 			})
-			//选获取CODE,防止后请求的时候腾讯服务端未同步报错
-			this.getCode();
-			// #endif
+		})
+		//选获取CODE,防止后请求的时候腾讯服务端未同步报错
+		this.getCode();
+		// #endif
+
+		// #ifdef H5
+		if (this.checkWeixin()) {
+			this.getWxCode()
+		} else {
+			uni.showToast({
+				icon: 'none',
+				title: "请在微信中打开",
+			});
+			//跳转到手机号密码登录
+		}
+		// #endif
+
+	},
+	onUnload() {
+		// 清除倒计时
+		if (this.countdownTimer) {
+			clearInterval(this.countdownTimer);
+			this.countdownTimer = null;
+		}
+	},
+	mounted() {
 
-			// #ifdef H5
-			if (this.checkWeixin()) {
-				this.getWxCode()
-			} else {
-				uni.showToast({
-					icon: 'none',
-					title: "请在微信中打开",
-				});
-				//跳转到手机号密码登录
+	},
+	methods: {
+		toRegister() {
+			this.navTo('/pages/auth/registerUser')
+		},
+		navTo(path) {
+			console.log("地址", path)
+			uni.navigateTo({
+				url: path
+			})
+		},
+		closePwd() {
+			this.showPassword = !this.showPassword
+		},
+		// 获取胶囊按钮布局参数
+		getMenuButtonInfo() {
+			// 微信小程序API(Uniapp可直接用uni.getMenuButtonBoundingClientRect)
+			const menuBtn = uni.getMenuButtonBoundingClientRect();
+			if (menuBtn) {
+
+				this.menuButtonInfo = {
+					top: menuBtn.top + 'px', // 胶囊顶部距离
+					height: menuBtn.height + 'px', // 胶囊高度
+					centerY: (menuBtn.top + menuBtn.height / 2) + 'px', // 胶囊垂直居中Y坐标
+					right: menuBtn.right + 'px' // 胶囊右侧距离
+				};
 			}
-			// #endif
-
 		},
-		onUnload() {
-			// 清除倒计时
-			if (this.countdownTimer) {
-				clearInterval(this.countdownTimer);
-				this.countdownTimer = null;
+		changeType(index) {
+			this.current = index;
+			// 切换时清空输入
+			if (index == 0) {
+				this.password = '';
+			} else {
+				this.verifyCode = '';
 			}
 		},
-		mounted() {
-
+		// 返回主页
+		goBack() {
+			uni.navigateBack({
+				delta: 1
+			})
 		},
-		methods: {
-			navTo(path) {
-				console.log("地址",path)
-				uni.navigateTo({
-					url: path
-				})
-			},
-			closePwd() {
-				this.showPassword = !this.showPassword
-			},
-			// 获取胶囊按钮布局参数
-			getMenuButtonInfo() {
-				// 微信小程序API(Uniapp可直接用uni.getMenuButtonBoundingClientRect)
-				const menuBtn = uni.getMenuButtonBoundingClientRect();
-				if (menuBtn) {
-
-					this.menuButtonInfo = {
-						top: menuBtn.top + 'px', // 胶囊顶部距离
-						height: menuBtn.height + 'px', // 胶囊高度
-						centerY: (menuBtn.top + menuBtn.height / 2) + 'px', // 胶囊垂直居中Y坐标
-						right: menuBtn.right + 'px' // 胶囊右侧距离
-					};
-				}
-			},
-			changeType(index) {
-				this.current = index;
-				// 切换时清空输入
-				if (index == 0) {
-					this.password = '';
-				} else {
-					this.verifyCode = '';
-				}
-			},
-			// 返回主页
-			goBack() {
-				uni.navigateBack({
-					delta: 1
-				})
-			},
-			// 获取验证码
+		// 获取验证码
 		getVerifyCode() {
 			if (this.countdown > 0) {
 				return;
@@ -182,44 +194,44 @@
 				return;
 			}
 			// 调用发送验证码API
-				uni.showLoading({
-					title: "发送中..."
+			uni.showLoading({
+				title: "发送中..."
+			});
+			let params = {
+				phone: this.phone,
+				type: '0',
+			}
+			sendSmsCode(params)
+				.then(res => {
+					uni.hideLoading();
+					if (res.code == 200) {
+						uni.showToast({
+							icon: 'success',
+							title: "验证码已发送",
+						});
+						// 开始倒计时
+						this.countdown = 60;
+						this.countdownTimer = setInterval(() => {
+							this.countdown--;
+							this.codeText = this.countdown + '秒重新获取';
+							if (this.countdown <= 0) {
+								clearInterval(this.countdownTimer);
+								this.countdownTimer = null;
+								this.codeText = '获取验证码';
+							}
+						}, 1000);
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg || "发送验证码失败",
+						});
+					}
+				})
+				.catch(err => {
+					uni.hideLoading();
 				});
-				let params = {
-					phone: this.phone,
-					type: '0',
-				}
-				sendSmsCode(params)
-					.then(res => {
-						uni.hideLoading();
-						if (res.code == 200) {
-							uni.showToast({
-								icon: 'success',
-								title: "验证码已发送",
-							});
-							// 开始倒计时
-							this.countdown = 60;
-							this.countdownTimer = setInterval(() => {
-								this.countdown--;
-								this.codeText = this.countdown + '秒重新获取';
-								if (this.countdown <= 0) {
-									clearInterval(this.countdownTimer);
-									this.countdownTimer = null;
-									this.codeText = '获取验证码';
-								}
-							}, 1000);
-						} else {
-							uni.showToast({
-								icon: 'none',
-								title: res.message || "发送验证码失败",
-							});
-						}
-					})
-					.catch(err => {
-						uni.hideLoading();
-					});
 		},
-			// 登录
+		// 登录
 		handleLogin() {
 			if (!this.isAgreement) {
 				uni.showToast({
@@ -272,7 +284,7 @@
 				this.loginByPassword();
 			}
 		},
-			// 验证码登录
+		// 验证码登录
 		loginByCode() {
 			uni.showLoading({
 				title: "登录中..."
@@ -292,10 +304,22 @@
 						});
 						uni.setStorageSync('AppToken', res.data.token);
 						uni.setStorageSync('userInfo', res.data.user);
-						uni.$emit('refreshLogin');
-						uni.navigateBack({
-							delta: 1
-						});
+						// uni.$emit('refreshLogin');
+						setTimeout(() => {
+							if (!res.data.user.roles) {
+								console.log("跳转注册")
+								uni.navigateTo({
+									url: '/pages/auth/register'
+								})
+							} else {
+								console.log("没跳转注册")
+								uni.$emit('refreshLogin');
+								uni.navigateBack({
+									delta: 1
+								});
+							}
+						}, 1000);
+
 					} else {
 						uni.showToast({
 							icon: 'none',
@@ -305,90 +329,140 @@
 				})
 				.catch(err => {
 					uni.hideLoading();
-					
+
 				});
 		},
-			// 密码登录
-			loginByPassword() {
-				uni.showLoading({
-					title: "登录中..."
-				});
-			const data={
+		// 密码登录
+		loginByPassword() {
+			uni.showLoading({
+				title: "登录中..."
+			});
+			const data = {
 				account: this.account,
-				 password: this.password
+				password: this.password
+			}
+			// 调用密码登录接口
+			login(data)
+				.then(res => {
+					uni.hideLoading();
+					if (res.code == 200) {
+						uni.showToast({
+							icon: 'success',
+							title: "登录成功",
+						});
+						console.log("登录成功:", res.data.token);
+						uni.setStorageSync('AppToken', res.data.token);
+						uni.setStorageSync('userInfo', res.data.user);
+						// uni.$emit('refreshLogin');
+						// uni.navigateBack({
+						// 	delta: 1
+						// });
+						setTimeout(() => {
+							if (!res.data.user.roles) {
+								console.log("跳转注册")
+								uni.navigateTo({
+									url: '/pages/auth/register'
+								})
+							} else {
+								console.log("没跳转注册")
+								uni.$emit('refreshLogin');
+								uni.navigateBack({
+									delta: 1
+								});
+							}
+						}, 1000);
+
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg || "登录失败",
+						});
+					}
+				})
+				.catch(err => {
+					console.log(err)
+					uni.hideLoading();
+
+				});
+		},
+		checkWeixin() {
+			var ua = window.navigator.userAgent.toLowerCase();
+			if (ua.match(/micromessenger/i) == 'micromessenger') {
+				return true;
+			} else {
+				return false;
 			}
-				// 调用密码登录接口
-				login(data)
-					.then(res => {
-						uni.hideLoading();
-						if (res.code == 200) {
-							uni.showToast({
-								icon: 'success',
-								title: "登录成功",
-							});
-							uni.setStorageSync('AppToken', res.data.token);
-							uni.setStorageSync('userInfo', res.data.user);
-							uni.$emit('refreshLogin');
-							uni.navigateBack({
-								delta: 1
-							});
-						} else {
-							uni.showToast({
-								icon: 'none',
-								title: res.msg || "登录失败",
-							});
+		},
+		//URL地址是否存在CODE
+		getUrlCode(name) {
+			return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) ||
+				[, ''
+				])[1]
+				.replace(/\+/g, '%20')) || null
+		},
+		//获取微信CODE
+		getWxCode() {
+			//在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 
+			//http://shequ.natapp1.cc/#/pages/index/index?deviceId=8
+			var appId = "wx40593595e62f61ad";
+			var url = "http://h5.yjf.runtzh.com";
+			window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appId +
+				'&redirect_uri=' + encodeURIComponent(url + "/#/pages/auth/wxLogin") +
+				'&response_type=code&scope=snsapi_userinfo&state=JeffreySu-954&connect_redirect=1#wechat_redirect';
+			//console.log('https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent("http://shequ.natapp1.cc/#/pages/index/index?deviceId="+this.deviceId) +'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect')
+			// redirect_uri是授权成功后,跳转的url地址,微信会帮我们跳转到该链接,并且通过?的形式拼接code
+		},
+		handleAgreement() {
+			this.isAgreement = !this.isAgreement;
+		},
+		openH5(url) {
+			var requestPath = uni.getStorageSync('requestPath');
+			uni.setStorageSync('url', requestPath + url);
+			uni.navigateTo({
+				url: '../home/web'
+			})
+		},
+
+		toForgetPassword() {
+			uni.navigateTo({
+				url: '/pages/auth/forgetPassword'
+			})
+		},
+		getCode() {
+			var that = this;
+			this.utils.getProvider()
+				.then(provider => {
+					console.log('当前的环境商', provider)
+					if (!provider) {
+						reject()
+					}
+					// uni登录
+					uni.login({
+						provider: provider,
+						success: async loginRes => {
+							that.code = loginRes.code
 						}
 					})
-					.catch(err => {
-						console.log(err)
-						uni.hideLoading();
-						
-					});
-			},
-			checkWeixin() {
-				var ua = window.navigator.userAgent.toLowerCase();
-				if (ua.match(/micromessenger/i) == 'micromessenger') {
-					return true;
-				} else {
-					return false;
-				}
-			},
-			//URL地址是否存在CODE
-			getUrlCode(name) {
-				return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) ||
-					[, ''
-					])[1]
-					.replace(/\+/g, '%20')) || null
-			},
-			//获取微信CODE
-			getWxCode() {
-				//在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 
-				//http://shequ.natapp1.cc/#/pages/index/index?deviceId=8
-				var appId = "wx40593595e62f61ad";
-				var url = "http://h5.yjf.runtzh.com";
-				window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appId +
-					'&redirect_uri=' + encodeURIComponent(url + "/#/pages/auth/wxLogin") +
-					'&response_type=code&scope=snsapi_userinfo&state=JeffreySu-954&connect_redirect=1#wechat_redirect';
-				//console.log('https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent("http://shequ.natapp1.cc/#/pages/index/index?deviceId="+this.deviceId) +'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect')
-				// redirect_uri是授权成功后,跳转的url地址,微信会帮我们跳转到该链接,并且通过?的形式拼接code
-			},
-			handleAgreement() {
-				this.isAgreement = !this.isAgreement;
-			},
-			openH5(url) {
-				var requestPath = uni.getStorageSync('requestPath');
-				uni.setStorageSync('url', requestPath + url);
-				uni.navigateTo({
-					url: '../home/web'
 				})
-			},
-			toForgetPassword(){
-				uni.navigateTo({
-					url: '/pages/auth/forgetPassword'
+				.catch(err => {
+
 				})
-			},
-			getCode() {
-				var that = this;
+		},
+		// 微信用户手机号登录
+		phoneLogin(e) {
+			var that = this;
+			if (!this.isAgreement) {
+				uni.showToast({
+					icon: 'none',
+					title: "请先同意协议后再登录",
+				});
+				return false;
+			}
+			uni.showLoading({
+				title: "处理中..."
+			})
+			console.log(e, "e")
+			if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
 				this.utils.getProvider()
 					.then(provider => {
 						console.log('当前的环境商', provider)
@@ -399,434 +473,412 @@
 						uni.login({
 							provider: provider,
 							success: async loginRes => {
-								that.code = loginRes.code
+								console.log(loginRes)
+								let code = loginRes.code // 获取开发code
+								var userCode = uni.getStorageSync('userCode');
+								loginByMiniApp({
+									encryptedData: e.mp.detail.encryptedData,
+									iv: e.mp.detail.iv,
+									code: code,
+									userCode: userCode
+								})
+									.then(res => {
+										if (res.code == 200) {
+											uni.hideLoading();
+											uni.showToast({
+												icon: 'none',
+												title: "登录成功",
+											});
+											uni.setStorageSync('AppToken', res.token);
+											uni.setStorageSync('userInfo', res.user);
+											uni.hideLoading()
+											//that.getUserInfo()
+											uni.$emit('refreshLogin');
+											uni.navigateBack({
+												delta: 1
+											})
+										} else {
+											uni.hideLoading();
+											uni.showToast({
+												icon: 'none',
+												title: "授权登录失败,请重新登录",
+											});
+										}
+
+									})
+									.catch(error => {
+										console.log(error)
+										uni.hideLoading();
+									})
+
 							}
 						})
 					})
 					.catch(err => {
-
+						uni.showToast({
+							icon: 'none',
+							title: err,
+						});
 					})
-			},
-			// 微信用户手机号登录
-			phoneLogin(e) {
-				var that = this;
-				if (!this.isAgreement) {
-					uni.showToast({
-						icon: 'none',
-						title: "请先同意协议后再登录",
-					});
-					return false;
-				}
-				uni.showLoading({
-					title: "处理中..."
-				})
-				console.log(e, "e")
-				if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
-					this.utils.getProvider()
-						.then(provider => {
-							console.log('当前的环境商', provider)
-							if (!provider) {
-								reject()
-							}
-							// uni登录
-							uni.login({
-								provider: provider,
-								success: async loginRes => {
-									console.log(loginRes)
-									let code = loginRes.code // 获取开发code
-									var userCode = uni.getStorageSync('userCode');
-									loginByMiniApp({
-											encryptedData: e.mp.detail.encryptedData,
-											iv: e.mp.detail.iv,
-											code: code,
-											userCode: userCode
-										})
-										.then(res => {
-											if (res.code == 200) {
-												uni.hideLoading();
-												uni.showToast({
-													icon: 'none',
-													title: "登录成功",
-												});
-												uni.setStorageSync('AppToken', res.token);
-												uni.setStorageSync('userInfo', res.user);
-												uni.hideLoading()
-												//that.getUserInfo()
-												uni.$emit('refreshLogin');
-												uni.navigateBack({
-													delta: 1
-												})
-											} else {
-												uni.hideLoading();
-												uni.showToast({
-													icon: 'none',
-													title: "授权登录失败,请重新登录",
-												});
-											}
-
-										})
-										.catch(error => {
-											console.log(error)
-											uni.hideLoading();
-										})
 
-								}
-							})
-						})
-						.catch(err => {
-							uni.showToast({
-								icon: 'none',
-								title: err,
-							});
-						})
-
-				} else {
-					uni.showToast({
-						title: '已拒绝授权',
-						icon: 'none',
-						duration: 2000,
-					})
-				}
-			},
-			back() {
-				uni.switchTab({
-					url: '/pages/home/index'
-				});
-				// uni.navigateBack()
+			} else {
+				uni.showToast({
+					title: '已拒绝授权',
+					icon: 'none',
+					duration: 2000,
+				})
 			}
+		},
+		back() {
+			uni.switchTab({
+				url: '/pages/home/index'
+			});
+			// uni.navigateBack()
 		}
 	}
+}
 </script>
 
 <style lang="scss">
-	.container {
-		flex: 1;
-		padding: 0 24rpx;
+.container {
+	flex: 1;
+	padding: 0 24rpx;
+	display: flex;
+	flex-direction: column;
+	justify-content: flex-start;
+	position: relative;
+
+	.bg {
+		width: 100%;
+		position: absolute;
+		top: 0;
+		left: 0;
+	}
+
+	.backImg {
 		display: flex;
-		flex-direction: column;
-		justify-content: flex-start;
-		position: relative;
+		align-items: center;
 
-		.bg {
-			width: 100%;
-			position: absolute;
-			top: 0;
-			left: 0;
+		image {
+			width: 40rpx;
+			height: 40rpx;
 		}
 
-		.backImg {
-			display: flex;
-			align-items: center;
-
-			image {
-				width: 40rpx;
-				height: 40rpx;
+		margin-left: 32rpx;
+		// position: absolute;
+		// left: 30rpx;
+		// z-index: 100;
+	}
+}
+
+.force-login-wrap {
+	width: 100%;
+	height: 100vh;
+	position: relative;
+
+	.top-title {
+		padding: 0 32rpx;
+		text-align: left;
+		margin-top: 20rpx;
+
+		.title-text {
+			font-weight: 600;
+			font-size: 48rpx;
+			color: #333333;
+			margin-bottom: 20rpx;
+
+			.blue {
+				color: #157CF8;
 			}
+		}
 
-			margin-left: 32rpx;
-			// position: absolute;
-			// left: 30rpx;
-			// z-index: 100;
+		.login-notice {
+			font-weight: 400;
+			font-size: 32rpx;
+			color: #666666;
+			line-height: 40rpx;
 		}
 	}
 
-	.force-login-wrap {
-		width: 100%;
-		height: 100vh;
+	.force-login__content {
+		margin-top: 54rpx;
+		padding: 0 32rpx;
 		position: relative;
 
-		.top-title {
-			padding: 0 32rpx;
-			text-align: left;
-			margin-top: 20rpx;
-
-			.title-text {
-				font-weight: 600;
-				font-size: 48rpx;
-				color: #333333;
-				margin-bottom: 20rpx;
+		.bg-type {
+			width: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
 
-				.blue {
-					color: #157CF8;
-				}
+		.logintype {
+			display: flex;
+			align-items: center;
+			margin-bottom: 66rpx;
+			border-bottom: 2rpx solid #f0f0f0;
+
+			.line {
+				margin: 0 32rpx;
+				width: 2rpx;
+				height: 32rpx;
+				background: #D7E1F0;
+				border-radius: 0rpx 0rpx 0rpx 0rpx;
 			}
 
-			.login-notice {
+			.logintype-item {
+				// flex: 1;
+				text-align: center;
+				padding-top: 36rpx;
+				padding-bottom: 48rpx;
+				font-family: PingFang SC, PingFang SC;
 				font-weight: 400;
 				font-size: 32rpx;
 				color: #666666;
-				line-height: 40rpx;
-			}
-		}
+				position: relative;
 
-		.force-login__content {
-			margin-top: 54rpx;
-			padding: 0 32rpx;
-			position: relative;
 
-			.bg-type {
-				width: 100%;
-				position: absolute;
-				top: 0;
-				left: 0;
-			}
 
-			.logintype {
-				display: flex;
-				align-items: center;
-				margin-bottom: 66rpx;
-				border-bottom: 2rpx solid #f0f0f0;
-
-				.line {
-					margin: 0 32rpx;
-					width: 2rpx;
-					height: 32rpx;
-					background: #D7E1F0;
-					border-radius: 0rpx 0rpx 0rpx 0rpx;
-				}
+				&.active {
+					font-size: 36rpx;
+					color: #333333;
+					font-weight: 600;
 
-				.logintype-item {
-					// flex: 1;
-					text-align: center;
-					padding-top: 36rpx;
-					padding-bottom: 48rpx;
-					font-family: PingFang SC, PingFang SC;
-					font-weight: 400;
-					font-size: 32rpx;
-					color: #666666;
-					position: relative;
-
-
-
-					&.active {
-						font-size: 36rpx;
-						color: #333333;
-						font-weight: 600;
-
-						&::after {
-							content: '';
-							position: absolute;
-							bottom: 30rpx;
-							left: 50%;
-							transform: translateX(-50%);
-							width: 52rpx;
-							height: 6rpx;
-							background: #157CF8;
-							border-radius: 42rpx;
-						}
+					&::after {
+						content: '';
+						position: absolute;
+						bottom: 30rpx;
+						left: 50%;
+						transform: translateX(-50%);
+						width: 52rpx;
+						height: 6rpx;
+						background: #157CF8;
+						border-radius: 42rpx;
 					}
 				}
 			}
+		}
 
-			.input-form {
-				margin-bottom: 60rpx;
+		.input-form {
+			margin-bottom: 60rpx;
 
-				.input-item {
-					background: #FFFFFF;
-					border-radius: 16rpx;
-					padding: 30rpx 40rpx;
-					margin-bottom: 48rpx;
-					box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
+			.input-item {
+				background: #FFFFFF;
+				border-radius: 16rpx;
+				padding: 30rpx 40rpx;
+				margin-bottom: 48rpx;
+				box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
 
-					&::last-child {
-						margin-bottom: 0
-					}
+				&::last-child {
+					margin-bottom: 0
+				}
 
-					.input-field {
-						width: 100%;
-						font-size: 30rpx;
-						font-family: PingFang SC;
-						color: #333333;
+				.input-field {
+					width: 100%;
+					font-size: 30rpx;
+					font-family: PingFang SC;
+					color: #333333;
 
-						&::placeholder {
-							color: #CCCCCC;
-						}
+					&::placeholder {
+						color: #CCCCCC;
 					}
+				}
 
-					.mima {
-						width: 100%;
-						display: flex;
-						align-items: center;
-						justify-content: space-between;
+				.mima {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
 
-						image {
-							width: 32rpx;
-							height: 32rpx;
-						}
-					}
+					.pwd-toggle {
+						width: 88rpx;
 
-					&.code-input-item {
 						display: flex;
 						align-items: center;
+						justify-content: center;
+					}
 
-						.code-input {
-							flex: 1;
-						}
-
-						.get-code-btn {
-							font-size: 28rpx;
-							font-family: PingFang SC;
-							font-weight: 500;
-							color: #157CF8;
-							padding-left: 20rpx;
-							white-space: nowrap;
-						}
+					image {
+						width: 32rpx;
+						height: 32rpx;
 					}
 				}
-			}
-
-			.forgot {
-				font-weight: 400;
-				font-size: 24rpx;
-				color: #388BFF;
-				line-height: 40rpx;
-				display: flex;
-				justify-content: flex-end;
-				margin: -40rpx 0 24rpx;
-			}
-
-			.encoding {
-				width: 100%;
-				height: 104rpx;
-				line-height: 104rpx;
-				text-align: center;
-				background: #EDEFF2;
-				border-radius: 16rpx 16rpx 16rpx 16rpx;
-				font-size: 32rpx;
-				color: #999999;
-			}
-
-			.login-btn-wrap {
-				margin-bottom: 40rpx;
-				margin-top: 140rpx;
 
-				.login-btn {
-					width: 100%;
-					height: 88rpx;
-					background: rgba(56, 139, 255, 1);
-					border-radius: 44rpx;
-					font-size: 32rpx;
-					font-family: PingFang SC;
-					font-weight: 500;
-					color: #FFFFFF;
-					border: none;
+				&.code-input-item {
 					display: flex;
 					align-items: center;
-					justify-content: center;
 
-					&::after {
-						border: none;
+					.code-input {
+						flex: 1;
+					}
+
+					.get-code-btn {
+						font-size: 28rpx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #157CF8;
+						padding-left: 20rpx;
+						white-space: nowrap;
 					}
 				}
 			}
 		}
-	}
 
-	.tips {
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		font-size: 24rpx;
-		color: #666666;
-		flex-wrap: nowrap;
-		padding: 0 60rpx;
-
-		checkbox {
-			margin-right: 10rpx;
-			flex-shrink: 0;
-			transform: scale(0.8);
+		.tips-group {
+			display: flex;
+			align-items: center;
+			justify-content: flex-end;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #388BFF;
+			line-height: 40rpx;
+			display: flex;
+			justify-content: flex-end;
+			margin: -40rpx 0 24rpx;
 		}
 
-		.tips-text {
-			margin-right: 4rpx;
-			white-space: nowrap;
+		.encoding {
+			width: 100%;
+			height: 104rpx;
+			line-height: 104rpx;
+			text-align: center;
+			background: #EDEFF2;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			font-size: 32rpx;
+			color: #999999;
 		}
 
-		.btn {
-			color: #157CF8;
-			margin: 0 2rpx;
-			white-space: nowrap;
+		.login-btn-wrap {
+			margin-bottom: 40rpx;
+			margin-top: 140rpx;
+
+			.login-btn {
+				width: 100%;
+				height: 88rpx;
+				background: rgba(56, 139, 255, 1);
+				border-radius: 44rpx;
+				font-size: 32rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #FFFFFF;
+				border: none;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				&::after {
+					border: none;
+				}
+			}
 		}
 	}
+}
+
+.tips {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 24rpx;
+	color: #666666;
+	flex-wrap: nowrap;
+	padding: 0 60rpx;
+
+	checkbox {
+		margin-right: 10rpx;
+		flex-shrink: 0;
+		transform: scale(0.8);
+	}
 
+	.tips-text {
+		margin-right: 4rpx;
+		white-space: nowrap;
+	}
 
-	.wx-login {
-		background: rgba(0, 0, 0, 0.7);
-		z-index: 99999;
-		position: fixed;
-		top: 0;
-		left: 0;
-		height: 100%;
-		width: 100%;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-
-		.form {
-			border-radius: 20rpx;
-			padding: 60rpx 30rpx;
-			width: 500upx;
-			height: 300upx;
-			background-color: #fff;
+	.btn {
+		color: #157CF8;
+		margin: 0 2rpx;
+		white-space: nowrap;
+	}
+}
+
+
+.wx-login {
+	background: rgba(0, 0, 0, 0.7);
+	z-index: 99999;
+	position: fixed;
+	top: 0;
+	left: 0;
+	height: 100%;
+	width: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+
+	.form {
+		border-radius: 20rpx;
+		padding: 60rpx 30rpx;
+		width: 500upx;
+		height: 300upx;
+		background-color: #fff;
+
+		.title {
+			font-size: 32upx;
+			font-family: PingFang SC;
+			font-weight: bold;
 
-			.title {
-				font-size: 32upx;
-				font-family: PingFang SC;
-				font-weight: bold;
+		}
 
-			}
+		.desc {
+			font-size: 28upx;
+			margin: 60upx 0upx 60upx 0upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+		}
 
-			.desc {
-				font-size: 28upx;
-				margin: 60upx 0upx 60upx 0upx;
-				font-family: PingFang SC;
-				font-weight: 500;
-			}
+		.btn-box {
+			margin-top: 30rpx;
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
 
-			.btn-box {
-				margin-top: 30rpx;
-				width: 100%;
+			.btn {
 				display: flex;
 				align-items: center;
 				justify-content: center;
+				margin-left: 10upx;
+				width: 50%;
+				height: 80rpx;
+				border-radius: 5rpx;
+				background-color: #0bb3f2;
+				font-size: 30rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #fff;
+				position: relative;
+			}
 
-				.btn {
-					display: flex;
-					align-items: center;
-					justify-content: center;
-					margin-left: 10upx;
-					width: 50%;
-					height: 80rpx;
-					border-radius: 5rpx;
-					background-color: #0bb3f2;
-					font-size: 30rpx;
-					font-family: PingFang SC;
-					font-weight: 500;
-					color: #fff;
-					position: relative;
-				}
-
-				.btn-close {
-					margin-right: 10upx;
-					width: 50%;
-					height: 80rpx;
-					border-radius: 5rpx;
-					border: 2rpx solid #0bb3f2;
-					background: none;
-					font-size: 30rpx;
-					font-family: PingFang SC;
-					font-weight: 500;
-					color: #0bb3f2;
-				}
+			.btn-close {
+				margin-right: 10upx;
+				width: 50%;
+				height: 80rpx;
+				border-radius: 5rpx;
+				border: 2rpx solid #0bb3f2;
+				background: none;
+				font-size: 30rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #0bb3f2;
 			}
 		}
 	}
-
-	.auth_btn {
-		width: 100%;
-		height: 100%;
-		top: 0upx;
-		position: absolute;
-		opacity: 0.0;
-	}
+}
+
+.auth_btn {
+	width: 100%;
+	height: 100%;
+	top: 0upx;
+	position: absolute;
+	opacity: 0.0;
+}
 </style>

+ 786 - 0
pages/auth/register.vue

@@ -0,0 +1,786 @@
+<template>
+	<view class="setting-page">
+		<view class="content">
+			<view class="info-block">
+				<view class="info-title">组织归属</view>
+				<view class="info-item">
+					<view class="title"><text class="required">*</text>公司</view>
+					<view class="picker" @click="showPicker('company')">
+						<view class="picker-text">{{ selectedCompanyName || '请选择公司' }}<image class="icon"
+								src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_expand.png"
+								mode="widthFix"></image>
+						</view>
+					</view>
+				</view>
+				<view class="info-item">
+					<view class="title"><text class="required">*</text>部门</view>
+					<view class="picker" @click="showPicker('dept')">
+						<view class="picker-text">{{ selectedDeptName || '请选择部门' }}<image class="icon"
+								src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_expand.png"
+								mode="widthFix"></image>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="info-block">
+
+				<view class="info-title">账号信息</view>
+				<!-- <view class="info-item">
+					<view class="title"><text class="required">*</text>用户账号</view>
+					<input class="input-field code-input" type="text" v-model="formData.userName" placeholder="请输入用户账号(登录名)" />
+				</view>
+				<view class="info-item">
+					<view class="title"><text class="required">*</text>用户名称</view>
+					<input class="input-field code-input" type="text" v-model="formData.nickName" placeholder="请输入名称" />
+				</view> -->
+				<!-- <view class="info-item">
+					<view class="title"><text class="required">*</text>手机号码</view>
+					<input class="input-field code-input" type="text" v-model="formData.phonenumber" placeholder="请输入手机号" />
+				</view> -->
+				<view class="info-item">
+					<view class="title"><text class="required"></text>用户邮箱</view>
+					<input class="input-field code-input" type="text" v-model="formData.email" placeholder="请输入邮箱(可选)" />
+				</view>
+				<view class="info-item">
+					<view class="title"><text class="required">*</text>身份证号</view>
+					<input class="input-field code-input" type="text" v-model="formData.idCard" placeholder="请输入身份证号" />
+				</view>
+				<view class="info-item">
+					<view class="title"><text class="required">*</text>用户性别</view>
+					<view class="radio-group">
+						<radio-group @change="onGenderChange" style="display: flex;">
+							<view class="radio-item" v-for="(item, index) in genderOptions" :key="index">
+								<radio :value="item.value" :checked="formData.sex === item.value">{{ item.label }}
+							</radio>
+							</view>
+						</radio-group>
+					</view>
+				</view>
+				<!-- <view class="info-item">
+					<view class="title"><text class="required">*</text>初始密码</view>
+					<view class="input-wrapper">
+						<input class="input-field code-input" type="text" :password="!showPassword" v-model="formData.password"
+							placeholder="请输入初始密码" />
+						<view class="img-box" @click="togglePassword">
+							<image class="icon"
+								:src="showPassword ? '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>
+				</view>
+				<view class="info-item">
+					<view class="title"><text class="required">*</text>确认密码</view>
+					<view class="input-wrapper">
+						<input class="input-field code-input" type="text" :password="!showConfirmPassword"
+							v-model="formData.confirmPassword" placeholder="请再次输入初始密码" />
+						<view class="img-box" @click="toggleConfirmPassword">
+							<image class="icon"
+								: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>
+				</view> -->
+			</view>
+			<view class="info-block">
+				<view class="info-title">权限与状态</view>
+				<view class="info-item">
+					<view class="title"><text class="required">*</text>用户类型</view>
+					<view class="picker" @click="showPicker('userType')">
+						<view class="picker-text">{{ formData.userType && userTypeOptions.length > 0 &&
+							selectedUserTypeIndex < userTypeOptions.length ?
+							userTypeOptions[selectedUserTypeIndex].label : '请选择用户类型' }}<image class="icon"
+								src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_expand.png"
+								mode="widthFix">
+								</image>
+						</view>
+					</view>
+				</view>
+				<view class="info-item">
+					<view class="title"><text class="required">*</text>账号状态</view>
+					<view class="radio-group">
+						<radio-group @change="onStatusChange" style="display: flex;">
+							<view class="radio-item" v-for="(item, index) in statusOptions" :key="index">
+								<radio :value="item.value" :checked="formData.status === item.value">{{ item.label }}
+								</radio>
+							</view>
+						</radio-group>
+					</view>
+				</view>
+				<view class="info-item">
+					<view class="title"><text class="required">*</text>绑定产品</view>
+					<view class="picker" @click="showPicker('product')">
+						<view class="picker-text">{{ selectedProducts.length > 0 ? getSelectedProductNames() : '请选择产品'
+							}}<image class="icon"
+								src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_expand.png"
+								mode="widthFix"></image>
+						</view>
+					</view>
+				</view>
+				<view class="info-item">
+					<view class="title"><text class="required">*</text>绑定角色</view>
+					<view class="picker" @click="showPicker('role')">
+						<view class="picker-text">{{ selectedRoles.length > 0 ? getSelectedRoleNames() : '请选择角色' }}
+							<image class="icon"
+								src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_expand.png"
+								mode="widthFix"></image>
+						</view>
+					</view>
+				</view>
+				<view class="info-item norow">
+					<view class="title">备注</view>
+					<textarea class="input-field code-input" type="text" v-model="formData.remark" placeholder="请输入备注" />
+				</view>
+			</view>
+		</view>
+
+
+		<view class="btn-box">
+			<view class="confirm" @click="confirm">确认</view>
+		</view>
+
+		<!-- 自定义picker组件 -->
+		<u-picker :title='pickerTitle' :show="showPickerVisible" confirmColor='#576B95' ref="uPicker"
+			:columns="pickerData" @confirm="handlePickerConfirm" @cancel="handlePickerCancel">
+		</u-picker>
+	</view>
+</template>
+
+<script>
+import { getCompanyUser, deptList, companyList, getCompanyRoleList, getProductList } from '@/api/user.js'
+export default {
+	data() {
+			return {
+				userInfo: uni.getStorageSync('userInfo'),
+				formData: {
+					companyId: '',//公司id
+					deptId: '',//部门id
+					// userName: '',//用户账号
+					// nickName: '',//用户名称
+					// phonenumber: '',//手机号
+					email: '',//邮箱
+					idCard: '',//身份证号
+					// password: '',//初始密码
+					// confirmPassword: '',//确认初始密码
+					sex: '',//性别
+					status: '',//账号状态
+					userType: '',//用户类型
+					productCode: '',//绑定产品
+					roleIds: '',//绑定角色
+					remark: '',//备注	
+					userId: '',//用户id
+				},
+				companyList: [],
+				
+				selectedCompanyIndex: 0,
+				// 部门选项
+				deptOptions: [],
+				selectedDept: '',
+				selectedDeptIndex: 0,
+				// picker相关
+				showPickerVisible: false,
+				pickerTitle: '默认标题',
+				pickerData: [],
+				originalPickerData: null,
+				currentPickerType: '',
+				// 组织信息
+				companyName: '',
+				// 密码显示状态
+				showPassword: false,
+				showConfirmPassword: false,
+				// 性别选项
+				genderOptions: [
+					{ value: '0', label: '男' },
+					{ value: '1', label: '女' }
+				],
+				// 状态选项
+				statusOptions: [
+					{ value: '0', label: '启用' },
+					{ value: '1', label: '禁用' }
+				],
+				// 用户类型选项
+				userTypeList: [],
+				selectedUserTypeId: '',
+				userTypeOptions: [
+					{ value: '0', label: '系统用户' }
+				],
+				selectedUserTypeIndex: 0,
+				// 产品选项
+				productOptions: [],
+				selectedProducts: [],
+				// 角色选项
+				roleOptions: [
+
+				],
+				selectedRoles: [],
+				// 选中的公司名称
+				selectedCompanyName: '',
+				// 选中的部门名称
+				selectedDeptName: ''
+			}
+		},
+	onLoad(options) {
+		console.log("跳转注册页面", options)
+		
+		// this.phone = options.phone || '';
+	},
+	onShow() {
+		// this.getCompanyUserList();
+	},
+	methods: {
+		getProductList() {
+			return new Promise((resolve, reject) => {
+				if (!this.formData.companyId) {
+					uni.showToast({
+						icon: 'none',
+						title: "请选择公司",
+						duration: 2000
+					});
+					reject('请选择公司');
+					return;
+				}
+				let params = {
+					companyId: this.formData.companyId || '',
+					status: 1,
+				}
+				getProductList(params).then(res => {
+					if (res.code == 200) {
+						// 处理接口返回的数据结构,使用rows作为数据源
+						const productData = res.data || [];
+						// 转换为所需的格式:显示productName,值为productCode
+						this.productOptions = productData.map(item => ({
+							value: item.productCode,
+							label: item.productName
+						}));
+						resolve(productData);
+					} else {
+						reject(res.msg || '获取产品列表失败');
+					}
+				}).catch(error => {
+					reject('网络错误,请稍后重试');
+				});
+			});
+		},
+		getCompanyRole() {
+			return new Promise((resolve, reject) => {
+				if (!this.formData.companyId) {
+					uni.showToast({
+						icon: 'none',
+						title: "请选择公司",
+					});
+					reject('请选择公司');
+					return;
+				}
+				let params = {
+					companyId: this.formData.companyId || '',
+					status: 0,
+				}
+				getCompanyRoleList(params)
+					.then(res => {
+						if (res.code == 200) {
+							this.userTypeList = res.rows || [];
+							this.userTypeOptions = this.userTypeList.map(item => ({
+								value: item.roleId.toString(),
+								label: item.roleName
+							}));
+							// 同时更新roleOptions
+							this.roleOptions = this.userTypeList.map(item => ({
+								value: item.roleId.toString(),
+								label: item.roleName
+							}));
+							resolve(res.rows || []);
+						} else if (res.code == 500) {
+							// 当接口返回500时,显示错误信息但不可选
+							this.roleOptions = [{
+								value: '-1',
+								label: res.msg || '获取角色失败'
+							}];
+							this.selectedRoles = [];
+							resolve([]);
+						}
+					})
+					.catch(error => {
+						// 网络错误时也显示错误信息
+						this.roleOptions = [{
+							value: '-1',
+							label: '网络错误,请稍后重试'
+						}];
+						this.selectedRoles = [];
+						resolve([]);
+					});
+			});
+		},deptList() {
+			return new Promise((resolve, reject) => {
+				let params = {
+					companyId: this.formData.companyId || '',
+					pageNum: 1,
+					pageSize: 10,
+				}
+				deptList(params).then(res => {
+					if (res.code == 200) {
+						// 转换部门数据格式
+						this.deptOptions = (res.rows || []).map(item => ({
+							value: item.deptId.toString(),
+							label: item.deptName,
+							deptId: item.deptId
+						}));
+						resolve(this.deptOptions);
+					} else {
+						reject(res.msg || '获取部门列表失败');
+					}
+				}).catch(error => {
+					reject('网络错误,请稍后重试');
+				});
+			});
+		},
+		fetchCompanyList() {
+					console.log("调用公司数据接口")
+
+			return new Promise((resolve, reject) => {
+				companyList().then(res => {
+					if (res.code == 200) {
+					console.log("成功调用公司数据接口")
+
+						this.companyList = res.rows || [];
+						resolve(res.data || []);
+					} else {
+						reject(res.msg || '获取公司列表失败');
+					}
+				}).catch(error => {
+					reject('网络错误,请稍后重试');
+				});
+			});
+		},
+		// 显示自定义picker
+		async showPicker(type) {
+			this.currentPickerType = type;
+			try {
+				uni.showLoading({ title: '加载中...' });
+
+				let data = [];
+				let title = '';
+
+				// 根据不同的类型调用对应的请求方法
+				if (type === 'company') {
+					// 加载公司数据
+					console.log("加载公司数据")
+					await this.fetchCompanyList();
+					data = this.companyList;
+					title = '选择公司';
+					// 使用 companyName 作为显示值
+					this.pickerData = [data.map(item => item.companyName || '未知公司')];
+				} else if (type === 'dept') {
+					// 检查是否已选择公司
+					if (!this.formData.companyId) {
+						uni.hideLoading();
+						uni.showToast({ title: '请先选择公司', icon: 'none' });
+						return;
+					}
+					// 加载部门数据
+					await this.deptList();
+					data = this.deptOptions;
+					title = '选择部门';
+					this.pickerData = [data.map(item => item.label)];
+				} else if (type === 'userType') {
+					// 用户类型数据
+					data = this.userTypeOptions;
+					title = '选择用户类型';
+					this.pickerData = [data.map(item => item.label)];
+				} else if (type === 'product') {
+					// 加载产品数据
+					await this.getProductList();
+					data = this.productOptions;
+					title = '选择产品';
+					this.pickerData = [data.map(item => item.label)];
+				} else if (type === 'role') {
+					// 加载角色数据
+					await this.getCompanyRole();
+					data = this.roleOptions;
+					title = '选择角色';
+					this.pickerData = [data.map(item => item.label)];
+				}
+				
+				// 确保 pickerData 是二维数组
+				if (!Array.isArray(this.pickerData) || !Array.isArray(this.pickerData[0])) {
+					uni.hideLoading();
+					uni.showToast({ title: '数据格式错误', icon: 'none' });
+					return;
+				}
+
+				// 保存原始数据,用于后续获取详细信息
+				this.originalPickerData = data;
+				this.pickerTitle = title;
+
+				uni.hideLoading();
+				this.showPickerVisible = true;
+			} catch (error) {
+				uni.hideLoading();
+			}
+		},
+
+		
+		onGenderChange(e) {
+			this.formData.sex=e.detail.value;
+		},
+		onStatusChange(e) {
+			this.formData.status= e.detail.value;
+		},
+
+		// 获取选中的产品名称
+		getSelectedProductNames() {
+			return this.productOptions
+				.filter(item => this.selectedProducts.includes(item.value))
+				.map(item => item.label)
+				.join(', ');
+		},
+		// 获取选中的产品代码,用逗号相连
+		getSelectedProductCodes() {
+			return this.selectedProducts.join(', ');
+		},
+		// 获取选中的角色名称
+		getSelectedRoleNames() {
+			return this.roleOptions
+				.filter(item => this.selectedRoles.includes(item.value))
+				.map(item => item.label)
+				.join(', ');
+		},
+		// 切换密码显示状态
+		togglePassword() {
+			this.formData.showPassword = !this.formData.showPassword;
+		},
+		// 切换确认密码显示状态
+		toggleConfirmPassword() {
+			this.formData.showConfirmPassword = !this.formData.showConfirmPassword;
+		},
+				// 处理picker确认
+		handlePickerConfirm(e) {
+			if (e.value && e.value.length > 0) {
+				const selectedText = e.value[0];
+				let selectedItem;
+
+				// 根据不同类型处理选中项
+				switch (this.currentPickerType) {
+					case 'company':
+					// 找到选中的公司
+					selectedItem = this.originalPickerData.find(item => 
+						item.companyName === selectedText
+					);
+					if (selectedItem) {
+						this.formData.companyId = selectedItem.companyId;
+						this.selectedCompanyIndex = this.companyList.indexOf(selectedItem);
+						this.selectedCompanyName = selectedText;
+						// 重置部门选择
+						this.formData.deptId = '';
+						this.selectedDept = '';
+						this.selectedDeptName = '';
+						// 清空部门选项,下次选择部门时会重新加载
+						this.deptOptions = [];
+					}
+					break;
+					case 'dept':
+						// 找到选中的部门
+						selectedItem = this.originalPickerData.find(item => item.label === selectedText);
+						if (selectedItem) {
+							this.formData.deptId = selectedItem.deptId;
+							this.selectedDept = selectedItem.value;
+							this.selectedDeptIndex = this.deptOptions.indexOf(selectedItem);
+							this.selectedDeptName = selectedText;
+						}
+						break;
+					case 'userType':
+						// 找到选中的用户类型
+						selectedItem = this.originalPickerData.find(item => item.label === selectedText);
+						if (selectedItem) {
+							this.formData.userType = selectedItem.label;
+							this.selectedUserTypeIndex = this.userTypeOptions.indexOf(selectedItem);
+						}
+						break;
+					case 'product':
+						// 找到选中的产品并切换选中状态
+						selectedItem = this.originalPickerData.find(item => item.label === selectedText);
+						if (selectedItem) {
+							const index = this.selectedProducts.indexOf(selectedItem.value);
+							if (index > -1) {
+								this.selectedProducts.splice(index, 1);
+							} else {
+								this.selectedProducts.push(selectedItem.value);
+							}
+						}
+						break;
+					case 'role':
+						// 找到选中的角色并切换选中状态
+						selectedItem = this.originalPickerData.find(item => item.label === selectedText);
+						if (selectedItem) {
+							console.log("选中的角色:",selectedItem);
+							
+							// 当只有一个选项且值为-1时(错误状态),不允许选择
+							if (this.roleOptions.length === 1 && this.roleOptions[0].value === '-1') {
+								return;
+							}
+							const index = this.selectedRoles.indexOf(selectedItem.value);
+							if (index > -1) {
+								this.selectedRoles.splice(index, 1);
+							} else {
+								this.selectedRoles.push(selectedItem.value);
+							}
+						}
+						break;
+				}
+			}
+			this.showPickerVisible = false;
+		},
+		// 处理picker取消
+		handlePickerCancel() {
+			this.showPickerVisible = false;
+		},
+		// 确认提交
+		async confirm() {
+			// 表单验证
+			if (!this.formData.companyId) {
+				uni.showToast({ title: '请选择公司', icon: 'none' });
+				return;
+			}
+			if (!this.selectedDept) {
+				uni.showToast({ title: '请选择部门', icon: 'none' });
+				return;
+			}
+			if (!this.formData.idCard) {
+				uni.showToast({ title: '请输入身份证号', icon: 'none' });
+				return;
+			}
+			// if (!this.formData.userName) {
+			// 	uni.showToast({ title: '请输入用户账号', icon: 'none' });
+			// 	return;
+			// }
+			// if (!this.formData.nickName) {
+			// 	uni.showToast({ title: '请输入用户名称', icon: 'none' });
+			// 	return;
+			// }
+			// if (!this.formData.phonenumber) {
+			// 	uni.showToast({ title: '请输入手机号码', icon: 'none' });
+			// 	return;
+			// }
+			// if (!this.formData.password) {
+			// 	uni.showToast({ title: '请输入初始密码', icon: 'none' });
+			// 	return;
+			// }
+			// if (this.formData.password !== this.formData.confirmPassword) {
+			// 	uni.showToast({ title: '两次输入的密码不一致', icon: 'none' });
+			// 	return;
+			// }
+			if (!this.formData.userType) {
+				uni.showToast({ title: '请选择用户类型', icon: 'none' });
+				return;
+			}
+			this.formData.productCode = this.getSelectedProductCodes();
+			console.log("产品代码:", this.formData.productCode);
+			if (!this.formData.productCode) {
+				uni.showToast({ title: '请选择绑定产品', icon: 'none' });
+				return;
+			}
+			// 准备提交数据
+			this.formData.deptId = this.selectedDept;
+			this.formData.productCode = this.getSelectedProductCodes();
+			this.formData.roleIds = this.selectedRoles;
+			this.formData.userType = this.selectedUserType;
+			// this.formData.sex = this.selectedGender;
+			this.formData.status = this.selectedStatus;
+			this.formData.userId = this.userInfo.userId;
+
+			// 打印提交数据,检查是否所有字段都已正确设置
+			console.log('提交数据:', this.formData);
+
+			try {
+				uni.showLoading({ title: '注册中...' });
+				
+				// 提交数据
+				const res = await getCompanyUser(this.formData);
+				
+				uni.hideLoading();
+				
+				if (res.code == 200) {
+					uni.showToast({ title: '注册成功', icon: 'success' });
+					// 注册成功后跳转到首页
+					console.log('准备跳转到首页');
+					setTimeout(() => {
+						uni.reLaunch({
+							url: '/pages/home/index',
+							success: function(res) {
+								console.log('跳转成功:', res);
+							},
+							fail: function(err) {
+								console.log('跳转失败:', err);
+							}
+						});
+					}, 1000);
+				} else {
+					uni.showToast({ title: res.msg || '注册失败', icon: 'none' });
+				}
+			} catch (error) {
+				uni.hideLoading();
+				uni.showToast({ title: '网络错误,请稍后重试', icon: 'none' });
+				console.error('注册失败:', error);
+			}
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.setting-page {
+	background: #F5F6FA;
+	min-height: 100vh;
+
+	.content {
+		.info-block {
+			background: #fff;
+			margin: 20rpx;
+			border-radius: 16rpx;
+			padding: 32rpx;
+
+		}
+
+		.info-title {
+			font-size: 32rpx;
+			font-weight: 600;
+			color: #333333;
+			margin-bottom: 24rpx;
+			padding-left: 8rpx;
+			border-left: 6rpx solid #388BFF;
+			margin-top: 32rpx;
+		}
+
+		.info-item {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			margin-bottom: 32rpx;
+			padding-bottom: 24rpx;
+			border-bottom: 1rpx solid #E5E5E5;
+
+			&:last-child {
+				border-bottom: none;
+				margin-bottom: 0;
+			}
+
+			.title {
+				width: 200rpx;
+				font-size: 28rpx;
+				color: #333333;
+				display: block;
+
+				.required {
+					color: #FF3B30;
+					margin-right: 8rpx;
+				}
+			}
+
+			.icon {
+				width: 32rpx;
+				height: 32rpx;
+			}
+
+			.input-field {
+				height: 80rpx;
+				font-size: 28rpx;
+				font-family: PingFang SC;
+				color: #333333;
+				padding: 0 20rpx;
+				border-radius: 8rpx;
+				box-sizing: border-box;
+			}
+
+			.code-input {
+				width: 100%;
+			}
+
+			textarea.input-field {
+				height: 120rpx;
+				padding: 20rpx;
+				resize: none;
+			}
+
+			.img-box {
+				position: absolute;
+				right: 20rpx;
+				top: 50%;
+				transform: translateY(-50%);
+
+				.icon {
+					width: 32rpx;
+					height: 32rpx;
+				}
+			}
+
+			.get-code-btn {
+				position: absolute;
+				right: 20rpx;
+				top: 50%;
+				transform: translateY(-50%);
+				font-size: 28rpx;
+				font-weight: 500;
+				color: #157CF8;
+				white-space: nowrap;
+			}
+
+			.picker {
+				width: 100%;
+			}
+
+			.picker-text {
+				width: 100%;
+				height: 80rpx;
+				font-size: 28rpx;
+				color: #333333;
+				padding: 0 20rpx;
+				border-radius: 8rpx;
+				box-sizing: border-box;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+			}
+
+			.radio-group {
+				display: flex;
+				margin-top: 8rpx;
+
+				.radio-item {
+					margin-right: 48rpx;
+					font-size: 28rpx;
+					color: #333333;
+
+					radio {
+						margin-right: 8rpx;
+					}
+				}
+			}
+
+			.input-wrapper {
+				position: relative;
+				width: 100%;
+			}
+		}
+
+		.norow {
+			flex-direction: column;
+			align-items: flex-start;
+		}
+	}
+
+	.btn-box {
+		padding: 64upx 32upx;
+
+		.confirm {
+			width: 100%;
+			height: 88upx;
+			line-height: 88upx;
+			text-align: center;
+			font-family: PingFang SC;
+			font-size: 32upx;
+			color: #FFFFFF;
+			background: #388BFF;
+			border-radius: 44upx;
+			margin: 0 20rpx;
+		}
+	}
+}
+</style>

+ 516 - 0
pages/auth/registerUser.vue

@@ -0,0 +1,516 @@
+<template>
+	<view class="container">
+		<!-- #ifdef MP-WEIXIN -->
+		<image class="bg" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/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="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/back_white.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">
+				<view class="input-form">
+					<view class="input-item">
+						<input class="input-field" type="text" v-model="formData.userName" placeholder="请输入用户账号(登录名)" />
+					</view>
+					<view class="input-item">
+						<input class="input-field" type="text" v-model="formData.nickName" placeholder="请输入用户名称" />
+					</view>
+					<view class="input-item">
+						<input class="input-field" type="number" v-model="formData.phonenumber" placeholder="请输入手机号" maxlength="11" />
+					</view>
+					<view class="input-item code-input-item">
+						<input class="input-field code-input" type="number" v-model="verifyCode" placeholder="请输入验证码" maxlength="6" />
+						<view class="get-code-btn" @click="getVerifyCode">
+							{{ codeText }}
+						</view>
+					</view>
+					<view class="input-item">
+						<view class="mima">
+							<input class="input-field" type="text" :password="showPassword" v-model="formData.password" placeholder="请输入密码" />
+							<view class="pwd-toggle" @click="closePwd">
+								<image
+									:src="showPassword ? 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_invisible.png' : 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_visible.png'"
+									mode="aspectFill"></image>
+							</view>
+						</view>
+					</view>
+					<view class="input-item">
+						<view class="mima">
+							<input class="input-field" type="text" :password="showConfirmPassword" v-model="formData.confirmPassword" placeholder="请再次输入密码" />
+							<view class="pwd-toggle" @click="closeConfirmPwd">
+								<image
+									:src="showConfirmPassword ? 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_invisible.png' : 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_visible.png'"
+									mode="aspectFill"></image>
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="tips-group">
+					<view class="tips-item" @click="toLogin">已有账号?立即登录</view>
+				</view>
+				<view class="login-btn-wrap">
+					<button class="login-btn" @click="handleRegister">注册</button>
+				</view>
+
+				<view class="tips">
+					<checkbox :checked="isAgreement" @click="handleAgreement()" />
+					<view class="tips-text" @click="handleAgreement()">已阅读并接受</view>
+					<view class="btn" @click.stop="navTo('/pages_user/userAgreement')">《用户注册协议》</view>
+					<view class="btn" @click.stop="navTo('/pages_user/privacyPolicy')">《隐私保护政策》</view>
+				</view>
+			</view>
+		</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import { sendSmsCode, smsRegister } from '@/api/user'
+	export default {
+		data() {
+			return {
+				formData: {
+					userName: '',
+					nickName: '',
+					phonenumber: '',
+					password: '',
+					confirmPassword: ''
+				},
+				verifyCode: '',
+				isAgreement: false,
+				menuButtonInfo: {},
+				codeText: '获取验证码',
+				countdown: 0,
+				countdownTimer: null,
+				showPassword: true,
+				showConfirmPassword: true
+			}
+		},
+		onLoad(option) {
+			this.getMenuButtonInfo()
+		},
+		onUnload() {
+			// 清除倒计时
+			if (this.countdownTimer) {
+				clearInterval(this.countdownTimer);
+				this.countdownTimer = null;
+			}
+		},
+		methods: {
+			navTo(path) {
+				uni.navigateTo({
+					url: path
+				})
+			},
+			closePwd() {
+				this.showPassword = !this.showPassword
+			},
+			closeConfirmPwd() {
+				this.showConfirmPassword = !this.showConfirmPassword
+			},
+			// 获取胶囊按钮布局参数
+			getMenuButtonInfo() {
+				const menuBtn = uni.getMenuButtonBoundingClientRect();
+				if (menuBtn) {
+					this.menuButtonInfo = {
+						top: menuBtn.top + 'px',
+						height: menuBtn.height + 'px',
+						centerY: (menuBtn.top + menuBtn.height / 2) + 'px',
+						right: menuBtn.right + 'px'
+					};
+				}
+			},
+			// 返回
+			goBack() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			// 跳转到登录页
+			toLogin() {
+				uni.navigateTo({
+					url: '/pages/auth/login'
+				})
+			},
+			// 获取验证码
+			getVerifyCode() {
+				if (this.countdown > 0) {
+					return;
+				}
+				if (!this.formData.phonenumber) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入手机号",
+					});
+					return;
+				}
+				if (!/^1[3-9]\d{9}$/.test(this.formData.phonenumber)) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入正确的手机号",
+					});
+					return;
+				}
+				// 调用发送验证码API
+				uni.showLoading({
+					title: "发送中..."
+				});
+				let params = {
+					phone: this.formData.phonenumber,
+					type: '2',
+				}
+				sendSmsCode(params)
+					.then(res => {
+						uni.hideLoading();
+						if (res.code == 200) {
+							uni.showToast({
+								icon: 'success',
+								title: "验证码已发送",
+							});
+							// 开始倒计时
+							this.countdown = 60;
+							this.countdownTimer = setInterval(() => {
+								this.countdown--;
+								this.codeText = this.countdown + '秒重新获取';
+								if (this.countdown <= 0) {
+									clearInterval(this.countdownTimer);
+									this.countdownTimer = null;
+									this.codeText = '获取验证码';
+								}
+							}, 1000);
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: res.msg || "发送验证码失败",
+							});
+						}
+					})
+					.catch(err => {
+						uni.hideLoading();
+					});
+			},
+			// 注册
+			handleRegister() {
+				if (!this.isAgreement) {
+					uni.showToast({
+						icon: 'none',
+						title: "请先同意协议后再注册",
+					});
+					return;
+				}
+
+				if (!this.formData.userName) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入用户账号",
+					});
+					return;
+				}
+
+				if (!this.formData.nickName) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入用户名称",
+					});
+					return;
+				}
+
+				if (!this.formData.phonenumber) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入手机号",
+					});
+					return;
+				}
+
+				if (!/^1[3-9]\d{9}$/.test(this.formData.phonenumber)) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入正确的手机号",
+					});
+					return;
+				}
+
+				if (!this.verifyCode) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入验证码",
+					});
+					return;
+				}
+
+				if (!this.formData.password) {
+					uni.showToast({
+						icon: 'none',
+						title: "请输入密码",
+					});
+					return;
+				}
+
+				if (this.formData.password !== this.formData.confirmPassword) {
+					uni.showToast({
+						icon: 'none',
+						title: "两次输入的密码不一致",
+					});
+					return;
+				}
+
+				this.register();
+			},
+			// 注册
+			register() {
+				uni.showLoading({
+					title: "注册中..."
+				});
+				// 调用注册接口
+				const data = {
+					userId: '', // 新用户userId为空
+					userName: this.formData.userName,
+					code: this.verifyCode,
+					nickName: this.formData.nickName,
+					phonenumber: this.formData.phonenumber,
+					password: this.formData.password,
+					confirmPassword: this.formData.confirmPassword
+				};
+				smsRegister(data)
+					.then(res => {
+						uni.hideLoading();
+						if (res.code == 200) {
+							uni.showToast({
+								icon: 'success',
+								title: "注册成功",
+							});
+							uni.setStorageSync('AppToken', res.data.token);
+							uni.setStorageSync('userInfo', res.data.user);
+							
+							if (!res.data.user.roles) {
+								console.log("跳转注册")
+								uni.navigateTo({
+									url: '/pages/auth/register'
+								})
+							} else {
+								console.log("没跳转注册")
+								uni.$emit('refreshLogin');
+								uni.navigateBack({
+									delta: 1
+								});
+							}
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: res.msg,
+							});
+						}
+					})
+					.catch(err => {
+						uni.hideLoading();
+						uni.showToast({
+							icon: 'none',
+							title: "网络错误,请稍后重试",
+						});
+					});
+			},
+			handleAgreement() {
+				this.isAgreement = !this.isAgreement;
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.container {
+		flex: 1;
+		padding: 0 24rpx;
+		display: flex;
+		flex-direction: column;
+		justify-content: flex-start;
+		position: relative;
+
+		.bg {
+			width: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
+
+		.backImg {
+			display: flex;
+			align-items: center;
+
+			image {
+				width: 40rpx;
+				height: 40rpx;
+			}
+
+			margin-left: 32rpx;
+		}
+	}
+
+	.force-login-wrap {
+		width: 100%;
+		height: 100vh;
+		position: relative;
+
+		.top-title {
+			padding: 0 32rpx;
+			text-align: left;
+			margin-top: 20rpx;
+
+			.title-text {
+				font-weight: 600;
+				font-size: 48rpx;
+				color: #333333;
+				margin-bottom: 20rpx;
+
+				.blue {
+					color: #157CF8;
+				}
+			}
+
+			.login-notice {
+				font-weight: 400;
+				font-size: 32rpx;
+				color: #666666;
+				line-height: 40rpx;
+			}
+		}
+
+		.force-login__content {
+			margin-top: 54rpx;
+			padding: 0 32rpx;
+			position: relative;
+
+			.input-form {
+				margin-bottom: 60rpx;
+
+				.input-item {
+					background: #FFFFFF;
+					border-radius: 16rpx;
+					padding: 30rpx 40rpx;
+					margin-bottom: 48rpx;
+					box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
+
+					&::last-child {
+						margin-bottom: 0
+					}
+
+					.input-field {
+						width: 100%;
+						font-size: 30rpx;
+						font-family: PingFang SC;
+						color: #333333;
+
+						&::placeholder {
+							color: #CCCCCC;
+						}
+					}
+
+					.mima {
+						width: 100%;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+
+						.pwd-toggle {
+							width: 88rpx;
+
+							display: flex;
+							align-items: center;
+							justify-content: center;
+						}
+
+						image {
+							width: 32rpx;
+							height: 32rpx;
+						}
+					}
+
+					&.code-input-item {
+						display: flex;
+						align-items: center;
+
+						.code-input {
+							flex: 1;
+						}
+
+						.get-code-btn {
+							font-size: 28rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #157CF8;
+							padding-left: 20rpx;
+							white-space: nowrap;
+						}
+					}
+				}
+			}
+
+			.tips-group {
+				display: flex;
+				align-items: center;
+				justify-content: flex-end;
+				font-weight: 400;
+				font-size: 24rpx;
+				color: #388BFF;
+				line-height: 40rpx;
+				margin: -40rpx 0 24rpx;
+			}
+
+			.login-btn-wrap {
+				margin-bottom: 40rpx;
+				margin-top: 140rpx;
+
+				.login-btn {
+					width: 100%;
+					height: 88rpx;
+					background: rgba(56, 139, 255, 1);
+					border-radius: 44rpx;
+					font-size: 32rpx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #FFFFFF;
+					border: none;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+
+					&::after {
+						border: none;
+					}
+				}
+			}
+		}
+	}
+
+	.tips {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		font-size: 24rpx;
+		color: #666666;
+		flex-wrap: nowrap;
+		padding: 0 60rpx;
+
+		checkbox {
+			margin-right: 10rpx;
+			flex-shrink: 0;
+			transform: scale(0.8);
+		}
+
+		.tips-text {
+			margin-right: 4rpx;
+			white-space: nowrap;
+		}
+
+		.btn {
+			color: #157CF8;
+			margin: 0 2rpx;
+			white-space: nowrap;
+		}
+	}
+</style>

+ 8 - 2
pages/auth/setting.vue

@@ -12,7 +12,7 @@
 				<view class="right">v{{ version }}</view>
 			</view>
 		</view>
-		<view class="btn-box">
+		<view class="btn-box" v-if="AppToken">
 			<view class="logout-btn" @click="handleLogout">退出登录</view>
 		</view>
 	</view>
@@ -22,11 +22,17 @@
 	export default {
 		data() {
 			return {
-				version: "1.0"
+				version: "1.0",
+				AppToken:''
 			}
 		},
 		onLoad() {
 			this.getVersion()
+	
+		},
+		onShow() {
+			this.AppToken=uni.getStorageSync('AppToken');
+			
 		},
 		methods: {
 			getVersion() {

+ 32 - 32
pages/user/index.vue

@@ -45,7 +45,7 @@
 <script>
 	
 	import {
-		getUserInfo
+		getCompanyUserInfo
 	} from '@/api/user'
 	export default {
 		data() {
@@ -82,21 +82,23 @@
 				// 消息数量
 				msgNum: 0,
 				isShow: true,
-				UserInfo: uni.getStorageSync('AppToken')
+				userInfo: uni.getStorageSync('userInfo')
 			};
 		},
 		onLoad() {
-			console.log("onload")
-		},
-		onShow() {
-			console.log("onshow")
-			// 从本地缓存加载用户信息
 			const userInfo = uni.getStorageSync('userInfo')
 			if (userInfo) {
 				this.userInfo = typeof userInfo === 'string' ? JSON.parse(userInfo) : userInfo
 			}
 			// 更新登录状态
-			this.UserInfo = uni.getStorageSync('AppToken')
+			this.userInfo = uni.getStorageSync('userInfo')
+		},
+		onShow() {
+			this.userInfo = uni.getStorageSync('userInfo')
+			// 从本地缓存加载用户信息
+			if(this.userInfo){
+				this.getCompanyUserInfo()
+			}
 		},
 		onReachBottom() {
 			console.log("onReachBottom")
@@ -107,8 +109,6 @@
 		methods: {
 				
 			isLogin(){
-				console.log("是否登录")
-				console.log("是否登录222",this.userInfo)
 				if(!this.userInfo || !this.userInfo.userId){
 					console.log("未登录,跳转到登录页面")
 					uni.navigateTo({
@@ -136,8 +136,6 @@
 				})
 			},
 
-			
-
 			openLink(item) {
 				if (item.name == '用户协议') {
 					this.openH5()
@@ -167,28 +165,30 @@
 					url: '../home/web'
 				})
 			},
-			getUserInfo() {
-				getUserInfo().then(
-					res => {
-						if (res.code == 200) {
-							if (res.user != null) {
-								this.user = res.user;
-							} else {
-								if (this.utils && this.utils.loginOut) {
-									this.utils.loginOut();
-								}
-							}
-
+			getCompanyUserInfo() {
+			if(!this.userInfo.userId){
+				return
+			}
+			getCompanyUserInfo(this.userInfo.userId).then(
+				res => {
+					if (res.code == 200) {
+						if (res.user != null) {
+							this.userInfo = res.user;
 						} else {
-							uni.showToast({
-								icon: 'none',
-								title: "请求失败",
-							});
+							if (this.utils && this.utils.loginOut) {
+								this.utils.loginOut();
+							}
 						}
-					},
-					rej => {}
-				);
-			},
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "请求失败",
+						});
+					}
+				},
+				rej => {}
+			);
+		},
 			// 跳转页面
 			navgetTo(url) {
 				if (this.utils && this.utils.isLogin) {

+ 55 - 58
pages_speaker/gradeApplication.vue

@@ -355,7 +355,8 @@
 
 	import {
 		apply,
-		getCompanyDoctorLevelApplyQuestionnaire
+		getCompanyDoctorLevelApplyQuestionnaire,
+		getDoctorDataList
 	} from '@/api/speaker';
 	export default {
 		data() {
@@ -380,6 +381,7 @@
 				applicationLevelColumns: [
 					['一级', '二级', '三级', '四级']
 				],
+				userInfo :uni.getStorageSync('userInfo') || '{}',
 				rejectionInfo: '',
 				formTitle: '',
 				formFields: [],
@@ -397,19 +399,13 @@
 					proofImages: [] // 证明材料图片
 				},
 				pickerTitle: '默认标题',
-				userInfo: {},
 				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"); //申请级别
+				// this.applyLevel = await utils.getDicts("doctor_apply_level"); //申请级别
 			} catch (e) {
 				console.log('获取字典数据失败:', e)
 			}
@@ -419,7 +415,7 @@
 				this.rejectionInfo = decodeURIComponent(options.rejectionInfo)
 			}
 			// 获取用户信息
-			this.userInfo = uni.getStorageSync('userInfo') || '{}'
+			
 			if (typeof this.userInfo === 'string') {
 				try {
 					this.userInfo = JSON.parse(this.userInfo) || {}
@@ -430,13 +426,53 @@
 			await this.getCompanyDoctorLevelApplyQuestionnaire()
 
 		},
-		// onShow: async function() {
-		// 	await this.getCompanyDoctorLevelApplyQuestionnaire()
-		// },
+		onShow() {
+			this.getDoctorDataList()
+		},
 		methods: {
+			buildApplyPayload() {
+				const materials = (this.formData.proofImages || []).map((url, index) => ({
+					id: 0,
+					companyId: (this.userInfo && this.userInfo.companyId) || 0,
+					applyId: 0,
+					fileUrl: url,
+					fileName: `proof_${index + 1}.jpg`,
+					fileSize: 0,
+					fileType: 'image/jpeg',
+					sortOrder: index + 1,
+					deleted: 0
+				}))
+				return {
+					id: null,
+					doctorId: this.doctorId || '',
+					companyId: (this.userInfo && this.userInfo.companyId) || 0,
+					questionnaireVersionId: this.formData.questionnaireId,
+					internationalPapers: parseInt(this.formData.internationalPapers) || 0,
+					nationalPapers: parseInt(this.formData.nationalPapers) || 0,
+					clinicalExperienceYears: parseInt(this.formData.clinicalExperience) || 0,
+					applyLevel: this.formData.applicationLevel,
+					materials
+				}
+			},
+			//申请级别
+			getDoctorDataList(){
+				getDoctorDataList(
+					{
+						companyId: this.userInfo.companyId,
+					}
+				).then(res => {
+					if (res.code === 200) {
+						const rows = Array.isArray(res.rows) ? res.rows : []
+						this.applyLevel = rows.map(it => ({
+							dictLabel: it.levelName,
+							dictValue: it.sort
+						}))
+					}
+				})
+			},
+
 			async getCompanyDoctorLevelApplyQuestionnaire() {
 				try {
-					console.log('获取公司医生等级申请问卷')
 					const res = await getCompanyDoctorLevelApplyQuestionnaire({
 						companyId: this.userInfo.companyId
 					})
@@ -462,7 +498,6 @@
 						this.formData.questionnaireId=res.data.versionId
 					}
 				} catch (e) {
-					console.log('获取公司医生等级申请问卷失败:', e)
 				}
 			},
 			// ---------- 动态表单(formJson)相关方法 ----------
@@ -865,7 +900,7 @@
 									// 解析上传结果
 									const data = JSON.parse(res.data)
 									if (data.code === 200) {
-										console.log('上传成功:', data.data)
+										
 										resolve(data.data)
 									} else {
 										reject(new Error(data.message || '上传失败'))
@@ -957,10 +992,9 @@
 
 			// 选择器确认
 			confirm(e) {
-				console.log(e)
+				
 				if (e.value && e.value.length > 0) {
 					if (this.pickerTitle === '申请级别') {
-						// e.value[0] 为选中的 dictLabel,用其找到对应项并保存 dictValue 提交、dictLabel 展示
 						const item = this.applyLevel.find(a => a.dictLabel === e.value[0])
 						if (item) {
 							this.formData.applicationLevel = item.dictValue
@@ -968,7 +1002,6 @@
 						}
 					}
 				}
-				// 关闭选择器
 				this.showPickerVisible = false
 			},
 
@@ -1011,7 +1044,6 @@
 
 			// 提交表单
 			submitForm() {
-				// 动态表单校验
 				if (this.formFields.length > 0) {
 					const validation = this.validateDynamicForm()
 					if (!validation.valid) {
@@ -1072,39 +1104,9 @@
 					})
 					return
 				}
-               ///console.log(this.formData.questionnaireId,'this.formData.questionnaireId')
+               
 				// 构建表单数据(静态字段)
-				const formData = {
-					// 基础字段
-					id: null,
-					doctorId: this.doctorId || '',
-					companyId: (this.userInfo && this.userInfo.companyId) || 0,
-					//companyName: (this.userInfo && this.userInfo.companyName) || '',
-					questionnaireVersionId:this.formData.questionnaireId,
-					// 学术信息
-					// academicTitle: this.formData.academicTitle,
-					// academicPosition: this.formData.academicPositions,
-					internationalPapers: parseInt(this.formData.internationalPapers) || 0,
-					nationalPapers: parseInt(this.formData.nationalPapers) || 0,
-					// academicResearch: this.formData.researchAreas,
-					clinicalExperienceYears: parseInt(this.formData.clinicalExperience) || 0,
-					// degree: this.formData.degree,
-					applyLevel: this.formData.applicationLevel,
-					// 证明材料
-					materials: (this.formData.proofImages || []).map((url, index) => {
-						return {
-							id: 0,
-							companyId: (this.userInfo && this.userInfo.companyId) || 0,
-							applyId: 0,
-							fileUrl: url,
-							fileName: `proof_${index + 1}.jpg`,
-							fileSize: 0,
-							fileType: 'image/jpeg',
-							sortOrder: index + 1,
-							deleted: 0
-						}
-					})
-				}
+				const formData = this.buildApplyPayload()
 				// 动态表单字段放入 dynamicFormData 传到接口
 				const dynamicFormData = {}
 				if (this.formFields && this.formFields.length > 0) {
@@ -1124,7 +1126,6 @@
 					formData.dynamicFormData = dynamicFormData
 				}
 
-				// 调用apply接口提交表单
 				uni.showLoading({
 					title: '提交中...'
 				})
@@ -1138,14 +1139,10 @@
 						uni.redirectTo({
 							url: '/pages_task/success'
 						})
-						// 提交成功后返回上一页
-						// setTimeout(() => {
-						// 	uni.navigateBack()
-						// }, 1500)
 					} else {
 						uni.showToast({
 							icon: 'none',
-							title: res.message || '提交失败'
+							title: res.msg||res.message
 						})
 					}
 				}).catch(err => {
@@ -1864,4 +1861,4 @@
 			}
 		}
 	}
-</style>
+</style>

+ 57 - 12
pages_speaker/index.vue

@@ -20,11 +20,11 @@
 						{{ item.label }}
 					</view>
 				</view>
-				<view class="filter-divider"></view>
+				<!-- <view class="filter-divider"></view>
 				<view class="filter-btn" @click="showMemberPopup = true">
 					<text>{{ selectedMemberOption || '全员' }}</text>
 					<image class="w32 h32" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_down.png" mode=""></image>
-				</view>
+				</view> -->
 			</view>
 			<!-- 成员筛选弹窗 -->
 		<view class="member-popup-overlay" v-if="showMemberPopup" @click="showMemberPopup = false"></view>
@@ -47,7 +47,15 @@
 		</view>
 		
 		<!-- 任务列表 -->
-		<scroll-view class="content" scroll-y>
+		<scroll-view 
+			class="content" 
+			scroll-y
+			refresher-enabled
+			:refresher-triggered="refreshing"
+			@refresherrefresh="onRefresh"
+			@refresherrestore="onRestore"
+			@scrolltolower="loadMore"
+		>
 			<view class="task-card" v-for="(item, index) in taskList" :key="index" @click="showDetail(item)">
 				<view class="card-header">
 					<view class="card-title">
@@ -98,7 +106,7 @@
 						{{ item.productGroup }}
 					</view>
 				</view>
-				<view class="apply-button" v-if="item.isApply==0" @click.stop="applyLevel(item)">定级申请</view>
+				<view class="apply-button" v-if="item.isApply==0&&item.status!= 0" @click.stop="applyLevel(item)">定级申请</view>
 			</view>
 		</scroll-view>
 
@@ -233,6 +241,13 @@
 				// 选中的成员选项文本
 				selectedMemberOption: '全员',
 				accountType: '',
+				// 下拉刷新
+				refreshing: false,
+				// 分页
+				page: 1,
+				pageSize: 20,
+				hasMore: true,
+				isLoadingMore: false,
 			}
 		},
 		watch: {
@@ -346,27 +361,57 @@
 					console.log("userInfo内容", this.userInfo)
 					const res = await speakerList({
 						companyId: this.userInfo.companyId,
-						page: 1,
-						pageSize: 20,
+						// page: this.page,
+						// pageSize: this.pageSize,
 						doctorName: this.searchName,
 						status: this.currentTab,
 						accountType: this.accountType
 					})
 					uni.hideLoading()
 					if (res.code === 200 && res.rows) {
-						// 直接使用接口返回的原始数据
-						this.taskList = res.rows
+						const rows = res.rows || []
+						if (this.isLoadingMore) {
+							this.taskList = this.taskList.concat(rows)
+						} else {
+							this.taskList = rows
+						}
+						this.hasMore = rows.length === this.pageSize
+						this.isLoadingMore = false
 					} else {
 						this.taskList = this.getDefaultData()
+						this.hasMore = false
+						this.isLoadingMore = false
 					}
 				} catch (e) {
 					uni.hideLoading()
 					console.error('加载数据失败', e)
-					this.taskList = this.getDefaultData()
+					if (!this.isLoadingMore) {
+						this.taskList = this.getDefaultData()
+					}
+					this.isLoadingMore = false
 				}
 			},
+			onRefresh() {
+				this.refreshing = true
+				Promise.resolve()
+					.then(() => {
+						this.page = 1
+						this.hasMore = true
+						this.isLoadingMore = false
+						return this.loadData()
+					})
+					.finally(() => {
+						this.refreshing = false
+					})
+			},
+			onRestore() {
+				this.refreshing = false
+			},
 			async loadMore() {
-				// 加载更多数据
+				if (this.isLoadingMore || !this.hasMore) return
+				this.isLoadingMore = true
+				this.page += 1
+				await this.loadData()
 			},
 			// 定级申请
 			applyLevel(item) {
@@ -496,7 +541,7 @@
 				flex: 1;
 				display: flex;
 				align-items: center;
-				gap: 64rpx;
+				justify-content: space-between;
 				overflow-x: auto;
 
 				.tab-item {
@@ -945,4 +990,4 @@
 			border: 1rpx solid #388BFF ;
 		}
 	}
-</style>
+</style>

+ 3 - 1
pages_speaker/lecturerDetail.vue

@@ -135,7 +135,9 @@
 				<view class="info-list">
 					<view class="info-item">
 						<text class="info-label">密码:</text>
-						<text class="info-value password">{{ lecturerInfo.pwd ||'-'}}</text>
+						<!-- <text class="info-value password">{{ lecturerInfo.pwd ||'-'}}</text> -->
+						<text class="info-value password">******</text>
+
 					</view>
 				</view>
 			</view>

+ 2 - 2
pages_speaker/speakerInvitation.vue

@@ -21,7 +21,7 @@
 				<!-- 邀请人信息区 -->
 				<view class="inviter-section">
 					<image class="inviter-avatar" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/my_heads_icon.png" mode="aspectFill"></image>
-					<text class="inviter-name">王小明</text>
+					<text class="inviter-name">{{ userInfo.nickName }}</text>
 					<text class="invite-desc">邀请你成为讲者</text>
 				</view>
 
@@ -30,7 +30,7 @@
 					<image class="qrcode-img" :src="qscode" @longpress="saveQrcode"></image>
 				</view>
 				<!-- 扫码提示文字 -->
-				<view class="scan-tip">扫一扫,注册一咻学术</view>
+				<view class="scan-tip">扫一扫,注册文依学苑</view>
 			</view>
 		</view>
 	</view>

+ 681 - 708
pages_task/approvalCenter.vue

@@ -70,13 +70,16 @@
 		</view>
 		<!-- 列表内容 -->
 		<scroll-view class="content" scroll-y refresher-enabled :refresher-triggered="refreshing"
-			@refresherrefresh="onRefresh" @refresherrestore="onRestore">
-			<view class="task-card" v-for="(item, index) in currentList" :key="index" @click="goDetails(item)">
+			@refresherrefresh="onRefresh" @refresherrestore="onRestore" @scrolltolower="onReachBottom">
+			<view class="task-card" v-for="(item, index) in auditList" :key="index" @click="goDetails(item)">
 				<!-- 任务/审核标题+状态 -->
 				<view class="card-top">
 					<text class="card-task-title">{{ getAuditNameDisplay(item.auditName) }}</text>
-
-					<view class="status-tag" :class="item.statusClass">{{ item.statusText }}</view>
+					<view class="status-tag"
+						:class="item.status == 1 ? 'status-createPending' : (item.status == 2 ? 'status-finish' : (item.status == 3 ? 'status-rejected' : 'status-createPending'))">
+						{{ item.status == 1 ? '待审核' : (item.status == 2 ? '已通过' : (item.status == 3 ? '已驳回' : '未知')) }}
+					</view>
+					<!-- <view class="status-tag" :class="item.status">{{ item.statusText }}</view> -->
 				</view>
 
 				<view class="card-content">
@@ -84,7 +87,8 @@
 					<view class="time-info">
 						<view class="time-item">
 							<text class="title">任务名称:</text>
-							<text>{{ item.auditName || '未设置' }}</text>
+							<!-- <text>{{ item.auditName || '未设置' }}</text> -->
+							<text>{{ item.businessData.taskInfo.taskName || item.auditName || '未设置' }}</text>
 						</view>
 						<view class="time-item">
 							<text class="title">任务类型:</text>
@@ -97,7 +101,8 @@
 						<view class="share-btn" @click="handleShare(item)">
 							<image class="share-icon"
 								src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_user.png"
-								mode="widthFix"></image>
+								mode="widthFix">
+							</image>
 							<text>{{ item.initiatorName || '未命名' }}</text>
 						</view>
 						<view class="date">
@@ -192,815 +197,783 @@
 	</view>
 </template>
 <script>
-	import utils from '@/utils/common.js'
-	import TabPopup from '@/components/tab-popup.vue'
-	import {
-		getPendingAuditList,
-		searchCompanyUser
-	} from '@/api/audit.js'
-
-	export default {
-		components: {
-			TabPopup
+import utils from '@/utils/common.js'
+import TabPopup from '@/components/tab-popup.vue'
+import {
+	getPendingAuditList,//查询公司下的待审核任务列表
+	pendingCount,//查询公司下的待审核任务数量
+	searchCompanyUser
+} from '@/api/audit.js'
+
+export default {
+	components: {
+		TabPopup
+	},
+	data() {
+		return {
+			userInfo: uni.getStorageSync('userInfo'),
+			processTemplate: null,
+			popShow: false,
+			showFilter: false,
+			selectedTabItem: '',
+			searchKeywords: '',
+			searchTimer: null,
+			filters: {
+				applyTimeStart: '',
+				applyTimeEnd: '',
+				finishTimeStart: '',
+				finishTimeEnd: '',
+				auditTimeStart: '',
+				auditTimeEnd: '',
+				taskBelong: 'my',
+				finishStatus: '',
+				belongType: ''
+			},
+			refreshing: false,
+			showSubTabPopup: false,
+			currentPopupType: 'all',
+			// 为每种类型的弹窗分别存储选中的选项
+			selectedSubTabOptions: {
+				all: 'all',
+				unfinished: 'unfinished'
+			},
+			selectedSubTabLabels: {
+				all: '全部审核',
+				unfinished: '最新发起'
+			},
+			// 顶部选项卡数组
+			topTabs: [{
+				label: '待办',
+				value: 'todo',
+				badge: 0
+			},
+			{
+				label: '已办',
+				value: 'done',
+				badge: 0
+			},
+			{
+				label: '我发起的',
+				value: 'myInitiate',
+				badge: 0
+			}
+			],
+			currentTopTab: 0,
+			currentSubTab: 'all',
+			// 子标签数组
+			taskSubTabs: [{
+				label: '全部审批',
+				value: 'all'
+			},
+			{
+				label: '最新发起',
+				value: 'unfinished'
+			}
+			],
+			tabsList: ['全部审批', '任务创建'],
+			tabsList2: ['最新发起', '最早发起'],
+			// auditSubTabs: [{
+			// 		label: '全部',
+			// 		value: 'all'
+			// 	},
+			// 	{
+			// 		label: '驳回',
+			// 		value: 'rejected'
+			// 	}
+			// ],
+			// 加载状态
+			loading: {
+				todo: false,
+				done: false,
+				myInitiate: false
+			},
+			// 列表数据
+			auditList: [],
+
+			// 初始化/加载状态控制,避免初次进入重复请求
+			isInitializing: true,
+			hasLoadedOnce: false,
+		}
+	},
+
+	computed: {
+		currentSubTabsList() {
+			return this.taskSubTabs;
+
 		},
-		data() {
-			return {
-				processTemplate: null,
-				popShow: false,
-				showFilter: false,
-				selectedTabItem: '',
-				searchKeywords: '',
-				searchTimer: null,
-				filters: {
-					applyTimeStart: '',
-					applyTimeEnd: '',
-					finishTimeStart: '',
-					finishTimeEnd: '',
-					auditTimeStart: '',
-					auditTimeEnd: '',
-					taskBelong: 'my',
-					finishStatus: '',
-					belongType: ''
-				},
-				refreshing: false,
-				showSubTabPopup: false,
-				currentPopupType: 'all',
-				// 为每种类型的弹窗分别存储选中的选项
-				selectedSubTabOptions: {
-					all: 'all',
-					unfinished: 'unfinished'
-				},
-				selectedSubTabLabels: {
-					all: '全部审核',
-					unfinished: '最新发起'
-				},
-				// 顶部选项卡数组
-				topTabs: [{
-						label: '待办',
-						value: 'todo',
-						badge: 0
-					},
-					{
-						label: '已办',
-						value: 'done',
-						badge: 0
-					},
-					{
-						label: '我发起的',
-						value: 'myInitiate',
-						badge: 0
-					}
-				],
-				currentTopTab: 0,
-				currentSubTab: 'all',
-				// 子标签数组
-				taskSubTabs: [{
-						label: '全部审批',
-						value: 'all'
-					},
-					{
-						label: '最新发起',
-						value: 'unfinished'
-					}
-				],
-				tabsList: ['全部审批', '任务创建'],
-				tabsList2: ['最新发起', '最早发起'],
-				// auditSubTabs: [{
-				// 		label: '全部',
-				// 		value: 'all'
-				// 	},
-				// 	{
-				// 		label: '驳回',
-				// 		value: 'rejected'
-				// 	}
-				// ],
-				// 加载状态
-				loading: {
-					todo: false,
-					done: false,
-					myInitiate: false
-				},
-				// 列表数据
-				todoList: [], // 待办列表(index=0)
-				doneList: [], // 已办列表(index=1)
-				myInitiateList: [], // 我发起的列表(index=2)
-				// 初始化/加载状态控制,避免初次进入重复请求
-				isInitializing: true,
-				hasLoadedOnce: false
+	},
+	onLoad() {
+		// 页面加载时的初始化操作
+		utils.getDicts("FLOW_TEMPLATE").then(res => {
+			this.processTemplate = res;
+			console.log("流程模板", this.processTemplate)
+		});
+	},
+	onShow() {
+		this.pendingCount()
+		this.loadData();
+
+	},
+	methods: {
+		pendingCount() {
+			let params = {
+				initiatorName: this.userInfo.nickName || '',
+				initiatorPhone: this.userInfo.phone || '',
+				userId: this.userInfo.userId || '',
+				companyId: this.userInfo.companyId || 0,
+				pageNum: this.pageNum || 1,
+				pageSize: this.pageSize || 10,
 			}
+			pendingCount(params).then(res => {
+				// if (res.code === 200) {
+				console.log("待审核任务数量", res || 0)
+				this.topTabs[0].badge = res.pendingCount || 0//待办
+				this.topTabs[1].badge = res.approvedCount || 0//已办
+				this.topTabs[2].badge = res.initiatedCount || 0//我发起的
+				// }
+			})
 		},
-		computed: {
-			currentSubTabsList() {
-				return this.taskSubTabs;
 
-			},
-			currentList() {
-				if (this.currentTopTab === 0) return this.todoList;
-				if (this.currentTopTab === 1) return this.doneList;
-				if (this.currentTopTab === 2) return this.myInitiateList;
+		buildQueryParams() {
+			const sort = this.selectedSubTabOptions && this.selectedSubTabOptions['unfinished'] === 'finished' ? 1 : 0
+			const tempCode = this.selectedSubTabOptions && this.selectedSubTabOptions['all'] === 'taskCreate' ? ['ADUIT_CJRW', 'ADUIT_WCRWSH'] : []
+			return {
+				initiatorName: this.userInfo.nickName || '',
+				initiatorPhone: this.userInfo.phone || '',
+				userId: this.userInfo.userId || '',
+				companyId: this.userInfo.companyId || 0,
+				sort,
+				tempCode,
+				pageNum: this.pageNum || 1,
+				pageSize: this.pageSize || 10,
+				status: this.currentTopTab
+				// status: this.currentTopTab === 0 ? 1 : (this.currentTopTab ===0? 1 : 2)
 			}
 		},
-		onLoad() {
-			// 页面加载时的初始化操作
-			this.loadData();
-			utils.getDicts("FLOW_TEMPLATE").then(res => {
-				this.processTemplate = res;
-				console.log("流程模板", this.processTemplate)
-			});
+		normalizeMapKeys(map) {
+			const res = {}
+			Object.keys(map || {}).forEach(k => {
+				res[String(k).trim()] = map[k]
+			})
+			return res
 		},
-		methods: {
-			onRefresh() {
-				this.refreshing = true;
-				this.loadData().finally(() => {
-					setTimeout(() => {
-						this.refreshing = false;
-					}, 500);
-				});
-			},
-			onRestore() {
-				this.refreshing = false;
-			},
-			openSubTabPopup(type) {
-				this.currentPopupType = type;
-				this.showSubTabPopup = true;
-			},
-			selectSubTabOption(value, label) {
-				// 根据当前弹窗类型更新对应类型的选中选项
-				this.selectedSubTabOptions[this.currentPopupType] = value;
-				this.selectedSubTabLabels[this.currentPopupType] = label;
-				this.currentSubTab = value;
-				this.showSubTabPopup = false;
-				// 这里可以添加根据选择的子标签过滤数据的逻辑
-			},
-			selectTabItem(item) {
-				this.selectedTabItem = item;
-				this.popShow = false;
-			},
-			goDetails(item) {
-				console.log("跳转参数", item)
-				uni.navigateTo({
-					url: `/pages_task/approvalTaskDetail?taskId=${item.id}&businessType=${item.businessType}`
+		mapAuditItem(item, type) {
+			console.log("item", item)
+			return {
+				auditName: item.auditName || '未知审核',
+				statusText: item.status ? ({ 1: '待审核', 2: '已通过', 3: '已驳回' })[item.status] : '未知',
+				statusClass: item.status ? ({ 1: 'status-createPending', 2: 'status-finish', 3: 'status-rejected' })[item.status] : 'status-createPending',
+				id: item.id,
+				status: item.status,
+				auditType: item.auditType,
+				businessId: item.businessId,
+				businessType: item.businessType,
+				createTime: item.createTime,
+				initiatorName: item.initiatorName,
+				taskName: (item.businessData && item.businessData.taskInfo && item.businessData.taskInfo.taskName) || ''
+			}
+		},
+		async fetchAll() {
+			const params = this.buildQueryParams()
+			const res = await getPendingAuditList(params)
+			if (res.code === 200) {
+					const rows = Array.isArray(res.rows) ? res.rows : (Array.isArray(res.row) ? res.row : [])
+					if ((this.pageNum || 1) > 1) {
+						this.auditList = this.auditList.concat(rows)
+					} else {
+						this.auditList = rows
+					}
+				console.log("待审核任务列表", this.auditList)
+				this.hasLoadedOnce = true
+				this.isInitializing = false
+			} else {
+				this.isInitializing = false
+			}
+		},
+		onRefresh() {
+			this.refreshing = true
+			this.pageNum = 1
+			Promise.resolve()
+				.then(() => this.fetchAll())
+				.finally(() => {
+					this.refreshing = false
 				})
+		},
+		onRestore() {
+			this.refreshing = false;
+		},
+			shouldLoadMore() {
+				const total = this.topTabs[this.currentTopTab]?.badge || 0
+				return total > 0 && this.auditList.length < total
 			},
-			switchTopTab(index) {
-				this.currentTopTab = index;
-				this.currentSubTab = 'all';
-				// 重置所有子标签选项
-				this.selectedSubTabOptions = {
-					all: 'all',
-					unfinished: 'unfinished'
-				};
-				this.selectedSubTabLabels = {
-					all: '全部审核',
-					unfinished: '最新发起'
-				};
-				this.popShow = false;
-				this.showSubTabPopup = false;
-				// 切换标签仅切换展示数据
-			},
-			closeFilter() {
-				this.showFilter = false
-			},
-			resetFilters() {
-				this.filters = {
-					applyTimeStart: '',
-					applyTimeEnd: '',
-					finishTimeStart: '',
-					finishTimeEnd: '',
-					auditTimeStart: '',
-					auditTimeEnd: '',
-					taskBelong: 'my',
-					finishStatus: '',
-					belongType: ''
+			onReachBottom() {
+				if (this.shouldLoadMore()) {
+					this.pageNum = (this.pageNum || 1) + 1
+					this.fetchAll()
 				}
 			},
-			confirmFilters() {
-				this.showFilter = false
-				console.log('筛选条件:', this.filters)
-				// 筛选后重新加载数据
+		openSubTabPopup(type) {
+			this.currentPopupType = type;
+			this.showSubTabPopup = true;
+		},
+		selectSubTabOption(value, label) {
+			// 根据当前弹窗类型更新对应类型的选中选项
+			this.selectedSubTabOptions[this.currentPopupType] = value;
+			this.selectedSubTabLabels[this.currentPopupType] = label;
+			this.currentSubTab = value;
+			this.showSubTabPopup = false;
+			this.fetchAll()
+		},
+		selectTabItem(item) {
+			this.selectedTabItem = item;
+			this.popShow = false;
+		},
+		goDetails(item) {
+			console.log("跳转参数", item)
+			uni.navigateTo({
+				url: `/pages_task/approvalTaskDetail?taskId=${item.id}&businessType=${item.businessType}`
+			})
+		},
+		switchTopTab(index) {
+			this.currentTopTab = index;
+			this.currentSubTab = 'all';
+			// 重置所有子标签选项
+			this.selectedSubTabOptions = {
+				all: 'all',
+				unfinished: 'unfinished'
+			};
+			this.selectedSubTabLabels = {
+				all: '全部审核',
+				unfinished: '最新发起'
+			};
+			this.popShow = false;
+			this.showSubTabPopup = false;
+			// 切换标签仅切换展示数据
+				this.pageNum = 1
+				this.auditList = []
 				this.loadData()
-			},
-			getAuditNameDisplay(auditName) {
-				if (!auditName) return '未设置'
-				switch (auditName) {
-					case '完成任务审核':
-						return '"完成任务"审核'
-					case '定级审核':
-						return '"讲者定级"审核'
-					default:
-						// 对于其他审核类型,在最开始和审核前都加双引号
-						const prefix = auditName.replace('审核', '')
-						return '"' + prefix + '"审核'
-				}
-			},
-			handleShare(item) {
-				uni.showToast({
-					title: '分享功能待实现',
-					icon: 'none'
-				})
-			},
-			handleSearchInput() {
-				// 初次进入时不触发重新加载,避免重复请求
-				if (this.isInitializing) return;
-				// 防抖处理,避免频繁请求
-				if (this.searchTimer) {
-					clearTimeout(this.searchTimer)
-				}
+			this.pendingCount()
+		},
+		closeFilter() {
+			this.showFilter = false
+		},
+		resetFilters() {
+			this.filters = {
+				applyTimeStart: '',
+				applyTimeEnd: '',
+				finishTimeStart: '',
+				finishTimeEnd: '',
+				auditTimeStart: '',
+				auditTimeEnd: '',
+				taskBelong: 'my',
+				finishStatus: '',
+				belongType: ''
+			}
+		},
+		confirmFilters() {
+			this.showFilter = false
+			console.log('筛选条件:', this.filters)
+			// 筛选后重新加载数据
+			this.loadData()
+		},
+		getAuditNameDisplay(auditName) {
+			if (!auditName) return '未设置'
+			switch (auditName) {
+				case '完成任务审核':
+					return '"完成任务"审核'
+				case '定级审核':
+					return '"讲者定级"审核'
+				default:
+					// 对于其他审核类型,在最开始和审核前都加双引号
+					const prefix = auditName.replace('审核', '')
+					return '"' + prefix + '"审核'
+			}
+		},
+		handleShare(item) {
+			uni.showToast({
+				title: '分享功能待实现',
+				icon: 'none'
+			})
+		},
+		handleSearchInput() {
+			// 初次进入时不触发重新加载,避免重复请求
+			if (this.isInitializing) return;
+			// 防抖处理,避免频繁请求
+			if (this.searchTimer) {
+				clearTimeout(this.searchTimer)
+			}
+			this.searchTimer = setTimeout(async () => {
+				if (this.searchKeywords.trim()) {
+					try {
+						const base = this.buildQueryParams()
+						const res = await getPendingAuditList({
+							...base,
+							keywords: this.searchKeywords.trim(),
+							pageNum: 1,
+							pageSize: 10
+						})
 
-				this.searchTimer = setTimeout(async () => {
-					if (this.searchKeywords.trim()) {
-						try {
-							// 调用搜索发起人接口
-							const res = await searchCompanyUser({
-								keywords: this.searchKeywords.trim(),
-								pageNum: 1,
-								pageSize: 10
-							})
-
-							if (res.code === 200 && res.rows) {
-								// 根据当前标签页更新对应列表
-								if (this.currentTopTab === 0) {
-									this.todoList = res.rows.map(item => ({
-										auditName: item.auditName || '未知审核',
-										statusText: '待审核',
-										statusClass: 'status-createPending',
-										id: item.id,
-										status: item.status,
-										auditType: item.auditType,
-										businessId: item.businessId,
-										businessType: item.businessType,
-										createTime: item.createTime,
-										initiatorName: item.initiatorName
-									}))
-								} else if (this.currentTopTab === 1) {
-									this.doneList = res.rows.map(item => ({
-										auditName: item.auditName || '未知审核',
-										statusText: item.status === 1 ? '已通过' : '已驳回',
-										statusClass: item.status === 1 ? 'status-finish' :
-											'status-rejected',
-										id: item.id,
-										status: item.status,
-										auditType: item.auditType,
-										businessId: item.businessId,
-										businessType: item.businessType,
-										createTime: item.createTime,
-										initiatorName: item.initiatorName
-									}))
-								} else if (this.currentTopTab === 2) {
-									this.myInitiateList = res.rows.map(item => ({
-										auditName: item.auditName || '未知审核',
-										statusText: '待审核',
-										statusClass: 'status-createPending',
-										id: item.id,
-										status: item.status,
-										auditType: item.auditType,
-										businessId: item.businessId,
-										businessType: item.businessType,
-										createTime: item.createTime,
-										initiatorName: item.initiatorName
-									}))
-								}
-							} else {
-								// 搜索结果为空,清空对应列表
-								if (this.currentTopTab === 0) {
-									this.todoList = []
-								} else if (this.currentTopTab === 1) {
-									this.doneList = []
-								} else if (this.currentTopTab === 2) {
-									this.myInitiateList = []
-								}
-							}
-						} catch (e) {
-							console.error('搜索失败', e)
-							uni.showToast({
-								title: '搜索失败',
-								icon: 'none'
-							})
-						}
-					} else {
-						// 搜索框为空,重新加载默认数据
-						if (this.hasLoadedOnce) {
-							this.loadData()
+						if (res.code === 200) {
+							this.auditList = res.row || [];
+							console.log("搜索")
+						} else {
+							// 搜索结果为空,清空对应列表
+							this.auditList = []
 						}
-					}
-				}, 300)
-			},
-			// 加载审批数据
-			async loadData() {
-				try {
-					const userInfoStr = uni.getStorageSync('userInfo')
-					const userInfo = userInfoStr ? (typeof userInfoStr === 'string' ? JSON.parse(userInfoStr) :
-						userInfoStr) : {}
-					// 一次请求获取全部列表与badge
-					const params = {
-						initiatorName: userInfo.nickName || '',
-						initiatorPhone: userInfo.phone || '',
-						userId: userInfo.userId || '',
-						companyId: userInfo.companyId || 0
-					}
-					const res = await getPendingAuditList(params)
-					if (res.code === 200 && res.data) {
-						const map = res.data.map || {}
-						// 更新badge
-						this.topTabs[0].badge = res.data.pendingDataCount || 0
-						this.topTabs[1].badge = res.data.completedDataCount || 0
-						this.topTabs[2].badge = res.data.myInitiationsCount || 0
-
-						// 标准化映射函数
-						const mapPending = (arr = []) => arr.map(item => ({
-							auditName: item.auditName || '未知审核',
-							statusText: '待审核',
-							statusClass: 'status-createPending',
-							id: item.id,
-							status: item.status,
-							auditType: item.auditType,
-							businessId: item.businessId,
-							businessType: item.businessType,
-							createTime: item.createTime,
-							initiatorName: item.initiatorName
-						}))
-						const mapCompleted = (arr = []) => arr.map(item => ({
-							auditName: item.auditName || '未知审核',
-							statusText: item.status === 1 ? '已通过' : '已驳回',
-							statusClass: item.status === 1 ? 'status-finish' : 'status-rejected',
-							id: item.id,
-							status: item.status,
-							auditType: item.auditType,
-							businessId: item.businessId,
-							businessType: item.businessType,
-							createTime: item.createTime,
-							initiatorName: item.initiatorName
-						}))
-						const mapMyInitiations = (arr = []) => arr.map(item => ({
-							auditName: item.auditName || '未知审核',
-							statusText: '待审核',
-							statusClass: 'status-createPending',
-							id: item.id,
-							status: item.status,
-							auditType: item.auditType,
-							businessId: item.businessId,
-							businessType: item.businessType,
-							createTime: item.createTime,
-							initiatorName: item.initiatorName
-						}))
-
-						// 更新三个列表
-						this.loading.todo = true
-						this.loading.done = true
-						this.loading.myInitiate = true
-						const pendingRaw = map.pendingData || map['pendingData'] || map['pendingData '] || []
-						const completedRaw = map.completedData || map['completedData'] || map['completedData '] || []
-						const myInitiationsRaw = map.myInitiations || map['myInitiations'] || map['myInitiations '] || []
-						this.todoList = mapPending(pendingRaw)
-						this.doneList = mapCompleted(completedRaw)
-						this.myInitiateList = mapMyInitiations(myInitiationsRaw)
-						this.loading.todo = false
-						this.loading.done = false
-						this.loading.myInitiate = false
-						this.hasLoadedOnce = true
-						this.isInitializing = false
-					} else {
+					} catch (e) {
+						console.error('搜索失败', e)
 						uni.showToast({
-							title: '获取审核列表失败',
+							title: '搜索失败',
 							icon: 'none'
 						})
-						this.isInitializing = false
 					}
-				} catch (e) {
-					console.error('加载数据失败', e)
-					uni.showToast({
-						title: '加载数据失败',
-						icon: 'none'
-					})
-					// 重置加载状态
-					this.loading.todo = false
-					this.loading.done = false
-					this.loading.myInitiate = false
-					this.isInitializing = false
+				} else {
+					// 搜索框为空,重新加载默认数据
+					if (this.hasLoadedOnce) {
+						this.fetchAll()
+					}
 				}
-			},
-			// 格式化时间
-			formatTime(timeStr) {
-				if (!timeStr) return ''
-				const date = new Date(timeStr)
-				const year = date.getFullYear()
-				const month = String(date.getMonth() + 1).padStart(2, '0')
-				const day = String(date.getDate()).padStart(2, '0')
-				const hours = String(date.getHours()).padStart(2, '0')
-				const minutes = String(date.getMinutes()).padStart(2, '0')
-				return `${year}-${month}-${day} ${hours}:${minutes}`
-			},
-			getBusinessTypeLabel(businessType) {
-				if (!businessType || !this.processTemplate) {
-					return '未设置'
+			}, 300)
+		},
+		// 加载审批数据
+		async loadData() {
+			try {
+				// 初始化分页
+				if (typeof this.pageNum === 'undefined') {
+					this.pageNum = 1
+					this.pageSize = 10
 				}
-				const dictItem = this.processTemplate.find(item => item.dictValue === businessType)
-				return dictItem ? dictItem.dictLabel : businessType
+				await this.fetchAll()
+			} catch (e) {
+				uni.showToast({ title: '加载数据失败', icon: 'none' })
+				this.isInitializing = false
 			}
+		},
+		// 格式化时间
+		formatTime(timeStr) {
+			if (!timeStr) return ''
+			const normalized = typeof timeStr === 'string'
+				? timeStr.replace(/-/g, '/').replace('T', ' ')
+				: timeStr
+			const date = new Date(normalized)
+			const year = date.getFullYear()
+			const month = String(date.getMonth() + 1).padStart(2, '0')
+			const day = String(date.getDate()).padStart(2, '0')
+			const hours = String(date.getHours()).padStart(2, '0')
+			const minutes = String(date.getMinutes()).padStart(2, '0')
+			return `${year}-${month}-${day} ${hours}:${minutes}`
+		},
+		getBusinessTypeLabel(businessType) {
+			if (!businessType || !this.processTemplate) {
+				return '未设置'
+			}
+			const dictItem = this.processTemplate.find(item => item.dictValue === businessType)
+			return dictItem ? dictItem.dictLabel : businessType
 		}
 	}
+}
 </script>
 <style lang="scss" scoped>
-	.container {
-		min-height: 100vh;
-		background: #F7F8FA;
+.container {
+	min-height: 100vh;
+	background: #F7F8FA;
+	position: relative;
+
+	// 搜索栏
+	.top-box {
+		padding: 20rpx 32rpx;
+		display: flex;
+		align-items: center;
+		background: #fff;
 		position: relative;
+		z-index: 101;
 
-		// 搜索栏
-		.top-box {
-			padding: 20rpx 32rpx;
+		.input-item {
 			display: flex;
 			align-items: center;
-			background: #fff;
-			position: relative;
-			z-index: 101;
+			flex: 1;
+			height: 72rpx;
+			background: #F7F8FA;
+			border-radius: 38rpx;
+
+			.search-icon {
+				width: 26rpx;
+				height: 26rpx;
+				margin: 0 10rpx 0 28rpx;
+			}
 
-			.input-item {
-				display: flex;
-				align-items: center;
+			input {
 				flex: 1;
-				height: 72rpx;
-				background: #F7F8FA;
-				border-radius: 38rpx;
-
-				.search-icon {
-					width: 26rpx;
-					height: 26rpx;
-					margin: 0 10rpx 0 28rpx;
-				}
+				font-size: 28rpx;
+				color: #333;
+			}
+		}
+	}
 
-				input {
-					flex: 1;
-					font-size: 28rpx;
-					color: #333;
+	// 顶部选项卡
+	.top-tabs {
+		display: flex;
+		background: #fff;
+		position: relative;
+		z-index: 101;
+
+		.top-tab-item {
+			flex: 1;
+			text-align: center;
+			padding: 24rpx 0;
+			font-size: 28rpx;
+			color: #999;
+			transition: all 0.2s;
+
+			&.active {
+				color: #333;
+				font-weight: 500;
+				position: relative;
+
+				&::after {
+					content: '';
+					position: absolute;
+					bottom: 0;
+					left: 50%;
+					transform: translateX(-50%);
+					border-radius: 3rpx;
+					width: 80rpx;
+					height: 6rpx;
+					background: #388BFF;
 				}
 			}
 		}
+	}
 
-		// 顶部选项卡
-		.top-tabs {
+	// 核心修改:子标签容器(定位参考)
+	.sub-tabs-wrapper {
+		position: relative; // 作为popup-box的定位参考
+		z-index: 101; // 确保在遮罩层之上
+
+		// 子标签栏
+		.sub-tabs {
 			display: flex;
+			justify-content: space-between;
 			background: #fff;
-			position: relative;
-			z-index: 101;
+			padding: 16rpx 32rpx;
+			gap: 24rpx;
 
-			.top-tab-item {
+			.sub-tab-item {
 				flex: 1;
-				text-align: center;
-				padding: 24rpx 0;
+				height: 64rpx;
+				display: flex;
+				border-radius: 70rpx;
+				border: 2rpx solid #F2F2F2;
+				justify-content: center;
+				align-items: center;
 				font-size: 28rpx;
-				color: #999;
+				color: #666;
 				transition: all 0.2s;
 
-				&.active {
-					color: #333;
-					font-weight: 500;
-					position: relative;
-
-					&::after {
-						content: '';
-						position: absolute;
-						bottom: 0;
-						left: 50%;
-						transform: translateX(-50%);
-						border-radius: 3rpx;
-						width: 80rpx;
-						height: 6rpx;
-						background: #388BFF;
-					}
+				.icon {
+					width: 28rpx;
+					height: 28rpx;
+					margin-left: 12rpx;
 				}
 			}
 		}
+	}
 
-		// 核心修改:子标签容器(定位参考)
-		.sub-tabs-wrapper {
-			position: relative; // 作为popup-box的定位参考
-			z-index: 101; // 确保在遮罩层之上
+	/* 子标签弹窗样式 */
+	.sub-tab-popup-overlay {
+		position: absolute;
+		top: 100%;
+		height: 100vh;
+		left: 0;
+		right: 0;
+		bottom: -1000rpx;
+		background: rgba(0, 0, 0, 0.5);
+		z-index: 8;
+	}
 
-			// 子标签栏
-			.sub-tabs {
-				display: flex;
-				justify-content: space-between;
-				background: #fff;
-				padding: 16rpx 32rpx;
-				gap: 24rpx;
+	.sub-tab-popup {
+		position: absolute;
+		top: 100%;
+		left: 0;
+		right: 0;
+		background: #fff;
+		border-radius: 0;
+		padding: 32rpx;
+		width: 100%;
+		box-sizing: border-box;
+		box-shadow: none;
+		z-index: 9;
+	}
 
-				.sub-tab-item {
-					flex: 1;
-					height: 64rpx;
-					display: flex;
-					border-radius: 70rpx;
-					border: 2rpx solid #F2F2F2;
-					justify-content: center;
-					align-items: center;
-					font-size: 28rpx;
-					color: #666;
-					transition: all 0.2s;
+	.sub-tab-options {
+		display: flex;
+		flex-wrap: wrap;
+		gap: 24rpx;
+		border-radius: 70rpx 70rpx 70rpx 70rpx;
+		justify-content: flex-start;
+	}
 
-					.icon {
-						width: 28rpx;
-						height: 28rpx;
-						margin-left: 12rpx;
-					}
-				}
-			}
+	.sub-tab-option {
+		padding: 24rpx 14rpx;
+		border-radius: 70rpx;
+		font-size: 28rpx;
+		color: #666666;
+		background: #ffffff;
+		border: 1rpx solid #e8e8e8;
+		transition: all 0.2s ease;
+		text-align: center;
+		min-width: 214rpx;
+		box-sizing: border-box;
+
+		&.active {
+			background: rgba(56, 139, 255, 0.15);
+			color: #ffffff;
+			color: #388BFF;
+			border: 1rpx solid #388BFF;
 		}
+	}
 
-		/* 子标签弹窗样式 */
-		.sub-tab-popup-overlay {
-			position: absolute;
-			top: 100%;
-			height: 100vh;
-			left: 0;
-			right: 0;
-			bottom: -1000rpx;
-			background: rgba(0, 0, 0, 0.5);
-			z-index: 8;
-		}
+	// 列表区域
+	.content {
+		padding: 24rpx;
+		box-sizing: border-box;
+		min-height: calc(100vh - 300rpx);
+		position: relative;
+		z-index: 98; // 低于遮罩层
 
-		.sub-tab-popup {
-			position: absolute;
-			top: 100%;
-			left: 0;
-			right: 0;
+		.task-card {
 			background: #fff;
-			border-radius: 0;
-			padding: 32rpx;
-			width: 100%;
-			box-sizing: border-box;
-			box-shadow: none;
-			z-index: 9;
-		}
+			border-radius: 24rpx;
+			margin-bottom: 20rpx;
+			border: 2rpx solid #E9F2FF;
+			position: relative;
+			padding-bottom: 24rpx;
 
-		.sub-tab-options {
-			display: flex;
-			flex-wrap: wrap;
-			gap: 24rpx;
-			border-radius: 70rpx 70rpx 70rpx 70rpx;
-			justify-content: flex-start;
-		}
+			.card-top {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				background: linear-gradient(90deg, #E8F1FF 0%, #FFFFFF 100%);
+				border-radius: 24rpx 24rpx 0 0;
+				padding: 26rpx 24rpx;
+				margin-bottom: 16rpx;
 
-		.sub-tab-option {
-			padding: 24rpx 14rpx;
-			border-radius: 70rpx;
-			font-size: 28rpx;
-			color: #666666;
-			background: #ffffff;
-			border: 1rpx solid #e8e8e8;
-			transition: all 0.2s ease;
-			text-align: center;
-			min-width: 214rpx;
-			box-sizing: border-box;
+				.card-task-title {
+					font-size: 32rpx;
+					font-weight: 600;
+					color: #333;
+				}
 
-			&.active {
-				background: rgba(56, 139, 255, 0.15);
-				color: #ffffff;
-				color: #388BFF;
-				border: 1rpx solid #388BFF;
-			}
-		}
+				.status-tag {
+					padding: 8rpx 16rpx;
+					border-radius: 20rpx;
+					font-size: 24rpx;
 
-		// 列表区域
-		.content {
-			padding: 24rpx;
-			box-sizing: border-box;
-			min-height: calc(100vh - 300rpx);
-			position: relative;
-			z-index: 98; // 低于遮罩层
+					&.status-wait {
+						background: #E3F2FD;
+						color: #2196F3;
+					}
 
-			.task-card {
-				background: #fff;
-				border-radius: 24rpx;
-				margin-bottom: 20rpx;
-				border: 2rpx solid #E9F2FF;
-				position: relative;
-				padding-bottom: 24rpx;
+					&.status-finish {
+						background: #E6FAEF;
+						color: #07C160;
+					}
 
-				.card-top {
-					display: flex;
-					justify-content: space-between;
-					align-items: center;
-					background: linear-gradient(90deg, #E8F1FF 0%, #FFFFFF 100%);
-					border-radius: 24rpx 24rpx 0 0;
-					padding: 26rpx 24rpx;
-					margin-bottom: 16rpx;
-
-					.card-task-title {
-						font-size: 32rpx;
-						font-weight: 600;
-						color: #333;
+					&.status-rejected {
+						background: #FFF4F5;
+						color: #CF3546;
 					}
 
-					.status-tag {
-						padding: 8rpx 16rpx;
-						border-radius: 20rpx;
-						font-size: 24rpx;
+					&.status-createPending {
+						background: #FFF8E6;
+						color: #FF9500;
+					}
+				}
+			}
 
-						&.status-wait {
-							background: #E3F2FD;
-							color: #2196F3;
-						}
+			.card-content {
+				padding: 0 24rpx;
 
-						&.status-finish {
-							background: #E6FAEF;
-							color: #07C160;
-						}
+				.time-info {
+					font-size: 28rpx;
+					color: #666;
+					display: flex;
+					flex-direction: column;
+					gap: 8rpx;
+					margin-bottom: 24rpx;
 
-						&.status-rejected {
-							background: #FFF4F5;
-							color: #CF3546;
-						}
+					.time-item {
+						display: flex;
+						font-size: 28rpx;
+						color: #333;
 
-						&.status-createPending {
-							background: #FFF8E6;
-							color: #FF9500;
+						.title {
+							color: #666;
 						}
 					}
 				}
 
-				.card-content {
-					padding: 0 24rpx;
+				.operate-btn-group {
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
 
-					.time-info {
+					.share-btn {
+						display: flex;
+						align-items: center;
 						font-size: 28rpx;
 						color: #666;
-						display: flex;
-						flex-direction: column;
-						gap: 8rpx;
-						margin-bottom: 24rpx;
 
-						.time-item {
-							display: flex;
-							font-size: 28rpx;
-							color: #333;
-
-							.title {
-								color: #666;
-							}
+						.share-icon {
+							width: 36rpx;
+							height: 36rpx;
+							margin-right: 8rpx;
 						}
 					}
 
-					.operate-btn-group {
-						display: flex;
-						align-items: center;
-						justify-content: space-between;
-
-						.share-btn {
-							display: flex;
-							align-items: center;
-							font-size: 28rpx;
-							color: #666;
-
-							.share-icon {
-								width: 36rpx;
-								height: 36rpx;
-								margin-right: 8rpx;
-							}
-						}
-
-						.date {
-							font-size: 24rpx;
-							color: #999;
-						}
+					.date {
+						font-size: 24rpx;
+						color: #999;
 					}
 				}
 			}
 		}
+	}
 
-		// 筛选弹窗
-		.filter-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: flex-end;
-
-			.filter-content {
-				width: 100%;
-				background: #fff;
-				border-radius: 24rpx 24rpx 0 0;
-				padding: 32rpx;
+	// 筛选弹窗
+	.filter-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: flex-end;
+
+		.filter-content {
+			width: 100%;
+			background: #fff;
+			border-radius: 24rpx 24rpx 0 0;
+			padding: 32rpx;
 
-				.filter-header {
-					display: flex;
-					align-items: center;
-					justify-content: center;
-					margin-bottom: 32rpx;
-					position: relative;
+			.filter-header {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				margin-bottom: 32rpx;
+				position: relative;
 
-					.filter-title {
-						font-size: 32rpx;
-						font-weight: bold;
-						color: #333;
-					}
+				.filter-title {
+					font-size: 32rpx;
+					font-weight: bold;
+					color: #333;
+				}
 
-					.filter-close-btn {
-						position: absolute;
-						right: 0;
-						width: 44rpx;
-						height: 44rpx;
-					}
+				.filter-close-btn {
+					position: absolute;
+					right: 0;
+					width: 44rpx;
+					height: 44rpx;
 				}
+			}
 
-				.filter-form {
-					padding: 0 0 24rpx 0;
+			.filter-form {
+				padding: 0 0 24rpx 0;
 
-					.filter-section {
-						margin-bottom: 32rpx;
+				.filter-section {
+					margin-bottom: 32rpx;
 
-						.section-label {
-							font-weight: 500;
-							font-size: 28rpx;
+					.section-label {
+						font-weight: 500;
+						font-size: 28rpx;
+						color: #333;
+						margin-bottom: 24rpx;
+					}
+
+					.time-range {
+						display: flex;
+						align-items: center;
+						gap: 16rpx;
+
+						.time-input {
+							flex: 1;
+							height: 72rpx;
+							text-align: center;
+							background: #F7F8FA;
+							border-radius: 8rpx;
+							padding: 0 16rpx;
+							font-size: 26rpx;
 							color: #333;
-							margin-bottom: 24rpx;
 						}
 
-						.time-range {
-							display: flex;
-							align-items: center;
-							gap: 16rpx;
-
-							.time-input {
-								flex: 1;
-								height: 72rpx;
-								text-align: center;
-								background: #F7F8FA;
-								border-radius: 8rpx;
-								padding: 0 16rpx;
-								font-size: 26rpx;
-								color: #333;
-							}
-
-							.time-separator {
-								font-size: 24rpx;
-								color: #999;
-							}
+						.time-separator {
+							font-size: 24rpx;
+							color: #999;
 						}
+					}
+
+					.btn-group {
+						display: flex;
+						gap: 16rpx;
+
+						.filter-btn {
+							width: 214rpx;
+							height: 72rpx;
+							background: #F7F8FA;
+							border-radius: 70rpx;
+							line-height: 72rpx;
+							text-align: center;
+							font-size: 28rpx;
+							transition: all 0.2s;
+							color: #333;
 
-						.btn-group {
-							display: flex;
-							gap: 16rpx;
-
-							.filter-btn {
-								width: 214rpx;
-								height: 72rpx;
-								background: #F7F8FA;
-								border-radius: 70rpx;
-								line-height: 72rpx;
-								text-align: center;
-								font-size: 28rpx;
-								transition: all 0.2s;
-								color: #333;
-
-								&.active {
-									background: rgba(56, 139, 255, 0.15);
-									color: #388BFF;
-								}
+							&.active {
+								background: rgba(56, 139, 255, 0.15);
+								color: #388BFF;
 							}
 						}
 					}
 				}
+			}
 
-				.filter-actions {
-					display: flex;
-					gap: 24rpx;
-					margin-top: 40rpx;
-
-					.reset-btn,
-					.confirm-btn {
-						flex: 1;
-						height: 80rpx;
-						line-height: 80rpx;
-						text-align: center;
-						border-radius: 200rpx;
-						font-size: 28rpx;
-						transition: all 0.2s;
-					}
+			.filter-actions {
+				display: flex;
+				gap: 24rpx;
+				margin-top: 40rpx;
+
+				.reset-btn,
+				.confirm-btn {
+					flex: 1;
+					height: 80rpx;
+					line-height: 80rpx;
+					text-align: center;
+					border-radius: 200rpx;
+					font-size: 28rpx;
+					transition: all 0.2s;
+				}
 
-					.reset-btn {
-						background: #fff;
-						color: #388BFF;
-						border: 2rpx solid #388BFF;
+				.reset-btn {
+					background: #fff;
+					color: #388BFF;
+					border: 2rpx solid #388BFF;
 
-						&:active {
-							background: #EBF3FF;
-						}
+					&:active {
+						background: #EBF3FF;
 					}
+				}
 
-					.confirm-btn {
-						background: #388BFF;
-						color: #fff;
+				.confirm-btn {
+					background: #388BFF;
+					color: #fff;
 
-						&:active {
-							background: #2A78E5;
-						}
+					&:active {
+						background: #2A78E5;
 					}
 				}
 			}
 		}
 	}
+}
 </style>

+ 342 - 277
pages_task/approvalTaskDetail.vue

@@ -10,8 +10,15 @@
 			<!-- 任务卡片 -->
 			<view class="task-card" v-if="auditData">
 				<view class="card-header">
-					<view class="card-title">{{ auditData.audit.auditName||'-' }}</view>
-					<view class="card-lable" :class="'pending'">待审核</view>
+					<view class="card-title">
+						{{ auditData.audit && auditData.audit.auditName ? auditData.audit.auditName : '-' }}</view>
+					<view class="card-lable" :class="'pending'" v-if="auditData.audit && auditData.audit.status==1">待审核
+					</view>
+					<view class="card-lable" :class="'pass'" v-if="auditData.audit && auditData.audit.status==2">审核通过
+					</view>
+					<view class="card-lable" :class="'reject'" v-if="auditData.audit && auditData.audit.status==3">已驳回
+					</view>
+
 				</view>
 				<view class="card-meta">
 					<view class="item">
@@ -30,39 +37,7 @@
 
 
 			<!-- 讲者审核详情 -->
-			<view class="info-section" v-if="auditData.audit.auditType=='ADUIT_JZSH'">
-				<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.businessData.doctorName||'-' }}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">账户身份</text>
-						<text class="info-value">{{ auditData.businessData.accountType=='0'?'医生':'药剂师' }}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">手机号码</text>
-						<text class="info-value">{{ auditData.businessData.mobile||'-' }}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">身份证号</text>
-						<text class="info-value">{{ auditData.businessData.idCard||'-'}}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">机构名称</text>
-						<text class="info-value">{{ auditData.businessData.institution||'-'}}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">注册时间</text>
-						<text class="info-value">{{ auditData.businessData. registerTime||'-'}}</text>
-					</view>
-				</view>
-			</view>
-			<view class="info-section" v-if="auditData.audit.auditType=='ADUIT_JZSH'">
+			<view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_JZSH'">
 				<view class="section-header">
 					<view class="section-indicator"></view>
 					<text class="section-title">基础信息</text>
@@ -94,7 +69,7 @@
 					</view>
 				</view>
 			</view>
-			<view class="info-section" v-if="auditData.audit.auditType=='ADUIT_JZSH'">
+			<view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_JZSH'">
 				<view class="section-header">
 					<view class="section-indicator"></view>
 					<text class="section-title">执业信息</text>
@@ -102,14 +77,15 @@
 				<view class="info-list">
 					<view class="info-item">
 						<text class="info-label">地址(省市区)</text>
-						<text
-							class="info-value">{{ auditData.businessData.province||'-' }} {{ auditData.businessData.city||'-' }} {{ auditData.businessData.district||'-' }}</text>	
+						<text class="info-value">{{ auditData.businessData.provinceName||'-' }}
+							{{ auditData.businessData.cityName||'-' }}
+							{{ auditData.businessData.districtName||'-' }}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">公司名称</text>
+						<text class="info-value">{{ auditData.businessData.companyName||'-'}}</text>
 					</view>
 					<view class="info-item">
-						<view class="info-item">
-							<text class="info-label">公司名称</text>
-							<text class="info-value">{{ auditData.businessData.companyName||'-'}}</text>
-						</view>
 						<text class="info-label">科室</text>
 						<text class="info-value">{{ auditData.businessData.department||'-'}}</text>
 					</view>
@@ -127,34 +103,32 @@
 					</view>
 				</view>
 			</view>
-			<view class="info-section" v-if="auditData.audit.auditType=='ADUIT_JZSH'">
+			<view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_JZSH'">
 				<view class="section-header">
 					<view class="section-indicator"></view>
 					<text class="section-title">资质信息</text>
 				</view>
 				<view class="qualification-list">
-					<view class="qualification-item" v-if="auditData.businessData.licenseImage||''">
+					<view class="qualification-item">
 						<text class="qualification-label">执业证图片</text>
-						<view class="image-grid">
-							<image class="qualification-image" :src="  auditData.businessData.licenseImage"
-								@click="showImagePreview(auditData.businessData.licenseImage)"></image>
+						<view class="image-grid" v-if="imageList('licenseImage').length">
+							<image v-for="(url, idx) in imageList('licenseImage')" :key="idx"
+								class="qualification-image" :src="url" @click="showImagePreview(url)"></image>
 						</view>
 					</view>
-					<view class="qualification-item" v-if="auditData.businessData.titleCertImage||''">
+					<view class="qualification-item">
 						<text class="qualification-label">职称证/工牌图片</text>
-						<view class="image-grid">
-							<image class="qualification-image" :src="auditData.businessData.titleCertImage||''"
-								@click="showImagePreview(auditData.businessData.titleCertImage||'')"></image>
+						<view class="image-grid" v-if="imageList('titleCertImage').length">
+							<image v-for="(url, idx) in imageList('titleCertImage')" :key="idx"
+								class="qualification-image" :src="url" @click="showImagePreview(url)"></image>
 						</view>
 					</view>
 				</view>
 			</view>
 
 
-
-
 			<!-- 提现审核详情 -->
-			<view class="info-section" v-if="auditData.audit.auditType=='ADUIT_TXSH'">
+			<view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_TXSH'">
 				<view class="section-header">
 					<view class="section-indicator"></view>
 					<text class="section-title">基础信息</text>
@@ -170,15 +144,15 @@
 					</view>
 				</view>
 			</view>
-			<view class="info-section" v-if="auditData.audit.auditType=='ADUIT_TXSH'">
+			<view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_TXSH'">
 				<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.businessData.pointsAmount||'-'}}</text>
+						<text class="info-label">提现积分数量</text>
+						<text class="info-value">{{ auditData.businessData.pointsAmount||'-'}}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">提现金额(积分折算)</text>
@@ -234,7 +208,8 @@
 
 
 			<!-- 创建任务审核详情和完成任务审核-->
-			<view class="info-section" v-if="auditData.audit.auditType=='ADUIT_WCRWS'||auditData.audit.auditType=='ADUIT_CJRW'">
+			<view class="info-section"
+				v-if="auditData.audit && (auditData.audit.auditType=='ADUIT_WCRWSH'||auditData.audit.auditType=='ADUIT_CJRW')">
 				<view class="section-header">
 					<view class="section-indicator"></view>
 					<text class="section-title">基础信息</text>
@@ -250,16 +225,14 @@
 					</view>
 				</view>
 			</view>
-			<view class="info-section" v-if="auditData.audit.auditType=='ADUIT_WCRWS'||auditData.audit.auditType=='ADUIT_CJRW'">
+			<view class="info-section"
+				v-if="auditData.audit && (auditData.audit.auditType=='ADUIT_WCRWSH'||auditData.audit.auditType=='ADUIT_CJRW')">
 				<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">费用分摊ID</text>
-							<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.costShareId||'-'}}</text>
-					</view> -->
+
 					<view class="info-item">
 						<text class="info-label">费用分摊名字</text>
 						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.costShareName||'-'}}</text>
@@ -272,18 +245,12 @@
 						<text class="info-label">任务数量</text>
 						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskCount||'-'}}</text>
 					</view>
-					<!-- <view class="info-item">
-						<text class="info-label">任务单位(字典ID)</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskUnit||'-'}}</text>
-					</view> -->
+
 					<view class="info-item">
 						<text class="info-label">任务单位名称</text>
 						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskUnitName||'-'}}</text>
 					</view>
-					<!-- <view class="info-item">
-						<text class="info-label">归属类型(字典ID)</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.belongType||'-'}}</text>
-					</view> -->
+
 					<view class="info-item">
 						<text class="info-label">归属名字</text>
 						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.belongTypeName||'-'}}</text>
@@ -318,13 +285,15 @@
 					</view>
 					<view class="info-item">
 						<text class="info-label">交付物审核时间</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.deliveryAuditTime||'-'}}</text>
+						<text
+							class="info-value">{{ auditData.businessData.auditTaskInfoVO.deliveryAuditTime||'-'}}</text>
 					</view>
 				</view>
 			</view>
 
 			<!-- 长视频信息 -->
-            <view class="info-section" v-if="auditData.audit.auditType=='ADUIT_WCRWS'||auditData.audit.auditType=='ADUIT_CJRW'">
+			<view class="info-section"
+				v-if="auditData.audit && auditData.audit.auditType=='ADUIT_WCRWSH' && auditData.businessData && auditData.businessData.auditTaskInfoVO && auditData.businessData.auditTaskInfoVO.taskType==6">
 				<view class="section-header">
 					<view class="section-indicator"></view>
 					<text class="section-title">长视频信息</text>
@@ -332,39 +301,53 @@
 				<view class="info-list">
 					<view class="info-item">
 						<text class="info-label">项目名称/视频标题</text>
-						<text class="info-value">{{ auditData.businessData.projectVO.title ||'-'}}</text>
+						<text class="info-value">{{ auditData.businessData.ctLongVideo.title ||'-'}}</text>
 					</view>
+
 					<view class="info-item">
 						<text class="info-label">是否原创</text>
-						<text class="info-value">{{auditData.businessData.projectVO.isOriginal==0?'否':'是'||'-'}}</text>
+						<text
+							class="info-value">{{auditData.businessData.ctLongVideo.isOriginal==0?'否':'是'||'-'}}</text>
 					</view>
 					<view class="qualification-list">
 						<view class="qualification-item">
 							<text class="qualification-label">封面图URL</text>
-							<view class="image-grid" v-if="auditData.businessData.projectVO.coverUrl||''">
-								<image class="qualification-image" :src="  auditData.businessData.projectVO.coverUrl||''"
-									@click="showImagePreview(auditData.businessData.projectVO.coverUrl||'')"></image>
+							<view class="image-grid" v-if="auditData.businessData.ctLongVideo.coverUrl||''">
+								<image class="qualification-image"
+									:src="auditData.businessData.ctLongVideo.coverUrl||''"
+									@click="showImagePreview(auditData.businessData.ctLongVideo.coverUrl||'')"></image>
 							</view>
 						</view>
 					</view>
 					<view class="info-item">
 						<text class="info-label">摘要</text>
-						<text class="info-value">{{auditData.businessData.projectVO.summary||'-'}}</text>
+						<text class="info-value">{{ auditData.businessData.ctLongVideo.summary ||'-'}}</text>
 					</view>
-					<view class="qualification-list">
+					<!-- <view class="info-item">
+						<video class="info-value" :src="auditData.businessData.ctLongVideo.videoUrl||''" controls></video>
+					</view> -->
+					<view class="info-item">
+						<text class="info-label">视频附件URL</text>
+						<text class="info-value link"
+							v-if="auditData.businessData.ctLongVideo && auditData.businessData.ctLongVideo.videoUrl"
+							@click="openUrl(auditData.businessData.ctLongVideo.videoUrl)">{{ auditData.businessData.ctLongVideo.videoUrl }}</text>
+						<text class="info-value" v-else>-</text>
+					</view>
+					<!-- <view class="qualification-list">
 						<view class="qualification-item">
 							<text class="qualification-label">视频附件URL</text>
-							<view class="image-grid" v-if="auditData.businessData.projectVO.videoUrl||''">
-								<image class="qualification-image" :src="  auditData.businessData.projectVO.videoUrl||''"
-									@click="showImagePreview(auditData.businessData.projectVO.videoUrl||'')"></image>
+							<view class="image-grid" v-if="auditData.businessData.ctLongVideo.videoUrl||''">
+								<image class="qualification-image" :src="  auditData.businessData.ctLongVideo.videoUrl||''"
+									@click="showImagePreview(auditData.businessData.ctLongVideo.videoUrl||'')"></image>
 							</view>
 						</view>
-					</view>
+					</view> -->
 				</view>
 			</view>
 
 			<!-- 短视频 -->
-            <view class="info-section" v-if="auditData.audit.auditType=='ADUIT_WCRWS'||auditData.audit.auditType=='ADUIT_CJRW'">
+			<view class="info-section"
+				v-if="auditData.audit && auditData.audit.auditType=='ADUIT_WCRWSH' && auditData.businessData && auditData.businessData.auditTaskInfoVO && auditData.businessData.auditTaskInfoVO.taskType==5">
 				<view class="section-header">
 					<view class="section-indicator"></view>
 					<text class="section-title">短视频信息</text>
@@ -372,46 +355,112 @@
 				<view class="info-list">
 					<view class="info-item">
 						<text class="info-label">项目名称/视频标题</text>
-						<text class="info-value">{{ auditData.businessData.projectVO.title ||'-'}}</text>
+						<text class="info-value">{{ auditData.businessData.ctShortVideo.title ||'-'}}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">是否原创</text>
-						<text class="info-value">{{auditData.businessData.projectVO.isOriginal==0?'否':'是'||'-'}}</text>
+						<text
+							class="info-value">{{auditData.businessData.ctShortVideo.isOriginal==0?'否':'是'||'-'}}</text>
 					</view>
 					<view class="qualification-list">
 						<view class="qualification-item">
 							<text class="qualification-label">封面图URL</text>
-							<view class="image-grid" v-if="auditData.businessData.projectVO.coverUrl||''">
-								<image class="qualification-image" :src="  auditData.businessData.projectVO.coverUrl||''"
-									@click="showImagePreview(auditData.businessData.projectVO.coverUrl||'')"></image>
+							<view class="image-grid" v-if="auditData.businessData.ctShortVideo.coverUrl||''">
+								<image class="qualification-image"
+									:src="  auditData.businessData.ctShortVideo.coverUrl||''"
+									@click="showImagePreview(auditData.businessData.ctShortVideo.coverUrl||'')"></image>
 							</view>
 						</view>
 					</view>
 					<view class="info-item">
 						<text class="info-label">摘要</text>
-						<text class="info-value">{{auditData.businessData.projectVO.summary||'-'}}</text>
+						<text class="info-value">{{auditData.businessData.ctShortVideo.summary||'-'}}</text>
 					</view>
-					<view class="qualification-list">
+					<view class="info-item">
+						<text class="info-label">视频附件URL</text>
+						<text class="info-value link"
+							v-if="auditData.businessData.ctShortVideo && auditData.businessData.ctShortVideo.videoUrl"
+							@click="openUrl(auditData.businessData.ctShortVideo.videoUrl)">{{ auditData.businessData.ctShortVideo.videoUrl }}</text>
+						<text class="info-value" v-else>-</text>
+					</view>
+
+					<!-- <view class="qualification-list">
 						<view class="qualification-item">
 							<text class="qualification-label">视频附件URL</text>
-							<view class="image-grid" v-if="auditData.businessData.projectVO.videoUrl||''">
-								<image class="qualification-image" :src="  auditData.businessData.projectVO.videoUrl||''"
-									@click="showImagePreview(auditData.businessData.projectVO.videoUrl||'')"></image>
+							<view class="image-grid" v-if="auditData.businessData.ctShortVideo.videoUrl||''">
+								<image class="qualification-image" :src="  auditData.businessData.ctShortVideo.videoUrl||''"
+									@click="showImagePreview(auditData.businessData.ctShortVideo.videoUrl||'')"></image>
 							</view>
 						</view>
-					</view>
+					</view> -->
 					<view class="info-item">
 						<text class="info-label">上下架状态</text>
-						<text class="info-value">{{auditData.businessData.projectVO.status==0?'上架':'下架'||'-'}}</text>
+						<text class="info-value">{{auditData.businessData.ctShortVideo.status==0?'上架':'下架'||'-'}}</text>
 					</view>
 				</view>
 			</view>
 
+			<!-- 文章 -->
+			<view class="info-section"
+				v-if="auditData.audit && auditData.audit.auditType=='ADUIT_WCRWSH' && auditData.businessData && auditData.businessData.auditTaskInfoVO && auditData.businessData.auditTaskInfoVO.taskType==4">
+				<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.businessData.ctArticle.title ||'-'}}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">是否原创</text>
+						<text class="info-value">{{auditData.businessData.ctArticle.isOriginal==0?'否':'是'||'-'}}</text>
+					</view>
+					<view class="qualification-list">
+						<view class="qualification-item">
+							<text class="qualification-label">封面图URL</text>
+							<view class="image-grid" v-if="auditData.businessData.ctArticle.coverImage||''">
+								<image class="qualification-image"
+									:src="  auditData.businessData.ctArticle.coverImage||''"
+									@click="showImagePreview(auditData.businessData.ctArticle.coverImage||'')"></image>
+							</view>
+						</view>
+					</view>
+					<view class="info-item">
+						<text class="info-label">富文本</text>
+						<text class="info-value">{{auditData.businessData.ctArticle.content||'-'}}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">摘要</text>
+						<text class="info-value">{{auditData.businessData.ctArticle.summary||'-'}}</text>
+					</view>
+					<view class="info-item">
+						<text class="info-label">附件URL</text>
+						<text class="info-value link"
+							v-if="auditData.businessData.ctArticle && auditData.businessData.ctArticle.attachmentUrl"
+							@click="openUrl(auditData.businessData.ctArticle.attachmentUrl)">{{ auditData.businessData.ctArticle.attachmentUrl }}</text>
+						<text class="info-value" v-else>-</text>
+					</view>
+					<!-- <view class="qualification-list">
+						<view class="qualification-item">
+							<text class="qualification-label">附件URL</text>
+							<view class="image-grid" v-if="auditData.businessData.ctArticle.attachmentUrl||''">
+								<image class="qualification-image" :src="  auditData.businessData.ctArticle.attachmentUrl||''"
+									@click="showImagePreview(auditData.businessData.ctArticle.attachmentUrl||'')"></image>
+							</view>
+						</view>
+					</view> -->
+					<view class="info-item">
+						<text class="info-label">上下架状态</text>
+						<text class="info-value">{{auditData.businessData.ctArticle.status==0?'上架':'下架'||'-'}}</text>
+					</view>
+				</view>
+			</view>
 
 
 
 			<!-- 定级审核-->
-			<view class="info-section" v-if="auditData.audit.auditType=='ADUIT_DJSH'">
+			<view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_DJSH'">
 				<view class="section-header">
 					<view class="section-indicator"></view>
 					<text class="section-title">定级信息</text>
@@ -435,113 +484,27 @@
 					</view>
 					<view class="info-item">
 						<text class="info-label">申请级别</text>
-						<text class="info-value">{{ auditData.businessData.doctorLevelApplyVO.applyLevelName ||'-'}}</text>
+						<text
+							class="info-value">{{ auditData.businessData.doctorLevelApplyVO.applyLevelName ||'-'}}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">国际性期刊论文/著作数</text>
-						<text class="info-value">{{auditData.businessData.doctorLevelApplyVO.internationalPapers ||'-'}}</text>
+						<text
+							class="info-value">{{auditData.businessData.doctorLevelApplyVO.internationalPapers ||'-'}}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">全国性期刊论文/著作数</text>
-						<text class="info-value">{{auditData.businessData.doctorLevelApplyVO.nationalPapers ||'-'}}</text>
+						<text
+							class="info-value">{{auditData.businessData.doctorLevelApplyVO.nationalPapers ||'-'}}</text>
 					</view>
 					<view class="info-item">
 						<text class="info-label">临床工作经验年数</text>
-						<text class="info-value">{{auditData.businessData.doctorLevelApplyVO.clinicalExperienceYears ||'-'}}</text>
-					</view>
-				</view>
-			</view>
-			<view class="info-section" v-if="auditData.audit.auditType=='ADUIT_WCRWS'||auditData.audit.auditType=='ADUIT_CJRW'">
-				<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.businessData.auditTaskInfoVO.costShareName||'-'}}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">任务积分</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskIntegral||'-'}}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">任务数量</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskCount||'-'}}</text>
-					</view>
-					<!-- <view class="info-item">
-						<text class="info-label">任务单位(字典ID)</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskUnit||'-'}}</text>
-					</view> -->
-					<view class="info-item">
-						<text class="info-label">任务单位名称</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskUnitName||'-'}}</text>
-					</view>
-					<!-- <view class="info-item">
-						<text class="info-label">归属类型(字典ID)</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.belongType||'-'}}</text>
-					</view> -->
-					<view class="info-item">
-						<text class="info-label">归属名字</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.belongTypeName||'-'}}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">计划开始时间</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.planStartTime||'-'}}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">计划结束时间</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.planEndTime||'-'}}</text>
-					</view>
-					<!-- <view class="info-item">
-						<text class="info-label">归属项目ID</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.projectId||'-'}}</text>
-					</view> -->
-					<view class="info-item">
-						<text class="info-label">项目名称</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.projectName||'-'}}</text>
-					</view>
-					<!-- <view class="info-item">
-						<text class="info-label">医生id</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.doctorId||'-'}}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">归属部门ID</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.deptId||'-'}}</text>
-					</view> -->
-					<view class="info-item">
-						<text class="info-label">部门名称</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.deptName||'-'}}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">交付物审核时间</text>
-						<text class="info-value">{{ auditData.businessData.auditTaskInfoVO.deliveryAuditTime||'-'}}</text>
+						<text
+							class="info-value">{{auditData.businessData.doctorLevelApplyVO.clinicalExperienceYears ||'-'}}</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.audit.auditName }}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">任务类型</text>
-						<text class="info-value">{{ auditData.audit.auditType }}</text>
-					</view>
-					<view class="info-item">
-						<text class="info-label">归属部门</text>
-						<text class="info-value">{{ auditData.audit.deptName }}</text>
-					</view>
-				</view>
-			</view> -->
 			<!-- 项目信息 -->
 			<view class="info-section" v-if="auditData.projectVO">
 				<view class="section-header">
@@ -621,10 +584,12 @@
 								<view class="user-name">{{ item.auditUserName }}</view>
 								<view class="user-status"
 									:style="{ color: item.status ===2|| item.status ===0 ? '#4CAF50' : item.status === 1 ? '#FF9800' : '#F44336' }">
-									{{ item.statusName }}</view>
+									{{ item.statusName||'-' }}
+								</view>
+								<view class="approval-comment" v-if="item.comment">{{item.comment||'-'}}</view>
 							</view>
 						</view>
-						<text class="approval-time">{{ item.auditTime || '' }}</text>
+						<text class="approval-time">{{ item.auditTime || '-' }}</text>
 						<view class="approval-line" v-if="index < auditData.auditFlows.length - 1"></view>
 					</view>
 				</view>
@@ -638,7 +603,7 @@
 			</view>
 		</view>
 
-		<view class="bottom-bar" v-if="auditData.audit.status != 2">
+		<view class="bottom-bar" v-if="auditData.audit && auditData.audit.status === 1 && isUserInLatestAuditUsers()">
 			<view class="action-buttons">
 				<view class="btn btn-cancel" @click="openRejectPopup">
 					<image class="icon"
@@ -653,6 +618,7 @@
 			</view>
 		</view>
 
+
 		<!-- 驳回弹窗 -->
 		<u-popup :show="showRejectPopup" mode="bottom" round="24" z-index="9999999">
 			<view class="reject-popup-content">
@@ -694,11 +660,19 @@
 				// 驳回意见
 				rejectReason: '',
 				// 状态栏高度
-				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				statusBarHeight: (uni.getWindowInfo ? uni.getWindowInfo().statusBarHeight : (typeof wx !== 'undefined' &&
+					wx.getWindowInfo ? wx.getWindowInfo().statusBarHeight : (uni.getSystemInfoSync && uni
+						.getSystemInfoSync().statusBarHeight) || 0)),
 				// 任务ID
 				taskId: '',
-				// 接口返回的原始数据
-				auditData: null,
+				// 接口返回的原始数据(初始化为安全空对象,避免渲染期空指针)
+				auditData: {
+					audit: {},
+					businessData: {},
+					auditFlows: [],
+					projectVO: null,
+					docterVO: null
+				},
 				// 审批信息
 				approvalInfo: [],
 				// 图片预览
@@ -708,6 +682,9 @@
 					current: 0
 				}
 			}
+		},
+		computed: {
+
 		},
 		onLoad(options) {
 			if (options.taskId) {
@@ -716,6 +693,19 @@
 			}
 		},
 		methods: {
+			getStatusBarHeight() {
+				if (uni.getWindowInfo) return uni.getWindowInfo().statusBarHeight || 0
+				if (typeof wx !== 'undefined' && wx.getWindowInfo) return wx.getWindowInfo().statusBarHeight || 0
+				const info = uni.getSystemInfoSync && uni.getSystemInfoSync()
+				return (info && info.statusBarHeight) || 0
+			},
+			imageList(field) {
+				const b = (this.auditData && this.auditData.businessData) || {}
+				const v = b[field]
+				if (!v) return []
+				if (Array.isArray(v)) return v.filter(Boolean)
+				return String(v).split(',').map(s => String(s).trim().replace(/`/g, '')).filter(Boolean)
+			},
 			// 打开驳回弹窗
 			openRejectPopup() {
 				// 直接打开驳回弹窗
@@ -723,36 +713,36 @@
 			},
 			//动态表单
 			getFieldDisplay(label, isMultiple = false) {
-			      const apply = this.auditData.businessData.doctorLevelApplyVO;
-				  console.log(this.auditData,'apply')
-			      if (!apply || !apply.formJson || !apply.dynamicFormData) return '-';
-			
-			      let formJson = apply.formJson;
-			      if (typeof formJson === 'string') {
-			        try {
-			          formJson = JSON.parse(formJson);
-			        } catch (e) {
-			          return '-';
-			        }
-			      }
-			      const fields = formJson.fields || [];
-			      const field = fields.find(f => f.__config__.label === label);
-			      if (!field) return '-';
-			
-			      const vModel = field.__vModel__;
-			      let value = apply.dynamicFormData[vModel];
-			      if (value === null || value === undefined || value === '') return '-';
-			
-			      const options = field.__slot__?.options || [];
-			      const optionMap = new Map(options.map(opt => [String(opt.value), opt.label]));
-			
-			      if (isMultiple) {
-			        const values = String(value).split(',').filter(Boolean);
-			        return values.map(v => optionMap.get(v) || v).join('、');
-			      } else {
-			        return optionMap.get(String(value)) || value;
-			      }
-			    },
+				const apply = this.auditData.businessData.doctorLevelApplyVO;
+				console.log(this.auditData, 'apply')
+				if (!apply || !apply.formJson || !apply.dynamicFormData) return '-';
+
+				let formJson = apply.formJson;
+				if (typeof formJson === 'string') {
+					try {
+						formJson = JSON.parse(formJson);
+					} catch (e) {
+						return '-';
+					}
+				}
+				const fields = formJson.fields || [];
+				const field = fields.find(f => f.__config__.label === label);
+				if (!field) return '-';
+
+				const vModel = field.__vModel__;
+				let value = apply.dynamicFormData[vModel];
+				if (value === null || value === undefined || value === '') return '-';
+
+				const options = field.__slot__?.options || [];
+				const optionMap = new Map(options.map(opt => [String(opt.value), opt.label]));
+
+				if (isMultiple) {
+					const values = String(value).split(',').filter(Boolean);
+					return values.map(v => optionMap.get(v) || v).join('、');
+				} else {
+					return optionMap.get(String(value)) || value;
+				}
+			},
 			// 确认驳回
 			async handleConfirmReject() {
 				if (!this.rejectReason.trim()) {
@@ -772,18 +762,22 @@
 					const res = await doAudit({
 						auditId: this.taskId,
 						userId: this.userInfo.userId,
+						businessType: this.auditData.audit.businessType,
 						userType: 0,
 						action: 2,
 						comment: this.rejectReason,
-						companyId: this.userInfo.companyId
+						companyId: this.userInfo.companyId,
+						businessId: this.auditData.audit.businessId
 					})
 
 					uni.hideLoading()
 
 					if (res.code === 200) {
 						uni.showToast({
-							title: res.data.message,
-							icon: none
+							title: res.msg||res.message || '操作成功',
+							icon: 'none',
+							duration: 2000,
+							mask: true
 						})
 
 						// 关闭弹窗
@@ -791,20 +785,20 @@
 						// 重置输入
 						this.rejectReason = ''
 						// 重新加载数据
-						this.loadData()
+						setTimeout(() => {
+							this.loadData()
+						}, 2000)
+						this.goBack()
 					} else {
 						uni.showToast({
-							title: res.msg || '驳回失败',
+							title: res.message || res.msg || '操作失败',
 							icon: 'none'
 						})
 					}
 				} catch (e) {
 					uni.hideLoading()
 					console.error('驳回失败', e)
-					uni.showToast({
-						title: '驳回失败,请稍后重试',
-						icon: 'none'
-					})
+
 				}
 			},
 
@@ -819,34 +813,17 @@
 					uni.showLoading({
 						title: '加载中...'
 					})
-
-					// 获取审批流程信息
-					//         const auditFlowsRes = await getAuditFlows({
-					//   auditId: this.taskId,
-					//   userId: this.userInfo.userId,
-					//   userType: this.userInfo.userType,
-					//   action: 0,
-					//   comment: "comment_3498cb3111a7",
-					//   companyId: this.userInfo.companyId
-					// })
-					//         if (auditFlowsRes.code === 200) {
-					// 			console.log('审批流程信息:', auditFlowsRes.data)
-					//           this.approvalInfo = auditFlowsRes.data || []
-					//         }
-
 					// 获取任务完成审核信息
-					const taskFinishAuditRes = await detail({
+					const res = await detail({
 						auditId: this.taskId
 					})
-					if (taskFinishAuditRes.code === 200) {
-						// 直接保存接口返回的原始数据
-						console.log('任务完成审核信息:', taskFinishAuditRes.data)
-						this.auditData = taskFinishAuditRes.data
+					if (res.code === 200) {
+						this.auditData = res.data || {
+							audit: {},
+							businessData: {},
+							auditFlows: []
+						}
 					}
-
-					// 实际项目中替换为接口请求:const res = await getTaskDetail({ id: this.taskId })
-					// 这里模拟接口赋值
-
 					uni.hideLoading()
 				} catch (e) {
 					uni.hideLoading()
@@ -875,7 +852,7 @@
 				})
 				// 实际项目中添加下载逻辑:uni.downloadFile + uni.saveFile
 			},
-			
+
 			// 解析formJson数据
 			parseFormJson(formJson) {
 				try {
@@ -884,14 +861,14 @@
 					const parsed = typeof formJson === 'string' ? JSON.parse(formJson) : formJson;
 					const fields = parsed.fields || [];
 					const result = {};
-					
+
 					// 遍历所有字段,提取label和value
 					fields.forEach(field => {
 						const config = field.__config__;
 						const label = config.label;
 						const vModel = field.__vModel__;
 						const value = field[vModel];
-						
+
 						// 对于select类型的字段,可能需要根据value找到对应的label
 						if (field.options && Array.isArray(field.options)) {
 							const option = field.options.find(opt => opt.value === value);
@@ -900,7 +877,7 @@
 							result[label] = value;
 						}
 					});
-					
+
 					return result;
 				} catch (e) {
 					console.error('解析formJson失败:', e);
@@ -924,35 +901,37 @@
 					const res = await doAudit({
 						auditId: this.taskId,
 						userId: this.userInfo.userId,
+						businessType: this.auditData.audit.businessType,
 						userType: 0,
 						action: 1,
 						comment: "",
-						companyId: this.userInfo.companyId
+						companyId: this.userInfo.companyId,
+						businessId: this.auditData.audit.businessId
 					})
 
 					uni.hideLoading()
 
 					if (res.code === 200) {
 						uni.showToast({
-							title: res.data.message,
-							icon: none
+							title: res.message || res.msg || '操作成功',
+							icon: 'none',
+							duration: 2000,
+							mask: true
 						})
 
 						// 重新加载数据
-						this.loadData()
+						setTimeout(() => {
+							this.loadData()
+						}, 2000)
+						this.goBack()
 					} else {
 						uni.showToast({
-							title: res.msg || '审批通过失败',
+							title: res.message || res.msg || '操作失败',
 							icon: 'none'
 						})
 					}
 				} catch (e) {
-					uni.hideLoading()
-					console.error('审批通过失败', e)
-					uni.showToast({
-						title: '审批通过失败,请稍后重试',
-						icon: 'none'
-					})
+
 				}
 			},
 
@@ -968,6 +947,74 @@
 			// 关闭图片预览
 			closeImagePreview() {
 				this.imagePreview.show = false;
+			},
+			openUrl(url) {
+				if (!url) {
+					return
+				}
+				// #ifdef H5
+				window.open(url, '_blank')
+				// #endif
+
+				// #ifdef APP-PLUS
+				plus.runtime.openURL(url)
+				// #endif
+
+				// #ifdef MP-WEIXIN
+				this.copyToClipboard(url)
+				uni.showToast({
+					title: '链接已复制,可在浏览器打开',
+					icon: 'none'
+				})
+				// #endif
+			},
+			// 判断用户是否在最新的审核人中
+			isUserInLatestAuditUsers() {
+				try {
+					// 获取用户信息
+					const userInfo = uni.getStorageSync('userInfo');
+					if (!userInfo || !userInfo.userId) {
+						console.log('用户信息不存在或没有 userId');
+						return false;
+					}
+
+					const userId = userInfo.userId.toString();
+					console.log('当前用户 userId:', userId);
+
+					// 检查 auditData 和 auditFlows 是否存在且不为空
+					if (!this.auditData || !this.auditData.auditFlows || this.auditData.auditFlows.length === 0) {
+						console.log('auditData 或 auditFlows 不存在或为空');
+						return false;
+					}
+
+					// 获取 auditFlows 数组的最后一个项作为最新的审核步骤
+					const latestFlow = this.auditData.auditFlows[this.auditData.auditFlows.length - 1];
+					console.log('最新的审核步骤:', latestFlow);
+
+					// 检查最新步骤的审核人
+					if (latestFlow && latestFlow.auditUserIds) {
+						console.log('最新步骤的 auditUserIds:', latestFlow.auditUserIds);
+						// 解析 auditUserIds 字符串为数组
+						try {
+							const auditUserIds = JSON.parse(latestFlow.auditUserIds);
+							console.log('解析后的 auditUserIds:', auditUserIds);
+							if (Array.isArray(auditUserIds)) {
+							// 检查 userId 是否在最新的审核人中,转换类型以确保匹配
+							const result = auditUserIds.some(id => id.toString() === userId);
+							console.log('用户是否在最新审核人中:', result);
+							return result;
+						}
+						} catch (error) {
+							console.error('解析 auditUserIds 失败:', error);
+						}
+					}
+
+					console.log('用户不在最新审核人中');
+					return false;
+				} catch (error) {
+					console.error('判断用户是否在最新审核人中失败:', error);
+					return false;
+				}
 			}
 		}
 	}
@@ -1377,7 +1424,7 @@
 
 			.left {
 				display: flex;
-				align-items: center;
+				// align-items: center;
 
 				.avatar-box {
 					width: 80rpx;
@@ -1419,6 +1466,14 @@
 				color: #999;
 				margin-top: 4rpx;
 			}
+			.approval-comment{
+				margin-top: 14rpx;
+				width: 100%;
+				padding: 20rpx;
+				font-size: 28rpx;
+				background: #F7F8FA;
+				border-radius: 16rpx 16rpx 16rpx 16rpx;
+			}
 		}
 
 		.approval-line {
@@ -1521,6 +1576,16 @@
 		object-fit: contain;
 	}
 
+	.link {
+		color: #388BFF;
+		text-decoration: underline;
+		display: block;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		max-width: 100%;
+	}
+
 	.close-button {
 		position: absolute;
 		top: -60rpx;

+ 1 - 1
pages_task/completeTask.vue

@@ -373,7 +373,7 @@
 					} else {
 						uni.showToast({
 							icon: 'none',
-							title: res.msg || '提交失败'
+							title: res.msg || res.message
 						})
 					}
 				} catch (e) {

+ 1048 - 907
pages_task/createTask.vue

@@ -16,7 +16,7 @@
 						<text>任务归属</text>
 					</view>
 					<view class="form-input picker-input" :class="{ placeholder: !formData.deptId }"
-						@click="showPicker('任务归属',companyData)">
+						@click="showPicker('任务归属', companyData)">
 						{{ institutionDisplayText || '请选择任务归属' }}
 						<image class="icon"
 							src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
@@ -29,7 +29,7 @@
 						<text>归属项目</text>
 					</view>
 					<view class="form-input picker-input" :class="{ placeholder: !formData.projectId }"
-						@click="showPicker('归属项目',companyList)">
+						@click="showPicker('归属项目', companyList)">
 						{{ belongingProjectDisplayText || '请选择归属项目' }}
 						<image class="icon"
 							src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
@@ -52,7 +52,7 @@
 						<text>产品代码</text>
 					</view>
 					<view class="form-input picker-input" :class="{ placeholder: !formData.productId }"
-						@click="showPicker('产品代码',productList)">
+						@click="showPicker('产品代码', productList)">
 						{{ productNameDisplayText || '请选择产品代码' }}
 						<image class="icon"
 							src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
@@ -64,7 +64,7 @@
 						<text>费用分摊</text>
 					</view>
 					<view class="form-input picker-input" :class="{ placeholder: !formData.costShareId }"
-						@click="showPicker('费用分摊',companyData)">
+						@click="showPicker('费用分摊', companyData)">
 						{{ costAllocationDisplayText || '请选择费用分摊主体' }}
 						<image class="icon"
 							src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
@@ -86,7 +86,7 @@
 						<text>归属类型</text>
 					</view>
 					<view class="form-input picker-input" :class="{ placeholder: !formData.belongType }"
-						@click="showPicker('归属类型',dictTypeColumns)">
+						@click="showPicker('归属类型', dictTypeColumns)">
 						{{ belongTypeDisplayText || '请选择归属类型' }}
 						<image class="icon"
 							src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
@@ -99,12 +99,22 @@
 						<text>任务类型</text>
 					</view>
 					<view class="form-input picker-input" :class="{ placeholder: !formData.taskType }"
-						@click="showPicker('任务类型',taskTypeColumns)">
+						@click="showPicker('任务类型', taskTypeColumns)">
 						{{ taskTypeDisplayText || '请选择任务类型' }}
 						<image class="icon"
 							src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_more.png"></image>
 					</view>
 				</view>
+				<view class="form-item"
+					v-if="formData.taskType === '1' || formData.taskType === '8' || formData.taskType === '9'">
+					<view class="form-label">
+						<view class="form-option" :class="{ 'selected': item.id == formData.targetId }"
+							v-for="(item, index) in selectionList" :key="index" @click="selectOption(item)">{{
+								item.title
+							}}</view>
+					</view>
+				</view>
+
 
 				<view class="form-item">
 					<view class="form-label">
@@ -138,11 +148,11 @@
 			:columns="pickerData" @confirm="confirm" @cancel="cancel">
 		</u-picker>
 
-		<u-datetime-picker :show="showStartTimePicker" v-model="startTimeValue" mode="date" confirmColor='#576B95'
+		<u-datetime-picker :show="showStartTimePicker" v-model="startTimeValue" mode="datetime" confirmColor='#576B95'
 			@confirm="onStartTimeConfirm" @cancel="showStartTimePicker = false">
 		</u-datetime-picker>
 
-		<u-datetime-picker :show="showEndTimePicker" v-model="endTimeValue" mode="date" confirmColor='#576B95'
+		<u-datetime-picker :show="showEndTimePicker" v-model="endTimeValue" mode="datetime" confirmColor='#576B95'
 			@confirm="onEndTimeConfirm" @cancel="showEndTimePicker = false">
 		</u-datetime-picker>
 
@@ -175,7 +185,7 @@
 					<text class="popup-title">任务归属</text>
 					<image class="close-icon"
 						src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_cross.png"
-						@click="showTaskPopup=false"></image>
+						@click="showTaskPopup = false"></image>
 				</view>
 				<view class="two-level-container">
 					<scroll-view class="primary-list" scroll-y>
@@ -206,347 +216,405 @@
 </template>
 
 <script>
-	import {
-		companyUserList
-	} from '@/api/task.js';
-	import {
-		company,
-		getAllData, //获取项目所有数据
-		queryAllProduct, //获取公司所有产品
-		queryAllData //获取任务类型
-	} from '@/api/task.js';
-	import utils from '@/utils/common.js'
-	import Step from '@/pages_task/components/step.vue'
-	import EvanSwitch from '@/components/evan-switch.vue'
-	export default {
-		components: {
-			Step,
-			EvanSwitch
-		},
-		data() {
-			return {
-				taskTypeDict: [], //任务类型字典
-				taskType: [], //任务类型
-				taskTypeOriginalData: [], //任务类型原始数据(包含dictLabel和dictValue)
-				companyList: [], //归属项目
-				projectData: [], //项目数据(持久化存储)
-				productList: [], //产品列表
-				companyData: [],
-				userInfo: {},
-				showTaskPopup: false,
-				primaryOptions: [{
-						id: 1,
-						name: '中药事业部',
-						children: ['中药一部', '中药二部', '中药三部', '中药四部']
-					},
-					{
-						id: 2,
-						name: '事业1组',
-						children: ['事业1组-项目部', '事业1组-市场部', '事业1组-技术部']
-					},
-
-				],
-				activePrimaryIndex: 0,
-				currentSecondaryOptions: [],
-				selectedSecondaryItem: '',
-				selectedPrimaryItem: null,
-				selectedIndex: -1,
-				selectedProject: null,
-				belongingprojects: [{
-						name: '学术交流项目'
-					},
-					{
-						name: '科学调研项目'
-					},
-					{
-						name: '2026年1月医学研究项目'
-					},
-					{
-						name: '2026年2月医学研究项目'
-					},
-					{
-						name: '2026年3月医学研究项目'
-					}
-				],
-				searchKeyword: '',
-				showBelongingPopup: false,
-				showPickerVisible: false,
-				costColumns: [
-					['主体1', '主体2', '主体3'],
-				],
-				taskTypeColumns: [
-					// ['类型1', '类型2', '类型3'],
-				],
-				currentStep: 1,
-				currentText: [{
-						id: 1,
-						stepNumber: 1,
-						title: '填写任务'
-					},
-					{
-						id: 2,
-						stepNumber: 2,
-						title: '选择客户'
-					},
-					{
-						id: 3,
-						stepNumber: 3,
-						title: '积分设置'
-					}
-				],
-				rejectionInfo: '',
-				formData: {
-					costShareId: '',
-					planStartTime: '',
-					planEndTime: '',
-					belongType: '',
-					deptId: '',
-					projectId: '',
-					productId: '',
-					taskType: '',
-					// companyUserId: '',
-					addRemark: false,
-					remark: '',
-					taskTypeDisplayText: '',
-					belongTypeDisplayText: ''
-					
-				},
-				originalCompanyData: null,
-				pickerTitle: '默认标题',
-				pickerData: [],
-				companyId: '',
-				showStartTimePicker: false,
-				showEndTimePicker: false,
-				startTimeValue: new Date(),
-				endTimeValue: new Date(),
+import {
+	companyUserList
+} from '@/api/task.js';
+import {
+	getProjectTypeList,
+	company,
+	getAllData, //获取项目所有数据
+	queryAllProduct, //获取公司所有产品
+	queryAllData, //获取任务类型
+	getTaskLiveList, //获取公开课选项
+	getDrugResearchList, //获取用药调研选项
+	getSurveyTaskList //获取问卷调查选项
+} from '@/api/task.js';
+import utils from '@/utils/common.js'
+import Step from '@/pages_task/components/step.vue'
+import EvanSwitch from '@/components/evan-switch.vue'
+export default {
+	components: {
+		Step,
+		EvanSwitch
+	},
+	data() {
+		return {
+			taskTypeDict: [], //任务类型字典
+			taskType: [], //任务类型
+			taskTypeOriginalData: [], //任务类型原始数据(包含dictLabel和dictValue)
+			companyList: [], //归属项目
+			projectData: [], //项目数据(持久化存储)
+			productList: [], //产品列表
+			companyData: [],
+			userInfo: {},
+			showTaskPopup: false,
+			primaryOptions: [{
+				id: 1,
+				name: '中药事业部',
+				children: ['中药一部', '中药二部', '中药三部', '中药四部']
+			},
+			{
+				id: 2,
+				name: '事业1组',
+				children: ['事业1组-项目部', '事业1组-市场部', '事业1组-技术部']
+			},
 
+			],
+			activePrimaryIndex: 0,
+			currentSecondaryOptions: [],
+			selectedSecondaryItem: '',
+			selectedPrimaryItem: null,
+			selectedIndex: -1,
+			selectedProject: null,
+			belongingprojects: [{
+				name: '学术交流项目'
+			},
+			{
+				name: '科学调研项目'
+			},
+			{
+				name: '2026年1月医学研究项目'
+			},
+			{
+				name: '2026年2月医学研究项目'
+			},
+			{
+				name: '2026年3月医学研究项目'
 			}
-		},
+			],
+			searchKeyword: '',
+			showBelongingPopup: false,
+			showPickerVisible: false,
+			costColumns: [
+				['主体1', '主体2', '主体3'],
+			],
+			taskTypeColumns: [
+				// ['类型1', '类型2', '类型3'],
+			],
+			currentStep: 1,
+			currentText: [{
+				id: 1,
+				stepNumber: 1,
+				title: '填写任务'
+			},
+			{
+				id: 2,
+				stepNumber: 2,
+				title: '选择客户'
+			},
+			{
+				id: 3,
+				stepNumber: 3,
+				title: '积分设置'
+			}
+			],
+			rejectionInfo: '',
+			formData: {
+				costShareId: '',
+				planStartTime: '',
+				planEndTime: '',
+				belongType: '',
+				deptId: '',
+				projectId: '',
+				productId: '',
+				taskType: '',
+				targetId: '',
+				taskTypeId: '',
+				// companyUserId: '',
+				addRemark: false,
+				remark: '',
+				taskTypeDisplayText: '',
+				belongTypeDisplayText: ''
 
-		onLoad: async function(options) {
-			try {
-				this.taskTypeDict = await utils.getDicts("task_type"); //任务类型
-				this.belongTypeList = await utils.getDicts("task_belong_type"); //任务类型
+			},
+			selectedType: null,
+			originalCompanyData: null,
+			pickerTitle: '默认标题',
+			pickerData: [],
+			companyId: '',
+			showStartTimePicker: false,
+			showEndTimePicker: false,
+			startTimeValue: new Date(),
+			endTimeValue: new Date(),
+			selectionList: [], //任务类型选项
 
-			} catch (e) {
-				console.log('获取字典数据失败:', e)
-			}
+		}
+	},
 
+	onLoad: async function (options) {
+		try {
+			this.taskTypeDict = await utils.getDicts("task_type"); //任务类型
+			this.belongTypeList = await utils.getDicts("task_belong_type"); //归属类型
 
-			this.userInfo = uni.getStorageSync("userInfo") || ''
-			if (options.rejectionInfo) {
-				this.rejectionInfo = decodeURIComponent(options.rejectionInfo)
-			}
-			// 获取用户信息
-			// 加载信息
-			this.companyId = this.userInfo.companyId || 1
-			// 设置默认日期为当天
-			this.formData.planStartTime = this.formatDateTime(new Date());
-			this.formData.planEndTime = this.formatDateTime(new Date());
+		} catch (e) {
+			console.log('获取字典数据失败:', e)
+		}
 
-		},
 
-		computed: {
-			taskTypeDisplayText() {
-				console.log('计算taskTypeDisplayText, formData.taskType:', this.formData.taskType);
-				console.log('计算taskTypeDisplayText, taskTypeOriginalData:', this.taskTypeOriginalData);
-				if (!this.formData.taskType || !this.taskTypeOriginalData) {
-					return '';
-				}
-				const selectedType = this.taskTypeOriginalData.find(item => item.dictValue === this.formData.taskType);
-				console.log('找到的selectedType:', selectedType);
-				return selectedType ? selectedType.dictLabel : '';
-			},
-			institutionDisplayText() {
-				if (!this.formData.deptId || !this.companyData) {
-					return '';
-				}
-				const selectedItem = this.companyData.find(item => item.deptId === this.formData.deptId);
-				return selectedItem ? selectedItem.deptName : '';
-			},
-			costAllocationDisplayText() {
-				if (!this.formData.costShareId || !this.companyData) {
-					return '';
+		this.userInfo = uni.getStorageSync("userInfo") || ''
+		if (options.rejectionInfo) {
+			this.rejectionInfo = decodeURIComponent(options.rejectionInfo)
+		}
+		// 获取用户信息
+		// 加载信息
+		this.companyId = this.userInfo.companyId || 1
+		// 设置默认日期为当天
+		// this.formData.planStartTime = this.formatDateTime(new Date());
+		// this.formData.planEndTime = this.formatDateTime(new Date());
+		console.log('this.userInfo.companyId:', this.userInfo.companyId)
+		this.getTaskLiveList()//获取公开课选项
+	},
+
+	computed: {
+		taskTypeDisplayText() {
+			console.log('计算taskTypeDisplayText, formData.taskType:', this.formData.taskType);
+			console.log('计算taskTypeDisplayText, taskTypeOriginalData:', this.taskTypeOriginalData);
+			if (!this.formData.taskType || !this.taskTypeOriginalData) {
+				return '';
+			}
+			const selectedType = this.taskTypeOriginalData.find(item => item.dictValue === this.formData.taskType);
+			console.log('找到的selectedType:', selectedType);
+			return selectedType ? selectedType.dictLabel : '';
+		},
+		institutionDisplayText() {
+			if (!this.formData.deptId || !this.companyData) {
+				return '';
+			}
+			const selectedItem = this.companyData.find(item => item.deptId === this.formData.deptId);
+			return selectedItem ? selectedItem.deptName : '';
+		},
+		costAllocationDisplayText() {
+			if (!this.formData.costShareId || !this.companyData) {
+				return '';
+			}
+			const selectedItem = this.companyData.find(item => item.deptId === this.formData.costShareId);
+			return selectedItem ? selectedItem.deptName : '';
+		},
+		belongingProjectDisplayText() {
+			console.log('计算belongingProjectDisplayText:', this.formData.projectId, this.projectData);
+			if (!this.formData.projectId || !this.projectData) {
+				console.log('formData.projectId或projectData为空');
+				return '';
+			}
+			const selectedItem = this.projectData.find(item => item.id === this.formData.projectId);
+			console.log('找到的项目:', selectedItem);
+			return selectedItem ? selectedItem.projectName : '';
+		},
+		productNameDisplayText() {
+			if (!this.formData.productId || !this.productList) {
+				return '';
+			}
+			const selectedItem = this.productList.find(item => item.id === this.formData.productId);
+			return selectedItem ? selectedItem.productName : '';
+		},
+		belongTypeDisplayText() {
+			if (!this.formData.belongType || !this.belongTypeList) {
+				return '';
+			}
+			const selectedItem = this.belongTypeList.find(item => item.dictValue === this.formData.belongType);
+			return selectedItem ? selectedItem.dictLabel : '';
+		},
+		// salesmanDisplayText() {
+		// 	if (!this.formData.companyUserId || !this.userList) {
+		// 		return '';
+		// 	}
+		// 	const selectedItem = this.userList.find(item => item.userId === this.formData.companyUserId);
+		// 	return selectedItem ? selectedItem.nickName : '';
+		// }
+	},
+	methods: {
+		selectOption(item) {
+			this.formData.targetId = item.id
+			console.log('选择选项:', item)
+			console.log('选择选项sss:', this.formData.targetId)
+		},
+		// 获取用药调研选项
+		getDrugResearchList() {
+			getDrugResearchList(this.userInfo.companyId).then(res => {
+				if (res.code === 200) {
+					console.log('获取用药调研选项:', res)
+					this.selectionList = res.data.rows || []
 				}
-				const selectedItem = this.companyData.find(item => item.deptId === this.formData.costShareId);
-				return selectedItem ? selectedItem.deptName : '';
-			},
-			belongingProjectDisplayText() {
-				console.log('计算belongingProjectDisplayText:', this.formData.projectId, this.projectData);
-				if (!this.formData.projectId || !this.projectData) {
-					console.log('formData.projectId或projectData为空');
-					return '';
+			})
+		},
+		// 获取问卷调查选项
+		getSurveyTaskList() {
+			getSurveyTaskList(this.userInfo.companyId).then(res => {
+				if (res.code === 200) {
+					console.log('获取问卷调查选项:', res)
+					this.selectionList = res.data.rows || []
 				}
-				const selectedItem = this.projectData.find(item => item.id === this.formData.projectId);
-				console.log('找到的项目:', selectedItem);
-				return selectedItem ? selectedItem.projectName : '';
-			},
-			productNameDisplayText() {
-				if (!this.formData.productId || !this.productList) {
-					return '';
+			})
+		},
+		// 获取公开课选项
+		getTaskLiveList() {
+			getTaskLiveList(this.userInfo.companyId).then(res => {
+				if (res.code === 200) {
+					console.log('获取公开课选项:', res)
+					this.selectionList = res.rows || []
 				}
-				const selectedItem = this.productList.find(item => item.id === this.formData.productId);
-				return selectedItem ? selectedItem.productName : '';
-			},
-			belongTypeDisplayText() {
-				if (!this.formData.belongType || !this.belongTypeList) {
-					return '';
+			})
+		},
+		getProjectTypeList() {
+			let params = {
+				companyId: this.userInfo.companyId || '',
+				// projectId: this.formData.projectId || '',
+				deptId: this.formData.deptId || '',
+			}
+			return getProjectTypeList(params).then(res => {
+				if (res.code === 200) {
+					const rows = Array.isArray(res.rows) ? res.rows : []
+					const first = rows[0] || {}
+					const idSet = new Set()
+					String(first.taskTypeIds || '').split(',').forEach(id => {
+						const t = String(id || '').trim()
+						if (t) idSet.add(t)
+					})
+
+					const filtered = (this.taskTypeDict || []).filter(d => idSet.has(String(d.dictValue)))
+					this.taskTypeOriginalData = filtered
+					this.taskTypeColumns = [filtered.map(d => d.dictLabel)]
 				}
-				const selectedItem = this.belongTypeList.find(item => item.dictValue === this.formData.belongType);
-				return selectedItem ? selectedItem.dictLabel : '';
-			},
-			// salesmanDisplayText() {
-			// 	if (!this.formData.companyUserId || !this.userList) {
-			// 		return '';
-			// 	}
-			// 	const selectedItem = this.userList.find(item => item.userId === this.formData.companyUserId);
-			// 	return selectedItem ? selectedItem.nickName : '';
-			// }
+			})
 		},
-		methods: {
-			//公司下的用户列表
-			async companyUserList() {
-				return new Promise((resolve, reject) => {
-					let data = {
-						companyId: this.userInfo.companyId || '',
-					}
-					companyUserList(data).then(res => {
-						if (res.code === 200) {
-							// 处理公司所有产品数据
-							this.userList = res.rows || []
-							console.log('company接口返回数据:', res)
 
-						}
-						resolve(res);
-					}).catch(err => {
-						console.error('获取公司下的用户列表失败:', err);
-						reject(err);
-					});
-				});
-			},
-			//任务类型
-			queryAllData() {
-				return new Promise((resolve, reject) => {
-					if (!this.formData.productId) {
-						uni.showToast({
-							title: '请先选择产品',
-							icon: 'none'
-						})
-						resolve();
-						return
-					}
-					let data = {
-						companyId: this.userInfo.companyId || '',
-						deptId: this.formData.deptId || '',
-						productId: this.formData.productId || '',
+
+		//公司下的用户列表
+		async companyUserList() {
+			return new Promise((resolve, reject) => {
+				let data = {
+					companyId: this.userInfo.companyId || '',
+				}
+				companyUserList(data).then(res => {
+					if (res.code === 200) {
+						// 处理公司所有产品数据
+						this.userList = res.rows || []
+						console.log('company接口返回数据:', res)
 
 					}
-					queryAllData(data).then(res => {
-						if (res.code === 200) {
-							// 处理任务类型
-							this.taskType = res.data || []
-							console.log('company接口返回数据:', res)
-
-							// 处理taskTypeIds,获取对应的字典数据
-							if (res.data && res.data.length > 0) {
-								const firstData = res.data[0];
-								if (firstData.taskTypeIds) {
-									// 分割taskTypeIds为数组
-									const taskTypeIdsArray = firstData.taskTypeIds.split(',');
-									// 从字典表中筛选出对应的项
-									const filteredTaskTypes = this.taskTypeDict.filter(item =>
-										taskTypeIdsArray.includes(item.dictValue)
-									);
-									// 保存原始数据(包含dictLabel和dictValue)
-									this.taskTypeOriginalData = filteredTaskTypes;
-									// 提取dictLabel并放到taskTypeColumns中
-									const taskTypeLabels = filteredTaskTypes.map(item => item.dictLabel);
-									this.taskTypeColumns = [taskTypeLabels];
-									console.log('处理后的taskTypeColumns:', this.taskTypeColumns);
-									console.log('任务类型原始数据:', this.taskTypeOriginalData);
-								}
+					resolve(res);
+				}).catch(err => {
+					console.error('获取公司下的用户列表失败:', err);
+					reject(err);
+				});
+			});
+		},
+		//任务类型
+		queryAllData() {
+			return new Promise((resolve, reject) => {
+				if (!this.formData.productId) {
+					uni.showToast({
+						title: '请先选择产品',
+						icon: 'none'
+					})
+					resolve();
+					return
+				}
+				let data = {
+					companyId: this.userInfo.companyId || '',
+					deptId: this.formData.deptId || '',
+					productId: this.formData.productId || '',
+
+				}
+				queryAllData(data).then(res => {
+					if (res.code === 200) {
+						// 处理任务类型
+						this.taskType = res.data || []
+						console.log('company接口返回数据:', res)
+
+						// 处理taskTypeIds,获取对应的字典数据
+						if (res.data && res.data.length > 0) {
+							const firstData = res.data[0];
+							if (firstData.taskTypeIds) {
+								// 分割taskTypeIds为数组
+								const taskTypeIdsArray = firstData.taskTypeIds.split(',');
+								// 从字典表中筛选出对应的项
+								const filteredTaskTypes = this.taskTypeDict.filter(item =>
+									taskTypeIdsArray.includes(item.dictValue)
+								);
+								// 保存原始数据(包含dictLabel和dictValue)
+								this.taskTypeOriginalData = filteredTaskTypes;
+								// 提取dictLabel并放到taskTypeColumns中
+								const taskTypeLabels = filteredTaskTypes.map(item => item.dictLabel);
+								this.taskTypeColumns = [taskTypeLabels];
+								console.log('处理后的taskTypeColumns:', this.taskTypeColumns);
+								console.log('任务类型原始数据:', this.taskTypeOriginalData);
 							}
 						}
-						resolve(res);
-					}).catch(err => {
-						console.error('获取任务类型失败:', err);
-						reject(err);
-					});
+					}
+					resolve(res);
+				}).catch(err => {
+					console.error('获取任务类型失败:', err);
+					reject(err);
 				});
-			},
+			});
+		},
 
-			//获取公司所有产品
-			async queryAllProduct() {
-				return new Promise((resolve, reject) => {
-					let data = {
-						companyId: this.userInfo.companyId || '',
+		//获取公司所有产品
+		async queryAllProduct() {
+			return new Promise((resolve, reject) => {
+				let data = {
+					companyId: this.userInfo.companyId || '',
+					projectId: this.formData.projectId
+				}
+				queryAllProduct(data).then(res => {
+					if (res.code === 200) {
+						// 处理公司所有产品数据
+						this.productList = res.data || []
+						console.log('company接口返回数据:', res)
 					}
-					queryAllProduct(data).then(res => {
-						if (res.code === 200) {
-							// 处理公司所有产品数据
-							this.productList = res.data || []
-							console.log('company接口返回数据:', res)
-						}
-						resolve(res);
-					}).catch(err => {
-						console.error('获取公司所有产品失败:', err);
-						reject(err);
-					});
+					resolve(res);
+				}).catch(err => {
+					console.error('获取公司所有产品失败:', err);
+					reject(err);
 				});
-			},
-			// 归属项目
-			async getAllData() {
-				return new Promise((resolve, reject) => {
-					let data = {
-						companyId: this.userInfo.companyId || '',
-						deptId: this.userInfo.deptId || '',
-						productCode: this.userInfo.productCode || ''
+			});
+		},
+		// 归属项目
+		async getAllData() {
+			return new Promise((resolve, reject) => {
+				let data = {
+					companyId: this.userInfo.companyId || '',
+					deptId: this.userInfo.deptId || '',
+					productCode: this.userInfo.productCode || ''
+				}
+				getAllData(data).then(res => {
+					if (res.code === 200) {
+						// 处理公司项目设置列表数据
+						this.companyList = res.data || []
+						// 保存项目数据用于显示
+						this.projectData = res.data || []
+
+						console.log('company接口返回数据:', res)
+						console.log('companyList数据结构:', this.companyList)
 					}
-					getAllData(data).then(res => {
-						if (res.code === 200) {
+					resolve(res);
+				}).catch(err => {
+					console.error('获取公司项目设置失败:', err);
+					reject(err);
+				});
+			});
+		},
+
+		async company() {
+			return new Promise((resolve, reject) => {
+				try {
+					uni.showLoading({
+						title: '加载中...'
+					})
+					// 调用company接口获取公司项目设置列表
+					// this.companyId
+					company(this.userInfo.userId).then(companyRes => {
+						uni.hideLoading()
+						if (companyRes.code === 200) {
 							// 处理公司项目设置列表数据
-							this.companyList = res.data || []
-							// 保存项目数据用于显示
-							this.projectData = res.data || []
+							this.companyData = companyRes.data || []
 
-							console.log('company接口返回数据:', res)
-							console.log('companyList数据结构:', this.companyList)
+							console.log('company接口返回数据:', companyRes)
+							// 这里可以根据接口返回的数据进行页面初始化,比如填充项目列表
 						}
-						resolve(res);
-					}).catch(err => {
-						console.error('获取公司项目设置失败:', err);
-						reject(err);
-					});
-				});
-			},
-
-			async company() {
-				return new Promise((resolve, reject) => {
-					try {
-						uni.showLoading({
-							title: '加载中...'
-						})
-						// 调用company接口获取公司项目设置列表
-						company(this.companyId).then(companyRes => {
-							uni.hideLoading()
-							if (companyRes.code === 200) {
-								// 处理公司项目设置列表数据
-								this.companyData = companyRes.data || []
-
-								console.log('company接口返回数据:', companyRes)
-								// 这里可以根据接口返回的数据进行页面初始化,比如填充项目列表
-							}
-							resolve(companyRes);
-						}).catch(e => {
-							uni.hideLoading()
-							console.error('加载信息失败', e)
-							uni.showToast({
-								title: '网络错误',
-								icon: 'none'
-							})
-							reject(e);
-						});
-					} catch (e) {
+						resolve(companyRes);
+					}).catch(e => {
 						uni.hideLoading()
 						console.error('加载信息失败', e)
 						uni.showToast({
@@ -554,706 +622,779 @@
 							icon: 'none'
 						})
 						reject(e);
-					}
-				});
-			},
-			submitInfo() {
-				info(this.userInfo.companyId).then(res => {
-					if (res.code === 200) {
-						console.log('公司项目设置:', res.data);
-						// 处理公司项目设置数据
-					}
-				}).catch(err => {
-					console.error('获取公司项目设置失败:', err);
-				});
-			},
-			handlePrimarySelect(index) {
-				this.activePrimaryIndex = index;
-				this.currentSecondaryOptions = this.primaryOptions[index].children || [];
-				this.selectedSecondaryItem = '';
-			},
-			handleSecondarySelect(item) {
-				this.selectedSecondaryItem = item;
-				this.selectedPrimaryItem = this.primaryOptions[this.activePrimaryIndex];
-			},
-			handleConfirm() {
-				if (this.selectedSecondaryItem) {
-					const displayText = `${this.selectedPrimaryItem.name} > ${this.selectedSecondaryItem}`;
-					this.formData.belongType = displayText;
-					this.showTaskPopup = false;
-				} else {
+					});
+				} catch (e) {
+					uni.hideLoading()
+					console.error('加载信息失败', e)
 					uni.showToast({
-						title: '请选择二级部门',
+						title: '网络错误',
 						icon: 'none'
-					});
+					})
+					reject(e);
 				}
-			},
-			closePopup() {
+			});
+		},
+		submitInfo() {
+			info(this.userInfo.companyId).then(res => {
+				if (res.code === 200) {
+					console.log('公司项目设置:', res.data);
+					// 处理公司项目设置数据
+				}
+			}).catch(err => {
+				console.error('获取公司项目设置失败:', err);
+			});
+		},
+		handlePrimarySelect(index) {
+			this.activePrimaryIndex = index;
+			this.currentSecondaryOptions = this.primaryOptions[index].children || [];
+			this.selectedSecondaryItem = '';
+		},
+		handleSecondarySelect(item) {
+			this.selectedSecondaryItem = item;
+			this.selectedPrimaryItem = this.primaryOptions[this.activePrimaryIndex];
+		},
+		handleConfirm() {
+			if (this.selectedSecondaryItem) {
+				const displayText = `${this.selectedPrimaryItem.name} > ${this.selectedSecondaryItem}`;
+				this.formData.belongType = displayText;
+				this.showTaskPopup = false;
+			} else {
+				uni.showToast({
+					title: '请选择二级部门',
+					icon: 'none'
+				});
+			}
+		},
+		closePopup() {
+			this.showBelongingPopup = false;
+			this.searchKeyword = '';
+			this.selectedIndex = -1;
+		},
+		selectProject(project, index) {
+			this.selectedIndex = index;
+			this.selectedProject = project;
+			this.formData.belongingProject = project.name;
+			setTimeout(() => {
 				this.showBelongingPopup = false;
 				this.searchKeyword = '';
 				this.selectedIndex = -1;
-			},
-			selectProject(project, index) {
-				this.selectedIndex = index;
-				this.selectedProject = project;
-				this.formData.belongingProject = project.name;
-				setTimeout(() => {
-					this.showBelongingPopup = false;
-					this.searchKeyword = '';
-					this.selectedIndex = -1;
-				}, 300);
-			},
-			async showPicker(title, data) {
-				// 根据不同的title调用对应的请求方法
-				if (title === '任务归属' || title === '费用分摊') {
-					// 调用company()获取任务归属和费用分摊数据
-					await this.company();
-					data = this.companyData;
-				} else if (title === '归属项目') {
-					// 调用getAllData()获取归属项目数据
-					await this.getAllData();
-					data = this.companyList;
-					console.log('归属项目数据:', data);
-				} else if (title === '产品代码') {
-					// 调用queryAllProduct()获取产品代码数据
-					await this.queryAllProduct();
-					data = this.productList;
-				} else if (title === '任务类型') {
-					// queryAllData()获取任务类型数据
-					await this.queryAllData();
-					// 使用处理后的taskTypeColumns作为数据
-					data = this.taskTypeColumns;
-					console.log('任务类型数据:', data);
-				} else if (title === '归属类型') {
-					// 归属类型数据已经在onLoad中获取
-					data = this.belongTypeList;
-					console.log('归属类型数据:', data);
-				} else if (title === '业务员') {
-					// 调用companyUserList()获取业务员数据
-					await this.companyUserList();
-					data = this.userList;
-					console.log('业务员数据:', data);
-				}
+			}, 300);
+		},
+		async showPicker(title, data) {
+			// 根据不同的title调用对应的请求方法
+			if (title === '任务归属' || title === '费用分摊') {
+				// 调用company()获取任务归属和费用分摊数据
+				await this.company();
+				data = this.companyData;
+
+			} else if (title === '归属项目') {
+				// 调用getAllData()获取归属项目数据
+				await this.getAllData();
+				data = this.companyList;
+				console.log('归属项目数据:', data);
+			} else if (title === '产品代码') {
+				// 调用queryAllProduct()获取产品代码数据
+				await this.queryAllProduct();
+				data = this.productList;
+			} else if (title === '任务类型') {
+				// queryAllData()获取任务类型数据
+				// await this.queryAllData();
+				await this.getProjectTypeList();
+				// 使用处理后的taskTypeColumns作为数据
+				data = this.taskTypeColumns;
+				console.log('任务类型数据:', data);
+			} else if (title === '归属类型') {
+				// 归属类型数据已经在onLoad中获取
+				data = this.belongTypeList;
+				console.log('归属类型数据:', data);
+			} else if (title === '业务员') {
+				// 调用companyUserList()获取业务员数据
+				await this.companyUserList();
+				data = this.userList;
+				console.log('业务员数据:', data);
+			}
 
-				// 处理任务归属和费用分摊数据,将deptStr作为显示文本
-				if ((title === '任务归属' || title === '费用分摊') && data && data.length > 0) {
-					// 转换为picker需要的格式
-					this.pickerData = [data.map(item => item.deptName)]
-					// 保存原始数据,用于后续获取deptId
-					this.originalCompanyData = data
-				} else if (title === '归属项目' && data && data.length > 0) {
-					// 处理归属项目数据,将projectName作为显示文本
-					this.pickerData = [data.map(item => item.projectName)]
-					// 保存原始数据,用于后续获取productId
-					this.originalCompanyData = data
-				} else if (title === '产品代码' && data && data.length > 0) {
-					// 处理产品代码数据,将productName作为显示文本
-					this.pickerData = [data.map(item => item.productName)]
-					// 保存原始数据,用于后续获取productCode
-					this.originalCompanyData = data
-				} else if (title === '归属类型' && data && data.length > 0) {
-					// 处理归属类型数据,将dictLabel作为显示文本
-					this.pickerData = [data.map(item => item.dictLabel)]
-					// 保存原始数据,用于后续获取dictType
-					this.originalCompanyData = data
-				} else if (title === '业务员' && data && data.length > 0) {
-					// 处理业务员数据,将nickName作为显示文本
-					this.pickerData = [data.map(item => item.nickName)]
-					// 保存原始数据,用于后续获取userId
-					this.originalCompanyData = data
-				} else {
-					this.pickerData = data
-					this.originalCompanyData = null
-				}
-				this.pickerTitle = title
-				console.log('打开picker, pickerTitle:', this.pickerTitle);
-				console.log('pickerData:', this.pickerData);
-				this.showPickerVisible = true
-			},
-			confirm(e) {
-				console.log('confirm事件返回值:', e);
-				console.log('pickerTitle:', this.pickerTitle);
-				console.log('e.value:', e.value);
-				if (e.value && e.value.length > 0) {
-					if (this.pickerTitle === '费用分摊') {
-						// e.value[0]是选中的文本值(deptName)
-						const selectedDeptStr = e.value[0];
-						console.log('选中的费用分摊文本:', selectedDeptStr);
-						console.log('originalCompanyData:', this.originalCompanyData);
-						// 从originalCompanyData中找到对应的项
-						const selectedItem = this.originalCompanyData.find(item => item.deptName === selectedDeptStr);
-						if (selectedItem) {
-							// 保存deptId到表单(存储id值)
-							this.formData.costShareId = selectedItem.deptId;
-							console.log('设置formData.costShareId为:', selectedItem.deptId);
-						} else {
-							this.formData.costShareId = '';
-							console.log('未找到对应的费用分摊');
+			// 处理任务归属和费用分摊数据,将deptStr作为显示文本
+			if ((title === '任务归属' || title === '费用分摊') && data && data.length > 0) {
+				// 转换为picker需要的格式
+				this.pickerData = [data.map(item => item.deptName)]
+				// 保存原始数据,用于后续获取deptId
+				this.originalCompanyData = data
+			} else if (title === '归属项目' && data && data.length > 0) {
+				// 处理归属项目数据,将projectName作为显示文本
+				this.pickerData = [data.map(item => item.projectName)]
+				// 保存原始数据,用于后续获取productId
+				this.originalCompanyData = data
+
+
+			} else if (title === '产品代码' && data && data.length > 0) {
+				// 处理产品代码数据,将productName作为显示文本
+				this.pickerData = [data.map(item => item.productName)]
+				// 保存原始数据,用于后续获取productCode
+				this.originalCompanyData = data
+			} else if (title === '归属类型' && data && data.length > 0) {
+				// 处理归属类型数据,将dictLabel作为显示文本
+				this.pickerData = [data.map(item => item.dictLabel)]
+				// 保存原始数据,用于后续获取dictType
+				this.originalCompanyData = data
+			} else if (title === '业务员' && data && data.length > 0) {
+				// 处理业务员数据,将nickName作为显示文本
+				this.pickerData = [data.map(item => item.nickName)]
+				// 保存原始数据,用于后续获取userId
+				this.originalCompanyData = data
+			} else {
+				this.pickerData = data
+				this.originalCompanyData = null
+			}
+			this.pickerTitle = title
+			console.log('打开picker, pickerTitle:', this.pickerTitle);
+			console.log('pickerData:', this.pickerData);
+			this.showPickerVisible = true
+		},
+		confirm(e) {
+			console.log('confirm事件返回值:', e);
+			console.log('pickerTitle:', this.pickerTitle);
+			console.log('e.value:', e.value);
+			if (e.value && e.value.length > 0) {
+				if (this.pickerTitle === '费用分摊') {
+					// e.value[0]是选中的文本值(deptName)
+					const selectedDeptStr = e.value[0];
+					console.log('选中的费用分摊文本:', selectedDeptStr);
+					console.log('originalCompanyData:', this.originalCompanyData);
+					// 从originalCompanyData中找到对应的项
+					const selectedItem = this.originalCompanyData.find(item => item.deptName === selectedDeptStr);
+					if (selectedItem) {
+						// 保存deptId到表单(存储id值)
+						this.formData.costShareId = selectedItem.deptId;
+						console.log('设置formData.costShareId为:', selectedItem.deptId);
+					} else {
+						this.formData.costShareId = '';
+						console.log('未找到对应的费用分摊');
+					}
+				} else if (this.pickerTitle === '任务类型') {
+					// e.value[0]是选中的文本值(dictLabel)
+					const selectedLabel = e.value[0];
+					console.log('选中的任务类型文本:', selectedLabel);
+					console.log('taskTypeOriginalData:', this.taskTypeOriginalData);
+					// 从taskTypeOriginalData中找到对应的项
+					const selectedType = this.taskTypeOriginalData.find(item => item.dictLabel === selectedLabel);
+					if (selectedType) {
+						// 从this.taskType中找到与当前项目匹配的配置对象
+
+						this.formData.taskType = selectedType.dictValue;
+						this.formData.taskTypeId = selectedType.dictValue || '';
+						this.formData.taskTypeDisplayText = this.taskTypeDisplayText;
+						if (selectedType.dictValue === '9') {
+							this.getSurveyTaskList();//问卷调查
+						} else if (selectedType.dictValue === '8') {
+							this.getDrugResearchList();//用药调研
+						} else if (selectedType.dictValue === '1') {
+							this.getTaskLiveList();//公开课
 						}
-					} else if (this.pickerTitle === '任务类型') {
-						// e.value[0]是选中的文本值(dictLabel)
-						const selectedLabel = e.value[0];
-						console.log('选中的任务类型文本:', selectedLabel);
-						console.log('taskTypeOriginalData:', this.taskTypeOriginalData);
-						// 从taskTypeOriginalData中找到对应的项
-						const selectedType = this.taskTypeOriginalData.find(item => item.dictLabel === selectedLabel);
-						if (selectedType) {
-							this.formData.taskType = selectedType.dictValue;
-							console.log('设置formData.taskType为:', selectedType.dictValue);
-							this.formData.taskTypeDisplayText = this.taskTypeDisplayText;
-
-						} else {}
-					} else if (this.pickerTitle === '任务归属' && this.originalCompanyData) {
-						// e.value[0]是选中的文本值(deptName)
-						const selectedDeptStr = e.value[0];
-						console.log('选中的任务归属文本:', selectedDeptStr);
-						console.log('originalCompanyData:', this.originalCompanyData);
-						// 从originalCompanyData中找到对应的项
-						const selectedItem = this.originalCompanyData.find(item => item.deptName === selectedDeptStr);
-						if (selectedItem) {
-							// 保存deptId到表单(存储id值)
-							this.formData.deptId = selectedItem.deptId;
-							console.log('设置formData.deptId为:', selectedItem.deptId);
-						} else {}
-					} else if (this.pickerTitle === '归属项目' && this.originalCompanyData) {
-						// e.value[0]是选中的文本值(projectName)
-						const selectedProjectName = e.value[0];
-						console.log('选中的归属项目文本:', selectedProjectName);
-						console.log('originalCompanyData:', this.originalCompanyData);
-						// 从originalCompanyData中找到对应的项
-						const selectedItem = this.originalCompanyData.find(item => item.projectName ===
-							selectedProjectName);
-						if (selectedItem) {
-							// 保存id到表单(存储id值)
-							this.formData.projectId = selectedItem.id;
-							// 保存productId到表单
-							this.formData.productId = selectedItem.productId;
-							this.formData.belongTypeDisplayText = this.belongingProjectDisplayText;
-							console.log('设置formData.projectId为:', selectedItem.id);
-						} else {}
-					} else if (this.pickerTitle === '产品代码' && this.originalCompanyData) {
-						// e.value[0]是选中的文本值(productName)
-						const selectedProductName = e.value[0];
-						console.log('选中的产品代码文本:', selectedProductName);
-						console.log('originalCompanyData:', this.originalCompanyData);
-						// 从originalCompanyData中找到对应的项
-						const selectedItem = this.originalCompanyData.find(item => item.productName ===
-							selectedProductName);
-						if (selectedItem) {
-							// 保存id到表单
-							this.formData.productId = selectedItem.id;
-							// 保存id用于获取任务类型
-							console.log('设置formData.productId为:', selectedItem.id);
-						} else {
+						this.selectedType = selectedType;
+
+					} else { }
+				} else if (this.pickerTitle === '任务归属' && this.originalCompanyData) {
+					// e.value[0]是选中的文本值(deptName)
+					const selectedDeptStr = e.value[0];
+					console.log('选中的任务归属文本:', selectedDeptStr);
+					console.log('originalCompanyData:', this.originalCompanyData);
+					// 从originalCompanyData中找到对应的项
+					const selectedItem = this.originalCompanyData.find(item => item.deptName === selectedDeptStr);
+					if (selectedItem) {
+						// 保存deptId到表单(存储id值)
+						this.formData.deptId = selectedItem.deptId;
+						console.log('设置formData.deptId为:', selectedItem.deptId);
+					} else { }
+				} else if (this.pickerTitle === '归属项目' && this.originalCompanyData) {
+					// e.value[0]是选中的文本值(projectName)
+					const selectedProjectName = e.value[0];
+					console.log('选中的归属项目文本:', selectedProjectName);
+					console.log('originalCompanyData:', this.originalCompanyData);
+					// 从originalCompanyData中找到对应的项
+					const selectedItem = this.originalCompanyData.find(item => item.projectName ===
+						selectedProjectName);
+					if (selectedItem) {
+						// 保存id到表单(存储id值)
+						this.formData.projectId = selectedItem.id;
+						// 保存productId到表单
+						this.formData.productId = selectedItem.productId;
+						this.formData.belongTypeDisplayText = this.belongingProjectDisplayText;
+						console.log('设置formData.projectId为:', selectedItem.id);
+					} else { }
+				} else if (this.pickerTitle === '产品代码' && this.originalCompanyData) {
+					// e.value[0]是选中的文本值(productName)
+					const selectedProductName = e.value[0];
+					console.log('选中的产品代码文本:', selectedProductName);
+					console.log('originalCompanyData:', this.originalCompanyData);
+					// 从originalCompanyData中找到对应的项
+					const selectedItem = this.originalCompanyData.find(item => item.productName ===
+						selectedProductName);
+					if (selectedItem) {
+						// 保存id到表单
+						this.formData.productId = selectedItem.id;
+						// 保存id用于获取任务类型
+						console.log('设置formData.productId为:', selectedItem.id);
+					} else {
 
-						}
-					} else if (this.pickerTitle === '归属类型' && this.originalCompanyData) {
-						// e.value[0]是选中的文本值(dictLabel)
-						const selectedLabel = e.value[0];
-						console.log('选中的归属类型文本:', selectedLabel);
-						console.log('originalCompanyData:', this.originalCompanyData);
-						// 从originalCompanyData中找到对应的项
-						const selectedItem = this.originalCompanyData.find(item => item.dictLabel === selectedLabel);
-						if (selectedItem) {
-							// 保存dictValue到表单的belongType字段
-							this.formData.belongType = selectedItem.dictValue;
-							console.log('设置formData.belongType为:', selectedItem.dictValue);
-						} else {
-							console.log('未找到对应的归属类型');
-						}
 					}
-					//  else if (this.pickerTitle === '业务员' && this.originalCompanyData) {
-					// 	// e.value[0]是选中的文本值(nickName)
-					// 	const selectedUserName = e.value[0];
-					// 	console.log('选中的业务员文本:', selectedUserName);
-					// 	console.log('originalCompanyData:', this.originalCompanyData);
-					// 	// 从originalCompanyData中找到对应的项
-					// 	const selectedItem = this.originalCompanyData.find(item => item.nickName === selectedUserName);
-					// 	if (selectedItem) {
-					// 		// 保存userId到表单的companyUserId字段
-					// 		this.formData.companyUserId = selectedItem.userId;
-					// 		console.log('设置formData.companyUserId为:', selectedItem.userId);
-					// 	} else {
-					// 		console.log('未找到对应的业务员');
-					// 	}
-					// }
-				}
-				this.showPickerVisible = false
-			},
-			cancel() {
-				this.showPickerVisible = false
-			},
-			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
+				} else if (this.pickerTitle === '归属类型' && this.originalCompanyData) {
+					// e.value[0]是选中的文本值(dictLabel)
+					const selectedLabel = e.value[0];
+					console.log('选中的归属类型文本:', selectedLabel);
+					console.log('originalCompanyData:', this.originalCompanyData);
+					// 从originalCompanyData中找到对应的项
+					const selectedItem = this.originalCompanyData.find(item => item.dictLabel === selectedLabel);
+					if (selectedItem) {
+						// 保存dictValue到表单的belongType字段
+						this.formData.belongType = selectedItem.dictValue;
+						console.log('设置formData.belongType为:', selectedItem.dictValue);
+					} else {
+						console.log('未找到对应的归属类型');
+					}
 				}
-				// 保存任务表单数据到本地存储
-				uni.setStorageSync('taskFormData', JSON.stringify(this.formData))
-				uni.navigateTo({
-					url: '/pages_task/selectCustomer'
+				//  else if (this.pickerTitle === '业务员' && this.originalCompanyData) {
+				// 	// e.value[0]是选中的文本值(nickName)
+				// 	const selectedUserName = e.value[0];
+				// 	console.log('选中的业务员文本:', selectedUserName);
+				// 	console.log('originalCompanyData:', this.originalCompanyData);
+				// 	// 从originalCompanyData中找到对应的项
+				// 	const selectedItem = this.originalCompanyData.find(item => item.nickName === selectedUserName);
+				// 	if (selectedItem) {
+				// 		// 保存userId到表单的companyUserId字段
+				// 		this.formData.companyUserId = selectedItem.userId;
+				// 		console.log('设置formData.companyUserId为:', selectedItem.userId);
+				// 	} else {
+				// 		console.log('未找到对应的业务员');
+				// 	}
+				// }
+			}
+			this.showPickerVisible = false
+		},
+		cancel() {
+			this.showPickerVisible = false
+		},
+		toNext() {
+			// 表单验证
+			if (!this.formData.deptId) {
+				uni.showToast({
+					title: '请选择任务归属',
+					icon: 'none'
 				})
-			},
-			onStartTimeConfirm(e) {
-				this.formData.planStartTime = this.formatDateTime(e.value);
-				this.showStartTimePicker = false;
-			},
-			onEndTimeConfirm(e) {
-				this.formData.planEndTime = this.formatDateTime(e.value);
-				this.showEndTimePicker = false;
-			},
-			formatDateTime(timestamp) {
-				const date = new Date(timestamp);
-				const year = date.getFullYear();
-				const month = String(date.getMonth() + 1).padStart(2, '0');
-				const day = String(date.getDate()).padStart(2, '0');
-				// const hours = String(date.getHours()).padStart(2, '0');
-				// const minutes = String(date.getMinutes()).padStart(2, '0');
-				// const seconds = String(date.getSeconds()).padStart(2, '0');
-				//  ${hours}:${minutes}:${seconds}
-				return `${year}-${month}-${day}`;
+				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.targetId && ['1', '8', '9'].includes(this.selectedType.dictValue)) {
+				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
+			}
+			
+			// 验证计划开始时间不能晚于计划结束时间
+			const startTime = new Date(this.formData.planStartTime);
+			const endTime = new Date(this.formData.planEndTime);
+			if (startTime > endTime) {
+				uni.showToast({
+					title: '计划开始时间不能晚于计划结束时间',
+					icon: 'none'
+				})
+				return
+			}
+			// 如果开启了任务备注,则备注为必填
+			if (this.formData.addRemark && !this.formData.remark) {
+				uni.showToast({
+					title: '请输入任务备注',
+					icon: 'none'
+				})
+				return
+			}
+			// 保存任务表单数据到本地存储
+			uni.setStorageSync('taskFormData', JSON.stringify(this.formData))
+			uni.navigateTo({
+				url: '/pages_task/selectCustomer'
+			})
+		},
+		onStartTimeConfirm(e) {
+			this.formData.planStartTime = this.formatDateTime(e.value);
+			this.showStartTimePicker = false;
+		},
+		onEndTimeConfirm(e) {
+			const endTime = new Date(e.value);
+			const startTime = new Date(this.formData.planStartTime);
+
+			if (this.formData.planStartTime && endTime < startTime) {
+				uni.showToast({
+					title: '计划结束时间不能早于开始时间',
+					icon: 'none'
+				});
+				return;
+			}
+
+			this.formData.planEndTime = this.formatDateTime(e.value);
+			this.showEndTimePicker = false;
+		},
+		formatDateTime(timestamp) {
+			const date = new Date(timestamp);
+			const year = date.getFullYear();
+			const month = String(date.getMonth() + 1).padStart(2, '0');
+			const day = String(date.getDate()).padStart(2, '0');
+			const hours = String(date.getHours()).padStart(2, '0');
+			const minutes = String(date.getMinutes()).padStart(2, '0');
+			const seconds = String(date.getSeconds()).padStart(2, '0');
+			return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
 		}
 	}
+}
 </script>
 
 <style lang="scss" scoped>
-	.container {
-		min-height: 100vh;
-		background: #F7F8FA;
-		display: flex;
-		flex-direction: column;
-		position: relative;
+.container {
+	min-height: 100vh;
+	background: #F7F8FA;
+	display: flex;
+	flex-direction: column;
+	position: relative;
+
+	&::before {
+		content: '';
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		width: 100%;
+		height: 544rpx;
+		background: linear-gradient(180deg, #E4EFFE 0%, rgba(228, 239, 254, 0) 100%);
+	}
 
-		&::before {
-			content: '';
-			position: absolute;
-			top: 0;
-			left: 0;
-			right: 0;
-			width: 100%;
-			height: 544rpx;
-			background: linear-gradient(180deg, #E4EFFE 0%, rgba(228, 239, 254, 0) 100%);
+	.content {
+		flex: 1;
+		box-sizing: border-box;
+
+		.rejection-banner {
+			display: flex;
+			align-items: center;
+			padding: 24rpx;
+			background: #FF5030;
+			color: #fff;
+			margin: 24rpx;
+			border-radius: 8rpx;
+
+			.rejection-icon {
+				width: 40rpx;
+				height: 40rpx;
+				border-radius: 50%;
+				background: rgba(255, 255, 255, 0.3);
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 24rpx;
+				margin-right: 16rpx;
+			}
+
+			.rejection-text {
+				flex: 1;
+				font-size: 28rpx;
+				line-height: 1.5;
+			}
 		}
 
-		.content {
-			flex: 1;
-			box-sizing: border-box;
+		.form-section {
+			background: #fff;
+			margin: 20rpx;
+			border-radius: 16rpx;
+			padding: 32rpx;
 
-			.rejection-banner {
+			.form-item {
 				display: flex;
+				justify-content: space-between;
 				align-items: center;
-				padding: 24rpx;
-				background: #FF5030;
-				color: #fff;
-				margin: 24rpx;
-				border-radius: 8rpx;
-
-				.rejection-icon {
-					width: 40rpx;
-					height: 40rpx;
-					border-radius: 50%;
-					background: rgba(255, 255, 255, 0.3);
-					display: flex;
-					align-items: center;
-					justify-content: center;
-					font-size: 24rpx;
-					margin-right: 16rpx;
-				}
+				border-bottom: 1px solid #EBEDF0;
+				padding: 30rpx 0;
 
-				.rejection-text {
-					flex: 1;
-					font-size: 28rpx;
-					line-height: 1.5;
+				&:last-child {
+					border-bottom: 0;
 				}
-			}
 
-			.form-section {
-				background: #fff;
-				margin: 20rpx;
-				border-radius: 16rpx;
-				padding: 32rpx;
-
-				.form-item {
+				.form-label {
 					display: flex;
-					justify-content: space-between;
+					flex-wrap: wrap;
 					align-items: center;
-					border-bottom: 1px solid #EBEDF0;
-					padding: 30rpx 0;
+					font-size: 28rpx;
+					color: #333;
+					margin-bottom: 16rpx;
 
-					&:last-child {
-						border-bottom: 0;
+					.required {
+						color: #CF3546;
+						margin-right: 4rpx;
 					}
 
-					.form-label {
-						display: flex;
-						align-items: center;
+					.form-option {
+						background: #F7F8FA;
+						padding: 14rpx 32rpx;
 						font-size: 28rpx;
-						color: #333;
+						border-radius: 70rpx;
+						color: #333333;
+						margin-right: 24rpx;
 						margin-bottom: 16rpx;
+						max-width: 100%;
+						word-break: break-word;
 
-						.required {
-							color: #CF3546;
-							margin-right: 4rpx;
+						&.selected {
+							background: rgba(56, 139, 255, 0.15);
+							color: #388BFF;
 						}
 					}
+				}
 
-					.txt {
-						font-size: 28rpx;
-						color: #333333;
-					}
+				.txt {
+					font-size: 28rpx;
+					color: #333333;
+				}
 
-					.form-input {
-						flex: 1;
-						font-size: 28rpx;
+				.form-input {
+					flex: 1;
+					font-size: 28rpx;
+					color: #C8C9CC;
+
+					&.placeholder {
 						color: #C8C9CC;
+					}
 
-						&.placeholder {
-							color: #C8C9CC;
-						}
+					&.picker-input {
+						display: flex;
+						align-items: center;
+						justify-content: flex-end;
 
-						&.picker-input {
-							display: flex;
-							align-items: center;
-							justify-content: flex-end;
+						&:not(.placeholder) {
+							color: #000;
 						}
+					}
 
-						.icon {
-							width: 36rpx;
-							height: 36rpx;
-						}
+					.icon {
+						width: 36rpx;
+						height: 36rpx;
 					}
+				}
 
-					.form-textarea {
-						flex: 1;
-						font-size: 28rpx;
-						color: #333;
-						padding: 16rpx;
-						border: 1px solid #EBEDF0;
-						border-radius: 8rpx;
-						min-height: 200rpx;
-						resize: none;
-						box-sizing: border-box;
-
-						&::placeholder {
-							color: #C8C9CC;
-						}
+				.form-textarea {
+					flex: 1;
+					font-size: 28rpx;
+					color: #333;
+					padding: 16rpx;
+					border: 1px solid #EBEDF0;
+					border-radius: 8rpx;
+					min-height: 200rpx;
+					resize: none;
+					box-sizing: border-box;
+
+					&::placeholder {
+						color: #C8C9CC;
 					}
 				}
 			}
 		}
-
-		.next-button {
-			text-align: center;
-			font-size: 32rpx;
-			color: #FFFFFF;
-			height: 88rpx;
-			line-height: 88rpx;
-			background: #388BFF;
-			border-radius: 200rpx;
-			margin: 32rpx;
-		}
 	}
 
-	::v-deep .u-popup__content {
-		border-radius: 40rpx 40rpx 0 0 !important;
+	.next-button {
+		text-align: center;
+		font-size: 32rpx;
+		color: #FFFFFF;
+		height: 88rpx;
+		line-height: 88rpx;
+		background: #388BFF;
+		border-radius: 200rpx;
+		margin: 32rpx;
 	}
+}
 
+::v-deep .u-popup__content {
+	border-radius: 40rpx 40rpx 0 0 !important;
+}
 
-	.popup-content {
-		border-radius: 40rpx 40rpx 0rpx 0rpx;
-		height: 70vh;
-		background-color: #fff;
 
-		.popup-header {
-			padding: 40rpx 30rpx 20rpx;
-			text-align: center;
-
-			.close-icon {
-				width: 44rpx;
-				height: 44rpx;
-				position: absolute;
-				right: 32rpx;
-			}
+.popup-content {
+	border-radius: 40rpx 40rpx 0rpx 0rpx;
+	height: 70vh;
+	background-color: #fff;
 
-			flex-shrink: 0;
+	.popup-header {
+		padding: 40rpx 30rpx 20rpx;
+		text-align: center;
 
-			.title {
-				font-size: 32rpx;
-				font-weight: 600;
-				color: #333;
-			}
-
-			.popup-title {
-				font-size: 32rpx;
-				font-weight: 600;
-				color: #333;
-			}
+		.close-icon {
+			width: 44rpx;
+			height: 44rpx;
+			position: absolute;
+			right: 32rpx;
 		}
 
-		.search-box {
-			display: flex;
-			align-items: center;
-			background: #F7F8FA;
-			border-radius: 38rpx;
-			padding: 16rpx 28rpx;
-			margin-bottom: 24rpx;
+		flex-shrink: 0;
 
-			.icon {
-				width: 26rpx;
-				height: 26rpx;
-				margin-right: 10rpx;
-			}
+		.title {
+			font-size: 32rpx;
+			font-weight: 600;
+			color: #333;
 		}
 
-		.project-list {
-			height: calc(100% - 200rpx);
+		.popup-title {
+			font-size: 32rpx;
+			font-weight: 600;
+			color: #333;
+		}
+	}
 
-			.project-item {
-				display: flex;
-				justify-content: space-between;
-				align-items: center;
-				padding: 28rpx 0;
-				font-size: 28rpx;
-				border-bottom: 1rpx solid #eee;
+	.search-box {
+		display: flex;
+		align-items: center;
+		background: #F7F8FA;
+		border-radius: 38rpx;
+		padding: 16rpx 28rpx;
+		margin-bottom: 24rpx;
+
+		.icon {
+			width: 26rpx;
+			height: 26rpx;
+			margin-right: 10rpx;
+		}
+	}
 
-				&:active {
-					background-color: #f9f9f9;
-				}
+	.project-list {
+		height: calc(100% - 200rpx);
 
-				&.active {
-					.project-name {
-						font-weight: 500;
-						color: #388BFF;
-					}
+		.project-item {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			padding: 28rpx 0;
+			font-size: 28rpx;
+			border-bottom: 1rpx solid #eee;
 
-					.icon {
-						opacity: 1;
-					}
-				}
+			&:active {
+				background-color: #f9f9f9;
+			}
 
+			&.active {
 				.project-name {
-					color: #333;
-					transition: all 0.2s ease;
+					font-weight: 500;
+					color: #388BFF;
 				}
 
 				.icon {
-					width: 36rpx;
-					height: 36rpx;
-					opacity: 0;
-					transition: opacity 0.2s ease;
+					opacity: 1;
 				}
 			}
-		}
 
-		.two-level-container {
-			display: flex;
-			flex: 1;
-			border-top: 1rpx solid #f5f5f5;
+			.project-name {
+				color: #333;
+				transition: all 0.2s ease;
+			}
 
-			.primary-list {
-				width: 40%;
-				background-color: #f8f9fa;
+			.icon {
+				width: 36rpx;
+				height: 36rpx;
+				opacity: 0;
+				transition: opacity 0.2s ease;
+			}
+		}
+	}
 
-				.primary-item {
-					padding: 28rpx 20rpx;
-					background: #F2F3F5;
+	.two-level-container {
+		display: flex;
+		flex: 1;
+		border-top: 1rpx solid #f5f5f5;
 
-					&:active {
-						background: #FFFFFF;
-					}
+		.primary-list {
+			width: 40%;
+			background-color: #f8f9fa;
 
-					&.primary-active {
-						position: relative;
-						background-color: #fff;
-
-						&::before {
-							content: '';
-							position: absolute;
-							top: 50%;
-							left: 0;
-							transform: translateY(-50%);
-							width: 8rpx;
-							height: 32rpx;
-							background: #388BFF;
-						}
+			.primary-item {
+				padding: 28rpx 20rpx;
+				background: #F2F3F5;
 
-						.primary-text {
-							font-weight: 500;
-						}
+				&:active {
+					background: #FFFFFF;
+				}
+
+				&.primary-active {
+					position: relative;
+					background-color: #fff;
+
+					&::before {
+						content: '';
+						position: absolute;
+						top: 50%;
+						left: 0;
+						transform: translateY(-50%);
+						width: 8rpx;
+						height: 32rpx;
+						background: #388BFF;
 					}
 
 					.primary-text {
-						font-size: 28rpx;
-						color: #666;
+						font-weight: 500;
 					}
 				}
-			}
 
-			.secondary-list {
-				width: 60%;
-				padding: 0 20rpx;
-
-				.secondary-item {
-					display: flex;
-					justify-content: space-between;
-					align-items: center;
-					padding: 28rpx 10rpx;
+				.primary-text {
 					font-size: 28rpx;
-					color: #333;
-
-					&.secondary-active {
-						font-weight: 500;
-						color: #388BFF;
-					}
+					color: #666;
 				}
 			}
 		}
 
-		.popup-footer {
-			padding: 20rpx 30rpx 40rpx;
-			background-color: #fff;
-			border-top: 1rpx solid #f5f5f5;
-			flex-shrink: 0;
-
-			.confirm-btn {
-				width: 100%;
-				height: 88rpx;
-				line-height: 88rpx;
-				background-color: #2979ff;
-				color: #fff;
-				font-size: 32rpx;
-				border-radius: 200rpx 200rpx 200rpx 200rpx;
+		.secondary-list {
+			width: 60%;
+			padding: 0 20rpx;
 
-				&:active {
-					opacity: 0.8;
+			.secondary-item {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				padding: 28rpx 10rpx;
+				font-size: 28rpx;
+				color: #333;
+
+				&.secondary-active {
+					font-weight: 500;
+					color: #388BFF;
 				}
 			}
 		}
 	}
 
-	@media (prefers-color-scheme: dark) {
-		.popup-content {
-			background-color: #1e1e1e;
+	.popup-footer {
+		padding: 20rpx 30rpx 40rpx;
+		background-color: #fff;
+		border-top: 1rpx solid #f5f5f5;
+		flex-shrink: 0;
 
-			.popup-header {
+		.confirm-btn {
+			width: 100%;
+			height: 88rpx;
+			line-height: 88rpx;
+			background-color: #2979ff;
+			color: #fff;
+			font-size: 32rpx;
+			border-radius: 200rpx 200rpx 200rpx 200rpx;
 
-				.title,
-				.popup-title {
-					color: #fff;
-				}
+			&:active {
+				opacity: 0.8;
 			}
+		}
+	}
+}
 
-			.two-level-container {
-				.primary-list {
-					background-color: #2d2d2d;
-					border-right-color: #3d3d3d;
+@media (prefers-color-scheme: dark) {
+	.popup-content {
+		background-color: #1e1e1e;
 
-					.primary-item {
-						border-bottom-color: #3d3d3d;
+		.popup-header {
 
-						&:active {
-							background-color: #3d3d3d;
-						}
+			.title,
+			.popup-title {
+				color: #fff;
+			}
+		}
+
+		.two-level-container {
+			.primary-list {
+				background-color: #2d2d2d;
+				border-right-color: #3d3d3d;
 
-						&.primary-active {
-							background-color: #3d3d3d;
+				.primary-item {
+					border-bottom-color: #3d3d3d;
 
-							.primary-text {
-								color: #2979ff;
-							}
-						}
+					&:active {
+						background-color: #3d3d3d;
+					}
+
+					&.primary-active {
+						background-color: #3d3d3d;
 
 						.primary-text {
-							color: #ccc;
+							color: #2979ff;
 						}
 					}
+
+					.primary-text {
+						color: #ccc;
+					}
 				}
+			}
 
-				.secondary-list {
-					.secondary-item {
-						border-bottom-color: #3d3d3d;
+			.secondary-list {
+				.secondary-item {
+					border-bottom-color: #3d3d3d;
 
-						&:active {
-							background-color: #3d3d3d;
-						}
+					&:active {
+						background-color: #3d3d3d;
+					}
 
-						&.secondary-active {
-							background-color: #2d2d2d;
-						}
+					&.secondary-active {
+						background-color: #2d2d2d;
+					}
 
-						.secondary-text {
-							color: #fff;
-						}
+					.secondary-text {
+						color: #fff;
 					}
 				}
 			}
+		}
 
-			.popup-footer {
-				background-color: #1e1e1e;
-				border-top-color: #3d3d3d;
-			}
+		.popup-footer {
+			background-color: #1e1e1e;
+			border-top-color: #3d3d3d;
 		}
 	}
-</style>
+}
+</style>

+ 1 - 1
pages_task/editSelectCustomer.vue

@@ -329,7 +329,7 @@ import{editAudit} from '@/api/task.js'
 						} else {
 							uni.showToast({
 								icon: 'none',
-								title: res.message || '提交失败'
+								title:res.msg|| res.message || '提交失败'
 							})
 						}
 					}).catch(err => {

+ 56 - 21
pages_task/pointsSettings.vue

@@ -16,9 +16,9 @@
 							<view class="customer-name">{{ customer.name }}</view>
 						</view>
 						<view class="integral-input-wrapper">
-							<input class="integral-input" type="number" :placeholder="customer.placeholder"
+					<input class="integral-input" type="number" :placeholder="customer.placeholder"
 								v-model="customer.integral" :disabled="customer.disabled"
-								@input="onIntegralInput(customer)" />
+								@input="onIntegralInput($event, customer)" @blur="onIntegralBlur(customer)" />
 							<view v-if="customer.integral" class="clear-icon-wrapper"
 								@click.stop="clearIntegral(customer)">
 								<image class="clear-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_clear.png"></image>
@@ -87,7 +87,7 @@
 							<view class="table-cell" style="flex: 1.5;">{{ customer.name }}</view>
 							<view class="table-cell" style="flex: 1;">{{ customer.level || '-' }}</view>
 							<view class="table-cell" style="flex: 1;">{{ customer.integral || '0' }}</view>
-							<view class="table-cell" style="flex: 2;">{{ customer.phone || customer.phonenumber || '-' }}</view>
+							<view class="table-cell" style="flex: 2;">{{ customer.mobile|| '-' }}</view>
 						</view>
 					</view>
 				</view>
@@ -198,7 +198,8 @@ import { getCompanyIntegralRanges } from '@/api/task.js'
 				let params = {
 					companyId: this.userInfo.companyId,
 					projectId: this.taskFormData.projectId,
-					doctorIds: doctorIds
+					doctorIds: doctorIds,
+					taskTypeId: this.taskFormData.taskTypeId || ''
 				}
 				console.log('传递的doctorIds:', doctorIds);
 				getCompanyIntegralRanges(params).then(res => {
@@ -246,22 +247,52 @@ import { getCompanyIntegralRanges } from '@/api/task.js'
 				// 使用 $set 确保响应式更新
 				this.$set(customer, 'integral', '')
 			},
-			onIntegralInput(customer) {
-				// 积分输入验证与范围限制
+			onIntegralInput(e, customer) {
+				const raw = e && e.detail ? e.detail.value : customer.integral
+				if (raw === '' || raw === null || raw === undefined) {
+					this.$set(customer, 'integral', '');
+					return;
+				}
+				let val = String(raw).replace(/[^\d]/g, '')
+				if (val === '') {
+					this.$set(customer, 'integral', '');
+					return;
+				}
+				let num = parseInt(val)
+				const minNum = Number(customer.minIntegral);
+				const maxNum = Number(customer.maxIntegral);
+				const hasMin = !Number.isNaN(minNum);
+				const hasMax = !Number.isNaN(maxNum);
+				// 输入阶段:超上限立即纠正;低于下限仅提示不改值(避免输入被打断)
+				if (!Number.isNaN(num) && hasMax && num > maxNum) {
+					num = maxNum
+					val = String(maxNum)
+					this.$set(customer, 'integral', val)
+					uni.showToast({ icon: 'none', title: `不得高于${maxNum}` })
+					return
+				}
+				if (!Number.isNaN(num) && hasMin && num < minNum) {
+					uni.showToast({ icon: 'none', title: `不得少于${minNum}` })
+				}
+				this.$set(customer, 'integral', val);
+			},
+			onIntegralBlur(customer) {
 				let val = parseInt(customer.integral);
 				if (isNaN(val)) {
 					this.$set(customer, 'integral', '');
 					return;
 				}
-				const hasMin = typeof customer.minIntegral === 'number';
-				const hasMax = typeof customer.maxIntegral === 'number';
-				if (hasMin && val < customer.minIntegral) {
-					val = customer.minIntegral;
-					uni.showToast({ icon: 'none', title: `不得少于${customer.minIntegral}` });
+				const minNum = Number(customer.minIntegral);
+				const maxNum = Number(customer.maxIntegral);
+				const hasMin = !Number.isNaN(minNum);
+				const hasMax = !Number.isNaN(maxNum);
+				if (hasMin && val < minNum) {
+					val = minNum;
+					uni.showToast({ icon: 'none', title: `不得少于${minNum}` });
 				}
-				if (hasMax && val > customer.maxIntegral) {
-					val = customer.maxIntegral;
-					uni.showToast({ icon: 'none', title: `不得高于${customer.maxIntegral}` });
+				if (hasMax && val > maxNum) {
+					val = maxNum;
+					uni.showToast({ icon: 'none', title: `不得高于${maxNum}` });
 				}
 				this.$set(customer, 'integral', String(val));
 			},
@@ -296,13 +327,15 @@ import { getCompanyIntegralRanges } from '@/api/task.js'
 					// 验证是否在范围内
 					const outOfRange = this.customerList.find(customer => {
 						const v = parseInt(customer.integral);
-						if (typeof customer.minIntegral === 'number' && v < customer.minIntegral) return true;
-						if (typeof customer.maxIntegral === 'number' && v > customer.maxIntegral) return true;
+						const minNum = Number(customer.minIntegral);
+						const maxNum = Number(customer.maxIntegral);
+						if (!Number.isNaN(minNum) && v < minNum) return true;
+						if (!Number.isNaN(maxNum) && v > maxNum) return true;
 						return false;
 					});
 					if (outOfRange) {
-						const min = outOfRange.minIntegral;
-						const max = outOfRange.maxIntegral;
+						const min = Number(outOfRange.minIntegral);
+						const max = Number(outOfRange.maxIntegral);
 						uni.showToast({
 							icon: 'none',
 							title: `${outOfRange.name || '该客户'}积分需在${min}-${max}`
@@ -342,6 +375,8 @@ import { getCompanyIntegralRanges } from '@/api/task.js'
 						companyId: userInfo.companyId || 0,
 						companyUserId: userInfo.userId || 0,
 						remark: taskFormData.remark || '',
+						targetId: taskFormData.targetId || '',
+						taskTypeId: taskFormData.taskTypeId || 0,
 						// companyUserId: taskFormData.companyUserId || 0,
 						// 构建doctorIds数组
 						// doctorIds: this.customerList.map(customer => parseInt(customer.id) || 0),
@@ -370,8 +405,8 @@ import { getCompanyIntegralRanges } from '@/api/task.js'
 								success: () => {
 									// 延迟跳转,让用户看到成功提示
 									setTimeout(() => {
-										uni.navigateTo({
-											url: '/pages_task/success'
+										uni.redirectTo({
+											url: "/pages_task/success?type=createTask"
 										})
 									}, 1500)
 								}
@@ -379,7 +414,7 @@ import { getCompanyIntegralRanges } from '@/api/task.js'
 						} else {
 							uni.showToast({
 								icon: 'none',
-								title: res.message || '提交失败'
+								title: res.msg ||res.message
 							})
 						}
 					}).catch(err => {

+ 6 - 2
pages_task/selectCustomer.vue

@@ -211,7 +211,11 @@ import { getAppliedList } from '@/api/task.js'
 				}
 
 				// 保存选中的客户到本地存储,以便pointsSettings.vue获取
-				uni.setStorageSync('selectedCustomers', JSON.stringify(this.selectedCustomers))
+				const enhanced = this.selectedCustomers.map(item => ({
+					...item,
+					mobile: item.mobile||''
+				}))
+				uni.setStorageSync('selectedCustomers', JSON.stringify(enhanced))
 
 				// 跳转到下一步(积分设置)
 				uni.navigateTo({
@@ -514,4 +518,4 @@ import { getAppliedList } from '@/api/task.js'
 			}
 		}
 	}
-</style>
+</style>

+ 239 - 243
pages_task/statistics.vue

@@ -39,8 +39,9 @@
 				:summary-stats="summaryStats.taskComplete" 
 				:columns="tableColumns.task"
 				:table-data="tableData.taskComplete" 
-				:loading="loading.task" 
-				@load-more="loadMore('task')"
+				:loading="loading.task"
+				height="600rpx"
+				@load-more="loadMore('taskComplete')"
 			>
 			</statistics-table>
 
@@ -50,8 +51,9 @@
 				:summary-stats="summaryStats.taskCreate" 
 				:columns="tableColumns.task"
 				:table-data="tableData.taskCreate" 
-				:loading="loading.task" 
-				@load-more="loadMore('task')"
+				:loading="loading.task"
+				height="600rpx"
+				@load-more="loadMore('taskCreate')"
 			>
 			</statistics-table>
 		</template>
@@ -63,12 +65,13 @@
 				:summary-stats="summaryStats.service" 
 				:columns="tableColumns.service"
 				:table-data="tableData.service" 
-				:loading="loading.service" 
+				:loading="loading.service"
+				height="600rpx"
 				@load-more="loadMore('service')"
 			>
 			</statistics-table>
 
-			<statistics-table 
+			<!-- <statistics-table 
 				:summary-title="summaryTitle.service[1]" 
 				:summary-stats="summaryStats.service" 
 				:columns="tableColumns.service"
@@ -76,7 +79,7 @@
 				:loading="loading.service" 
 				@load-more="loadMore('service')"
 			>
-			</statistics-table>
+			</statistics-table> -->
 		</template>
 
 		<!-- 日期选择弹窗 -->
@@ -138,25 +141,23 @@
 				</template>
 
 				<template v-else-if="currentStatType === 'service'">
-					<!-- 服务单类型筛选 -->
 					<view class="filter-group">
-						<view class="group-label">服务单类型</view>
+						<view class="group-label">服务单结算状态</view>
 						<view class="filter-tags">
-							<view class="filter-tag" :class="{ active: tempSelectedServiceType === item.value }"
-								v-for="(item, index) in serviceTypeOptions" :key="index" @click="selectServiceType(item.value)">
-								{{ item.label }}
+							<view class="filter-tag" :class="{ active: tempSelectedSettlementStatus === item.dictValue }"
+								v-for="(item, index) in serviceOrderSettlementStatusDict" :key="index" @click="selectSettlementStatus(item.dictValue)">
+								{{ item.dictLabel }}
 							</view>
 						</view>
 					</view>
 
-					<!-- 服务单状态筛选 -->
 					<view class="filter-group">
 						<view class="group-label">服务单状态</view>
 						<view class="filter-tags">
-							<view class="filter-tag" :class="{ active: tempSelectedServiceStatus === item.value }"
-								v-for="(item, index) in serviceStatusOptions" :key="index"
-								@click="selectServiceStatus(item.value)">
-								{{ item.label }}
+							<view class="filter-tag" :class="{ active: tempSelectedServiceStatus === item.dictValue }"
+								v-for="(item, index) in serviceOrderAuditStatusDict" :key="index"
+								@click="selectServiceStatus(item.dictValue)">
+								{{ item.dictLabel }}
 							</view>
 						</view>
 					</view>
@@ -175,29 +176,40 @@
 <script>
 import utils from '@/utils/common.js'
 	import StatisticsTable from '@/components/StatisticsTable.vue'
-	import { getTaskCompleteStats, getTaskCreateStats } from '@/api/task.js'
+	import { getTaskCompleteStats, getTaskCreateStats, getStatisticsSummary } from '@/api/task.js'
 	export default {
 		components: {
 			StatisticsTable
 		},
 		data() {
+			const d = new Date();
+			const y = d.getFullYear();
+			const m = String(d.getMonth() + 1).padStart(2, '0');
+			const dd = String(d.getDate()).padStart(2, '0');
+			const todayStr = `${y}-${m}-${dd}`;
+			const weekAgo = new Date(d);
+			weekAgo.setDate(weekAgo.getDate() - 7);
+			const y2 = weekAgo.getFullYear();
+			const m2 = String(weekAgo.getMonth() + 1).padStart(2, '0');
+			const dd2 = String(weekAgo.getDate()).padStart(2, '0');
+			const weekAgoStr = `${y2}-${m2}-${dd2}`;
 			return {
 				userInfo: uni.getStorageSync("userInfo")||'',
 				statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
 				showDatePicker: false,
 				showFilter: false,
 				currentStatType: 'task', // 当前统计类型: task-任务统计, service-服务单统计
-				
 				// 日期范围
 				dateRange: {
-					startDate: '2025-12-01',
-					endDate: '2025-12-25'
+					startDate: weekAgoStr,
+					endDate: todayStr
 				},
 				tempDateRange: {
-					startDate: '2025-12-01',
-					endDate: '2025-12-25'
+					startDate: weekAgoStr,
+					endDate: todayStr
 				},
 				
+				
 				// 任务统计筛选
 				selectedTaskType: [],
 				selectedTaskStatus: [],
@@ -205,60 +217,13 @@ import utils from '@/utils/common.js'
 				tempSelectedTaskStatus: [],
 				
 				// 服务单统计筛选
-				selectedServiceType: 'all',
 				selectedServiceStatus: '',
-				tempSelectedServiceType: 'all',
 				tempSelectedServiceStatus: '',
+				selectedSettlementStatus: '',
+				tempSelectedSettlementStatus: '',
+				serviceOrderAuditStatusDict: [],
+				serviceOrderSettlementStatusDict: [],
 				
-				// 服务单类型选项
-				serviceTypeOptions: [{
-						label: '全部类型',
-						value: 'all'
-					},
-					{
-						label: '技术咨询',
-						value: 'techConsultation'
-					},
-					{
-						label: '售后服务',
-						value: 'afterSales'
-					},
-					{
-						label: '安装服务',
-						value: 'installation'
-					},
-					{
-						label: '维修服务',
-						value: 'repair'
-					},
-					{
-						label: '投诉建议',
-						value: 'complaint'
-					}
-				],
-				
-				// 服务单状态选项
-				serviceStatusOptions: [{
-						label: '待处理',
-						value: 'pending'
-					},
-					{
-						label: '处理中',
-						value: 'processing'
-					},
-					{
-						label: '已完成',
-						value: 'completed'
-					},
-					{
-						label: '已关闭',
-						value: 'closed'
-					},
-					{
-						label: '已取消',
-						value: 'cancelled'
-					}
-				],
 				
 				// 统计标题(分开存储)
 				summaryTitle: {
@@ -270,15 +235,15 @@ import utils from '@/utils/common.js'
 				summaryStats: {
 					taskComplete: [{
 						label: '总积分',
-						value: 300
+						value:0
 					}],
 					taskCreate: [{
 						label: '总积分',
-						value: 1000
+						value: 0
 					}],
 					service: [{
 						label: '总积分',
-						value: 45
+						value: 0
 					}]
 				},
 				
@@ -287,61 +252,66 @@ import utils from '@/utils/common.js'
 					task: [{
 						title: '归属',
 						key: 'deptName',
-						width: '20%'
+						width: '24%'
 					},
 					{
 						title: '类型',
 						key: 'taskType',
-						width: '20%'
+						width: '12%'
 					},
 					{
 						title: '数量',
 						key: 'count',
-						width: '15%'
+						width: '10%'
 					},
 					{
 						title: '客户',
-						key: 'companyUserName',
-						width: '20%'
-					},{"title": "业务员",
-					"key": "doctorName",
-					"width": "20%"
+						key: 'doctorName',
+						width: '24%'
+					},{
+						title: "业务员",
+					    key: "companyUserName",
+					    width: "18%"
 					},
 					{
 						title: '积分',
 						key: 'totalPoints',
-						width: '25%'
+						width: '12%'
 					}],
 					service: [{
-							title: '项目归属',
-							key: 'serviceNo',
-							width: '25%'
+							title: '归属部门',
+							key: 'deptName',
+							width: '24%'
 						},
 						{
-							title: '类型',
-							key: 'serviceType',
-							width: '20%'
+							title: '服务单数',
+							key: 'serviceOrderCount',
+							width: '12%'
 						},
 						{
-							title: '数',
-							key: 'customerName',
-							width: '20%'
+							title: '任务数',
+							key: 'taskCount',
+							width: '10%'
 						},
 						{
-							title: '客户',
-							key: 'statusText',
-							width: '20%',
-							slot: true
+							title: '客服数',
+							key: 'companyUserCount',
+							width: '12%'
 						},
 						{
-							title: '业务员',
-							key: 'createTime',
-							width: '25%'
+							title: '医生数',
+							key: 'doctorCount',
+							width: '12%'
 						},
 						{
-							title: '积分',
-							key: 'createTime',
-							width: '25%'
+							title: '任务金额',
+							key: 'taskAmount',
+							width: '15%'
+						},
+						{
+							title: '总金额',
+							key: 'totalAmount',
+							width: '15%'
 						}
 					]
 				},
@@ -352,31 +322,17 @@ import utils from '@/utils/common.js'
 				],
 				taskCreate: [
 				],
-				service: [{
-					serviceNo: '学术研究',
-					serviceType: '技术咨询',
-					customerName: '李*华',
-					status: 'completed',
-					statusText: '已完成',
-					createTime: '2025-12-25'
-				},
-				{
-					serviceNo: '学术研究',
-					serviceType: '售后服务',
-					customerName: '张*伟',
-					status: 'processing',
-					statusText: '处理中',
-					createTime: '2025-12-24'
-				},
-				{
-					serviceNo: '学术研究',
-					serviceType: '安装服务',
-					customerName: '王*芳',
-					status: 'pending',
-					statusText: '待处理',
-					createTime: '2025-12-23'
-				}
-				]
+				service: []
+			},
+			// 分页与加载更多控制
+			pageSize: 10,
+			page: {
+				taskComplete: 1,
+				taskCreate: 1
+			},
+			hasMore: {
+				taskComplete: true,
+				taskCreate: true
 			},
 			taskTypeDict: [],//任务类型
 			taskStatusDict: [],//任务状态
@@ -390,7 +346,14 @@ import utils from '@/utils/common.js'
 		},
 		computed: {
 			dateRangeText() {
-				return `${this.dateRange.startDate} 至 ${this.dateRange.endDate}`
+				const d = new Date()
+				const y = d.getFullYear()
+				const m = String(d.getMonth() + 1).padStart(2, '0')
+				const dd = String(d.getDate()).padStart(2, '0')
+				const today = `${y}-${m}-${dd}`
+				const start = this.dateRange && this.dateRange.startDate ? this.dateRange.startDate : today
+				const end = this.dateRange && this.dateRange.endDate ? this.dateRange.endDate : today
+				return `${start} 至 ${end}`
 			}
 		},
 		watch: {
@@ -401,8 +364,8 @@ import utils from '@/utils/common.js'
 						this.tempSelectedTaskType = [...this.selectedTaskType]
 						this.tempSelectedTaskStatus = [...this.selectedTaskStatus]
 					} else {
-						this.tempSelectedServiceType = this.selectedServiceType
 						this.tempSelectedServiceStatus = this.selectedServiceStatus
+						this.tempSelectedSettlementStatus = this.selectedSettlementStatus
 					}
 				}
 			},
@@ -410,13 +373,21 @@ import utils from '@/utils/common.js'
 				// 切换统计类型时,重置筛选条件(可选)
 				this.resetFilters()
 				// 重新加载数据
-				this.loadData()
+				if (newVal === 'task') {
+					this.loadData()
+				} else {
+					this.getStatisticsSummary()
+				}
 			}
 		},
 		onLoad: async function(options) {
 			try {
 				this.taskTypeDict = await utils.getDicts("task_type");//任务类型
 				this.taskStatusDict = await utils.getDicts("task_status");//任务状态
+
+				this.serviceOrderAuditStatusDict = await utils.getDicts("service_order_audit_status");//服务单状态
+				this.serviceOrderSettlementStatusDict = await utils.getDicts("service_order_settlement_status");//服务单结算状态
+
 			} catch (e) {
 				console.log('获取字典数据失败:', e)
 			}
@@ -427,6 +398,64 @@ import utils from '@/utils/common.js'
 			this.loadMore(this.currentStatType)
 		},
 		methods: {
+			//服务单统计汇总
+			getStatisticsSummary(){
+				let params = {
+					companyId: this.userInfo.companyId,
+					deptId: this.userInfo.deptId,
+					startTime: this.dateRange.startDate,
+					endTime: this.dateRange.endDate,
+					auditStatus: String(this.selectedServiceStatus || ''),
+					settlementStatus: String(this.selectedSettlementStatus || '')
+				}
+				getStatisticsSummary(params).then(res => {
+					if (res.code === 200) {
+						const d = res.data || {}
+						const list = Array.isArray(d) ? d : (Array.isArray(d.rows) ? d.rows : [])
+						this.tableData.service = list
+						const totalAmount = d.totalAmount != null
+							? d.totalAmount
+							: list.reduce((sum, cur) => sum + Number(cur.totalAmount || 0), 0)
+						this.summaryStats.service = [
+							{ label: '总金额', value: totalAmount }
+						]
+					}
+				})
+			},
+			
+			// 构造任务统计公共请求参数
+			buildTaskParams(pageNum = 1) {
+				const userInfo = uni.getStorageSync('userInfo') || {}
+				const params = {
+					companyId: userInfo.companyId || 1,
+					pageNum,
+					pageSize: this.pageSize,
+					startDate: this.dateRange.startDate,
+					endDate: this.dateRange.endDate
+				}
+				if (this.selectedTaskType && this.selectedTaskType.length > 0) {
+					params.taskTypes = this.selectedTaskType.join(',')
+				}
+				if (this.selectedTaskStatus && this.selectedTaskStatus.length > 0) {
+					params.taskStatuses = this.selectedTaskStatus.join(',')
+				}
+				return params
+			},
+			
+			// 解析任务统计响应,返回 rows/totalCount/totalPoints
+			parseTaskStats(res) {
+				const d = (res && res.data) || {}
+				const rows = Array.isArray(d.rows) ? d.rows : (res.rows || [])
+				const totalCount = (d.totalCount != null) ? d.totalCount : (res.total || rows.length || 0)
+				const totalPoints = (d.totalPoints != null)
+					? d.totalPoints
+					: rows.reduce((sum, item) => sum + (item.totalPoints || 0), 0)
+				const normalized = rows.map(item => ({
+					...item,
+					taskType: item.taskType || '无类型'
+				}))
+				return { rows: normalized, totalCount, totalPoints }
+			},
 			// 切换统计类型
 			switchStatType(type) {
 				if (this.currentStatType !== type) {
@@ -465,7 +494,11 @@ import utils from '@/utils/common.js'
 					...this.tempDateRange
 				}
 				this.showDatePicker = false
-				this.loadData()
+				if (this.currentStatType === 'task') {
+					this.loadData()
+				} else {
+					this.getStatisticsSummary()
+				}
 			},
 			
 			closeFilter() {
@@ -474,8 +507,8 @@ import utils from '@/utils/common.js'
 					this.tempSelectedTaskType = this.selectedTaskType
 					this.tempSelectedTaskStatus = this.selectedTaskStatus
 				} else {
-					this.tempSelectedServiceType = this.selectedServiceType
 					this.tempSelectedServiceStatus = this.selectedServiceStatus
+					this.tempSelectedSettlementStatus = this.selectedSettlementStatus
 				}
 				this.showFilter = false
 			},
@@ -519,14 +552,21 @@ import utils from '@/utils/common.js'
 					this.tempSelectedServiceStatus = value
 				}
 			},
+			selectSettlementStatus(value) {
+				if (this.tempSelectedSettlementStatus === value) {
+					this.tempSelectedSettlementStatus = ''
+				} else {
+					this.tempSelectedSettlementStatus = value
+				}
+			},
 			
 			resetFilters() {
 				if (this.currentStatType === 'task') {
 					this.tempSelectedTaskType = []
 					this.tempSelectedTaskStatus = []
 				} else {
-					this.tempSelectedServiceType = 'all'
 					this.tempSelectedServiceStatus = ''
+					this.tempSelectedSettlementStatus = ''
 				}
 			},
 			
@@ -535,11 +575,15 @@ import utils from '@/utils/common.js'
 					this.selectedTaskType = [...this.tempSelectedTaskType]
 					this.selectedTaskStatus = [...this.tempSelectedTaskStatus]
 				} else {
-					this.selectedServiceType = this.tempSelectedServiceType
 					this.selectedServiceStatus = this.tempSelectedServiceStatus
+					this.selectedSettlementStatus = this.tempSelectedSettlementStatus
 				}
 				this.showFilter = false
-				this.loadData()
+				if (this.currentStatType === 'task') {
+					this.loadData()
+				} else {
+					this.getStatisticsSummary()
+				}
 			},
 			
 			async loadData() {
@@ -554,63 +598,36 @@ import utils from '@/utils/common.js'
 						// 获取用户信息
 						const userInfo = uni.getStorageSync('userInfo')
 						
-						// 构建请求参数
-						const params = {
-							companyId: userInfo.companyId || 1,
-							pageNum: 1,
-							pageSize: 10
-						}
-						
-						// 如果有选中的任务类型,添加到请求参数中
-						if (this.selectedTaskType && this.selectedTaskType.length > 0) {
-							params.taskTypes = this.selectedTaskType.join(',')
-						}
-						
-						// 如果有选中的任务状态,添加到请求参数中
-						if (this.selectedTaskStatus && this.selectedTaskStatus.length > 0) {
-							params.taskStatuses = this.selectedTaskStatus.join(',')
-						}
+						// 重置分页
+						this.page.taskComplete = 1
+						this.page.taskCreate = 1
 						
-						// 调用任务完成统计接口
-						const completeStatsRes = await getTaskCompleteStats(params)
-						// 调用任务创建统计接口
-						const createStatsRes = await getTaskCreateStats(params)
+						// 并发获取完成与创建统计
+						const params = this.buildTaskParams(1)
+						const [completeStatsRes, createStatsRes] = await Promise.all([
+							getTaskCompleteStats(params),
+							getTaskCreateStats(params)
+						])
 						
 						// 处理返回的数据
 					if (completeStatsRes.code === 200) {
-						// 更新任务完成统计数据
-						console.log('任务完成统计数据:', completeStatsRes)
-						// 更新表格数据
-						this.tableData.taskComplete = completeStatsRes.rows.map(item => ({
-							...item,
-							taskType: item.taskType || '无类型'
-						}))
-						// 更新汇总统计
-						this.summaryStats.taskComplete = [{
-							label: '总任务数',
-							value: completeStatsRes.total || 0
-						}, {
-							label: '总积分',
-							value: completeStatsRes.rows.reduce((sum, item) => sum + (item.totalPoints || 0), 0)
-						}]
+						const comp = this.parseTaskStats(completeStatsRes)
+						this.tableData.taskComplete = comp.rows
+						this.hasMore.taskComplete = comp.rows.length >= this.pageSize
+						this.summaryStats.taskComplete = [
+							{ label: '总任务数', value: comp.totalCount },
+							{ label: '总积分', value: comp.totalPoints }
+						]
 					}
 					
 					if (createStatsRes.code === 200) {
-						// 更新任务创建统计数据
-						console.log('任务创建统计数据:', createStatsRes)
-						// 更新表格数据
-						this.tableData.taskCreate = createStatsRes.rows.map(item => ({
-							...item,
-							taskType: item.taskType || '无类型'
-						}))
-						// 更新汇总统计
-						this.summaryStats.taskCreate = [{
-							label: '总任务数',
-							value: createStatsRes.total || 0
-						}, {
-							label: '总积分',
-							value: createStatsRes.rows.reduce((sum, item) => sum + (item.totalPoints || 0), 0)
-						}]
+						const cre = this.parseTaskStats(createStatsRes)
+						this.tableData.taskCreate = cre.rows
+						this.hasMore.taskCreate = cre.rows.length >= this.pageSize
+						this.summaryStats.taskCreate = [
+							{ label: '总任务数', value: cre.totalCount },
+							{ label: '总积分', value: cre.totalPoints }
+						]
 					}
 						
 						uni.hideLoading()
@@ -630,64 +647,43 @@ import utils from '@/utils/common.js'
 				}
 			},
 			
-			async loadMore(type) {
-				// 根据类型加载更多数据
-				this.loading[type] = true
-				// 模拟加载更多
-				setTimeout(() => {
-					if (type === 'task') {
-						// 添加更多任务数据
-						this.tableData.task.push(...this.getMoreTaskData())
-					} else {
-						// 添加更多服务单数据
-						this.tableData.service.push(...this.getMoreServiceData())
-					}
-					this.loading[type] = false
-				}, 1000)
-			},
-			
-			getMoreTaskData() {
-				// 返回更多任务数据
-				return [{
-						taskType: '更多任务',
-						points: '30',
-						applicant: '测试*员',
-						status: 'completed',
-						statusText: '已完成',
-						receiveTime: '2025-09-26'
-					},
-					{
-						taskType: '更多任务2',
-						points: '50',
-						applicant: '测试*员2',
-						status: 'pendingReview',
-						statusText: '待审核',
-						receiveTime: '2025-09-27'
+			async loadMore(which) {
+				// 仅处理两个任务表格的加载更多;无更多时拦截
+				if (which === 'taskComplete' && !this.hasMore.taskComplete) return
+				if (which === 'taskCreate' && !this.hasMore.taskCreate) return
+				
+				this.loading.task = true
+				try {
+					if (which === 'taskComplete') {
+						const nextPage = this.page.taskComplete + 1
+						const res = await getTaskCompleteStats(this.buildTaskParams(nextPage))
+						if (res.code === 200) {
+							const comp = this.parseTaskStats(res)
+							if (comp.rows.length > 0) {
+								this.tableData.taskComplete = this.tableData.taskComplete.concat(comp.rows)
+								this.page.taskComplete = nextPage
+							}
+							this.hasMore.taskComplete = comp.rows.length >= this.pageSize
+						}
+					} else if (which === 'taskCreate') {
+						const nextPage2 = this.page.taskCreate + 1
+						const res2 = await getTaskCreateStats(this.buildTaskParams(nextPage2))
+						if (res2.code === 200) {
+							const cre = this.parseTaskStats(res2)
+							if (cre.rows.length > 0) {
+								this.tableData.taskCreate = this.tableData.taskCreate.concat(cre.rows)
+								this.page.taskCreate = nextPage2
+							}
+							this.hasMore.taskCreate = cre.rows.length >= this.pageSize
+						}
 					}
-				]
-			},
-			
-			getMoreServiceData() {
-				// 返回更多服务单数据
-				return [{
-					serviceNo: 'FW20251222004',
-					serviceType: '维修服务',
-					customerName: '赵*强',
-					status: 'closed',
-					statusText: '已关闭',
-					createTime: '2025-12-22'
-				},
-				{
-					serviceNo: 'FW20251221005',
-					serviceType: '投诉建议',
-					customerName: '孙*丽',
-					status: 'cancelled',
-					statusText: '已取消',
-					createTime: '2025-12-21'
+				} finally {
+					this.loading.task = false
 				}
-				]
 			},
 			
+			// 去掉本地“更多任务”占位数据与服务单模拟追加,保持真实接口分页
+			
 			// 根据taskType获取任务类型名称
 			getTaskTypeName(taskType) {
 				// 任务类型映射
@@ -1001,4 +997,4 @@ import utils from '@/utils/common.js'
 			}
 		}
 	}
-</style>
+</style>

+ 12 - 4
pages_task/success.vue

@@ -12,17 +12,25 @@
 
 		data() {
 			return {
-
+				type: ''
 			}
 		},
 		watch: {
 
 		},
-		onLoad() {},
+		onLoad(options) {
+			this.type = options.type
+		},
 
 		methods: {
 			goBack() {
-				uni.navigateBack()
+				if (this.type === 'createTask') {
+					uni.navigateTo({
+						url: '/pages_task/xlTask'
+					})
+				} else {
+					uni.navigateBack()
+				}
 			},
 
 
@@ -73,4 +81,4 @@
 
 
 	}
-</style>
+</style>

+ 18 - 12
pages_task/taskDetail.vue

@@ -135,8 +135,8 @@
 							</view>
 						</view>
 						<view class="client-stats">
-							<view class="stat-item"><text class="num">{{detail.doctorVO.taskNum ||'0'}} </text>任务</view>
-							<view class="stat-item"><text class="num">{{ detail.doctorVO.balance||'0' }} </text>积分</view>
+							<view class="stat-item"><text class="num">{{detail.taskCount ||'0'}} </text>任务</view>
+							<view class="stat-item"><text class="num">{{ detail.taskIntegral||'0' }} </text>积分</view>
 						</view>
 					</view>
 				</view>
@@ -192,7 +192,7 @@
 				</view>
 				<view class="audit-tabs">
 					<view class="audit-tab" :class="{ active: activeTab === 'create' }" @click="switchTab('create')">创建任务审批</view>
-					<view class="audit-tab" :class="{ active: activeTab === 'complete' }" @click="switchTab('complete')">完成任务审批</view>
+					<view class="audit-tab" v-if="detail.createAuditStatus!=0" :class="{ active: activeTab === 'complete' }" @click="switchTab('complete')">完成任务审批</view>
 				</view>
 				<view class="approval-list">
 					<view class="approval-item" v-for="(item, index) in currentApprovalInfo" :key="index">
@@ -218,7 +218,7 @@
 
 			</view>
 		</scroll-view>
-		<view class="bottom-bar" v-if="auditStatus==1">
+		<view class="bottom-bar" v-if="auditStatus==1&&detailType==='audit'">
 			<view class="action-buttons">
 				<view class="btn btn-cancel" @click="openRejectPopup">
 					<image class="icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_approval_no.png"></image>
@@ -252,11 +252,11 @@
 </template>
 
 <script>
-import { doAudit,doCreateAudit} from '@/api/audit.js'
+import { doAudit
+	// ,doCreateAudit
+} from '@/api/audit.js'
 import { info } from '@/api/task.js';
-	// import { getTaskFinishAuditInfo,detail} from '@/api/task.js';
-	import { detail} from '@/api/audit.js';
-
+import { detail} from '@/api/audit.js';
 	export default {
 		data() {
 			return {
@@ -299,6 +299,7 @@ import { info } from '@/api/task.js';
 				userInfo:{},
 				showRejectPopup:false,//是否展示驳回弹窗
 				rejectReason:'',//驳回原因
+				detailType:''//详情type
 
 
 			}
@@ -322,7 +323,9 @@ import { info } from '@/api/task.js';
 			if (options.id) {
 				const id = options.id
 			this.info(id);
-
+			}
+			if(options.type){
+				this.detailType = options.type
 			}
 
 			// 初始化 auditStatus
@@ -355,7 +358,8 @@ import { info } from '@/api/task.js';
         console.log("this.userInfo",this.userInfo)
 
         // 根据当前标签选择不同的审核接口
-        const auditApi = this.activeTab === 'create' ? doCreateAudit : doAudit;
+        // const auditApi = this.activeTab === 'create' ? doCreateAudit : doAudit;
+        const auditApi =  doAudit;
         
         // 调用审核接口,传递action=2表示驳回
         const res = await auditApi({
@@ -406,7 +410,9 @@ import { info } from '@/api/task.js';
         console.log("this.userInfo",this.userInfo)
 
         // 根据当前标签选择不同的审核接口
-        const auditApi = this.activeTab === 'create' ? doCreateAudit : doAudit;
+        // const auditApi = this.activeTab === 'create' ? doCreateAudit : doAudit;
+        const auditApi = doAudit;
+
         
         // 调用审核接口,传递action=1表示通过
         const res = await auditApi({
@@ -1137,4 +1143,4 @@ import { info } from '@/api/task.js';
 		}
 	}
 
-</style>
+</style>

+ 76 - 50
pages_task/xlTask.vue

@@ -4,7 +4,13 @@
 		<view class="top-box">
 			<view class="input-item">
 				<image class="icon search-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/search.png" mode="widthFix"></image>
-				<input placeholder="请输入客户姓名/机构名称" placeholder-class="placeholder" />
+				<input 
+					v-model="searchKeyword"
+					:placeholder="searchPlaceholder"
+					placeholder-class="placeholder"
+					confirm-type="search"
+					@confirm="onSearch"
+				/>
 			</view>
 			<view class="filter-item" @click="showFilter = true">
 				<image class="filter-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_select.png" mode="widthFix"></image>
@@ -17,9 +23,9 @@
 			<view class="top-tab-item" :class="{ active: currentTopTab === 'task' }" @click="switchTopTab('task')">
 				任务列表
 			</view>
-			<view class="top-tab-item" :class="{ active: currentTopTab === 'audit' }" @click="switchTopTab('audit')">
+			<!-- <view class="top-tab-item" :class="{ active: currentTopTab === 'audit' }" @click="switchTopTab('audit')">
 				审核列表
-			</view>
+			</view> -->
 		</view>
 
 		<!-- 动态子标签 -->
@@ -100,8 +106,7 @@
 							</view>
 							<view class="btn-group">
 								<view class="btn" v-if="item.showDelete" @click.stop="handleTaskDelete(item, index)">删除</view>
-							<!-- @click.stop="handleCopy(item)" -->
-						<view class="btn" @click.stop="copyTask(item.id)" >复制创建</view>
+						<!-- <view class="btn" @click.stop="copyTask(item.id)" >复制创建</view> -->
 							</view>
 						</view>
 
@@ -112,30 +117,23 @@
 				</view>
 			</view>
 			<!-- 审核列表 -->
-			<view v-else>
+			<!-- <view v-else>
 				<view class="task-card" v-for="(item, index) in currentList" :key="index" @click="goDetails(item)">
-					<!-- 任务标题+状态 -->
 					<view class="card-top">
 						<text class="card-task-title">{{ item.auditName || '未设置' }}</text>
 						<view class="status-tag" :class="item.statusClass">{{ item.statusText }}</view>
 					</view>
-
 					<view class="card-content">
-						<!-- 讲者信息 -->
 						<view class="speaker-info">
 							<text class="speaker-name">{{ item.businessData.taskInfo.doctorVO.doctorName||'未命名' }}</text>
 							<view class="level-tag" v-if="item.businessData.taskInfo.doctorVO.jobTitle">{{ item.businessData.taskInfo.doctorVO.jobTitle }}</view>
 						</view>
-
-						<!-- 医院+科室 -->
 						<view class="org-info">
 							<image class="org-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/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>
 						</view>
-
-						<!-- 标签组 -->
 						<view class="card-tags">
 							<view class="tag-left-group">
 								<view class="tag-item video-tag" v-if="item.businessData.taskInfo.taskTypeName">
@@ -146,25 +144,19 @@
 								<view class="tag-item category-tag" v-if="item.businessData.taskInfo.taskTypeName">
 									{{ item.businessData.taskInfo.taskTypeName }}
 								</view>
-
 							</view>
-
 							<view class="tag-right-group">
-								<view class="tag-item points-tag">{{ item.businessData.taskInfo.doctorVO.taskIntegral||'0' }}积分</view>
-								<view class="tag-item count-tag">{{ item.businessData.taskInfo.doctorVO.taskCount ||'0' }}个</view>
+								<view class="tag-item points-tag">{{ item.businessData.taskInfo.taskIntegral||'0' }}积分</view>
+								<view class="tag-item count-tag">{{ item.businessData.taskInfo.taskCount ||'0' }}个</view>
 								<view class="tag-item count-tag">院内</view>
 							</view>
 						</view>
-
-						<!-- 时间信息 -->
 						<view class="time-info">
 							<view class="time-item">
 								<text>申请时间:</text>
 								<text>{{  item.businessData.taskInfo.createTime ||'-'}}</text>
 							</view>
 						</view>
-
-						<!-- 操作按钮 -->
 						<view class="operate-btn-group">
 							<view class="share-btn" @click="handleShare(item)">
 								<image class="share-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_user.png" mode="widthFix"></image>
@@ -172,16 +164,13 @@
 							</view>
 							<view class="btn-group">
 								<view class="btn"  @click.stop="handleTaskDelete(item, index)">删除</view>
-								<view class="btn"  @click.stop="handleCopy(item)">编辑</view>
 							</view>
 						</view>
-
-						<!-- 状态印章 -->
 						<image class="status-seal" :src="item.sealImg" mode="widthFix">
 						</image>
 					</view>
 				</view>
-			</view>
+			</view> -->
 		</scroll-view>
 		<view class="side">
 			<view class="side-item"  >
@@ -205,9 +194,9 @@
 					<view class="filter-section">
 						<view class="section-label">任务申请时间</view>
 						<view class="time-range">
-							<view class="time-input" @click="openDatePicker('applyTimeStart')">{{ filters.applyTimeStart || '开始时间' }}</view>
+							<view class="time-input" @click="openDatePicker('applyStartTime')">{{ filters.applyStartTime || '开始时间' }}</view>
 							<view class="time-separator">-</view>
-							<view class="time-input" @click="openDatePicker('applyTimeEnd')">{{ filters.applyTimeEnd || '结束时间' }}</view>
+							<view class="time-input" @click="openDatePicker('applyEndTime')">{{ filters.applyEndTime || '结束时间' }}</view>
 						</view>
 					</view>
 
@@ -237,8 +226,6 @@
 						<view class="btn-group">
 							<view class="filter-btn" :class="{ active: filters.taskBelong === '' }"
 								@click="filters.taskBelong = ''">我的任务</view>
-							<!-- <view class="filter-btn" :class="{ active: filters.taskBelong === 'dept' }"
-								@click="filters.taskBelong = 'dept'">部门任务</view> -->
 						</view>
 					</view>
 
@@ -285,11 +272,13 @@
 import { dicts } from '@/api/common.js';
 import utils from '@/utils/common.js'
 // auditList
+import { pendingtaskAudtList } from '@/api/task.js';
 import { list,  deleted, company ,auditList,copy} from '@/api/task.js';
 import { getPendingAuditList } from '@/api/audit.js';
 	export default {
 		data() {
 				return {
+					searchKeyword: '',
 					showFilter: false,
 					showDatePicker: false,
 					currentDateField: '',
@@ -298,8 +287,8 @@ import { getPendingAuditList } from '@/api/audit.js';
 					companySettingsLoaded: false,
 					isLoading: false,
 					filters: {
-						applyTimeStart: '',
-						applyTimeEnd: '',
+						applyStartTime: '',
+						applyEndTime: '',
 						finishTimeStart: '',
 						finishTimeEnd: '',
 						auditTimeStart: '',
@@ -392,12 +381,31 @@ import { getPendingAuditList } from '@/api/audit.js';
 			},
 			currentList() {
 				return this.currentTopTab === 'task' ? this.taskList : this.auditList;
+			},
+			searchPlaceholder() {
+				return this.currentTopTab === 'task' ? '请输入客户姓名/机构名称' : '请输入客户姓名/电话号码'
 			}
 		},
 		mounted() {
 			this.loadData();
 		},
 		methods: {
+			// //查询公司下的待审核任务列表
+			// pendingtaskAudtList() {
+			// 	const params = {
+			// 		companyId: this.userInfo.companyId || 0
+			// 	}
+			// 	pendingtaskAudtList(params).then(res => {
+			// 		if (res.code === 200 && res.data) {
+			// 			this.auditList = res.data || [];
+			// 		} else {
+			// 			uni.showToast({
+			// 				title: res.msg || '查询失败',
+			// 				icon: 'none'
+			// 			});
+			// 		}
+			// 	});
+			// },
 			//复制任务
 			copyTask(id){
 				console.log("复制",id);
@@ -418,6 +426,7 @@ import { getPendingAuditList } from '@/api/audit.js';
 				getAuditList() {
 					// 构建请求参数
 					const params = {
+						tempCode: ['ADUIT_CJRW', 'ADUIT_WCRWSH'],
 						userId: this.userInfo.userId,
 					    taskStatus: this.currentSubTab || '',
 						status:'',
@@ -425,9 +434,10 @@ import { getPendingAuditList } from '@/api/audit.js';
 						templateCode: this.templateCode||'',
 						pageNum: this.auditPage,
 						pageSize: this.auditPageSize,
+						keyWord: this.searchKeyword || '',
 						// 任务申请时间
-						applyStartTime: this.filters.applyTimeStart || '',
-						applyEndTime: this.filters.applyTimeEnd || '',
+						applyStartTime: this.filters.applyStartTime || '',
+						applyEndTime: this.filters.applyEndTime || '',
 						// 任务完成时间
 						taskFinishTimeStart: this.filters.finishTimeStart || '',
 						taskFinishTimeEnd: this.filters.finishTimeEnd || '',
@@ -448,13 +458,15 @@ import { getPendingAuditList } from '@/api/audit.js';
 						});
 					}
 					
-					getPendingAuditList(params).then(res => {
+					pendingtaskAudtList(params).then(res => {
 						this.isLoading = false;
 						this.isLoadingMore = false;
 						uni.hideLoading();
-						if (res.code === 200 && res.rows) {
+						if (res.code === 200 ) {
+						console.log("审批列表数据",res);
+
 							// 处理审核列表数据
-							const newAuditList = res.rows.map(item => {
+							const newAuditList = res.data.map(item => {
 								// 从businessData.taskInfo中获取任务信息
 								const taskInfo = item.businessData?.taskInfo || {};
 								return {
@@ -462,11 +474,11 @@ import { getPendingAuditList } from '@/api/audit.js';
 									auditName: item.auditName,
 									initiatorName: taskInfo.doctorName || item.initiatorName || '未知',
 									createTime: item.createTime,
-									statusText: this.getAuditStatusText(item.status),
+									statusText: this.getAuditStatusText(item.businessData.taskInfo.taskStatus),
 									statusClass: this.getAuditStatusClass(item.status),
 									doctorName: taskInfo.doctorName || item.initiatorName || '未知',
 									initiatorId: item.initiatorId || '',
-									sealImg: item.status === 1 ? 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/img_finished.png' : 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/img_unfinish.png',
+									sealImg: item.businessData.taskInfo.taskStatus === 1 ? 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/img_finished.png' : 'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/img_unfinish.png',
 									businessData: item.businessData || {},
 									// 从taskInfo中获取其他需要的字段
 									taskTitle: taskInfo.taskName || item.auditName,
@@ -487,7 +499,7 @@ import { getPendingAuditList } from '@/api/audit.js';
 								this.auditList = newAuditList;
 							}
 							// 判断是否还有更多数据
-							this.auditHasMore = res.rows.length === this.auditPageSize;
+							this.auditHasMore = res.data.length === this.auditPageSize;
 							console.log("审核列表数据",this.auditList);
 						} else {
 							// 如果是加载更多,则保持原有数据
@@ -503,10 +515,6 @@ import { getPendingAuditList } from '@/api/audit.js';
 						this.isLoading = false;
 						this.isLoadingMore = false;
 						uni.hideLoading();
-						uni.showToast({
-							title: '网络错误',
-							icon: 'none'
-						});
 					});
 				},
 			dicts() {
@@ -582,7 +590,9 @@ import { getPendingAuditList } from '@/api/audit.js';
 						type: this.currentTopTab,
 						taskStatus: this.currentSubTab,
 						page: this.page,
-						pageSize: this.pageSize
+						pageSize: this.pageSize,
+					    companyId: this.userInfo.companyId || 0,
+						keyWord: this.searchKeyword || ''
 					};
 					
 					// 避免重复请求
@@ -649,6 +659,19 @@ import { getPendingAuditList } from '@/api/audit.js';
 						});
 					});
 				},
+			onSearch() {
+				if (this.currentTopTab === 'task') {
+					this.page = 1
+					this.hasMore = true
+					this.taskList = []
+					this.getTaskList()
+				} else {
+					this.auditPage = 1
+					this.auditHasMore = true
+					this.auditList = []
+					this.getAuditList()
+				}
+			},
 			getCompanySettings() {
 				// 获取公司项目设置
 				if (this.userInfo.companyId) {
@@ -683,7 +706,8 @@ import { getPendingAuditList } from '@/api/audit.js';
 				const statusMap = {
 					0: '待审核',
 					1: '已通过',
-					2: '已驳回'
+					2: '已驳回',
+					3: '未完成'
 				};
 				return statusMap[status] || '-';
 			},
@@ -692,7 +716,9 @@ import { getPendingAuditList } from '@/api/audit.js';
 				const statusMap = {
 					0: 'status-wait',
 					1: 'status-finish',
-					2: 'status-rejected'
+					2: 'status-rejected',
+					3: 'status-wait',
+
 				};
 				return statusMap[status] || 'status-wait';
 			},
@@ -735,7 +761,7 @@ import { getPendingAuditList } from '@/api/audit.js';
 					id = item.businessData.taskInfo.id
 				}
 				uni.navigateTo({
-					url: `/pages_task/taskDetail?taskId=${item.createAuditInstanceId||item.businessData.taskInfo.createAuditInstanceId||''}&taskId2=${item.finishAuditInstanceId||item.businessData.taskInfo.finishAuditInstanceId||''}&id=${id||''}`
+					url: `/pages_task/taskDetail?taskId=${item.createAuditInstanceId||item.businessData.taskInfo.createAuditInstanceId||''}&taskId2=${item.finishAuditInstanceId||item.businessData.taskInfo.finishAuditInstanceId||''}&id=${id||''}&type=${this.currentTopTab}`
 				});
 			},
 			selectSubTab(value) {
@@ -774,8 +800,8 @@ import { getPendingAuditList } from '@/api/audit.js';
 			},
 			resetFilters() {
 				this.filters = {
-					applyTimeStart: '',
-					applyTimeEnd: '',
+					applyStartTime: '',
+					applyEndTime: '',
 					finishTimeStart: '',
 					finishTimeEnd: '',
 					auditTimeStart: '',
@@ -1514,4 +1540,4 @@ import { getPendingAuditList } from '@/api/audit.js';
 			}
 		}
 	}
-</style>
+</style>

+ 37 - 37
pages_user/doctor.vue

@@ -2,18 +2,18 @@
 	<view class="container">
 		<scroll-view class="content" scroll-y>
 			<view class="agreement-body">
-				<view class="title">【一咻学术】隐私保护政策</view>
+				<view class="title">【文依学术】隐私保护政策</view>
 				<view class="update-time">更新日期:2026年2月24日</view>
 
 				<view class="section">
-					<view class="section-text">一咻学术用户隐私协议</view>
+					<view class="section-text">文依学术用户隐私协议</view>
 					<view class="section-text">用户隐私保护协议</view>
 					<view class="section-text">更新提示:</view>
-					<view class="section-text">尊敬的一咻学术用户:根据最新的法律法规及政策要求,结合实际情况,我们对《用户隐私保护协议》进行了部分更新。此版本的更新内容主要集中在:</view>
+					<view class="section-text">尊敬的文依学术用户:根据最新的法律法规及政策要求,结合实际情况,我们对《用户隐私保护协议》进行了部分更新。此版本的更新内容主要集中在:</view>
 					<view class="section-text">1、更新了"十、我们如何处理未成年人的个人信息"部分内容;</view>
 					<view class="section-text">提示条款</view>
-					<view class="section-text">您的信任对我们非常重要,我们深知隐私和个人信息安全的重要性,我们将按照法律法规要求,采取相应的安全保护措施,以保护您的个人信息安全。鉴此,一咻学术(以下简称"我们"或"学苑")制定本《用户隐私保护协议》(以下简称"本协议")并承诺严格遵循本协议的内容合理处理您的个人信息及其他数据。我们在此提醒您:</view>
-					<view class="section-text">本协议适用于一咻学术的所有互联网电子服务或商品。如我们及/或关联公司的互联网电子服务或商品中使用了一咻学术提供的互联网电子服务或商品(例如直接使用一咻学术APP、小程序账户登录)但未设独立隐私保护协议的,则本协议同样适用于该部分互联网电子服务或商品。我们及/或关联公司就其向您提供电子服务或商品单独设立隐私保护协议的,则相应产品或服务适用该相应的隐私保护协议。</view>
+					<view class="section-text">您的信任对我们非常重要,我们深知隐私和个人信息安全的重要性,我们将按照法律法规要求,采取相应的安全保护措施,以保护您的个人信息安全。鉴此,文依学术(以下简称"我们"或"学苑")制定本《用户隐私保护协议》(以下简称"本协议")并承诺严格遵循本协议的内容合理处理您的个人信息及其他数据。我们在此提醒您:</view>
+					<view class="section-text">本协议适用于文依学术的所有互联网电子服务或商品。如我们及/或关联公司的互联网电子服务或商品中使用了文依学术提供的互联网电子服务或商品(例如直接使用文依学术APP、小程序账户登录)但未设独立隐私保护协议的,则本协议同样适用于该部分互联网电子服务或商品。我们及/或关联公司就其向您提供电子服务或商品单独设立隐私保护协议的,则相应产品或服务适用该相应的隐私保护协议。</view>
 					<view class="section-text">请您注意,本协议和声明不适用于以下情况:</view>
 					<view class="section-text">1、通过我们的互联网电子服务或商品而接入的第三方服务(包括任何第三方网站)收集的信息;</view>
 					<view class="section-text">2、通过在我们互联网电子服务或商品中进行广告服务的其他公司或机构所收集的信息。</view>
@@ -49,9 +49,9 @@
 					<view class="section-text">1.4 儿童</view>
 					<view class="section-text">指不满十四周岁的未成年人。</view>
 					<view class="section-text">1.5 业务数据</view>
-					<view class="section-text">不同于个人信息,是指学苑的用户利用一咻学术的服务上传、下载、分发等通过一咻学术的技术服务处理的数据。</view>
+					<view class="section-text">不同于个人信息,是指学苑的用户利用文依学术的服务上传、下载、分发等通过文依学术的技术服务处理的数据。</view>
 					<view class="section-text">1.6 服务平台</view>
-					<view class="section-text">指一咻学术开发、运营的互联网诊疗服务平台,包括域名为:qicaijiaxiang.com的网站和"一咻学术"微信小程序、"一咻学术"微信小程序等移动端应用及网站的合称。</view>
+					<view class="section-text">指文依学术开发、运营的互联网诊疗服务平台,包括域名为:qicaijiaxiang.com的网站和"文依学术"微信小程序、"文依学术"微信小程序等移动端应用及网站的合称。</view>
 					<view class="section-text">1.7 关联公司</view>
 					<view class="section-text">指一方现在或将来控制、受控制或与其处于共同控制下的任何公司、机构。"控制"是指直接或间接地拥有影响所提及公司管理的能力,无论是通过所有权、有投票权的股份、合同或其他被依法认定的方式。</view>
 				</view>
@@ -68,11 +68,11 @@
 					<view class="section-title">三、我们如何收集和使用您的个人信息</view>
 					<view class="section-text">我们会出于协议所述的以下目的,收集、储存和使用您的个人信息:</view>
 					<view class="section-text">3.1 帮助您成为我们的用户</view>
-					<view class="section-text">一咻学术平台的知识内容属于平台付费所得,在您查阅时,需要注册成为平台用户,以便我们根据您的行为习惯提供服务。在您注册时,请您至少提供手机号码、密码,我们将通过发送短信验证码的方式验证您的身份是否有效。若仅需使用浏览、搜索等基本服务,您不需要注册成为我们的用户及提供上述信息。</view>
+					<view class="section-text">文依学术平台的知识内容属于平台付费所得,在您查阅时,需要注册成为平台用户,以便我们根据您的行为习惯提供服务。在您注册时,请您至少提供手机号码、密码,我们将通过发送短信验证码的方式验证您的身份是否有效。若仅需使用浏览、搜索等基本服务,您不需要注册成为我们的用户及提供上述信息。</view>
 					<view class="section-text">您的登录名包括但不仅限于您的手机号、邮箱账号、用户名,您可以完善昵称、密码、头像、联系地址、出生日期等相关信息,补充这些"账户信息"将有助于我们为您提供更具个性化的服务。</view>
-					<view class="section-text">您需要向我们提供真实姓名和有效身份证件(包括但不限于身份证、医保卡、护照)的号码和复印件、生物识别特征(静态或动态的面部特征)、银行卡号及预留手机号,以便于我们进行实名(实人)认证。如果您不提供这些信息,可能会影响您对一咻学术部分核心业务功能的正常使用,如预约挂号、慢病复诊、购药等,但不会影响您进行基本的浏览、搜索。</view>
+					<view class="section-text">您需要向我们提供真实姓名和有效身份证件(包括但不限于身份证、医保卡、护照)的号码和复印件、生物识别特征(静态或动态的面部特征)、银行卡号及预留手机号,以便于我们进行实名(实人)认证。如果您不提供这些信息,可能会影响您对文依学术部分核心业务功能的正常使用,如预约挂号、慢病复诊、购药等,但不会影响您进行基本的浏览、搜索。</view>
 					<view class="section-text">在您主动注销账号时,我们将根据相关法律法规的要求尽快使其匿名或删除您的个人信息。</view>
-					<view class="section-text">授权登录:您注册我们的账户后,我们可能经您同意后向我们的关联公司共享您的账户信息(头像、昵称及其他页面提示的信息),您可通过同一账号在我们提供的链接入口使用我们关联公司提供的服务或产品。此外,我们可能从第三方获取您授权共享的第三方账户信息(如头像、昵称、联系方式等),并将您的第三方账户与您的一咻学术账户绑定,使您可以通过第三方账户直接登录并使用一咻学术的服务或产品。我们将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的这些个人信息。</view>
+					<view class="section-text">授权登录:您注册我们的账户后,我们可能经您同意后向我们的关联公司共享您的账户信息(头像、昵称及其他页面提示的信息),您可通过同一账号在我们提供的链接入口使用我们关联公司提供的服务或产品。此外,我们可能从第三方获取您授权共享的第三方账户信息(如头像、昵称、联系方式等),并将您的第三方账户与您的文依学术账户绑定,使您可以通过第三方账户直接登录并使用文依学术的服务或产品。我们将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的这些个人信息。</view>
 					<view class="section-text">3.2 为您展示和推送医疗相关信息和服务</view>
 					<view class="section-text">为向您提供更契合您需求的页面展示和搜索结果、了解产品适配性,我们会收集关于您使用的服务以及使用方式的信息并将这些信息进行关联,这些信息包括:</view>
 					<view class="section-text">设备信息:我们会根据您在软件安装及使用中授予的具体权限,接收并记录您所使用的设备相关信息(包括设备型号、操作系统版本、设备设置、Android id、MAC地址、IMEI、IMSI、唯一设备标识符、浏览器等软硬件特征信息)、设备所在位置相关信息(包括IP 地址、GPS位置以及能够提供相关信息的Wi-Fi 接入点、蓝牙和基站这类传感器信息)。</view>
@@ -87,18 +87,18 @@
 					<view class="section-text">3.3.1 您向我们提供的信息</view>
 					<view class="section-text">为便于您使用互联网电子服务或商品,您需提供真实姓名、手机号、社保卡、就诊卡等信息。您可以为其他人进行预约或咨询等服务,您需要提供该实际用户的前述个人信息。在提供该实际用户的前述个人信息之前,您需确保您已经取得其授权同意,其中涉及儿童个人信息的,您需在提供前征得该儿童监护人的同意。</view>
 					<view class="section-text">当您在产品及/或服务中订购相应的医疗服务和商品时,我们可能会收集您的交易信息、记录,包括您所购买的商品及/或服务信息、具体订单号、订单创建时间、您应支付的金额,我们收集这些信息是为了帮助您顺利完成交易、保障您的交易安全、查询订单信息。其中,如您购买商品的,在下单过程中,您需至少提供您的收货人姓名、收货地址、收货人联系电话;您可以为其他人订购商品及/或服务,但需提供该实际收货人的前述个人信息,且需确保您已经取得其授权同意。您知晓并同意第三方物流配送主体不可避免地获知及使用您的上述信息,用于完成交付目的。为使我们及时获悉并确认交付进度及状态,向您提供售后与争议解决服务,您同意我们可自物流相关服务主体处收集与交付进度相关的信息。如果您拒绝提供此类信息,您理解并同意我们将无法完成相关交付及售后服务。</view>
-					<view class="section-text">当您使用本产品或服务提供的问诊功能,在问诊过程中,我们可能会申请开启您的位置信息(地理位置)、相机/摄像头、麦克风(语音)以及存储的相关权限,您可随时通过您设备的相关功能设置开启/取消上述权限;同时可能要求您提供患者姓名、性别、身份证号码、手机号码、出生日期、所在城市、与患者的关系、病情病症、住院志、医嘱单、问诊记录、检验报告、手术及麻醉记录、护理记录、用药记录、药物食物过敏信息、生育信息、以往病史、诊治情况、家族病史、现病史、传染病史等,以及与个人身体健康状况产生的相关信息,及体重、身高、肺活量等。如您不提供上述信息,将会影响您使用部分互联网电子服务或商品,但不影响您使用一咻学术产品或服务的基本浏览、搜索功能。另外,我们可能会收集您在使用服务或产品过程中产生的健康咨询详情(如图片、文字、视频、语音)、预约挂号记录、检查检验、用药处方、医生诊断结果等信息,用于向您展示及便于您对信息进行管理。</view>
-					<view class="section-text">为帮助您顺利完成交易、保证您的交易安全、完成付款相应医疗服务和/或商品费用的支付,您可能需要提供银行卡号、身份证号码、银行卡的预留手机号和/或其他认证信息、创建账户与支付口令、医保卡号、医保卡绑定的手机号码以及医保支付口令,同时,为满足相关法律法规或监管机构的要求,我们可能需要将您必要的个人信息及上述支付信息提供给监管机构以及监管机构指定的第三方服务机构,以顺利完成您所订购相应医疗服务和药品费用的支付和结算。如您不提供上述信息,将无法正常使用相关的支付功能,但不会影响您使用一咻学术提供的基本浏览、搜索功能。</view>
+					<view class="section-text">当您使用本产品或服务提供的问诊功能,在问诊过程中,我们可能会申请开启您的位置信息(地理位置)、相机/摄像头、麦克风(语音)以及存储的相关权限,您可随时通过您设备的相关功能设置开启/取消上述权限;同时可能要求您提供患者姓名、性别、身份证号码、手机号码、出生日期、所在城市、与患者的关系、病情病症、住院志、医嘱单、问诊记录、检验报告、手术及麻醉记录、护理记录、用药记录、药物食物过敏信息、生育信息、以往病史、诊治情况、家族病史、现病史、传染病史等,以及与个人身体健康状况产生的相关信息,及体重、身高、肺活量等。如您不提供上述信息,将会影响您使用部分互联网电子服务或商品,但不影响您使用文依学术产品或服务的基本浏览、搜索功能。另外,我们可能会收集您在使用服务或产品过程中产生的健康咨询详情(如图片、文字、视频、语音)、预约挂号记录、检查检验、用药处方、医生诊断结果等信息,用于向您展示及便于您对信息进行管理。</view>
+					<view class="section-text">为帮助您顺利完成交易、保证您的交易安全、完成付款相应医疗服务和/或商品费用的支付,您可能需要提供银行卡号、身份证号码、银行卡的预留手机号和/或其他认证信息、创建账户与支付口令、医保卡号、医保卡绑定的手机号码以及医保支付口令,同时,为满足相关法律法规或监管机构的要求,我们可能需要将您必要的个人信息及上述支付信息提供给监管机构以及监管机构指定的第三方服务机构,以顺利完成您所订购相应医疗服务和药品费用的支付和结算。如您不提供上述信息,将无法正常使用相关的支付功能,但不会影响您使用文依学术提供的基本浏览、搜索功能。</view>
 					<view class="section-text">当您与我们联系时,我们可能会保存您的沟通、通信/通话记录和内容或您留下的联系方式等信息,以便与您联系或帮助您解决问题,或记录相关问题的处理方案及结果。为了提供服务及改进服务质量的合理需要,我们还可能使用的您的其他信息,包括您与客服联系时您提供的相关信息,您参与问卷调查时向我们发送的问卷答复信息。如果您针对具体订单进行咨询、投诉或提供建议的,我们会使用您的账户信息和订单信息。如您拒绝提供上述信息,我们可能无法向您及时反馈投诉、申诉或咨询结果。</view>
 					<view class="section-text">您可通过我们为您提供的评价、问答、论坛等信息发布功能公开发布信息,包括作为注册用户可发表评价及问答内容、发布图文信息。请注意,您公开发布的信息中可能会涉及您或他人的个人信息甚至敏感个人信息,如您在评价时选择上传包含个人信息的图片。请您更加谨慎地考虑,是否在使用服务时共享甚至公开分享相关信息。若您公开发布的信息中涉及儿童个人信息的,您需在发布前征得对应儿童监护人的同意。</view>
 					<view class="section-text">3.3.2 我们通过间接获得方式收集到的您的个人信息</view>
 					<view class="section-text">我们可能从第三方获取您授权共享的账户信息(头像、昵称、联系方式),并在您同意本声明和协议后将您的第三方账户与您的账户绑定,使您可以通过第三方账户直接登录并使用我们的互联网电子服务或商品。我们会将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的这些个人信息。</view>
-					<view class="section-text">您可通过同一账号在我们提供的链接入口使用我们关联公司提供的互联网电子服务或商品,为便于我们基于关联账号共同向您提供一站式服务并便于您统一进行管理,我们在一咻学术平台集中展示您的信息或推荐您感兴趣的信息。</view>
+					<view class="section-text">您可通过同一账号在我们提供的链接入口使用我们关联公司提供的互联网电子服务或商品,为便于我们基于关联账号共同向您提供一站式服务并便于您统一进行管理,我们在文依学术平台集中展示您的信息或推荐您感兴趣的信息。</view>
 					<view class="section-text">当您通过我们互联网电子服务或商品使用上述服务时,您授权我们根据实际业务及合作需要从我们关联公司处接收、汇总、分析我们确认其来源合法或您授权同意其向我们提供的您的个人信息或交易信息。</view>
-					<view class="section-text">如您拒绝提供上述信息或拒绝授权,可能无法使用我们关联公司的相应互联网电子服务或商品,或者无法展示相关信息,但不影响使用一咻学术的健康咨询等核心服务。</view>
+					<view class="section-text">如您拒绝提供上述信息或拒绝授权,可能无法使用我们关联公司的相应互联网电子服务或商品,或者无法展示相关信息,但不影响使用文依学术的健康咨询等核心服务。</view>
 					<view class="section-text">3.4 为您提供安全保障</view>
 					<view class="section-text">请注意,为确保账户身份真实性、向您提供更好的安全保障,您可以向我们提供身份证、社保卡等身份信息,绑定银行卡等完成实名认证。如您拒绝提供上述信息,可能无法使用特定的互联网电子服务或商品、继续可能存在风险的操作等,但不会影响您使用浏览、搜索等服务。</view>
-					<view class="section-text">为提高您使用我们及我们关联公司、合作伙伴提供服务的安全性,保护您或其他用户或公众的人身财产安全免遭侵害,更好地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入等安全风险,更准确地识别违反法律法规或一咻学术相关协议规则的情况,我们可能使用或整合您的账户信息、交易信息、设备信息(包括设备型号、操作系统版本、设备设置、Android id、MAC地址、IMEI、IMSI、唯一设备标识符、已安装应用软件列表、最近运行的应用这类软硬件特征信息)、设备所在位置相关信息(包括IP地址、GPS位置以及能够提供相关信息的Wi-Fi接入点、蓝牙和基站这类传感器信息)、有关网络日志以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息,来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施。</view>
+					<view class="section-text">为提高您使用我们及我们关联公司、合作伙伴提供服务的安全性,保护您或其他用户或公众的人身财产安全免遭侵害,更好地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入等安全风险,更准确地识别违反法律法规或文依学术相关协议规则的情况,我们可能使用或整合您的账户信息、交易信息、设备信息(包括设备型号、操作系统版本、设备设置、Android id、MAC地址、IMEI、IMSI、唯一设备标识符、已安装应用软件列表、最近运行的应用这类软硬件特征信息)、设备所在位置相关信息(包括IP地址、GPS位置以及能够提供相关信息的Wi-Fi接入点、蓝牙和基站这类传感器信息)、有关网络日志以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息,来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施。</view>
 					<view class="section-text">3.5 其他用途</view>
 					<view class="section-text">我们将信息用于本声明和协议未载明的其他用途,或者将基于特定目的收集而来的信息用于其他目的时,会事先征求您的同意。若您提供的信息中含有其他用户的个人信息,在向我们提供这些个人信息之前,您需确保您已经取得合法的授权。若其中涉及儿童个人信息的,您需在发布前取得对应儿童监护人的同意,前述情形下监护人有权通过本协议规定的途径联系我们,要求更正或删除涉及儿童个人信息的内容。</view>
 					<view class="section-text">3.6 征得授权同意的例外</view>
@@ -115,7 +115,7 @@
 					<view class="section-text">10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;</view>
 					<view class="section-text">11、法律法规规定的其他情形。</view>
 					<view class="section-text">请知悉,根据适用的法律,若我们对个人信息采取技术措施和其他必要措施进行处理,使得数据接收方无法重新识别特定个人且不能复原,或我们可能会对收集的信息进行去标识化地研究、统计分析和预测,用于改善平台的内容和布局,为商业决策提供产品或服务支撑,以及改进产品和服务(包括使用匿名数据进行机器学习或模型算法训练),则此类处理后数据的使用无需另行向您通知并征得您的同意。</view>
-					<view class="section-text">如我们停止运营一咻学术平台,我们将及时停止继续收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,对所持有的个人信息进行删除或匿名化处理。</view>
+					<view class="section-text">如我们停止运营文依学术平台,我们将及时停止继续收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,对所持有的个人信息进行删除或匿名化处理。</view>
 					<view class="section-text">3.7 设备权限调用</view>
 					<view class="section-text">为向您提供便捷、优质的服务,我们可能会调用您设备的一些权限,以下是我们可能调用的设备权限列表及对应的使用目的说明,您有权随时选择关闭下列权限的授权,但可能会影响您正常使用我们互联网电子服务或商品的部分或全部功能。</view>
 					<!-- <view class="section-text">点击图片可查看完整电子表格</view> -->
@@ -124,9 +124,9 @@
 				<view class="section">
 					<view class="section-title">四、信息存储</view>
 					<view class="section-text">4.1 存储地点</view>
-					<view class="section-text">您知晓并同意,您在使用一咻学术产品、服务期间所产生的有关您的信息存储在中国境内安全可信的服务器上。</view>
+					<view class="section-text">您知晓并同意,您在使用文依学术产品、服务期间所产生的有关您的信息存储在中国境内安全可信的服务器上。</view>
 					<view class="section-text">4.2 存储期限</view>
-					<view class="section-text">我们仅在实现本协议所述目的所必需的时间内保留您的个人信息。在您与我们之间的合同关系(客户关系)存续期间,我们会处理并保存您的数据。当您注销一咻学术账户后,我们将对您的帐号信息进行删除或匿名化处理,但法律法规另有规定(例如《中华人民共和国电子商务法》要求商品和服务信息、交易信息保存时间自交易完成之日起不少于三年,《处方管理办法》要求普通处方保存期限为一年,《医疗机构管理条例实施细则》要求医疗机构门诊病历的保存期不得少于十五年等)或者您另行授权同意的除外。</view>
+					<view class="section-text">我们仅在实现本协议所述目的所必需的时间内保留您的个人信息。在您与我们之间的合同关系(客户关系)存续期间,我们会处理并保存您的数据。当您注销文依学术账户后,我们将对您的帐号信息进行删除或匿名化处理,但法律法规另有规定(例如《中华人民共和国电子商务法》要求商品和服务信息、交易信息保存时间自交易完成之日起不少于三年,《处方管理办法》要求普通处方保存期限为一年,《医疗机构管理条例实施细则》要求医疗机构门诊病历的保存期不得少于十五年等)或者您另行授权同意的除外。</view>
 				</view>
 
 				<view class="section">
@@ -134,21 +134,21 @@
 					<view class="section-text">5.1 委托处理</view>
 					<view class="section-text">涉及具体的模块或功能由外部供应商提供的,对我们委托处理个人信息的该等外部供应商,我们会与其签署严格的保密协定,要求他们按照我们的要求、本协议以及其他任何相关的保密和安全措施来处理个人信息。</view>
 					<view class="section-text">5.2 共享</view>
-					<view class="section-text">我们不会与一咻学术服务提供者以外的任何公司、组织和个人分享您的个人信息,但以下情况除外:</view>
+					<view class="section-text">我们不会与文依学术服务提供者以外的任何公司、组织和个人分享您的个人信息,但以下情况除外:</view>
 					<view class="section-text">1、在获取您的明确授权或同意的情况下共享:获得您的明确授权或同意后,我们会与其他方共享您的个人信息。</view>
 					<view class="section-text">2、在法定情形下的共享:我们可能会根据法律法规规定,或按政府主管部门的强制性要求,对外共享您的个人信息。</view>
-					<view class="section-text">3、与关联公司间共享:为便于我们基于关联账号共同向您提供服务,推荐您可能感兴趣的信息或保护一咻学术关联公司或其他用户或公众的人身财产安全免遭侵害,您的个人信息可能会与我们的关联公司共享。我们只会共享必要的个人信息(如为便于您通过同一账号使用我们关联公司产品或服务,我们会向关联公司共享您必要的账户信息),且这种共享受本协议所声明目的的约束。如果我们共享您的敏感个人信息或关联公司改变个人信息的使用及处理目的,将再次征求您的授权同意。</view>
+					<view class="section-text">3、与关联公司间共享:为便于我们基于关联账号共同向您提供服务,推荐您可能感兴趣的信息或保护文依学术关联公司或其他用户或公众的人身财产安全免遭侵害,您的个人信息可能会与我们的关联公司共享。我们只会共享必要的个人信息(如为便于您通过同一账号使用我们关联公司产品或服务,我们会向关联公司共享您必要的账户信息),且这种共享受本协议所声明目的的约束。如果我们共享您的敏感个人信息或关联公司改变个人信息的使用及处理目的,将再次征求您的授权同意。</view>
 					<view class="section-text">4、与授权合作伙伴共享:仅为实现本声明和协议中声明的目的,我们的某些服务将由授权合作伙伴提供。我们可能会与合作伙伴共享您的某些个人信息,以提供更好的客户服务和用户体验。例如,在您订购我们的商品时,我们必须与配送服务提供商共享您的订单信息才能安排送货;或者我们需要将您的订单号和订单金额与金融机构共享以实现其确认您的支付指令并完成支付等。我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。同时,我们会与合作伙伴签署严格的保密协定,要求他们按照我们的说明、本协议以及其他任何相关的保密和安全措施来处理您的个人信息。我们的合作伙伴无权将共享的个人信息用于任何其他用途。如果您拒绝我们的合作伙伴在提供服务时收集为提供服务所必须的个人信息, 将可能导致您无法使用该第三方服务。</view>
 					<view class="section-text">鉴于医疗的特殊性,出于患教以及帮助其他患者的目的,您与医生的交流信息将在匿名化和/或去标识化处理后,默认展示给第三方阅读。通过由我们或第三方提供的功能,您可以主动公开分享、共享信息(如向其他互联网平台转发内容),在这种情况下共享信息将被广泛并即时传送。但只要您不删除被共享的信息,该信息会一直留存在公众领域;在一些情况下,即使您删除共享信息,该等信息仍可由其他用户或与我们没有关联及不受我们控制的第三方独立地缓存、复制或储存,或通过其他用户或该等第三方在公众领域保存。例如,当您将您本平台提出的问题转发到其他互联网平台,该平台将可能独立的展示、缓存或保存您转发的内容,其他互联网用户也可能转发、保存您的回答,而相应的页面将不受我们的控制。</view>
 					<view class="section-text">5.3 转让</view>
 					<view class="section-text">我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</view>
 					<view class="section-text">1、在获取您的明确授权或同意的情况下转让:获得您的明确授权或同意后,我们会向其他方转让您的个人信息;</view>
-					<view class="section-text">2、在一咻学术服务提供者发生合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如涉及到个人信息转让,我们会在要求新的持有您个人信息的公司、组织继续受声明和协议的约束,否则我们将要求该公司、组织重新向您征求授权同意。</view>
+					<view class="section-text">2、在文依学术服务提供者发生合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如涉及到个人信息转让,我们会在要求新的持有您个人信息的公司、组织继续受声明和协议的约束,否则我们将要求该公司、组织重新向您征求授权同意。</view>
 					<view class="section-text">5.4 公开披露</view>
 					<view class="section-text">我们仅会在以下情况下,公开披露您的个人信息:</view>
 					<view class="section-text">1、获得您明确同意或基于您的主动选择,我们可能会公开披露您的个人信息;</view>
 					<view class="section-text">2、基于法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会向有权机关披露您的个人信息。 但我们保证,在上述情况发生时,我们会要求披露请求方必须出具与之相应的有效法律文件,并对被披露的信息采取符合法律和业界标准的安全防护措施。</view>
-					<view class="section-text">3、如果我们确定您出现违反法律法规或严重违反一咻学术相关协议规则的情况,或为保护一咻学术及其关联公司用户或公众的人身财产安全免遭侵害,我们可能依据法律法规或一咻学术相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及一咻学术已对您采取的措施。例如,若您囤积号源、虚假预约而严重违反用户协议,我们可能会公开披露或与合作方共享您的身份信息、联系方式与处罚情况。</view>
+					<view class="section-text">3、如果我们确定您出现违反法律法规或严重违反文依学术相关协议规则的情况,或为保护文依学术及其关联公司用户或公众的人身财产安全免遭侵害,我们可能依据法律法规或文依学术相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及文依学术已对您采取的措施。例如,若您囤积号源、虚假预约而严重违反用户协议,我们可能会公开披露或与合作方共享您的身份信息、联系方式与处罚情况。</view>
 					<view class="section-text">5.5 共享、转让、公开披露个人信息时事先征得授权同意的例外</view>
 					<view class="section-text">以下情形中,共享、转让、公开披露您的个人信息无需事先征得您的授权同意:</view>
 					<view class="section-text">1、与个人信息控制者履行法律法规规定的义务相关的;</view>
@@ -164,28 +164,28 @@
 
 				<view class="section">
 					<view class="section-title">六、用户业务数据和公开信息</view>
-					<view class="section-text">不同于您的个人信息,对于用户业务数据和公开信息,一咻学术将按如下方式处理:</view>
+					<view class="section-text">不同于您的个人信息,对于用户业务数据和公开信息,文依学术将按如下方式处理:</view>
 					<view class="section-text">6.1 用户业务数据</view>
-					<view class="section-text">1、您通过一咻学术平台提供的互联网电子服务或商品,加工、存储、上传、下载、分发以及通过其他方式处理的数据,均为您的用户业务数据,您完全拥有您的用户业务数据。一咻学术作为服务提供商,我们只会严格执行您的指示处理您的业务数据,除按与您协商一致或执行明确的法律法规要求外,不对您的业务数据进行任何非授权的使用或披露。</view>
-					<view class="section-text">2、您应对您的用户业务数据来源及内容负责,一咻学术提示您谨慎判断数据来源及内容的合法性。因您的用户业务数据内容违反法律法规、部门规章或国家协议而造成的全部结果及责任均由您自行承担。</view>
-					<view class="section-text">3、根据您与一咻学术协商一致,一咻学术在您选定的数据中心存储用户业务数据。一咻学术恪守对用户的安全承诺,根据适用的法律保护用户存储在一咻学术数据中心的数据。</view>
+					<view class="section-text">1、您通过文依学术平台提供的互联网电子服务或商品,加工、存储、上传、下载、分发以及通过其他方式处理的数据,均为您的用户业务数据,您完全拥有您的用户业务数据。文依学术作为服务提供商,我们只会严格执行您的指示处理您的业务数据,除按与您协商一致或执行明确的法律法规要求外,不对您的业务数据进行任何非授权的使用或披露。</view>
+					<view class="section-text">2、您应对您的用户业务数据来源及内容负责,文依学术提示您谨慎判断数据来源及内容的合法性。因您的用户业务数据内容违反法律法规、部门规章或国家协议而造成的全部结果及责任均由您自行承担。</view>
+					<view class="section-text">3、根据您与文依学术协商一致,文依学术在您选定的数据中心存储用户业务数据。文依学术恪守对用户的安全承诺,根据适用的法律保护用户存储在文依学术数据中心的数据。</view>
 					<view class="section-text">6.2 公开信息</view>
-					<view class="section-text">1、公开信息是指您公开分享的任何信息,任何人都可以在使用和未使用一咻学术互联网电子服务或商品期间查看或访问这些信息。例如您在社区、论坛发布的信息。</view>
-					<view class="section-text">2、为使用一咻学术的互联网电子服务或商品,可能存在您必须公开分享的信息。</view>
-					<view class="section-text">3、在使用一咻学术平台进行交易时,您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息,如联络方式或者邮政地址等。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。您也可以通过我们的服务建立联系和相互分享。当您通过我们的服务创建交流、交易或分享时,您可以自主选择沟通、交易或分享的对象,作为能够看到您的联络方式、交流信息或分享内容等相关信息的第三方,如您发现自己的个人信息泄漏,尤其是您的账户或密码发生泄露,请您立即联络客服,以便一咻学术采取相应措施。</view>
+					<view class="section-text">1、公开信息是指您公开分享的任何信息,任何人都可以在使用和未使用文依学术互联网电子服务或商品期间查看或访问这些信息。例如您在社区、论坛发布的信息。</view>
+					<view class="section-text">2、为使用文依学术的互联网电子服务或商品,可能存在您必须公开分享的信息。</view>
+					<view class="section-text">3、在使用文依学术平台进行交易时,您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息,如联络方式或者邮政地址等。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。您也可以通过我们的服务建立联系和相互分享。当您通过我们的服务创建交流、交易或分享时,您可以自主选择沟通、交易或分享的对象,作为能够看到您的联络方式、交流信息或分享内容等相关信息的第三方,如您发现自己的个人信息泄漏,尤其是您的账户或密码发生泄露,请您立即联络客服,以便文依学术采取相应措施。</view>
 				</view>
 
 				<view class="section">
 					<view class="section-title">七、我们如何保护您的个人信息</view>
-					<view class="section-text">7.1 我们已采取符合业界标准、合理可行的安全防护措施保护您提供的个人信息安全,防止个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。例如,在您的浏览器与服务器之间交换数据(如信用卡信息)时受 SSL(Secure Socket Layer)协议加密保护;我们同时对一咻学术平台提供HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)协议安全浏览方式;我们会使用加密技术提高个人信息的安全性;我们会使用受信赖的保护机制防止个人信息遭到恶意攻击;我们会部署访问控制机制,尽力确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。我们努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护您的个人信息安全。我们积极建立数据分类分级制度、数据安全管理规范、数据安全开发规范来管理规范个人信息的存储和使用,努力确保未收集与我们提供的服务无关的个人信息。此外,我们通过与信息接触者签署保密协议、监控和审计机制来对数据进行全面安全控制。防止您的个人信息遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。</view>
+					<view class="section-text">7.1 我们已采取符合业界标准、合理可行的安全防护措施保护您提供的个人信息安全,防止个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。例如,在您的浏览器与服务器之间交换数据(如信用卡信息)时受 SSL(Secure Socket Layer)协议加密保护;我们同时对文依学术平台提供HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)协议安全浏览方式;我们会使用加密技术提高个人信息的安全性;我们会使用受信赖的保护机制防止个人信息遭到恶意攻击;我们会部署访问控制机制,尽力确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。我们努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护您的个人信息安全。我们积极建立数据分类分级制度、数据安全管理规范、数据安全开发规范来管理规范个人信息的存储和使用,努力确保未收集与我们提供的服务无关的个人信息。此外,我们通过与信息接触者签署保密协议、监控和审计机制来对数据进行全面安全控制。防止您的个人信息遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。</view>
 					<view class="section-text">但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全。您需要了解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。</view>
 					<view class="section-text">7.2 我们有行业先进的以数据为核心,围绕数据生命周期进行的数据安全管理体系,从组织建设、制度设计、人员管理、产品技术等方面多维度提升整个系统的安全性。</view>
 					<view class="section-text">7.3 我们会采取合理可行的措施,尽力避免收集无关的个人信息。我们只会在达成本声明和协议所述目的所需的期限内保留您的个人信息,除非需要延长保留期或受到法律的允许。</view>
-					<view class="section-text">7.4 互联网并非绝对安全的环境,我们强烈建议您不要使用非一咻学术推荐的通信方式发送个人信息。您可以通过我们的服务建立联系和相互分享。当您通过我们的服务创建交流、交易或分享时,您可以自主选择沟通、交易或分享的对象,作为能够看到您的交易内容、联络方式、交流信息或分享内容等相关信息的第三方。</view>
-					<view class="section-text">在使用一咻学术平台进行网上健康咨询时,您不可避免地要向医务人员或客服披露自己的个人信息,如联系方式或身份信息。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息尤其是您的账户或密码发生泄露,请您立即联络客服,以便我们根据您的申请采取相应措施。</view>
+					<view class="section-text">7.4 互联网并非绝对安全的环境,我们强烈建议您不要使用非文依学术推荐的通信方式发送个人信息。您可以通过我们的服务建立联系和相互分享。当您通过我们的服务创建交流、交易或分享时,您可以自主选择沟通、交易或分享的对象,作为能够看到您的交易内容、联络方式、交流信息或分享内容等相关信息的第三方。</view>
+					<view class="section-text">在使用文依学术平台进行网上健康咨询时,您不可避免地要向医务人员或客服披露自己的个人信息,如联系方式或身份信息。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息尤其是您的账户或密码发生泄露,请您立即联络客服,以便我们根据您的申请采取相应措施。</view>
 					<view class="section-text">请注意,您在使用我们服务时自愿共享甚至公开分享的信息,可能会涉及您或他人的个人信息甚至敏感个人信息,如您在发帖、评论时选择上传包含个人信息的图片。请您更加谨慎地考虑,是否在使用我们的服务时共享甚至公开分享相关信息。</view>
 					<view class="section-text">请使用复杂密码,协助我们保证您的账号安全。我们将尽力保障您发送给我们的任何信息的安全性。如果我们的物理、技术或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。</view>
-					<view class="section-text">7.5 我们将不定期更新并公开安全风险、个人信息安全影响评估报告等有关内容,您可通过一咻学术平台公告方式获得。</view>
+					<view class="section-text">7.5 我们将不定期更新并公开安全风险、个人信息安全影响评估报告等有关内容,您可通过文依学术平台公告方式获得。</view>
 					<view class="section-text">7.6 在不幸发生个人信息安全事件后,我们将按照法律法规的要求向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。事件相关情况我们将以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。在不幸发生儿童信息安全事件后,我们将按照法律法规的要求,及时向儿童及其监护人告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、儿童及其监护人可自主防范和降低风险的建议、对儿童及其监护人的补救措施等。我们将及时将事件相关情况以电话、推送、发送邮件/短消息等方式告知儿童及其监护人。难以逐一告知时,我们会采取合理、有效的方式发布相关警示信息。</view>
 					<view class="section-text">7.7 我们还将按照监管部门要求,上报个人信息安全事件的处置情况。</view>
 				</view>
@@ -212,14 +212,14 @@
 					<view class="section-text">若我们决定响应您的删除请求,我们还将同时尽可能通知从我们处获得您的个人信息的主体,要求其及时删除,除非法律法规另有规定,或这些主体获得您的独立授权。</view>
 					<view class="section-text">当您从我们的服务中删除信息后,我们可能不会立即从备份系统中删除相应的信息,但会在备份更新时删除这些信息。</view>
 					<view class="section-text">8.4 改变您授权同意的范围</view>
-					<view class="section-text">您可以通过删除信息、关闭设备功能、在一咻学术平台中进行隐私设置等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。</view>
+					<view class="section-text">您可以通过删除信息、关闭设备功能、在文依学术平台中进行隐私设置等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。</view>
 					<view class="section-text">请您理解,每个业务功能需要一些基本的个人信息才能得以完成(见本隐私保护协议"我们如何收集和使用您的信息")。当您收回同意后,我们将不再处理相应的个人信息。但您收回同意的决定,不会影响此前基于您的授权而开展的个人信息处理。</view>
 					<view class="section-text">8.5 个人信息主体注销账户</view>
 					<view class="section-text">您可通过"我的-联系客服"功能联系客服完成账户的注销。请您谨慎操作,否则,因账户注销产生的数据丢失问题均由您自行承担。</view>
-					<view class="section-text">在符合一咻学术单项服务的服务协议约定条件及国家相关法律法规规定的情况下,您的该项一咻学术服务帐号可能被注销或删除。当帐号注销或被删除后,与该帐号相关的、该单项服务项下的全部服务资料和数据将依照单项服务的服务协议约定删除或匿名化处理。但法律法规另有规定的除外。</view>
+					<view class="section-text">在符合文依学术单项服务的服务协议约定条件及国家相关法律法规规定的情况下,您的该项文依学术服务帐号可能被注销或删除。当帐号注销或被删除后,与该帐号相关的、该单项服务项下的全部服务资料和数据将依照单项服务的服务协议约定删除或匿名化处理。但法律法规另有规定的除外。</view>
 					<view class="section-text">在注销账户之后,我们将停止为您提供产品或服务,并依据您的要求,删除您的个人信息,但法律法规另有规定的除外。</view>
 					<view class="section-text">8.6 约束信息系统自动决策</view>
-					<view class="section-text">在某些互联网电子服务或商品中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制做出决定。例如向您推荐您可能希望了解的医生或疾病知识,也可能根据您的位置信息或用户画像向您推送更精准的医生信息。如果这些决定显著影响您的合法权益,您有权要求我们做出解释,我们也将在不侵害一咻学术商业秘密或用户权益、社会公共利益的前提下提供申诉方法。</view>
+					<view class="section-text">在某些互联网电子服务或商品中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制做出决定。例如向您推荐您可能希望了解的医生或疾病知识,也可能根据您的位置信息或用户画像向您推送更精准的医生信息。如果这些决定显著影响您的合法权益,您有权要求我们做出解释,我们也将在不侵害文依学术商业秘密或用户权益、社会公共利益的前提下提供申诉方法。</view>
 					<view class="section-text">8.7 响应您的上述请求</view>
 					<view class="section-text">为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。</view>
 					<view class="section-text">我们将在30个工作日内做出答复。如您不满意,还可以通过客服发起投诉。</view>
@@ -229,7 +229,7 @@
 					<view class="section-text">2、与国家安全、国防安全有关的;</view>
 				</view>
 
-				<view class="footer">感谢您对一咻学术平台的信任与支持。</view>
+				<view class="footer">感谢您对文依学术平台的信任与支持。</view>
 			</view>
 		</scroll-view>
 	</view>

+ 171 - 92
pages_user/privacyPolicy.vue

@@ -2,40 +2,37 @@
 	<view class="container">
 		<scroll-view class="content" scroll-y>
 			<view class="agreement-body">
-				<view class="title">【一咻学术】隐私保护政策</view>
-				<view class="update-time">更新日期:2026年2月24日</view>
+				<view class="title">用户隐私保护协议</view>
+				<view class="update-time">更新日期:2026年3月25日</view>
 
 				<view class="section">
-					<view class="section-text">一咻学术用户隐私协议</view>
-					<view class="section-text">用户隐私保护协议</view>
-					<view class="section-text">更新提示:</view>
-					<view class="section-text">尊敬的一咻学术用户:根据最新的法律法规及政策要求,结合实际情况,我们对《用户隐私保护协议》进行了部分更新。此版本的更新内容主要集中在:</view>
-					<view class="section-text">1、更新了"十、我们如何处理未成年人的个人信息"部分内容;</view>
-					<view class="section-text">提示条款</view>
-					<view class="section-text">您的信任对我们非常重要,我们深知隐私和个人信息安全的重要性,我们将按照法律法规要求,采取相应的安全保护措施,以保护您的个人信息安全。鉴此,一咻学术(以下简称"我们"或"学苑")制定本《用户隐私保护协议》(以下简称"本协议")并承诺严格遵循本协议的内容合理处理您的个人信息及其他数据。我们在此提醒您:</view>
-					<view class="section-text">本协议适用于一咻学术的所有互联网电子服务或商品。如我们及/或关联公司的互联网电子服务或商品中使用了一咻学术提供的互联网电子服务或商品(例如直接使用一咻学术APP、小程序账户登录)但未设独立隐私保护协议的,则本协议同样适用于该部分互联网电子服务或商品。我们及/或关联公司就其向您提供电子服务或商品单独设立隐私保护协议的,则相应产品或服务适用该相应的隐私保护协议。</view>
+					<view class="section-title">提示条款</view>
+					<view class="section-text">您的信任对我们非常重要,我们深知隐私和个人信息安全的重要性,我们将按照法律法规要求,采取相应的安全保护措施,以保护您的个人信息安全。鉴此,成都文依合创科技有限公司(以下简称“我们”或“文依学术”)制定本《用户隐私保护协议》(以下简称“本协议”)并承诺严格遵循本协议的内容合理处理您的个人信息及其他数据。我们在此提醒您:</view>
+					<view class="section-text">本协议适用于文依学术的所有互联网电子服务。如我们及/或关联公司的互联网电子服务中使用了文依学术提供的互联网电子服务(例如直接使用文依学术小程序账户登录)但未设独立隐私保护协议的,则本协议同样适用于该部分互联网电子服务。我们及/或关联公司就其向您提供电子服务单独设立隐私保护协议的,则相应产品或服务适用该相应的隐私保护协议。</view>
 					<view class="section-text">请您注意,本协议和声明不适用于以下情况:</view>
-					<view class="section-text">1、通过我们的互联网电子服务或商品而接入的第三方服务(包括任何第三方网站)收集的信息;</view>
-					<view class="section-text">2、通过在我们互联网电子服务或商品中进行广告服务的其他公司或机构所收集的信息。</view>
+					<view class="section-text">1、通过我们的互联网电子服务而接入的第三方服务(包括任何第三方网站)收集的信息;</view>
+					<view class="section-text">2、通过在我们互联网电子服务中进行广告服务的其他公司或机构所收集的信息。</view>
 					<view class="section-text">我们不参与且不对您与第三方之间因个人信息保护等发生的纠纷承担任何责任。</view>
-					<view class="section-text">在使用我们的各项互联网电子服务或商品前,请您务必仔细阅读并透彻理解本协议,特别是以粗体标识的条款,您应重点阅读,在确认充分理解并同意后方使用相关互联网电子服务或商品。一旦您开始使用本平台服务,将被视为对本协议内容的接受和认可。</view>
+					<view class="section-text">在使用我们的各项互联网电子服务前,请您务必仔细阅读并透彻理解本协议,特别是以粗体标识的条款,您应重点阅读,在确认充分理解并同意后方使用相关互联网电子服务。一旦您开始使用本平台服务,将被视为对本协议内容的接受和认可。</view>
 					<view class="section-text">如对本声明和协议内容有任何疑问、意见或建议,您可通过客服与我们联系。</view>
-					<view class="section-text">隐私权协议</view>
-					<view class="section-text">学苑深知个人信息对您的重要性,并会尽全力保护您的个人信息安全。我们致力于维持您对我们的信任,我们承诺将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。在使用我们的互联网电子服务或商品前,请您仔细阅读并了解本协议,我们将按照本协议收集、处理及披露您的信息。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">隐私权协议</view>
+					<view class="section-text">文依学术深知个人信息对您的重要性,并会尽全力保护您的个人信息安全。我们致力于维持您对我们的信任,我们承诺将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。在使用我们的互联网电子服务前,请您仔细阅读并了解本协议,我们将按照本协议收集、处理及披露您的信息。</view>
 					<view class="section-text">本协议和声明将帮助您了解以下内容:</view>
 					<view class="section-text">1、定义</view>
 					<view class="section-text">2、我们可能收集的信息</view>
 					<view class="section-text">3、我们如何收集和使用您的个人信息</view>
-					<view class="section-text">4、我们如何使用 Cookie 和同类技术</view>
-					<view class="section-text">5、信息存储</view>
-					<view class="section-text">6、我们如何委托处理、共享、转让、公开披露您的个人信息</view>
-					<view class="section-text">7、用户业务数据和公开信息</view>
-					<view class="section-text">8、我们如何保护您的个人信息</view>
-					<view class="section-text">9、您如何管理您的个人信息</view>
-					<view class="section-text">10、我们如何处理未成年人的个人信息</view>
-					<view class="section-text">11、您的个人信息如何在全球范围转移</view>
-					<view class="section-text">12、本声明和协议如何更新</view>
-					<view class="section-text">13、如何联系我们</view>
+					<view class="section-text">4、信息存储</view>
+					<view class="section-text">5、我们如何委托处理、共享、转让、公开披露您的个人信息</view>
+					<view class="section-text">6、用户业务数据和公开信息</view>
+					<view class="section-text">7、我们如何保护您的个人信息</view>
+					<view class="section-text">8、您如何管理您的个人信息</view>
+					<view class="section-text">9、我们如何处理未成年人的个人信息</view>
+					<view class="section-text">10、您的个人信息如何在全球范围转移</view>
+					<view class="section-text">11、本声明和协议如何更新</view>
+					<view class="section-text">12、如何联系我们</view>
 				</view>
 
 				<view class="section">
@@ -43,17 +40,15 @@
 					<view class="section-text">1.1 个人信息</view>
 					<view class="section-text">指以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息, 不包括匿名化处理后的信息。</view>
 					<view class="section-text">1.2 敏感个人信息</view>
-					<view class="section-text">指一旦泄露或者非法使用,容易导致自然人的人格尊严受到侵害或者人身、财产安全受到危害的个人信息,包括生物识别信息、宗教信仰、特定身份、医疗健康、金融账户、行踪轨迹等信息,以及儿童的个人信息。</view>
+					<view class="section-text">指一旦泄露或者非法使用,容易导致自然人的人格尊严受到侵害或者人身、财产安全受到危害的个人信息,包括生物识别信息、宗教信仰、特定身份、医疗健康、金融账户、行踪轨迹等信息,以及不满十四周岁未成年人的个人信息。</view>
 					<view class="section-text">1.3 个人信息删除</view>
 					<view class="section-text">指在实现日常业务功能所涉及的系统中去除个人信息的行为,使其保持不可被检索、访问的状态。</view>
-					<view class="section-text">1.4 儿童</view>
-					<view class="section-text">指不满十四周岁的未成年人。</view>
-					<view class="section-text">1.5 业务数据</view>
-					<view class="section-text">不同于个人信息,是指学苑的用户利用一咻学术的服务上传、下载、分发等通过一咻学术的技术服务处理的数据。</view>
-					<view class="section-text">1.6 服务平台</view>
-					<view class="section-text">指一咻学术开发、运营的互联网诊疗服务平台,包括域名为:qicaijiaxiang.com的网站和"一咻学术"微信小程序、"一咻学术"微信小程序等移动端应用及网站的合称。</view>
-					<view class="section-text">1.7 关联公司</view>
-					<view class="section-text">指一方现在或将来控制、受控制或与其处于共同控制下的任何公司、机构。"控制"是指直接或间接地拥有影响所提及公司管理的能力,无论是通过所有权、有投票权的股份、合同或其他被依法认定的方式。</view>
+					<view class="section-text">1.4 业务数据</view>
+					<view class="section-text">不同于个人信息,是指文依学术的用户利用文依学术的服务上传、下载、分发等通过文依学术的技术服务处理的数据。</view>
+					<view class="section-text">1.5 服务平台</view>
+					<view class="section-text">指成都文依合创科技有限公司开发、运营的“文依学术”微信小程序。</view>
+					<view class="section-text">1.6 关联公司</view>
+					<view class="section-text">指一方现在或将来控制、受控制或与其处于共同控制下的任何公司、机构。“控制”是指直接或间接地拥有影响所提及公司管理的能力,无论是通过所有权、有投票权的股份、合同或其他被依法认定的方式。</view>
 				</view>
 
 				<view class="section">
@@ -68,39 +63,33 @@
 					<view class="section-title">三、我们如何收集和使用您的个人信息</view>
 					<view class="section-text">我们会出于协议所述的以下目的,收集、储存和使用您的个人信息:</view>
 					<view class="section-text">3.1 帮助您成为我们的用户</view>
-					<view class="section-text">一咻学术平台的知识内容属于平台付费所得,在您查阅时,需要注册成为平台用户,以便我们根据您的行为习惯提供服务。在您注册时,请您至少提供手机号码、密码,我们将通过发送短信验证码的方式验证您的身份是否有效。若仅需使用浏览、搜索等基本服务,您不需要注册成为我们的用户及提供上述信息。</view>
-					<view class="section-text">您的登录名包括但不仅限于您的手机号、邮箱账号、用户名,您可以完善昵称、密码、头像、联系地址、出生日期等相关信息,补充这些"账户信息"将有助于我们为您提供更具个性化的服务。</view>
-					<view class="section-text">您需要向我们提供真实姓名和有效身份证件(包括但不限于身份证、医保卡、护照)的号码和复印件、生物识别特征(静态或动态的面部特征)、银行卡号及预留手机号,以便于我们进行实名(实人)认证。如果您不提供这些信息,可能会影响您对一咻学术部分核心业务功能的正常使用,如预约挂号、慢病复诊、购药等,但不会影响您进行基本的浏览、搜索。</view>
+					<view class="section-text">您需要注册一个账户,以便我们为您提供服务。在您注册时,请您至少提供手机号码、密码,我们将通过发送短信验证码的方式验证您的身份是否有效。若仅需使用浏览、搜索等基本服务,您不需要注册成为我们的用户及提供上述信息。</view>
+					<view class="section-text">您的登录名包括但不仅限于您的手机号,您可以完善昵称、密码、头像等相关信息,补充这些“账户信息”将有助于我们为您提供更具个性化的服务。</view>
 					<view class="section-text">在您主动注销账号时,我们将根据相关法律法规的要求尽快使其匿名或删除您的个人信息。</view>
-					<view class="section-text">授权登录:您注册我们的账户后,我们可能经您同意后向我们的关联公司共享您的账户信息(头像、昵称及其他页面提示的信息),您可通过同一账号在我们提供的链接入口使用我们关联公司提供的服务或产品。此外,我们可能从第三方获取您授权共享的第三方账户信息(如头像、昵称、联系方式等),并将您的第三方账户与您的一咻学术账户绑定,使您可以通过第三方账户直接登录并使用一咻学术的服务或产品。我们将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的这些个人信息。</view>
-					<view class="section-text">3.2 为您展示和推送医疗相关信息和服务</view>
+					<view class="section-text">授权登录:您注册我们的账户后,我们可能经您同意后向我们的关联公司共享您的账户信息(头像、昵称及其他页面提示的信息),您可通过同一账号在我们提供的链接入口使用我们关联公司提供的服务或产品。此外,我们可能从第三方获取您授权共享的第三方账户信息(如头像、昵称、联系方式等),并将您的第三方账户与您的文依学术账户绑定,使您可以通过第三方账户直接登录并使用文依学术的服务或产品。我们将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的这些个人信息。</view>
+					<view class="section-text">3.2 为您展示和推送相关信息和服务</view>
 					<view class="section-text">为向您提供更契合您需求的页面展示和搜索结果、了解产品适配性,我们会收集关于您使用的服务以及使用方式的信息并将这些信息进行关联,这些信息包括:</view>
 					<view class="section-text">设备信息:我们会根据您在软件安装及使用中授予的具体权限,接收并记录您所使用的设备相关信息(包括设备型号、操作系统版本、设备设置、Android id、MAC地址、IMEI、IMSI、唯一设备标识符、浏览器等软硬件特征信息)、设备所在位置相关信息(包括IP 地址、GPS位置以及能够提供相关信息的Wi-Fi 接入点、蓝牙和基站这类传感器信息)。</view>
 					<view class="section-text">日志信息:当您使用我们的网站或客户端等提供的服务或产品时,我们会自动收集您对服务的详细使用情况,作为有关网络日志保存,包括您的搜索查询内容、IP地址、浏览器的类型、电信运营商、使用的语言、访问日期和时间及您访问的网页记录。除此之外,我们还会收集您的浏览记录,浏览记录包括您浏览的医院信息、科室信息、医生信息、药品信息、问答、评论、文章。</view>
 					<view class="section-text">请注意,单独的设备信息、日志信息是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将该类个人信息做匿名化、去标识化处理。</view>
-					<view class="section-text">为改善我们的产品或服务、向您提供更符合您个性化需求的信息展示、搜索及推送服务,我们会根据您的浏览及搜索记录、设备信息、位置信息、历史问诊、个人生理健康信息、关注医生、加入的圈子等,提取您的浏览、搜索偏好、行为习惯、位置信息等特征,基于特征标签进行间接人群画像并展示、推送信息。</view>
+					<view class="section-text">为改善我们的产品或服务、向您提供更符合您个性化需求的信息展示、搜索及推送服务,我们会根据您的浏览及搜索记录、设备信息、位置信息、产品信息、客户信息、审批记录、打卡记录等,提取您的浏览、搜索偏好、行为习惯、位置信息等特征,基于特征标签进行间接人群画像并展示、推送信息。</view>
 					<view class="section-text">同时,我们通过以下措施努力保障您的隐私体验:</view>
-					<view class="section-text">1、如果您要删除您的浏览和搜索记录,您可以在"搜索框"中点击清除图标、或"清空历史";</view>
+					<view class="section-text">1、如果您要删除您的浏览和搜索记录,您可以在“搜索框”中点击清除图标、或“清空历史”;</view>
 					<view class="section-text">2、如您不想接受我们给您发送的商业广告,您可通过联系客服退订或我们提供的其他方式进行退订或关闭;</view>
-					<view class="section-text">3、如您想管理我们给您发送的定向推送和个性化广告功能,您可以在"设置-隐私设置"中进行调整。需注意的是,您可设置我们不适用某些类别信息向您展示相关定性推送和广告,但是您仍然会看到推送信息和广告,您看到的推送信息和广告数量不会变化,只不过推送信息和广告的相关性会下降。</view>
-					<view class="section-text">3.3 向您提供互联网电子服务或商品</view>
+					<view class="section-text">3、如您想管理我们给您发送的定向推送和个性化广告功能,您可以在“设置-隐私设置”中进行调整。需注意的是,您可设置我们不适用某些类别信息向您展示相关定性推送和广告,但是您仍然会看到推送信息和广告,您看到的推送信息和广告数量不会变化,只不过推送信息和广告的相关性会下降。</view>
+					<view class="section-text">3.3 向您提供互联网电子服务</view>
 					<view class="section-text">3.3.1 您向我们提供的信息</view>
-					<view class="section-text">为便于您使用互联网电子服务或商品,您需提供真实姓名、手机号、社保卡、就诊卡等信息。您可以为其他人进行预约或咨询等服务,您需要提供该实际用户的前述个人信息。在提供该实际用户的前述个人信息之前,您需确保您已经取得其授权同意,其中涉及儿童个人信息的,您需在提供前征得该儿童监护人的同意。</view>
-					<view class="section-text">当您在产品及/或服务中订购相应的医疗服务和商品时,我们可能会收集您的交易信息、记录,包括您所购买的商品及/或服务信息、具体订单号、订单创建时间、您应支付的金额,我们收集这些信息是为了帮助您顺利完成交易、保障您的交易安全、查询订单信息。其中,如您购买商品的,在下单过程中,您需至少提供您的收货人姓名、收货地址、收货人联系电话;您可以为其他人订购商品及/或服务,但需提供该实际收货人的前述个人信息,且需确保您已经取得其授权同意。您知晓并同意第三方物流配送主体不可避免地获知及使用您的上述信息,用于完成交付目的。为使我们及时获悉并确认交付进度及状态,向您提供售后与争议解决服务,您同意我们可自物流相关服务主体处收集与交付进度相关的信息。如果您拒绝提供此类信息,您理解并同意我们将无法完成相关交付及售后服务。</view>
-					<view class="section-text">当您使用本产品或服务提供的问诊功能,在问诊过程中,我们可能会申请开启您的位置信息(地理位置)、相机/摄像头、麦克风(语音)以及存储的相关权限,您可随时通过您设备的相关功能设置开启/取消上述权限;同时可能要求您提供患者姓名、性别、身份证号码、手机号码、出生日期、所在城市、与患者的关系、病情病症、住院志、医嘱单、问诊记录、检验报告、手术及麻醉记录、护理记录、用药记录、药物食物过敏信息、生育信息、以往病史、诊治情况、家族病史、现病史、传染病史等,以及与个人身体健康状况产生的相关信息,及体重、身高、肺活量等。如您不提供上述信息,将会影响您使用部分互联网电子服务或商品,但不影响您使用一咻学术产品或服务的基本浏览、搜索功能。另外,我们可能会收集您在使用服务或产品过程中产生的健康咨询详情(如图片、文字、视频、语音)、预约挂号记录、检查检验、用药处方、医生诊断结果等信息,用于向您展示及便于您对信息进行管理。</view>
-					<view class="section-text">为帮助您顺利完成交易、保证您的交易安全、完成付款相应医疗服务和/或商品费用的支付,您可能需要提供银行卡号、身份证号码、银行卡的预留手机号和/或其他认证信息、创建账户与支付口令、医保卡号、医保卡绑定的手机号码以及医保支付口令,同时,为满足相关法律法规或监管机构的要求,我们可能需要将您必要的个人信息及上述支付信息提供给监管机构以及监管机构指定的第三方服务机构,以顺利完成您所订购相应医疗服务和药品费用的支付和结算。如您不提供上述信息,将无法正常使用相关的支付功能,但不会影响您使用一咻学术提供的基本浏览、搜索功能。</view>
+					<view class="section-text">为便于您使用互联网电子服务,您需提供手机号等信息。</view>
 					<view class="section-text">当您与我们联系时,我们可能会保存您的沟通、通信/通话记录和内容或您留下的联系方式等信息,以便与您联系或帮助您解决问题,或记录相关问题的处理方案及结果。为了提供服务及改进服务质量的合理需要,我们还可能使用的您的其他信息,包括您与客服联系时您提供的相关信息,您参与问卷调查时向我们发送的问卷答复信息。如果您针对具体订单进行咨询、投诉或提供建议的,我们会使用您的账户信息和订单信息。如您拒绝提供上述信息,我们可能无法向您及时反馈投诉、申诉或咨询结果。</view>
-					<view class="section-text">您可通过我们为您提供的评价、问答、论坛等信息发布功能公开发布信息,包括作为注册用户可发表评价及问答内容、发布图文信息。请注意,您公开发布的信息中可能会涉及您或他人的个人信息甚至敏感个人信息,如您在评价时选择上传包含个人信息的图片。请您更加谨慎地考虑,是否在使用服务时共享甚至公开分享相关信息。若您公开发布的信息中涉及儿童个人信息的,您需在发布前征得对应儿童监护人的同意。</view>
 					<view class="section-text">3.3.2 我们通过间接获得方式收集到的您的个人信息</view>
-					<view class="section-text">我们可能从第三方获取您授权共享的账户信息(头像、昵称、联系方式),并在您同意本声明和协议后将您的第三方账户与您的账户绑定,使您可以通过第三方账户直接登录并使用我们的互联网电子服务或商品。我们会将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的这些个人信息。</view>
-					<view class="section-text">您可通过同一账号在我们提供的链接入口使用我们关联公司提供的互联网电子服务或商品,为便于我们基于关联账号共同向您提供一站式服务并便于您统一进行管理,我们在一咻学术平台集中展示您的信息或推荐您感兴趣的信息。</view>
-					<view class="section-text">当您通过我们互联网电子服务或商品使用上述服务时,您授权我们根据实际业务及合作需要从我们关联公司处接收、汇总、分析我们确认其来源合法或您授权同意其向我们提供的您的个人信息或交易信息。</view>
-					<view class="section-text">如您拒绝提供上述信息或拒绝授权,可能无法使用我们关联公司的相应互联网电子服务或商品,或者无法展示相关信息,但不影响使用一咻学术的健康咨询等核心服务。</view>
+					<view class="section-text">我们可能从第三方获取您授权共享的账户信息(头像、昵称、联系方式),并在您同意本声明和协议后将您的第三方账户与您的账户绑定,使您可以通过第三方账户直接登录并使用我们的互联网电子服务。我们会将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的这些个人信息。</view>
+					<view class="section-text">您可通过同一账号在我们提供的链接入口使用我们关联公司提供的互联网电子服务,为便于我们基于关联账号共同向您提供一站式服务并便于您统一进行管理,我们在文依学术平台集中展示您的信息或推荐您感兴趣的信息。</view>
+					<view class="section-text">当您通过我们互联网电子服务使用上述服务时,您授权我们根据实际业务及合作需要从我们关联公司处接收、汇总、分析我们确认其来源合法或您授权同意其向我们提供的您的个人信息或交易信息。</view>
+					<view class="section-text">如您拒绝提供上述信息或拒绝授权,可能无法使用我们关联公司的相应互联网电子服务,或者无法展示相关信息,但不影响使用文依学术的其他功能。</view>
 					<view class="section-text">3.4 为您提供安全保障</view>
-					<view class="section-text">请注意,为确保账户身份真实性、向您提供更好的安全保障,您可以向我们提供身份证、社保卡等身份信息,绑定银行卡等完成实名认证。如您拒绝提供上述信息,可能无法使用特定的互联网电子服务或商品、继续可能存在风险的操作等,但不会影响您使用浏览、搜索等服务。</view>
-					<view class="section-text">为提高您使用我们及我们关联公司、合作伙伴提供服务的安全性,保护您或其他用户或公众的人身财产安全免遭侵害,更好地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入等安全风险,更准确地识别违反法律法规或一咻学术相关协议规则的情况,我们可能使用或整合您的账户信息、交易信息、设备信息(包括设备型号、操作系统版本、设备设置、Android id、MAC地址、IMEI、IMSI、唯一设备标识符、已安装应用软件列表、最近运行的应用这类软硬件特征信息)、设备所在位置相关信息(包括IP地址、GPS位置以及能够提供相关信息的Wi-Fi接入点、蓝牙和基站这类传感器信息)、有关网络日志以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息,来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施。</view>
+					<view class="section-text">为提高您使用我们及我们关联公司、合作伙伴提供服务的安全性,保护您或其他用户或公众的人身财产安全免遭侵害,更好地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入等安全风险,更准确地识别违反法律法规或文依学术相关协议规则的情况,我们可能使用或整合您的账户信息、交易信息、设备信息(包括设备型号、操作系统版本、设备设置、Android id、MAC地址、IMEI、IMSI、唯一设备标识符、已安装应用软件列表、最近运行的应用这类软硬件特征信息)、设备所在位置相关信息(包括IP地址、GPS位置以及能够提供相关信息的Wi-Fi接入点、蓝牙和基站这类传感器信息)、有关网络日志以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息,来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施。</view>
 					<view class="section-text">3.5 其他用途</view>
-					<view class="section-text">我们将信息用于本声明和协议未载明的其他用途,或者将基于特定目的收集而来的信息用于其他目的时,会事先征求您的同意。若您提供的信息中含有其他用户的个人信息,在向我们提供这些个人信息之前,您需确保您已经取得合法的授权。若其中涉及儿童个人信息的,您需在发布前取得对应儿童监护人的同意,前述情形下监护人有权通过本协议规定的途径联系我们,要求更正或删除涉及儿童个人信息的内容。</view>
+					<view class="section-text">我们将信息用于本声明和协议未载明的其他用途,或者将基于特定目的收集而来的信息用于其他目的时,会事先征求您的同意。若您提供的信息中含有其他用户的个人信息,在向我们提供这些个人信息之前,您需确保您已经取得合法的授权。</view>
 					<view class="section-text">3.6 征得授权同意的例外</view>
 					<view class="section-text">根据相关法律法规规定,以下情形中收集您的个人信息无需征得您的授权同意:</view>
 					<view class="section-text">1、与国家安全、国防安全有关的;</view>
@@ -115,18 +104,62 @@
 					<view class="section-text">10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;</view>
 					<view class="section-text">11、法律法规规定的其他情形。</view>
 					<view class="section-text">请知悉,根据适用的法律,若我们对个人信息采取技术措施和其他必要措施进行处理,使得数据接收方无法重新识别特定个人且不能复原,或我们可能会对收集的信息进行去标识化地研究、统计分析和预测,用于改善平台的内容和布局,为商业决策提供产品或服务支撑,以及改进产品和服务(包括使用匿名数据进行机器学习或模型算法训练),则此类处理后数据的使用无需另行向您通知并征得您的同意。</view>
-					<view class="section-text">如我们停止运营一咻学术平台,我们将及时停止继续收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,对所持有的个人信息进行删除或匿名化处理。</view>
+					<view class="section-text">如我们停止运营文依学术平台,我们将及时停止继续收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,对所持有的个人信息进行删除或匿名化处理。</view>
 					<view class="section-text">3.7 设备权限调用</view>
-					<view class="section-text">为向您提供便捷、优质的服务,我们可能会调用您设备的一些权限,以下是我们可能调用的设备权限列表及对应的使用目的说明,您有权随时选择关闭下列权限的授权,但可能会影响您正常使用我们互联网电子服务或商品的部分或全部功能。</view>
-					<!-- <view class="section-text">点击图片可查看完整电子表格</view> -->
+					<view class="section-text">为向您提供便捷、优质的服务,我们可能会调用您设备的一些权限,以下是我们可能调用的设备权限列表及对应的使用目的说明,您有权随时选择关闭下列权限的授权,但可能会影响您正常使用我们互联网电子服务的部分或全部功能。</view>
+					<view class="section-text">设备权限</view>
+					<view class="section-text">对应业务功能</view>
+					<view class="section-text">调用权限的目的</view>
+					<view class="section-text">是否询问</view>
+					<view class="section-text">如果关闭权限会影响用户什么功能</view>
+					<view class="section-text">位置</view>
+					<view class="section-text">用于基于位置的定位打卡</view>
+					<view class="section-text">通过用户当前位置,获取打卡地点</view>
+					<view class="section-text">用户使用相应服务前会弹窗询问</view>
+					<view class="section-text">用户将无法准确使用定位打卡功能</view>
+					<view class="section-text">相册</view>
+					<view class="section-text">核心业务功能</view>
+					<view class="section-text">保存图片至相册</view>
+					<view class="section-text">用户使用相应服务前会弹窗询问</view>
+					<view class="section-text">用户无法正常保存图片功能</view>
+					<view class="section-text">通知</view>
+					<view class="section-text">全部功能</view>
+					<view class="section-text">接受审批结果</view>
+					<view class="section-text">用户首次打开手机客户端时会弹窗询问</view>
+					<view class="section-text">用户无法正常接受各类通知消息</view>
+					<view class="section-text">无线数据</view>
+					<view class="section-text">全部功能</view>
+					<view class="section-text">连接网络</view>
+					<view class="section-text">用户首次打开手机客户端时会弹窗询问</view>
+					<view class="section-text">移动客户端无法正常使用</view>
+					<view class="section-text">WLAN</view>
+					<view class="section-text">全部功能</view>
+					<view class="section-text">连接网络</view>
+					<view class="section-text">用户首次打开手机客户端时会弹窗询问</view>
+					<view class="section-text">移动客户端无法正常使用</view>
+					<view class="section-text">存储</view>
+					<view class="section-text">全部功能</view>
+					<view class="section-text">写入存储用户信息,存储日志等信息</view>
+					<view class="section-text">用户首次打开手机客户端时会弹窗询问</view>
+					<view class="section-text">移动客户端无法正常使用</view>
+					<view class="section-text">剪切板</view>
+					<view class="section-text">全部</view>
+					<view class="section-text">根据您的主动点选使用剪贴板功能辅助您的操作,使用粘贴功能智能填写地址信息、一键复制快速分享图文信息</view>
+					<view class="section-text">iOS 系统调用时有响应提示</view>
+					<view class="section-text">无法智能填写地址信息、无法一键复制快速分享图文信息,但不影响主要功能</view>
+					<view class="section-text">电话状态</view>
+					<view class="section-text">安全保障</view>
+					<view class="section-text">读取本机识别码,用于保障您的账号及使用安全</view>
+					<view class="section-text">用户首次打开手机客户端时会弹窗询问</view>
+					<view class="section-text">您的设备与账号可能处于风险之中,但不影响主要功能。</view>
 				</view>
 
 				<view class="section">
 					<view class="section-title">四、信息存储</view>
 					<view class="section-text">4.1 存储地点</view>
-					<view class="section-text">您知晓并同意,您在使用一咻学术产品、服务期间所产生的有关您的信息存储在中国境内安全可信的服务器上。</view>
+					<view class="section-text">您知晓并同意,您在使用文依学术产品、服务期间所产生的有关您的信息存储在中国境内安全可信的服务器上。</view>
 					<view class="section-text">4.2 存储期限</view>
-					<view class="section-text">我们仅在实现本协议所述目的所必需的时间内保留您的个人信息。在您与我们之间的合同关系(客户关系)存续期间,我们会处理并保存您的数据。当您注销一咻学术账户后,我们将对您的帐号信息进行删除或匿名化处理,但法律法规另有规定(例如《中华人民共和国电子商务法》要求商品和服务信息、交易信息保存时间自交易完成之日起不少于三年,《处方管理办法》要求普通处方保存期限为一年,《医疗机构管理条例实施细则》要求医疗机构门诊病历的保存期不得少于十五年等)或者您另行授权同意的除外。</view>
+					<view class="section-text">我们仅在实现本协议所述目的所必需的时间内保留您的个人信息。在您与我们之间的合同关系(客户关系)存续期间,我们会处理并保存您的数据。当您注销文依学术账户后,我们将对您的帐号信息进行删除或匿名化处理,但法律法规另有规定或者您另行授权同意、技术上难以实现、实现争议解决目等情况除外。</view>
 				</view>
 
 				<view class="section">
@@ -134,21 +167,19 @@
 					<view class="section-text">5.1 委托处理</view>
 					<view class="section-text">涉及具体的模块或功能由外部供应商提供的,对我们委托处理个人信息的该等外部供应商,我们会与其签署严格的保密协定,要求他们按照我们的要求、本协议以及其他任何相关的保密和安全措施来处理个人信息。</view>
 					<view class="section-text">5.2 共享</view>
-					<view class="section-text">我们不会与一咻学术服务提供者以外的任何公司、组织和个人分享您的个人信息,但以下情况除外:</view>
+					<view class="section-text">我们不会与文依学术服务提供者以外的任何公司、组织和个人分享您的个人信息,但以下情况除外:</view>
 					<view class="section-text">1、在获取您的明确授权或同意的情况下共享:获得您的明确授权或同意后,我们会与其他方共享您的个人信息。</view>
 					<view class="section-text">2、在法定情形下的共享:我们可能会根据法律法规规定,或按政府主管部门的强制性要求,对外共享您的个人信息。</view>
-					<view class="section-text">3、与关联公司间共享:为便于我们基于关联账号共同向您提供服务,推荐您可能感兴趣的信息或保护一咻学术关联公司或其他用户或公众的人身财产安全免遭侵害,您的个人信息可能会与我们的关联公司共享。我们只会共享必要的个人信息(如为便于您通过同一账号使用我们关联公司产品或服务,我们会向关联公司共享您必要的账户信息),且这种共享受本协议所声明目的的约束。如果我们共享您的敏感个人信息或关联公司改变个人信息的使用及处理目的,将再次征求您的授权同意。</view>
-					<view class="section-text">4、与授权合作伙伴共享:仅为实现本声明和协议中声明的目的,我们的某些服务将由授权合作伙伴提供。我们可能会与合作伙伴共享您的某些个人信息,以提供更好的客户服务和用户体验。例如,在您订购我们的商品时,我们必须与配送服务提供商共享您的订单信息才能安排送货;或者我们需要将您的订单号和订单金额与金融机构共享以实现其确认您的支付指令并完成支付等。我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。同时,我们会与合作伙伴签署严格的保密协定,要求他们按照我们的说明、本协议以及其他任何相关的保密和安全措施来处理您的个人信息。我们的合作伙伴无权将共享的个人信息用于任何其他用途。如果您拒绝我们的合作伙伴在提供服务时收集为提供服务所必须的个人信息, 将可能导致您无法使用该第三方服务。</view>
-					<view class="section-text">鉴于医疗的特殊性,出于患教以及帮助其他患者的目的,您与医生的交流信息将在匿名化和/或去标识化处理后,默认展示给第三方阅读。通过由我们或第三方提供的功能,您可以主动公开分享、共享信息(如向其他互联网平台转发内容),在这种情况下共享信息将被广泛并即时传送。但只要您不删除被共享的信息,该信息会一直留存在公众领域;在一些情况下,即使您删除共享信息,该等信息仍可由其他用户或与我们没有关联及不受我们控制的第三方独立地缓存、复制或储存,或通过其他用户或该等第三方在公众领域保存。例如,当您将您本平台提出的问题转发到其他互联网平台,该平台将可能独立的展示、缓存或保存您转发的内容,其他互联网用户也可能转发、保存您的回答,而相应的页面将不受我们的控制。</view>
+					<view class="section-text">3、与关联公司间共享:为便于我们基于关联账号共同向您提供服务,推荐您可能感兴趣的信息或保护文依学术关联公司或其他用户或公众的人身财产安全免遭侵害,您的个人信息可能会与我们的关联公司共享。我们只会共享必要的个人信息(如为便于您通过同一账号使用我们关联公司产品或服务,我们会向关联公司共享您必要的账户信息),且这种共享受本协议所声明目的的约束。如果我们共享您的敏感个人信息或关联公司改变个人信息的使用及处理目的,将再次征求您的授权同意。</view>
 					<view class="section-text">5.3 转让</view>
 					<view class="section-text">我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</view>
 					<view class="section-text">1、在获取您的明确授权或同意的情况下转让:获得您的明确授权或同意后,我们会向其他方转让您的个人信息;</view>
-					<view class="section-text">2、在一咻学术服务提供者发生合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如涉及到个人信息转让,我们会在要求新的持有您个人信息的公司、组织继续受声明和协议的约束,否则我们将要求该公司、组织重新向您征求授权同意。</view>
+					<view class="section-text">2、在文依学术服务提供者发生合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如涉及到个人信息转让,我们会在要求新的持有您个人信息的公司、组织继续受声明和协议的约束,否则我们将要求该公司、组织重新向您征求授权同意。</view>
 					<view class="section-text">5.4 公开披露</view>
 					<view class="section-text">我们仅会在以下情况下,公开披露您的个人信息:</view>
 					<view class="section-text">1、获得您明确同意或基于您的主动选择,我们可能会公开披露您的个人信息;</view>
-					<view class="section-text">2、基于法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会向有权机关披露您的个人信息。 但我们保证,在上述情况发生时,我们会要求披露请求方必须出具与之相应的有效法律文件,并对被披露的信息采取符合法律和业界标准的安全防护措施。</view>
-					<view class="section-text">3、如果我们确定您出现违反法律法规或严重违反一咻学术相关协议规则的情况,或为保护一咻学术及其关联公司用户或公众的人身财产安全免遭侵害,我们可能依据法律法规或一咻学术相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及一咻学术已对您采取的措施。例如,若您囤积号源、虚假预约而严重违反用户协议,我们可能会公开披露或与合作方共享您的身份信息、联系方式与处罚情况。</view>
+					<view class="section-text">2、基于法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会向有权机关披露您的个人信息。但我们保证,在上述情况发生时,我们会要求披露请求方必须出具与之相应的有效法律文件,并对被披露的信息采取符合法律和业界标准的安全防护措施。</view>
+					<view class="section-text">3、如果我们确定您出现违反法律法规或严重违反文依学术相关协议规则的情况,或为保护文依学术及其关联公司用户或公众的人身财产安全免遭侵害,我们可能依据法律法规或文依学术相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及文依学术已对您采取的措施。例如,若您囤积号源、虚假预约而严重违反用户协议,我们可能会公开披露或与合作方共享您的身份信息、联系方式与处罚情况。</view>
 					<view class="section-text">5.5 共享、转让、公开披露个人信息时事先征得授权同意的例外</view>
 					<view class="section-text">以下情形中,共享、转让、公开披露您的个人信息无需事先征得您的授权同意:</view>
 					<view class="section-text">1、与个人信息控制者履行法律法规规定的义务相关的;</view>
@@ -164,46 +195,44 @@
 
 				<view class="section">
 					<view class="section-title">六、用户业务数据和公开信息</view>
-					<view class="section-text">不同于您的个人信息,对于用户业务数据和公开信息,一咻学术将按如下方式处理:</view>
+					<view class="section-text">不同于您的个人信息,对于用户业务数据和公开信息,文依学术将按如下方式处理:</view>
 					<view class="section-text">6.1 用户业务数据</view>
-					<view class="section-text">1、您通过一咻学术平台提供的互联网电子服务或商品,加工、存储、上传、下载、分发以及通过其他方式处理的数据,均为您的用户业务数据,您完全拥有您的用户业务数据。一咻学术作为服务提供商,我们只会严格执行您的指示处理您的业务数据,除按与您协商一致或执行明确的法律法规要求外,不对您的业务数据进行任何非授权的使用或披露。</view>
-					<view class="section-text">2、您应对您的用户业务数据来源及内容负责,一咻学术提示您谨慎判断数据来源及内容的合法性。因您的用户业务数据内容违反法律法规、部门规章或国家协议而造成的全部结果及责任均由您自行承担。</view>
-					<view class="section-text">3、根据您与一咻学术协商一致,一咻学术在您选定的数据中心存储用户业务数据。一咻学术恪守对用户的安全承诺,根据适用的法律保护用户存储在一咻学术数据中心的数据。</view>
+					<view class="section-text">1、您通过文依学术平台提供的互联网电子服务,加工、存储、上传、下载、分发以及通过其他方式处理的数据,均为您的用户业务数据,您完全拥有您的用户业务数据。文依学术作为服务提供商,我们只会严格执行您的指示处理您的业务数据,除按与您协商一致或执行明确的法律法规要求外,不对您的业务数据进行任何非授权的使用或披露。</view>
+					<view class="section-text">2、您应对您的用户业务数据来源及内容负责,文依学术提示您谨慎判断数据来源及内容的合法性。因您的用户业务数据内容违反法律法规、部门规章或国家协议而造成的全部结果及责任均由您自行承担。</view>
+					<view class="section-text">3、根据您与文依学术协商一致,文依学术在您选定的数据中心存储用户业务数据。文依学术恪守对用户的安全承诺,根据适用的法律保护用户存储在文依学术数据中心的数据。</view>
 					<view class="section-text">6.2 公开信息</view>
-					<view class="section-text">1、公开信息是指您公开分享的任何信息,任何人都可以在使用和未使用一咻学术互联网电子服务或商品期间查看或访问这些信息。例如您在社区、论坛发布的信息。</view>
-					<view class="section-text">2、为使用一咻学术的互联网电子服务或商品,可能存在您必须公开分享的信息。</view>
-					<view class="section-text">3、在使用一咻学术平台进行交易时,您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息,如联络方式或者邮政地址等。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。您也可以通过我们的服务建立联系和相互分享。当您通过我们的服务创建交流、交易或分享时,您可以自主选择沟通、交易或分享的对象,作为能够看到您的联络方式、交流信息或分享内容等相关信息的第三方,如您发现自己的个人信息泄漏,尤其是您的账户或密码发生泄露,请您立即联络客服,以便一咻学术采取相应措施。</view>
+					<view class="section-text">1、公开信息是指您公开分享的任何信息,任何人都可以在使用和未使用文依学术互联网电子服务期间查看或访问这些信息。例如您在社区、论坛发布的信息。</view>
+					<view class="section-text">2、为使用文依学术的互联网电子服务,可能存在您必须公开分享的信息。</view>
+					<view class="section-text">3、在使用文依学术平台进行交易时,若您需要向交易对方或潜在的交易对方披露自己的个人信息,如联络方式或者邮政地址等。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。您也可以通过我们的服务建立联系和相互分享。当您通过我们的服务创建交流、交易或分享时,您可以自主选择沟通、交易或分享的对象,作为能够看到您的联络方式、交流信息或分享内容等相关信息的第三方,如您发现自己的个人信息泄漏,尤其是您的账户或密码发生泄露,请您立即联络客服,以便文依学术采取相应措施。</view>
 				</view>
 
 				<view class="section">
 					<view class="section-title">七、我们如何保护您的个人信息</view>
-					<view class="section-text">7.1 我们已采取符合业界标准、合理可行的安全防护措施保护您提供的个人信息安全,防止个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。例如,在您的浏览器与服务器之间交换数据(如信用卡信息)时受 SSL(Secure Socket Layer)协议加密保护;我们同时对一咻学术平台提供HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)协议安全浏览方式;我们会使用加密技术提高个人信息的安全性;我们会使用受信赖的保护机制防止个人信息遭到恶意攻击;我们会部署访问控制机制,尽力确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。我们努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护您的个人信息安全。我们积极建立数据分类分级制度、数据安全管理规范、数据安全开发规范来管理规范个人信息的存储和使用,努力确保未收集与我们提供的服务无关的个人信息。此外,我们通过与信息接触者签署保密协议、监控和审计机制来对数据进行全面安全控制。防止您的个人信息遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。</view>
+					<view class="section-text">7.1 我们已采取符合业界标准、合理可行的安全防护措施保护您提供的个人信息安全,防止个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。例如,在您的浏览器与服务器之间交换数据(如信用卡信息)时受 SSL(Secure Socket Layer)协议加密保护;我们同时对文依学术平台提供HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)协议安全浏览方式;我们会使用加密技术提高个人信息的安全性;我们会使用受信赖的保护机制防止个人信息遭到恶意攻击;我们会部署访问控制机制,尽力确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。我们努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护您的个人信息安全。我们积极建立数据分类分级制度、数据安全管理规范、数据安全开发规范来管理规范个人信息的存储和使用,努力确保未收集与我们提供的服务无关的个人信息。此外,我们通过与信息接触者签署保密协议、监控和审计机制来对数据进行全面安全控制。防止您的个人信息遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。</view>
 					<view class="section-text">但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全。您需要了解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。</view>
 					<view class="section-text">7.2 我们有行业先进的以数据为核心,围绕数据生命周期进行的数据安全管理体系,从组织建设、制度设计、人员管理、产品技术等方面多维度提升整个系统的安全性。</view>
 					<view class="section-text">7.3 我们会采取合理可行的措施,尽力避免收集无关的个人信息。我们只会在达成本声明和协议所述目的所需的期限内保留您的个人信息,除非需要延长保留期或受到法律的允许。</view>
-					<view class="section-text">7.4 互联网并非绝对安全的环境,我们强烈建议您不要使用非一咻学术推荐的通信方式发送个人信息。您可以通过我们的服务建立联系和相互分享。当您通过我们的服务创建交流、交易或分享时,您可以自主选择沟通、交易或分享的对象,作为能够看到您的交易内容、联络方式、交流信息或分享内容等相关信息的第三方。</view>
-					<view class="section-text">在使用一咻学术平台进行网上健康咨询时,您不可避免地要向医务人员或客服披露自己的个人信息,如联系方式或身份信息。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息尤其是您的账户或密码发生泄露,请您立即联络客服,以便我们根据您的申请采取相应措施。</view>
+					<view class="section-text">7.4 互联网并非绝对安全的环境,我们强烈建议您不要使用非文依学术推荐的通信方式发送个人信息。</view>
+					<view class="section-text">请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息尤其是您的账户或密码发生泄露,请您立即联络客服,以便我们根据您的申请采取相应措施。</view>
 					<view class="section-text">请注意,您在使用我们服务时自愿共享甚至公开分享的信息,可能会涉及您或他人的个人信息甚至敏感个人信息,如您在发帖、评论时选择上传包含个人信息的图片。请您更加谨慎地考虑,是否在使用我们的服务时共享甚至公开分享相关信息。</view>
 					<view class="section-text">请使用复杂密码,协助我们保证您的账号安全。我们将尽力保障您发送给我们的任何信息的安全性。如果我们的物理、技术或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。</view>
-					<view class="section-text">7.5 我们将不定期更新并公开安全风险、个人信息安全影响评估报告等有关内容,您可通过一咻学术平台公告方式获得。</view>
+					<view class="section-text">7.5 我们将不定期更新并公开安全风险、个人信息安全影响评估报告等有关内容,您可通过文依学术平台公告方式获得。</view>
 					<view class="section-text">7.6 在不幸发生个人信息安全事件后,我们将按照法律法规的要求向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。事件相关情况我们将以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。在不幸发生儿童信息安全事件后,我们将按照法律法规的要求,及时向儿童及其监护人告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、儿童及其监护人可自主防范和降低风险的建议、对儿童及其监护人的补救措施等。我们将及时将事件相关情况以电话、推送、发送邮件/短消息等方式告知儿童及其监护人。难以逐一告知时,我们会采取合理、有效的方式发布相关警示信息。</view>
 					<view class="section-text">7.7 我们还将按照监管部门要求,上报个人信息安全事件的处置情况。</view>
 				</view>
 
 				<view class="section">
 					<view class="section-title">八、您如何管理您的个人信息</view>
-					<view class="section-text">我们非常重视您对个人信息的关注,并尽最大努力保护您对于自己个人信息访问、更正、删除以及撤回同意的各项权利, 以使您拥有充分的能力保障您的隐私和安全。您可以通过以下方式访问及管理您的个人信息:</view>
+					<view class="section-text">我们非常重视您对个人信息的关注,并尽最大努力保护您对于自己个人信息访问、更正、删除以及撤回同意的各项权利,以使您拥有充分的能力保障您的隐私和安全。您可以通过以下方式访问及管理您的个人信息:</view>
 					<view class="section-text">8.1 访问您的个人信息</view>
 					<view class="section-text">您有权随时访问您的个人信息,法律法规规定的例外情况除外。您可以通过以下方式自行访问您的个人信息:</view>
-					<view class="section-text">a.账户信息——如果您希望访问或编辑您的账户中的个人基本资料信息和实名认证信息、更改您的密码或添加绑定邮箱等,您可以登录账号通过"我的-设置中心"执行此类操作。</view>
-					<view class="section-text">b.银行卡管理:您可以登陆账号,通过"我的-银行卡"进行银行卡的绑定、更换。</view>
-					<view class="section-text">c.预约、问诊记录等:您可以登陆账号通过"我的-全部订单"查看了解历史记录。</view>
+					<view class="section-text">a.账户信息——如果您希望访问或编辑您的账户中的个人基本资料信息和实名认证信息、更改您的密码或添加绑定邮箱等,您可以登录账号通过“我的-设置中心”执行此类操作。</view>
 					<view class="section-text">如果您无法通过上述路径访问您的个人信息,您可以随时通过客服与我们取得联系。我们将在30个工作日内回复您的访问请求。</view>
-					<view class="section-text">对于您在使用我们的互联网电子服务或商品过程中产生的其他个人信息,我们将根据本条"8.7 响应您的上述请求"中的相关安排向您提供。</view>
+					<view class="section-text">对于您在使用我们的互联网电子服务过程中产生的其他个人信息,我们将根据本条“8.7 响应您的上述请求”中的相关安排向您提供。</view>
 					<view class="section-text">8.2 更正或补充您的个人信息</view>
-					<view class="section-text">当您发现我们处理的关于您的个人信息有错误时,您有权要求我们做出更正或补充。您可以通过"8.1访问您的个人信息"中列明的方式提出更正或补充申请。</view>
+					<view class="section-text">当您发现我们处理的关于您的个人信息有错误时,您有权要求我们做出更正或补充。您可以通过“8.1访问您的个人信息”中列明的方式提出更正或补充申请。</view>
 					<view class="section-text">8.3 删除您的个人信息</view>
-					<view class="section-text">您可以通过"8.1访问您的个人信息"中列明的方式删除您的部分个人信息。同时,您也可以通过在线客服联系我们,帮助您删除您在平台上的部分相关信息。在以下情形中,您可以向我们提出删除个人信息的请求:</view>
+					<view class="section-text">您可以通过“8.1访问您的个人信息”中列明的方式删除您的部分个人信息。同时,您也可以通过在线客服联系我们,帮助您删除您在平台上的部分相关信息。在以下情形中,您可以向我们提出删除个人信息的请求:</view>
 					<view class="section-text">1、如果我们处理个人信息的行为违反法律法规;</view>
 					<view class="section-text">2、如果我们收集、使用您的个人信息,却未征得您的明确同意;</view>
 					<view class="section-text">3、如果我们处理个人信息的行为严重违反了与您的约定;</view>
@@ -212,14 +241,14 @@
 					<view class="section-text">若我们决定响应您的删除请求,我们还将同时尽可能通知从我们处获得您的个人信息的主体,要求其及时删除,除非法律法规另有规定,或这些主体获得您的独立授权。</view>
 					<view class="section-text">当您从我们的服务中删除信息后,我们可能不会立即从备份系统中删除相应的信息,但会在备份更新时删除这些信息。</view>
 					<view class="section-text">8.4 改变您授权同意的范围</view>
-					<view class="section-text">您可以通过删除信息、关闭设备功能、在一咻学术平台中进行隐私设置等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。</view>
-					<view class="section-text">请您理解,每个业务功能需要一些基本的个人信息才能得以完成(见本隐私保护协议"我们如何收集和使用您的信息")。当您收回同意后,我们将不再处理相应的个人信息。但您收回同意的决定,不会影响此前基于您的授权而开展的个人信息处理。</view>
+					<view class="section-text">您可以通过删除信息、关闭设备功能、在文依学术平台中进行隐私设置等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。</view>
+					<view class="section-text">请您理解,每个业务功能需要一些基本的个人信息才能得以完成(见本隐私保护协议“我们如何收集和使用您的信息”)。当您收回同意后,我们将不再处理相应的个人信息。但您收回同意的决定,不会影响此前基于您的授权而开展的个人信息处理。</view>
 					<view class="section-text">8.5 个人信息主体注销账户</view>
-					<view class="section-text">您可通过"我的-联系客服"功能联系客服完成账户的注销。请您谨慎操作,否则,因账户注销产生的数据丢失问题均由您自行承担。</view>
-					<view class="section-text">在符合一咻学术单项服务的服务协议约定条件及国家相关法律法规规定的情况下,您的该项一咻学术服务帐号可能被注销或删除。当帐号注销或被删除后,与该帐号相关的、该单项服务项下的全部服务资料和数据将依照单项服务的服务协议约定删除或匿名化处理。但法律法规另有规定的除外。</view>
+					<view class="section-text">您可通过“我的-联系客服”功能联系客服完成账户的注销。请您谨慎操作,否则,因账户注销产生的数据丢失问题均由您自行承担。</view>
+					<view class="section-text">在符合文依学术单项服务的服务协议约定条件及国家相关法律法规规定的情况下,您的该项文依学术服务帐号可能被注销或删除。当帐号注销或被删除后,与该帐号相关的、该单项服务项下的全部服务资料和数据将依照单项服务的服务协议约定删除或匿名化处理。但法律法规另有规定的除外。</view>
 					<view class="section-text">在注销账户之后,我们将停止为您提供产品或服务,并依据您的要求,删除您的个人信息,但法律法规另有规定的除外。</view>
 					<view class="section-text">8.6 约束信息系统自动决策</view>
-					<view class="section-text">在某些互联网电子服务或商品中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制做出决定。例如向您推荐您可能希望了解的医生或疾病知识,也可能根据您的位置信息或用户画像向您推送更精准的医生信息。如果这些决定显著影响您的合法权益,您有权要求我们做出解释,我们也将在不侵害一咻学术商业秘密或用户权益、社会公共利益的前提下提供申诉方法。</view>
+					<view class="section-text">在某些互联网电子服务中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制做出决定。例如向您推荐您可能希望了解的文章素材,也可能根据您的位置信息向您推荐附近负责机构。如果这些决定显著影响您的合法权益,您有权要求我们做出解释,我们也将在不侵害文依学术商业秘密或用户权益、社会公共利益的前提下提供申诉方法。</view>
 					<view class="section-text">8.7 响应您的上述请求</view>
 					<view class="section-text">为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。</view>
 					<view class="section-text">我们将在30个工作日内做出答复。如您不满意,还可以通过客服发起投诉。</view>
@@ -227,9 +256,59 @@
 					<view class="section-text">在以下情形中,按照法律法规要求,我们将无法响应您的请求:</view>
 					<view class="section-text">1、与个人信息控制者履行法律法规规定的义务相关的;</view>
 					<view class="section-text">2、与国家安全、国防安全有关的;</view>
+					<view class="section-text">3、与公共安全、公共卫生、重大公共利益有关的;</view>
+					<view class="section-text">4、与犯罪侦查、起诉、审判和执行判决等有关的;</view>
+					<view class="section-text">5、有充分证据表明个人信息主体存在主观恶意或滥用权利的;</view>
+					<view class="section-text">6、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</view>
+					<view class="section-text">7、响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;</view>
+					<view class="section-text">8、涉及商业秘密的。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">九、我们如何处理未成年人的个人信息</view>
+					<view class="section-text">如果没有父母或监护人的同意,未成年人不得创建自己的用户账户。在使用本平台过程中我们推定您具有相应的民事行为能力。如您为未成年人,建议您请您的父母或监护人仔细阅读本声明和协议,并在征得您的父母或监护人同意的前提下使用我们的互联网电子服务向我们提供信息。</view>
+					<view class="section-text">我们不会主动直接向未成年人收集其个人信息。对于经父母或监护人同意使用我们的互联网电子服务而收集未成年人个人信息的情况,我们只会在法律法规允许、父母或监护人明确同意或者保护未成年人所必要的情况下使用、共享、转让或披露此信息。</view>
+					<view class="section-text">根据当地监管部门的相关规定,文依学术仅对满足特定年龄要求的用户提供互联网电子服务。如果有事实证明未成年人并未取得监护人同意的情况下注册使用了我们的产品和/或服务,我们会与相关监护人协商,并设法尽快删除相关个人信息。</view>
+					<view class="section-text">对于可能涉及的儿童个人信息,我们进一步采取以下措施予以保障:</view>
+					<view class="section-text">1. 对于收集到的儿童个人信息,我们除遵守本隐私保护协议关于用户个人信息的约定外,还会秉持正当必要、知情同意、目的明确、安全保障、依法利用的原则,严格遵循《儿童个人信息网络保护规定》等法律法规的要求进行存储、使用、披露,且不会超过实现收集、使用目的所必须的期限,到期后我们会对儿童个人信息进行删除或匿名化处理。</view>
+					<view class="section-text">2. 当您作为监护人为被监护的儿童选择使用我们提供的相关服务时,我们可能需要向您收集被监护的儿童个人信息,用于向您履行相关服务之必要。在具体服务中需要向您收集儿童个人信息的,我们会事先取得您的授权同意,并告知您收集的目的和用途。如果您不提供前述信息,您将无法享受我们提供的相关服务。此外,您在使用本平台过程中可能会主动向我们提供儿童个人信息,请您明确知悉并谨慎选择。您作为监护人应当正确履行监护职责,保护儿童个人信息安全。若儿童本人需要注册或使用我们的产品和/或服务,您应正确引导并予以监护。</view>
+					<view class="section-text">3. 儿童或其监护人有权随时访问和更正儿童个人信息,还可以向我们提出更正和删除的请求。如您对儿童个人信息相关事宜有任何意见、建议或投诉、举报,请联系我们。我们会随时为您提供帮助。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">十、您的个人信息如何在全球范围转移</view>
+					<view class="section-text">我们在中华人民共和国境内运营中收集和产生的个人信息,存储在中国境内,以下情形除外:</view>
+					<view class="section-text">1、法律法规有明确规定;</view>
+					<view class="section-text">2、获得您的明确授权;</view>
+					<view class="section-text">3、您通过互联网进行海外互联网电子服务等个人主动行为。</view>
+					<view class="section-text">针对以上情形,我们会通过合理必要的措施确保以不低于本协议规定的程度及我国法律法规规定的个人信息保护标准保护您的个人信息。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">十一、本声明和协议如何更新</view>
+					<view class="section-text">我们的声明和协议可能变更,我们保留不时更新或修改本声明和协议的权利。</view>
+					<view class="section-text">未经您明确同意,我们不会削减您按照本声明和协议所应享有的权利。 我们会在本页面上发布对本声明和协议所做的任何变更。</view>
+					<view class="section-text">对于重大变更,我们还会提供更为显著的通知(包括我们会通过网站公示的方式进行通知甚至向您提供弹窗提示)。</view>
+					<view class="section-text">本声明和协议所指的重大变更包括但不限于:</view>
+					<view class="section-text">1、我们的服务模式发生重大变化,如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;</view>
+					<view class="section-text">2、我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;</view>
+					<view class="section-text">3、个人信息共享、转让或公开披露的主要对象发生变化;</view>
+					<view class="section-text">4、您参与个人信息处理方面的权利及其行使方式发生重大变化;</view>
+					<view class="section-text">5、我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时;</view>
+					<view class="section-text">6、个人信息安全影响评估报告表明存在高风险时。</view>
+					<view class="section-text">如果您不同意修改后的内容,您有权并应立即停止使用我们提供的服务。如果您继续使用我们提供的服务,则视为您接受我们对本声明和协议相关条款所做的修改。我们还会将本声明和协议的旧版本存档,供您查阅。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">十二、如何联系我们</view>
+					<view class="section-text">以下情况,您可以通过在线客服与我们联系,一般情况下我们将在30个工作日内回复您的请求:</view>
+					<view class="section-text">1、如对本声明和协议内容有任何疑问、意见或建议;</view>
+					<view class="section-text">2、如发现个人信息可能被泄露。</view>
+					<view class="section-text">您可以通过“我的-联系客服”或客服电话(17716144271)与我们联系。</view>
+					<view class="section-text">如果您对我们的回复不满意,特别是您认为我们的个人信息处理行为损害了您的合法权益,您还可以通过向成都文依合创科技有限公司运营总部成都市温江区海天腾逸广场4号楼有管辖权的法院提起诉讼来寻求解决方案。</view>
 				</view>
 
-				<view class="footer">感谢您对一咻学术平台的信任与支持。</view>
+				<view class="footer">感谢您对文依学术平台的信任与支持。</view>
 			</view>
 		</scroll-view>
 	</view>
@@ -307,4 +386,4 @@ export default {
 	margin-top: 32rpx;
 	padding-top: 24rpx;
 }
-</style>
+</style>

+ 173 - 44
pages_user/userAgreement.vue

@@ -2,83 +2,212 @@
 	<view class="container">
 		<scroll-view class="content" scroll-y>
 			<view class="agreement-body">
-				<view class="title">用户协议</view>
-				<view class="update-time">更新日期:2026年2月24日</view>
+				<view class="title">用户服务协议</view>
+				<view class="update-time">更新日期:2026年3月25日</view>
 
 				<view class="section">
-					<view class="section-title">一、协议的接受与修订</view>
-					<view class="section-text">1.1 本协议是您与「研究型互联网医院」平台(以下简称「本平台」)之间关于使用本平台服务所订立的协议。请您仔细阅读本协议全部内容,未成年人应在法定监护人陪同下阅读。</view>
-					<view class="section-text">1.2 您使用本平台服务即视为已阅读并同意接受本协议约束。若您不同意本协议任何条款,请立即停止使用本平台服务。</view>
-					<view class="section-text">1.3 本平台有权根据需要修改本协议条款,修改后的协议将在平台内公布。若您继续使用服务,即视为接受修订后的协议。</view>
+					<view class="section-title">导言</view>
+					<view class="section-text">欢迎使用文依学术小程序及服务!</view>
+					<view class="section-text">为使用文依学术小程序(以下简称“本平台”)及服务,用户应当阅读并遵守《文依学术用户服务协议》(以下简称“本协议”),以及《文依学术用户隐私保护协议》等相关协议。请用户务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款,以及开通或使用某项服务的单独协议,并选择接受或不接受。限制、免责条款可能以加粗形式提示用户注意。</view>
+					<view class="section-text">除非用户已阅读并接受本协议所有条款,否则用户无权注册、使用本软件及相关服务。用户的注册、使用、获取、登录文依学术等行为即视为用户已阅读并同意上述协议的约束。</view>
 				</view>
 
 				<view class="section">
-					<view class="section-title">二、服务说明</view>
-					<view class="section-text">2.1 本平台面向医生、药剂师等医疗相关专业人士,提供医学教育、任务参与、积分与提现、认证管理、问卷与案例收集等相关服务。</view>
-					<view class="section-text">2.2 本平台提供的服务内容可能随业务调整而变更,具体以平台实际展示为准。本平台保留在不另行通知的情况下调整、中断或终止部分或全部服务的权利。</view>
-					<view class="section-text">2.3 您理解并同意,本平台仅提供信息与任务撮合服务,不替代任何医疗行为或专业判断,您在使用服务过程中应遵守国家法律法规及行业规范。</view>
+					<view class="section-title">一、重要提示</view>
+					<view class="section-text">1.1 本平台各项电子服务的所有权和运作权归属成都文依合创科技有限公司所有,您在注册使用本平台之前应仔细阅读本《文依学术用户服务协议》中的各项条款,特别是免除或者限制责任的条款、法律适用和争议解决条款,以及其他以斜体、粗体等显著标识的涉及用户核心利益的重要条款。如您对协议有任何疑问,可向文依学术客服咨询。(未满18周岁的未成年人或其他不具备完全行为能力的人应当在其监护人陪同下阅读)。</view>
+					<view class="section-text">1.2 您在点击“注册”同意本协议之前,应当认真阅读本协议。您的注册行为及任何直接、间接使用本平台的部分或全部功能的行为,即视为已阅读并同意接受本协议的约束,包括接受更新后的本协议条款,愿意无条件、无保留地接受本协议所有条款约定并承担相应法律责任。如果您不同意本协议或其中任何条款约定,您应立即停止注册及使用程序。</view>
+					<view class="section-text">1.3 本公司可根据情况制订、修改本协议及条款,您以明示同意或默示同意等任何方式同意接受修改后的协议或条款,变更后的协议和条款即自动对您产生法律效力。</view>
+					<view class="section-text">1.4 用户确认:本协议是处理双方权利义务的契约,始终有效,法律另有强制性规定或双方另有特别约定的,依其规定。</view>
+					<view class="section-text">1.5 本公司保留在中华人民共和国大陆地区施行之法律允许的范围内独自决定拒绝部分或全部服务、关闭用户账户、清除或编辑内容或取消订单的权利。</view>
 				</view>
 
 				<view class="section">
-					<view class="section-title">三、账号注册与使用</view>
-					<view class="section-text">3.1 您应使用真实、准确的信息完成注册与认证。若您为医生或药剂师,需按要求提供执业证、职称证等材料,并保证所提交信息真实有效。</view>
-					<view class="section-text">3.2 您应妥善保管账号与密码,对使用该账号进行的一切行为负责。如发现账号被盗用或存在异常,请及时联系平台处理。</view>
-					<view class="section-text">3.3 您不得将账号出借、转让或以其他方式供他人使用;不得利用本平台从事违法违规活动或损害他人合法权益的行为。</view>
+					<view class="section-title">二、定义</view>
+					<view class="section-text">2.1 平台:具体指成都文依合创科技有限公司开发、运营的“文依学术”微信小程序。</view>
+					<view class="section-text">2.2 文依学术服务/本服务:指用户可依托文依学术平台,基于互联网,为文依学术平台用户提供互联网信息服务。</view>
+					<view class="section-text">2.3 用户:指文依学术平台的使用人,在本协议中被称为“您”或“用户”。</view>
+					<view class="section-text">2.4 本公司:指成都文依合创科技有限公司。</view>
+					<view class="section-text">2.7 关联公司:指成都文依合创科技有限公司在中国境内设立或运营的实体,包括直接或间接控股的公司,参股或形成经营、协作的具有关联关系的企业。</view>
 				</view>
 
 				<view class="section">
-					<view class="section-title">四、用户行为规范</view>
-					<view class="section-text">4.1 您在使用本平台服务时,应遵守中华人民共和国相关法律法规,不得发布违法、虚假、侵权或违背公序良俗的内容。</view>
-					<view class="section-text">4.2 您参与任务(如科普创作、短视频/长视频、问卷、用药调研、案例收集等)时,应保证所提交内容原创或已获授权,不得抄袭、剽窃或侵犯他人知识产权。</view>
-					<view class="section-text">4.3 您不得利用技术手段干扰平台正常运行、破坏数据或窃取他人信息;不得进行刷量、作弊等影响公平性的行为。</view>
+					<view class="section-title">三、账号管理</view>
+					<view class="section-text">3.1 用户在注册帐号或使用本服务的过程中,需要提供一些必要的个人信息,例如:为向用户提供帐号注册服务或进行用户身份识别,需要填写手机号码、工作单位、岗位信息;通话功能需要用户授权访问手机通讯录等。若国家法律法规或政策有特殊规定的,用户需要提供真实的身份信息。若用户提供的信息不完整或不真实,则可能无法使用本服务或在使用过程中受到限制。您在注册填写用户信息时,应保证提供的资料真实、准确、完整、合法有效,若提供的资料信息并非真实、准确、完整、合法有效,本公司有权随时暂停、冻结您的平台账号并要求您承担因此造成的法律后果。</view>
+					<view class="section-text">3.2 您的账号注册与使用应符合网络道德,遵守中华人民共和国的相关法律法规。您的用户名和昵称中不能含有威胁、淫秽、谩骂、非法、侵害他人正当权益等有争议性的文字。您在本平台上的言论不得违法、不得违反公序良俗、不得使用攻击性语言恶意中伤他人,或作出虚假性陈述。违反以上规定的,本平台有权随时采取暂停提供服务、删除内容、冻结账号等措施,且由此造成的一切不利后果由您自行承担。</view>
+					<view class="section-text">3.3 您需自行妥善保管其平台账号有关个人资料,不得以任何方式将平台账号有关个人资料转让、告知或借予他人。如因上述或其他不可归因于本公司的缘故导致您的平台账号有关个人资料遗失、被盗或泄露等情况致使您的自身相关权益受到损害的,皆由您自行承担责任。</view>
+					<view class="section-text">3.4 用户授权行为:对本平台而言,您的帐号和密码是唯一验证登录用户真实身份的依据,只要使用了正确的帐号和密码无论是谁登录均视为您本人登录或已得到您本人的授权。您应当对以您的帐号进行的所有活动和事件负法律责任。</view>
+					<view class="section-text">3.5 如您发现平台账号相关个人资料被非法使用或其他异常状况,请立即通知本公司线上服务人员,线上服务人员验证用户有效身份后可暂时冻结该平台账号之登录和使用等操作,待经过相关部门查实审核后,如无异常状况即可恢复使用。</view>
+					<view class="section-text">3.6 本公司保有暂停、清除各类不符合法律政策或不真实的信息内容而无须通知您的权利。若您未遵守国家法律法规及本协议规定,本平台有权作出独立判断并采取暂停或关闭您的帐号等措施。您须对自己在本平台发表的言论和行为承担法律责任。</view>
 				</view>
 
 				<view class="section">
-					<view class="section-title">五、积分与提现</view>
-					<view class="section-text">5.1 本平台积分规则以平台内公示为准。积分可用于兑换、提现等,具体规则以当时有效说明为准。</view>
-					<view class="section-text">5.2 提现需绑定真实有效的银行卡及身份信息,并可能需满足最低提现金额、实名认证等条件。因您提供信息有误导致的提现失败或延迟由您自行承担。</view>
-					<view class="section-text">5.3 如发现作弊、虚假任务完成等违规行为,本平台有权扣减或清零积分,并保留追究法律责任的权利。</view>
+					<view class="section-title">四、用户责任和义务</view>
+					<view class="section-text">4.1 用户依法言行义务。根据国家相关法律法规和规章的规定,您在注册使用本平台相关服务的过程中,应严格遵守以下义务:</view>
+					<view class="section-text">(1)不得传输或发表:煽动抗拒、破坏宪法和法律、行政法规实施的言论,煽动颠覆国家政权,推翻社会主义制度的言论,煽动分裂国家、破坏国家统一的言论,煽动民族仇恨、民族歧视、破坏民族团结的言论;</view>
+					<view class="section-text">(2)从中国大陆向境外传输资料信息时必须符合中国有关法规;</view>
+					<view class="section-text">(3)不得利用本平台从事洗钱、窃取商业秘密、窃取个人信息、不正当竞争等违法犯罪活动;</view>
+					<view class="section-text">(4)不得干扰本平台的正常运转,不得侵入本平台及国家计算机信息系统;</view>
+					<view class="section-text">(5)不得传输或发表任何违法犯罪的、骚扰性的、中伤他人的、辱骂性的、恐吓性的、伤害性的、庸俗的、淫秽的、不文明的等信息资料;</view>
+					<view class="section-text">(6)不得传输或发表损害国家社会公共利益和涉及国家安全的信息资料或言论;</view>
+					<view class="section-text">(7)不得教唆他人从事本条所禁止的行为;</view>
+					<view class="section-text">(8)不得利用在本平台注册的账户进行牟利性经营活动或进行广告行为;</view>
+					<view class="section-text">(9)不得发布任何侵犯他人著作权、商标权等知识产权或合法权利的内容;</view>
+					<view class="section-text">如您违反上述任一规则,导致相应法律后果的发生,您将以自己的名义独立承担所有法律责任。</view>
+					<view class="section-text">4.2 您在使用本平台接受服务时,应保证提供真实、完整、准确、合法有效的数据以及其他信息资料。如果资料发生变动,您应及时更改。因未按以上要求提供信息资料而导致的一切责任,由您自行承担。</view>
+					<view class="section-text">4.3 您在使用本平台接受服务时,应遵守国家法律、法规等规范性文件及本公司的各项规则和要求,保证您的言行不违背社会公共利益或公共道德,不损害他人的合法权益,不违反本协议所列条款之规定。您需对自己在本平台上的言行承担法律责任。</view>
+					<view class="section-text">4.4 如您未满18周岁或因其他原因不具备完全行为能力,您只能在父母或监护人的监护参与下才能使用本平台。</view>
+					<view class="section-text">4.5 您不得以任何形式转让或授权他人使用自己的文依学术用户名,亦不得盗用他人帐号,由以上行为造成的后果由用户自行承担。</view>
 				</view>
 
 				<view class="section">
-					<view class="section-title">六、知识产权</view>
-					<view class="section-text">6.1 本平台所包含的商标、标识、界面设计、软件等知识产权归本平台或相关权利人所有。未经书面许可,您不得擅自使用、复制或修改。</view>
-					<view class="section-text">6.2 您在本平台上传、发布的内容,在您保留著作权的前提下,授予本平台在全球范围内、免费的、非独家的、可再许可的使用权,用于平台运营、展示、推广等目的。</view>
+					<view class="section-title">五、服务定位</view>
+					<view class="section-text">5.1 本平台提供线上打卡、签到、工作汇报、日常工作管理等功能。</view>
+					<view class="section-text">5.2 本平台仅为用户提供技术服务功能,对用户使用本平台过程中产生的内容、信息的真实性、正确性不承担责任。</view>
+					<view class="section-text">5.3 本平台提供的服务均符合国家法律、法规等规范性文件及本公司的各项规则和要求。</view>
 				</view>
 
 				<view class="section">
-					<view class="section-title">七、隐私与个人信息</view>
-					<view class="section-text">7.1 我们重视您的隐私。收集、使用、存储及保护个人信息的规则以《隐私政策》为准,请您一并阅读。</view>
-					<view class="section-text">7.2 为提供服务,我们可能收集您的账号信息、认证信息、任务完成记录、设备信息等,并可能依法向合作方或监管部门提供。我们不会在未经您同意的情况下向无关第三方出售您的个人信息。</view>
+					<view class="section-title">六、平台权利及服务的暂停、终止</view>
+					<view class="section-text">6.1 如您提供虚假信息、实施违反法律法规或本协议的行为,本平台可立即中止对您提供部分或全部服务而无须为此承担责任,且本平台有权要求您赔偿因提供虚假信息或实施相关行为给本平台及第三方造成的损失。</view>
+					<view class="section-text">6.2 如您在接受本平台提供的服务过程中有下列情形之一的,本平台有权立即终止向其提供部分或全部服务,由此造成的法律和经济后果由您自行承担:</view>
+					<view class="section-text">(1)发布医托、强烈广告性质等内容;</view>
+					<view class="section-text">(2)从中国境内向境外传输技术性资料时违背中国有关法律法规;</view>
+					<view class="section-text">(3)利用本平台服务从事洗钱、窃取商业秘密、不正当竞争等非法行为;</view>
+					<view class="section-text">(4)以包括但不限于盗用他人账号、恶意编造或虚构信息、恶意投诉、未经允许进入他人电脑或手机系统等方式干扰或扰乱本平台服务;</view>
+					<view class="section-text">(5)传输非法、骚扰性、影射或中伤他人、辱骂性、恐吓性、伤害性、庸俗、带有煽动性、可能引起公众恐慌、淫秽的、散播谣言等信息资料;</view>
+					<view class="section-text">(6)传输教唆他人构成犯罪行为、危害社会治安、侵害自己或他人人身安全的资料,传输助长国内不利条件和涉及国家安全的资料,传输不符合当地法规、国家法律和国际法律的资料;</view>
+					<view class="section-text">(7)发布涉及政治、性别歧视、种族歧视或攻击他人的文字、图片或语言等信息;</view>
+					<view class="section-text">(8)其他严重违背社会公共利益和社会公德、违背本协议或补充协议、违反法律禁止性规定的行为。</view>
+					<view class="section-text">(9)其他本平台认为需要终止服务的情况。</view>
+					<view class="section-text">6.3 因部分特殊原因致使暂停提供服务的,本平台不承担损害赔偿责任,该特殊原因包括但不限于:</view>
+					<view class="section-text">(1)因地震、海啸、战争、黑客行为、系统故障、网络原因等不可抗力因素,造成系统运行障碍而暂停服务;</view>
+					<view class="section-text">(2)因电信系统、电信设备出现通信故障而暂停服务;</view>
+					<view class="section-text">(3)因平台公告系统维护而暂停服务;</view>
+					<view class="section-text">(4)因其他非归因于本平台的原因致使暂停服务。</view>
+					<view class="section-text">6.4 本平台有权利但无义务对用户的注册数据及活动行为进行查阅,如发现注册数据或活动行为中存在任何问题或怀疑,均有权向用户发出询问复核及要求改正的通知或者在紧急情况下直接作出删除等处理。</view>
+					<view class="section-text">6.5 经国家生效法律文书或行政处罚决定确认用户存在违法行为,或者本平台有足够事实依据可以认定用户存在违法或违反本协议的行为的,本平台有权以合理方式公布用户的违法行为。</view>
+					<view class="section-text">6.6 服务发生变更、中断、终止后,本平台仍有以下权利:</view>
+					<view class="section-text">(1)服务发生终止后,本平台有权将用户的注册数据及以前的行为记录进行匿名化处理;</view>
+					<view class="section-text">(2)如用户在服务变更、中断、终止前在本平台上存在违法行为或违反条款的行为,本平台仍可行使本协议所规定的权利。</view>
+					<view class="section-text">6.7 对于您在本平台使用过程的不当行为或其它任何本平台认为应当终止服务的情况,本平台有权随时作出删除相关信息、终止服务提供等处理,而无须征得您的同意。</view>
+					<view class="section-text">6.8 您理解并同意本公司将会尽其商业上的合理努力保障用户在本平台及服务中的数据存储安全,但是,本公司并不能就此提供完全保证,包括但不限于以下情形:</view>
+					<view class="section-text">6.8.1 本公司不对用户在本软件及服务中相关数据的删除或储存失败负责;</view>
+					<view class="section-text">6.82 本公司有权根据实际情况自行决定用户在本软件及服务中数据的最长储存期限,并在服务器上为其分配数据最大存储空间等。您可根据自己的需要自行备份本平台及服务中的相关数据;</view>
+					<view class="section-text">6.8.3 如果您停止使用本平台及服务或服务被终止、取消,本公司可以从服务器上永久地删除您的数据。服务停止、终止或取消后,本公司没有义务向您返还任何数据。</view>
+					<view class="section-text">6.8.4 您在使用本平台及服务时,须自行承担如下来自本公司不可掌控的风险内容,包括但不限于:</view>
+					<view class="section-text">6.8.4.1 由于不可抗拒因素可能引起的用户信息丢失、泄漏等风险;</view>
+					<view class="section-text">6.8.4.2 您必须选择与所安装终端设备相匹配的软件版本,否则,由于软件与终端设备型号不相匹配所导致的任何问题或损害,均由您自行承担;</view>
+					<view class="section-text">6.8.4.3 您在使用本平台访问第三方网站时,因第三方网站及相关内容所可能导致的风险,由您自行承担;</view>
+					<view class="section-text">6.8.4.4 您发布的内容被他人转发、分享,因此等传播可能带来的风险和责任;</view>
+					<view class="section-text">6.8.4.5 由于网络信号不稳定、网络带宽小等网络原因,所引起的本平台登录失败、资料同步不完整、页面打开速度慢等风险。</view>
 				</view>
 
 				<view class="section">
-					<view class="section-title">八、免责与责任限制</view>
-					<view class="section-text">8.1 因网络状况、不可抗力、政府行为等原因导致的服务中断或数据丢失,本平台将尽力恢复但不承担由此产生的责任。</view>
-					<view class="section-text">8.2 您通过本平台发布的内容由您自行负责。若因您的内容引发纠纷或给本平台或第三方造成损失,由您承担相应责任。</view>
-					<view class="section-text">8.3 在法律允许的范围内,本平台对因使用或无法使用服务而产生的间接、附带、惩罚性损失不承担责任。</view>
+					<view class="section-title">七、用户信息保护</view>
+					<view class="section-text">7.1 本公司承诺积极保护您的个人信息资料(包括个人身份信息及其他相关信息;您使用本平台服务过程中提供、形成的信息中的非公开内容等)的安全并视情况采取必要保护措施。同时,为了运营和改善本平台的技术与服务,本平台将可能会自行收集使用或向第三方提供用户的非个人隐私信息,这将有助于本平台向用户提供更好的用户体验和服务质量。</view>
+					<view class="section-text">7.2 未经您的许可,本公司不会向任何第三方公开、提供或共享用户注册资料中的姓名、个人有效身份证件号码、联系方式、家庭住址等个人信息资料,但以下情况除外:</view>
+					<view class="section-text">(1)用户或其监护人授权本公司披露的;</view>
+					<view class="section-text">(2)司法机关或行政机关基于法定程序要求本公司提供或协助的。</view>
+					<view class="section-text">7.3 因服务必要,本平台可能会将相关网站链接至本平台开展合作的伙伴的网站(统称“第三方网站”)。您在使用本平台提供的链接访问第三方网站时,这些网站的运营商可能会收集用户的个人信息。本平台尽力要求所有链接的第三方网站采用不低于本平台的个人信息保护措施,但本平台不对这些第三方网站上的活动、隐私权政策或隐私保护水平承担任何法律或其他责任。</view>
+					<view class="section-text">7.4 您在上传和管理组织成员名称、照片、手机号等个人信息时,请确保您已经事先获得组织成员的明确同意,仅收集为运营及功能实现目的而必需的用户信息,且已充分告知组织成员相关数据收集的目的、范围及使用方式等。</view>
+					<view class="section-text">7.5 就您使用本平台及服务过程中所产生的及您所收集或被提供的任何个人信息(“个人信息”),您应根据所有可适用法律法规使用本服务,并依约履行您在本协议下的义务。本协议所指的“可适用法律法规”是指您通过本服务所提供的信息、服务或前述信息、服务可被接收的国家、地区的法律、法规、规章、规范性文件、政策。您承诺:</view>
+					<view class="section-text">7.5.1 遵守不时修订的所有可适用的隐私和数据保护的法律法规,包括适用于个人信息的法律法规,并向我们提供必要信息以证明您已遵守前述法律法规及本协议约定;</view>
+					<view class="section-text">7.5.2 仅就使用本平台及本服务之目的使用、处理用户的个人信息,除非最终用户另行授权或同意;</view>
+					<view class="section-text">7.5.3 明确、准确地向您的客户描述您所收集的个人信息以及如何使用、向第三方分享这些信息等;</view>
+					<view class="section-text">7.5.4 采取适宜的技术及系统的安全措施,以保护个人信息免遭未经授权访问或使用,并对前述安全措施的有效性进行定期测试;</view>
+					<view class="section-text">7.5.5 确保所有有权访问个人信息的人员都受保密义务的约束;</view>
+					<view class="section-text">7.5.6 出现任何未经授权的访问或使用个人信息的情况下,及时联系本平台;</view>
+					<view class="section-text">7.5.7 更多有关个人信息和隐私保护的相关政策,请详见《文依学术用户隐私保护协议》</view>
+					<view class="section-text">7.6 用户使用或继续使用我们的服务,即意味着同意我们按照《文依学术用户隐私保护政策》收集、使用、储存和分享用户的相关信息。详情请参见《文依学术用户隐私保护政策》。</view>
 				</view>
 
 				<view class="section">
-					<view class="section-title">九、协议终止</view>
-					<view class="section-text">9.1 您可随时停止使用服务并注销账号(如有注销入口)。本平台也可在您违反本协议或法律法规时,暂停或终止向您提供服务。</view>
-					<view class="section-text">9.2 协议终止后,您使用服务的权利即行终止;本平台有权保留您的历史数据以履行法定义务或解决纠纷。</view>
+					<view class="section-title">八、对第三方责任的声明</view>
+					<view class="section-text">8.1 平台上为您的便利而提供的外部链接,包括但不限于任何广告内容链接,以及该链接所指向网页之所有内容,均系该网页所属第三方的所有者制作和提供。第三方网站并非也不反映本平台之任何意见和主张,也不表示本平台同意或支持该第三方网页上的任何内容、主张或立场。本平台对第三方网页中内容之合法性、准确性、真实性、适用性、安全性和完整性等概不承担任何责任。任何单位或个人如需要第三方网站中内容(包括资讯、资料、消息、产品或服务介绍、报价等),并欲据此进行交易或其他行为前,应慎重辨别这些内容的合法性、准确性、真实性、适用性、完整性和安全性(包括下载第三方网站中内容是否会感染电脑病毒),并采取谨慎的预防措施。如您不确定这些内容是否合法、准确、真实、实用、完整和安全,建议您先咨询专业人士。</view>
+					<view class="section-text">8.2 任何单位或者个人因相信、使用第三方网站中信息、服务、产品等内容,或据此进行交易等行为,而引致的人身伤亡、财产毁损(包括因下载而感染电脑病毒)、名誉或商誉诽谤、版权或知识产权等权利的侵犯等事件,及因该等事件所造成的损害后果,本平台概不承担任何法律责任。无论何种原因,本平台不对任何非与本平台直接发生的交易和行为承担任何直接、间接、附带或衍生的损失和责任。</view>
 				</view>
 
 				<view class="section">
-					<view class="section-title">十、法律适用与争议解决</view>
-					<view class="section-text">10.1 本协议的订立、执行与解释均适用中华人民共和国法律(不含冲突法)。</view>
-					<view class="section-text">10.2 因本协议产生的争议,双方应友好协商;协商不成的,任何一方可向本平台运营主体所在地有管辖权的人民法院提起诉讼。</view>
+					<view class="section-title">九、特别授权</view>
+					<view class="section-text">9.1 您同意并授权本公司为储存、保护用户个人信息资料而与第三方进行合作建立信息数据库,授权本公司在提供服务过程中因服务需求与第三方共享个人信息及信息数据库。</view>
+					<view class="section-text">9.2 您同意并授权本公司在不泄露个人信息资料的前提下,对个人信息数据库进行分析及大数据信息收集。</view>
+					<view class="section-text">9.3 您同意并授权本公司根据您提供、使用本服务过程中形成的信息通过短信、邮件、电话、视频、音频或其他形式向您提供服务、活动及其他相关商业信息。</view>
+					<view class="section-text">9.4 您同意并授权本公司在必要时使用您的注册信息、用户名、密码等信息,登陆进入您的注册账户,进行证据保全,包括但不限于公证、见证等。</view>
+					<view class="section-text">9.5 您同意以上权利一经授予,不可撤销。</view>
 				</view>
 
 				<view class="section">
-					<view class="section-title">十一、其他</view>
-					<view class="section-text">11.1 本协议条款如部分无效,不影响其余条款的效力。</view>
-					<view class="section-text">11.2 本平台未行使或延迟行使本协议项下权利,不构成对该权利的放弃。</view>
-					<view class="section-text">11.3 如您对本协议有任何疑问,可通过平台内客服或公示的联系方式与我们联系。</view>
+					<view class="section-title">十、知识产权条款</view>
+					<view class="section-text">10.1 本公司是本平台及相关平台所承载所有内容(文、图、视频、音频等)的版权所有者。未经本公司的书面许可,任何单位或个人不得以任何方式非法地全部或部分复制、转载、引用、链接、抓取或以其他方式使用本平台的信息内容。如有违反,本公司有权追究其法律责任。</view>
+					<view class="section-text">10.2 本公司是本平台的制作者,享有本平台内容及资源的著作权等合法权利,有权不时地对本协议及本平台的内容进行修改,并在本平台张贴,无须另行通知用户。在法律允许的最大限度范围内,本公司对本协议及本平台内容拥有解释权。</view>
+					<view class="section-text">10.3 一旦您接受本协议,即表明您主动将您在任何时间段在本平台发表的任何形式的信息内容(包括但不限于用户评价、用户咨询、各类话题文章等信息内容)的财产性权利等任何可转让的权利,如著作权财产权(包括并不限于:复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权以及应当由著作权人享有的其他可转让权利),全部独家且不可撤销地转让给本公司所有,您同意本公司有权就任何主体侵权而单独提起诉讼。</view>
+					<view class="section-text">10.4 本协议已经构成《中华人民共和国著作权法》第二十五条及相关法律规定的著作财产权等权利转让书面协议,其效力及于本平台上发布的任何受著作权法保护的作品内容,无论该等内容形成于本协议订立前还是本协议订立后。</view>
+					<view class="section-text">10.5 您同意并已充分了解本协议的条款,承诺不将已发表于本平台的信息,以任何形式发布或授权其它主体以任何方式使用(包括且限于在各类网站、媒体上使用)。</view>
+					<view class="section-text">10.6 本平台所刊登的资料信息(诸如文字、图表、标识、按钮图标、图像、声音文件片段、数字下载、数据编辑和软件),均是本公司或其内容提供者的财产,受中国和国际版权法的保护。本平台上所有内容的汇编是本公司的排他财产,受中国和国际版权法的保护。本平台上的所有软件都是本公司或其关联公司或其软件供应商的财产,受中国和国际版权法的保护。</view>
 				</view>
 
-				<view class="footer">感谢您使用研究型互联网医院平台。</view>
+				<view class="section">
+					<view class="section-title">十一、协议的修改、中止和终止</view>
+					<view class="section-text">11.1 您的任何意见和建议均可通过本平台向本公司工作人员反馈。经协商后双方如达成一致,则可对本协议相关内容进行调整。</view>
+					<view class="section-text">11.2 若您违反本协议或相关规定,本公司工作人员多次交涉未果;或因您的行为对本公司造成损失的,本公司有权终止与您的协议,并冻结您的个人账号。</view>
+					<view class="section-text">11.3 根据国家法律法规变化及网络运营需要,本公司有权对本协议条款不时地进行修改,修改后的协议一旦在本平台张贴公告即行生效,并自动代替原有协议。您可随时登陆本平台查阅最新协议;您有义务随时关注本平台公告并阅读最新协议。</view>
+					<view class="section-text">11.4 如您不同意更新后的协议,可以且应立即停止接受本平台依据本协议提供的服务或通告本平台停止对您帐号的该项服务,本平台停止您的服务后,您使用本服务的权利马上终止,即刻起,本平台不再对您承担任何义务和责任;如您继续使用本平台提供的服务,即视为同意更新后的协议。</view>
+					<view class="section-text">11.5 鉴于移动互联网服务的特殊性,本公司有权随时变更、中止或终止部分或全部的服务。如变更、中止或终止的服务属于免费服务,本公司无需通知您,也无需对您或任何第三方承担任何责任。</view>
+					<view class="section-text">11.6 如本协议中任何一条被视为废止、无效或因任何理由不可执行,该条应视为可分的且并不影响任何其余条款的有效性和可执行性。</view>
+					<view class="section-text">11.7 当您与平台发生有关争议时,以最新的服务协议为作为双方权利义务约定。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">十二、免责条款及不承诺担保</view>
+					<view class="section-text">12.1 在使用本平台服务的过程中,可能会遇到不可抗力等风险因素,使服务发生中断。不可抗力是指不能预见、不能克服并不能避免且对一方或双方造成重大影响的客观事件,包括但不限于自然灾害如洪水、地震、瘟疫流行和风暴等以及社会事件如战争、动乱、政府行为等。出现上述不可抗力情况时,本公司将努力在第一时间与相关单位配合,及时进行修复,但是由此造成的损失(包括但不限于信息损失,服务中断,资料灭失)本公司在法律允许的范围内免责。</view>
+					<view class="section-text">12.2 在法律允许的范围内,本公司对以下情形导致的服务中断或受阻不承担责任:</view>
+					<view class="section-text">(1) 受到计算机病毒、木马或其他恶意程序、黑客攻击的破坏;</view>
+					<view class="section-text">(2) 用户或本公司电脑软件、系统、硬件和通信线路出现故障;</view>
+					<view class="section-text">(3) 用户操作不当;</view>
+					<view class="section-text">(4) 用户通过非本公司授权的方式使用服务。</view>
+					<view class="section-text">(5)其他不可归因于本平台的事由。</view>
+					<view class="section-text">12.3 本服务同大多数互联网服务一样,受包括但不限于用户原因、网络服务质量、社会环境等因素的差异影响,可能受到各种安全问题的侵扰,如他人利用用户的资料,造成现实生活中的骚扰;您应加强信息安全及使用者资料的保护意识,注意加强密码保护,以免遭致损失和骚扰。</view>
+					<view class="section-text">12.4 在使用本服务的过程中,可能会遇到网络信息或其他用户行为带来的风险,本公司不对任何第三方信息的真实性、适用性、合法性承担责任,也不对因第三人侵权行为给用户造成的损害(包括但不限于信息损失,服务中断,资料灭失)负责。这些风险包括但不限于:</view>
+					<view class="section-text">(1) 来自他人匿名或冒名的含有威胁、诽谤、令人反感或非法内容的信息;</view>
+					<view class="section-text">(2) 因使用本协议项下的服务,遭受他人误导、欺骗或其他导致或可能导致的任何心理、生理上的伤害以及经济上的损失;</view>
+					<view class="section-text">(3) 其他因网络信息或用户行为引起的风险。</view>
+					<view class="section-text">12.5 不论在何种情况下,本公司均不对由于网络连接故障,电脑,通讯或其他系统的故障,电力故障,罢工,劳动争议,暴乱,起义,骚乱,生产力或生产资料不足,火灾,洪水,风暴,爆炸,不可抗力,战争,政府行为,国际、国内法院的命令或第三方的不作为等任何不可归因于本公司的原因而造成的不能服务或延迟服务承担责任。</view>
+					<view class="section-text">12.6 不论是否可以预见,不论源于何种形式的行为,本公司不对由以下原因造成的任何特别的、直接的、间接的、惩罚性的、突发性的或有因果关系的损害或其他任何损害(包括但不限于信息损失,服务中断,资料灭失)承担责任:</view>
+					<view class="section-text">(1) 使用或不能使用服务平台。</view>
+					<view class="section-text">(2) 未经授权的存取或修改数据或数据的传输。</view>
+					<view class="section-text">(3) 第三方通过服务所作的陈述或行为。</view>
+					<view class="section-text">(4) 其它与服务相关事件,包括疏忽等,所造成的损害。</view>
+					<view class="section-text">12.7 本平台所有信息仅供参考。本平台致力于提供正确、完整的信息资讯,但不保证信息的绝对正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。</view>
+					<view class="section-text">12.8 除非另有明确的书面说明,本平台及其所包含的或以其它方式通过本平台提供给用户的全部信息、内容、材料、产品(包括软件)和服务,均是在“按现状”和“按现有”的基础上提供的。除非另有明确的书面说明,本公司不对本平台的运营及其包含在本平台上的信息、内容、材料、产品(包括软件)或服务作任何形式的、明示或默示的声明或担保(根据中华人民共和国法律另有规定的以外)。</view>
+					<view class="section-text">12.9 本平台不承诺网络服务一定能满足用户的要求,也不承诺网络服务不会中断,对网络服务的及时性、安全性、准确性也都不作承诺。本平台不承诺网页上设置的外部链接的准确性和完整性,同时,对于该等外部链接指向的不由本平台实际控制的任何网页上的内容,本平台不承担任何责任。</view>
+					<view class="section-text">12.10 本平台所承载的内容(文、图、视频、音频)均为传播有益健康资讯目的,本公司不对其真实性、科学性、严肃性做任何形式保证。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">十三、通告</view>
+					<view class="section-text">13.1 本协议下所规定的通知有权要求以书面形式通过以下邮址递交收悉,通知的到达以文依学术收悉为准。
+文依学术地址:成都市温江区柳城街办致远路2号1栋1单元20层2017号</view>
+					<view class="section-text">收件人:文依学术项目组(收)</view>
+					<view class="section-text">联系电话:17716144271 </view>
+					<view class="section-text">本协议项下所有的通知均可通过重要页面公告、电子邮件或常规的信件传送等方式进行;该等通知于发送之日视为已送达。</view>
+					<view class="section-text">13.2 您对于本公司的通知应当通过本平台对外正式公布的通信地址、电子邮件地址等联系信息进行送达。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">十四、法律适用、管辖及其他</view>
+					<view class="section-text">14.1 本协议之效力、解释、变更、执行与争议解决均适用中华人民共和国法律,如无相关法律规定的,则应参照通用国际商业惯例、政府部门相关规定和(或)行业惯例。</view>
+					<view class="section-text">14.2 本协议签订地为本平台数据服务中心成都温江海天腾逸广场4号楼。因本协议产生之争议,由双方协商解决;协商不成的,任何一方均有权向本协议签订地人民法院提起诉讼。</view>
+					<view class="section-text">14.3 本协议构成您与本平台就服务之约定事项及其他有关事宜的完整协议,除服务条款规定的之外,未赋予服务条款各方其他权利。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">十五、其他约定</view>
+					<view class="section-text">15.1 我们在此特别提示:本协议内容包括协议正文、隐私权政策及所有文依学术已经发布或将来可能发布的各类规则、规范、通知、公告等(合称“规则”)。法律声明、隐私政策及所有规则为协议不可分割的一部分,与协议正文具有同等法律效力。</view>
+				</view>
+
+				<view class="footer">
+					<view class="section-text">成都文依合创科技有限公司</view>
+				</view>
 			</view>
 		</scroll-view>
 	</view>
@@ -156,4 +285,4 @@ export default {
 	margin-top: 32rpx;
 	padding-top: 24rpx;
 }
-</style>
+</style>

+ 5 - 2
pages_user/userInfo.vue

@@ -877,11 +877,14 @@
 
 	.popup-footer {
 		display: flex;
+		justify-content: space-between;
 	}
 
 	.popup-btn {
-		flex: 1;
-		gap: 20rpx;
+		width: 38%;
+		margin: 0 32rpx;
+		// flex: 1;
+		// gap: 20rpx;
 		text-align: center;
 		height: 88rpx;
 		line-height: 88rpx;

+ 321 - 148
yszc.md

@@ -1,149 +1,322 @@
-【一咻学术】医生注册协议
-您在开始使用一咻学术服务前,请您务必仔细阅读并充分理解本《一咻学术用户使用协议》。同时,您还应仔细阅读并充分理解一咻学术的隐私政策、知识产权申请等系列政策和声明。在本服务条款中,请您务必特别注意及重点阅读与您的权利及义务密切相关的条款,此类条款可能以粗体加黑的方式标记,包括但不限于免责条款等。
-一、使用协议的接受
-1.为使您更好的使用一咻学术的相关服务,请您仔细阅读以下条款,如果您对本协议的任何条款表示异议,您可以选择不进入一咻学术或向一咻学术客服咨询。当您注册成功,无论是进入一咻学术,还是在一咻学术上发布任何内容(即「内容」)及其他任何直接、间接使用本服务平台的部分或全部功能的行为,均意味着您(即「用户」)已阅读并完全接受本协议项下的全部条款,包括接受更新后的本协议条款,均愿意无条件、无保留地接受并承担相应法律责任。如果您不同意本协议或其中任何条款约定,您应立即停止注册及使用程序。
-2.如您未满14周岁,请在法定监护人的陪同下阅读本用户使用协议,并特别注意未成年人使用的相关条款。
-3."用户"指所有直接或间接获取和使用一咻学术及相关服务的使用者,包括自然人、法人和其他组织等。在本协议中称为"用户"或称"您"。
-4.本协议是您与成都文依合创科技有限公司(以下简称"公司"或"我们")之间就您下载、安装、注册、登录、使用"一咻学术"小程序及网页,并获得一咻学术提供的相关服务所订立的协议。公司有权依一咻学术及相关服务或运营的需要单方决定,安排或指定其关联公司、控制公司、继承公司或公司认可的第三方公司继续运营一咻学术平台。并且,就本协议项下涉及的某些服务,可能会由公司的关联公司、控制公司、继承公司或公司认可的第三方公司向您提供。您知晓并同意接受相关服务内容,即视为接受相关权利义务关系亦受本协议约束。
-5.一咻学术所有服务的所有权、运作权和解释权均归公司所有。您同意本用户使用协议内容并完成注册程序,即成为一咻学术的正式用户,即被视为用户确认自己具有独立的行为能力,明确自己所享有的相应权利,能够独立承担法律责任。
-6.一咻学术可根据情况制订、修改本协议及条款,您以明示同意或默示同意等任何方式同意接受修改后的协议或条款,变更后的协议和条款即自动对您产生法律效力。
-7.用户确认:本协议是处理双方权利义务的契约,始终有效,法律另有强制性规定或双方另有特别约定的,依其规定。
-二、一咻学术提供的服务
-1.一咻学术不断创新以向其用户提供最优体验。您认知并同意一咻学术提供的服务的形式和本质可不经事先通知您而不时变换。本软件及相关服务更新或部分服务内容更新后,在可能的情况下,公司将以包括但不限于系统提示、公告、站内信等方式提示用户,用户有权选择接受更新版本或服务,如用户不接受,部分功能将受到限制或不能继续使用。
-2.一咻学术及相关服务中包含公司以各种合法方式获取的信息或信息内容链接,同时也包括公司及其关联公司合法运营的其他单项服务。这些服务在一咻学术平台可能以单独板块形式存在。公司有权不时地增加、减少或改动这些特别板块的设置及服务。
-3.作为这种持续创新的一部分,您认知并同意一咻学术可自行决定,无须事先通知您,即停止(永久或暂时)向您或全体用户提供服务。您可在任何时候停止使用服务。您停止使用服务时无需特别通知一咻学术。
-4.您认知并同意,如果一咻学术禁用对您的帐户的访问权,则您可能被阻止获得服务、您的帐户资料或包含在您帐户中的任何文件或其他内容。
-5.为保证一咻学术软件及相关服务安全、提升用户服务,您使用一咻学术及相关服务需自行准备与软件及相关服务有关的终端设备(如电脑、手机等装置),一旦您在其终端设备中打开一咻学术平台,即视为您使用一咻学术软件及相关服务。为充分实现一咻学术平台的全部功能,您可能需要将其终端设备联网,您理解由您承担所需要的费用(如流量费、上网费等)。
-6.您理解并同意部分服务由广告收入支持,可展示广告和推销。这些广告可能是针对存储于服务中的信息、通过服务提出的询问或其他信息的内容提供的。一咻学术在服务上的广告的方式、模式和范围可不经向您特别通知而变更。作为一咻学术授予您访问和使用服务的权利的对价,您同意一咻学术可以在服务上加载该等广告。当然您有权根据《一咻学术隐私政策》条款的指引进行相应的推送关闭。
-三、平台使用规则
-1.使用平台时可能产生的用户信息:
-用户个人信息。用户个人信息包括但不限于下列信息:用户真实姓名、头像、身份证号、职业、职务、手机电话、银行账号、第三方支付账号、电子邮件、教育经历、从业经历等。
-非用户个人信息。用户在一咻学术上,包括提问、发布、回答、浏览、操作状态、使用记录、使用习惯等在内的全部记录信息。除 1 款所列用户个人信息范围外的其他所有信息,均视为非用户个人信息。
-第三方平台记录信息。使用第三方账号注册、登录、使用一咻学术服务的,将被视为用户完全理解、同意并接受一咻学术包括但不限于收集、统计、分析等方式使用其在第三方平台填写、登记、公布、记录的全部信息。用户一旦使用第三方平台账号注册、登陆、使用一咻学术服务,一咻学术对该第三方记录信息的任何使用,均被视为已经获得了用户本人的完全同意并接受。
-2.用户使用一咻学术前,需要拥有一个成功注册的账户,用户可以使用真实有效的个人手机号码或邮箱地址作为用户名进行账户注册,亦可授权第三方账号(如一咻医生、一咻健康、微信、支付宝等)快捷登录,且在第三方账户快捷登录中可能涉及用户绑定已有账户或注册新账户的操作。用户注册成功后,一咻学术将给予每个用户一个用户帐号及相应的密码,账户名称和密码将作为一咻学术识别用户身份的唯一有效标识,只要使用了正确的帐号和密码无论是谁登录均视为您本人登录或已得到您本人的授权,用户应当对以其用户帐号进行的所有活动和事件负法律责任,请用户务必妥善保管该用户帐号和密码。用户不得将账号转借、租让、售卖给他人使用,否则应承担由此可能产生的全部责任,并与实际使用人承担连带责任。一咻学术无法对非法或未经您授权使用您的账号及密码的行为做出甄别,因此一咻学术不承担任何责任。当密码或者账号遭到未获授权使用,或者发生任何安全问题时,用户有责任及时有效地通知一咻学术并向当地公安机关报案。
-3.用户应本着诚实守信的原则,自行向一咻学术提供所需信息。信息发布者可提供个人信息、行医资格(如需)、就医经历(如需)、教育经历(如需)、工作经历(如需)以及相关的其他信息;用户需保证所提供的信息必须在合法基础上保证真实、准确、完整,并保证及时更新以上信息。如因用户自行提供的信息存在非法、抄袭、错误、侵犯他人隐私等问题,用户需承担因此引发的相应的法律责任及后果,且一咻学术保留暂停、清除各类不符合法律政策或不真实的信息内容而无须通知您的权利及终止用户使用一咻学术各项服务的权利,且一咻学术可以保留向被侵权的第三方披露此类用户的个人信息之相关权利。若您未遵守国家法律法规及本协议规定,一咻学术有权作出独立判断并采取暂停或关闭您的帐号等措施。
-4.用户须对在一咻学术的注册信息的真实性、合法性、有效性承担全部责任,用户不得冒充他人;不得利用他人的名义发布任何信息;不得恶意使用注册帐号导致其他用户误认;否则一咻学术有权立即停止提供服务,收回其帐号并由用户独自承担由此而产生的一切法律责任。
-5.用户直接或通过各类方式(如 RSS 源和站外 AdivI引用等)间接使用一咻学术服务和数据的行为,都将被视作已无条件接受本协议全部内容;若用户对本协议的任何条款存在异议,请停止使用一咻学术所提供的全部服务。
-6.一咻学术是一个医疗健康相关信息提供、分享、传播及获取的平台,用户通过一咻学术发表的信息为公开的信息,其他第三方均可以通过一咻学术获取用户发表的信息,用户对任何信息的发表即认可该信息为公开的信息,并单独对此行为承担法律责任;任何用户不愿被其他第三人获知的信息都不应该在一咻学术上进行发表。
-7.用户承诺不得以任何方式利用一咻学术直接或间接从事违反中国法律以及社会公德的行为,一咻学术有权对违反上述承诺的内容予以删除。
-用户不得利用一咻学术服务制作、上载、复制、发布、传播或者转载如下内容:
-•反对宪法所确定的基本原则的;
-•危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;
-•损害国家荣誉和利益的; 煽动民族仇恨、民族歧视,破坏民族团结的;
-•侮辱、滥用英烈形象,否定英烈事迹,美化粉饰侵略战争行为的;
-•破坏国家宗教政策,宣扬邪教和封建迷信的;
-•散布谣言,扰乱社会秩序,破坏社会稳定的;
-•散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;
-•侮辱或者诽谤他人,侵害他人合法权益的;
-•含有法律、行政法规禁止的其他内容的信息。
-1.一咻学术有权对用户使用一咻学术的情况进行审查和监督,如用户在使用一咻学术时违反任何上述规定,一咻学术或其授权的人有权要求用户改正或直接采取一切必要的措施(包括但不限于更改或删除用户张贴的内容、暂停或终止用户使用一咻学术的权利)以减轻用户不当行为造成的影响。
-2.一咻学术保留从任何服务中筛选、审阅、标明、过滤、修订、拒绝或删除任何或所有内容的权利(但无义务这样做)。就某些服务而言,一咻学术可提供滤除明确色情内容、政治相关内容的工具。此外,还有可以通过商业渠道获得的服务和软件能够限制访问令您反感的材料。
-3.我们非常注重未成年人的保护:
-(1) 若您为未成年人,应在监护人监护、指导下仔细阅读本协议,并且使用我们的产品及/或服务已经得到监护人的同意;
-(2) 监护人应注意指导子女上网应注意的安全问题,提前做好相应的风险防范指导工作。若监护人同意未成年人使用我们的产品及/或服务,必须以监护人的名义申请消费(如涉及),并对未成年人使用我们的产品及/或服务进行正确的引导、监督。未成年人使用我们的产品及/或服务,以及行使和履行本协议项下的权利义务视为已获得了监护人的认可;
-(3) 我们提醒未成年人在使用我们产品及/或服务时,要善于网上学习,避免沉迷网络,影响日常学习生活。
-四、账户安全
-1.您同意并理解您有责任将您与用于获得服务的任何帐户相关的密码保密。
-2.您同意将独自就在您帐户下的所有活动对一咻学术负责。
-3.您对个人账户的使用、遗失等造成的任何一咻学术及第三方的损失,由您承担;如果您得知任何对您的密码或您的帐户的任何未经授权的使用或者发生存在其它安全问题,您同意立即通知一咻学术。
-4.一咻学术将通过对用户密码进行加密等安全措施确保用户的信息不丢失,不被滥用和变造。尽管有前述安全措施,您理解在信息网络上不存在"完善的安全措施"。因黑客行为或您的保管疏忽导致账号、密码遭他人非法使用,一咻学术不承担任何责任。如您发现任何非法使用用户账户或存在安全漏洞的情况,应立即通知一咻学术。
-5.关于一咻学术的数据保护惯例的信息,请查阅一咻学术的《一咻学术隐私政策》。该政策解释了一咻学术如何处理您的个人信息,并在您使用服务时保护您的隐私。您同意按照一咻学术的隐私政策使用您的数据。
-6.用户理解并同意,一咻学术会尽力保障用户使用数据的存储安全,但不能就此完全保证,包括但不限于以下情形:
-6.1 一咻学术有权根据实际情况自行决定用户在一咻学术上使用数据的最长存储期限和最大存储空间等,用户可自行根据自己的需要备份您在一咻学术的使用数据。
-6.2由于网络信号不稳定、网络带宽小等原因导致登录、注册、资料同步、内容查看不稳定、收费服务在合理时间内中断的,其风险由用户自行承担。
-6.3如果用户删除了一咻学术账户,我们有权从服务器中永久删除用户的账户数据,且没有义务向用户返还数据。
-五、知识产权
-1.一咻学术是一个信息获取、分享及传播的平台,我们尊重和鼓励一咻学术用户创作发表分享的内容,一咻学术充分认知到保护知识产权对一咻学术生存与发展的重要性,承诺将保护知识产权作为一咻学术运营的基本原则之一。
-2.用户在一咻学术上发表的全部原创内容(包括但不仅限于回答、文章和评论),著作权均归用户本人所有。除用户单独授权一咻学术平台可独占或排他使用其发表的内容外,用户可授权第三方以任何方式使用,不需要得到一咻学术的同意。
-3.一咻学术上可由多人参与编辑的内容,包括但不限于问题及补充说明、答案总结、话题描述、话题结构,所有参与编辑者均同意,相关知识产权归一咻学术所有。
-4.一咻学术提供的网络服务中包含的标识、版面设计、排版方式、文本、图片、图形等均受著作权、商标权及其它法律保护,未经相关权利人(含一咻学术及其他原始权利人)同意,上述内容均不得在任何平台被直接或间接发布、使用、出于发布或使用目的的改写或再发行,或被用于其他任何商业目的。
-5.为了促进知识的分享和传播,用户将其在一咻学术上发表的全部内容,授予一咻学术免费的、不可撤销的、非独家使用(除用户对使用方式有单独授权外)和传播的许可,一咻学术有权将该内容用于一咻学术各种形态的产品和服务上,包括但不限于平台以及发表的应用或其他互联网产品。
-6.第三方若出于非商业目的,将用户在一咻学术上发表的内容转载在一咻学术之外的地方,应当在作品的正文开头的显著位置注明原作者姓名(或原作者在一咻学术上使用的帐号名称),给出原始链接,注明「发表于一咻学术」,并不得对作品进行修改演绎。若需要对作品进行修改,或用于商业目的,第三方应当联系用户获得单独授权,按照用户规定的方式使用该内容。
-7.一咻学术为用户提供「保留所有权利,禁止转载」的选项。除非获得原作者的单独授权,任何第三方不得转载标注了「禁止转载」的内容,否则均视为侵权。
-8.用户了解并同意,一咻学术之服务、产品与资料仅依其当前所呈现的状况提供,而且一咻学术明确地表示拒绝对于服务、产品或资料等给予任何明示或暗示之担保或保证,包括但不限于,为商业使用、适合于特定目的或未侵害他人权利之担保或保证等。一咻学术对于因服务、产品或资料等所产生之任何直接、间接、附带的或因此而导致之衍生性损失概不负责。一咻学术对于任何用户信息或个性化设定之时效、删除、传递错误、未予储存或其它任何问题,均不承担任何责任。在一咻学术上传或发表的内容,用户应保证其为著作权人或已取得合法授权,并且该内容不会侵犯任何第三方的合法权益。如果第三方提出关于著作权的异议,一咻学术有权根据实际情况删除相关的内容,且有权追究用户的法律责任。给一咻学术或任何第三方造成损失的,用户应负责全额赔偿。
-9.如果任何第三方侵犯了一咻学术用户相关的权利,用户同意不可撤销地授权一咻学术或其指定的代理人单独、全权代表一咻学术自身或用户对该第三方提出警告、投诉、发起行政执法、诉讼、进行上诉,或谈判和解,并且用户同意在一咻学术认为必要的情况下参与共同维权。
-10.一咻学术有权但无义务对用户发布的内容进行审核,有权根据相关证据结合《侵权责任法》、《信息网络传播权保护条例》等法律法规及一咻学术原则对侵权信息进行处理。
-11.您认知并同意,一咻学术(或一咻学术的许可方)对服务拥有一切法定权利、所有权和利益,包括存在于服务中的任何知识产权(无论该等权利是否已经登记,也不论该等权利在世界的何等地方存在)。您进一步认知,服务可能包括一咻学术指定为保密的信息,未经一咻学术事先书面同意,您不得披露该等信息。
-12.除非您与一咻学术另有书面协议,否则本条款中的任何规定均未给予您使用一咻学术任何商号、商标、服务标记、标识、域名及其他显著品牌特征的权利。
-13.如果您在与一咻学术的单独书面协议中被给予一项使用上述品牌特征的明确的权利,则您同意您在使用该等品牌特征时遵守该协议、本条款的任何适用规定以及不时更新的一咻学术品牌特征使用指南。
-14.除第11条规定的限制许可外,一咻学术认知并同意,其不在本条款项下获得您(或您的许可方)对在服务上或通过服务提交、张贴、传输或展示的任何内容的任何权利、所有权或利益,包括该内容中存在的任何知识产权(无论该等权利是否已经登记,亦不论该等权利在世界的何等地方存在)。除非您与一咻学术另有书面协议,否则您同意您负责保护并强制执行这些权利,一咻学术没有义务代表您这样做。
-15.您同意您不得删除、掩藏或改动服务所附的或包含的任何专有权利声明(包括著作权和商标声明)。
-16.除非您得到一咻学术书面明确授权这样做,否则您同意在使用服务时,您将不以可能或故意导致混淆该等商标、名称或标识的所有者或授权用户的方式使用任何公司或组织的商标、服务标识、商号、标识。
-六、侵权举报
-1. 一咻学术高度重视自由表达和个人、企业正当权利的平衡。依照法律规定删除违法信息是一咻学术社区的法定义务,一咻学术社区亦未与任何中介机构合作开展此项业务。
-2.侵犯企业或个人合法权益的侵权举报,包括但不限于涉及个人隐私、造谣与诽谤、商业侵权。
-(1)涉及个人隐私:发布内容中直接涉及身份信息,如个人姓名、家庭住址、身份证号码、工作单位、私人电话等详细个人隐私;
-(2)造谣、诽谤:发布内容中指名道姓(包括自然人和企业)的直接谩骂、侮辱、虚构中伤、恶意诽谤等;
-(3)商业侵权:泄露企业商业机密及其他根据保密协议不能公开讨论的内容。
- 用户在一咻学术发表的内容仅表明其个人的立场和观点,并不代表一咻学术的立场或观点。如果个人或企业发现一咻学术上存在侵犯自身合法权益的内容,可以先尝试与作者取得联系,通过沟通协商解决问题。如您无法联系到作者,或无法通过与作者沟通解决问题,您可通过向一咻学术指定邮箱发送侵权投诉内容至邮箱(17716144271@163.com    )进行投诉。为了保证问题能够及时有效地处理,请务必提交真实有效、完整清晰的材料,否则投诉将无法受理。您需要向一咻学术提供的投诉材料包括:
-(1)权利人对涉嫌侵权内容拥有商标权、著作权和/或其他依法可以行使权利的权属证明,权属证明通常是营业执照或组织机构代码证;
-(2)举报人的身份证明,身份证明可以是身份证或护照;
-(3)如果举报人非权利人,请举报人提供代表权利人进行举报的书面授权证明。为确保投诉材料的真实性,在侵权举报中,您还需要出具以下法律声明;
-(4)我本人为所举报内容的合法权利人;
-(5)我举报的发布在一咻学术社区中的内容侵犯了本人相应的合法权益;
-(6)如果本侵权举报内容不完全属实,本人将承担由此产生的一切法律责任,并承担和赔偿一咻学术因根据投诉人的通知书对相关帐号的处理而造成的任何损失,包括但不限于一咻学术因向被投诉方赔偿而产生的损失及一咻学术名誉、商誉损害等。
-处理流程
-(7)出于网络平台的监督属性,并非所有申请都必须受理。一咻学术自收到举报的七个工作日内处理。处理期间,不提供任何电话、邮件及其他方式的查询服务。
-(8)出现一咻学术已经删除或处理的内容,但是百度、谷歌等搜索引擎依然可以搜索到的现象,是因为百度、谷歌等搜索引擎自带缓存,此类问题一咻学术无权也无法处理,因此相关申请不予受理。您可以自行联系搜索引擎服务商进行处理。
-(9)此为一咻学术唯一的官方侵权投诉渠道,暂不提供其他方式处理此业务。
-(10)用户在一咻学术中的商业行为引发的法律纠纷,由交易双方自行处理,与一咻学术无关。
-七、终止您与一咻学术的关系
-1. 一咻学术可能会对服务内容进行变更、也可能会中断、终止服务。鉴于网络服务的特殊性(包括但不限于服务器的稳定性问题、恶意的网络攻击等行为或一咻学术无法控制的情形),您同意一咻学术有权随时中断或终止部分或全部的服务。
-2. 您理解,一咻学术需要定期或不定期对提供服务的平台或相关设备进行维护、升级或其他目的暂停部分或全部服务,如因此类情况而造成服务在合理时间内的中断,一咻学术无需为此承担任何责任。
-3. 如果您希望终止与使用一咻学术产品及服务的,您可以通过【一咻学术隐私政策】中规定的方式注销账号及相关使用信息。
-4. 发生下列情况时一咻学术可单方终止其与您的服务关系及相关协议约定:
-(1)您违反了本条款的任何规定(或您的行为方式明确显示您不打算或不能遵守本条款规定);或
-(2)法律要求一咻学术这样做(例如:向您提供服务不合法或变得不合法);或
-(3)一咻学术与之一起向您提供服务的合作伙伴已终止与一咻学术的关系或停止向您提供服务;或
-(4)一咻学术转变为不再向您居住的或您从那里使用服务的国家内的用户提供服务;或
-(5)一咻学术认为,一咻学术向您提供服务不再具有商业可行性。
-5. 本条款终止时,您和一咻学术已经享受或承担的(或在本条款有效期间已经产生的)或明确规定为无限期有效的所有法定权利、义务和责任不受该终止的影响。
-6. 一咻学术、其子公司和关联公司及其许可人,不就以下各项向您作出陈述或保证:
-(1)您对服务的使用将符合您的需求;
-(2)您对服务的使用将无中断、及时、安全或没有错误;
-(3)由于您使用服务而获得的任何信息将是准确的或可靠的;及
-(4)作为服务的一部分向您提供的任何软件的运行或功能中的缺陷将被纠正。
-7. 通过使用服务而下载或以其他方式获得的任何材料由您自行作出并承担风险,您将独自对由于下载任何该等材料而导致对电脑系统或其他装置的损害或数据的丢失负责。
-8. 您从一咻学术获得的或通过服务或从服务获得的任何建议或信息(无论口头还是书面的)均不创立本条款中未明确规定的任何保证。
-9. 一咻学术进一步明确否认任何种类的所有保证和条件(无论明示还是默示的),包括但不限于适销性、适合特定目的及不侵权的默示保证和条件。
-八、责任限制
-在遵守本协议全部规定的前提下,您明示理解并同意,一咻学术、其子公司和关联公司及其许可人不就以下事项对您承担责任:
-1.您无论由于何种原因和在任何责任理论项下发生的任何直接、间接、附带、特殊、后果性或惩罚性的损害。这应包括但不限于任何利润损失(无论是直接还是间接发生)、任何商誉或业务声誉损失、任何数据丢失、替代物品或服务的购买费用或其他无形损失;
-2.您可能产生的任何损失或损害,包括但不限于由下列原因导致的损失或损害;
-3. 您对任何广告的完整性、准确性或其存在的信任,或作为您与其广告出现在服务中的任何广告商或赞助人之间的任何关系或交易的结果;
-4. 一咻学术对服务可能做出的变更,或永久或暂时停止提供服务(或服务中的任何功能);
-5. 对通过您使用服务而维持或传输的任何内容及其他通信数据的删除、毁坏或未能将其储存;
-6. 您未向一咻学术提供准确的帐户信息;
-7. 您未对您的密码或帐户资料保持安全及保密;
-8. 无论一咻学术是否接到通知或是否应已知晓引起任何该等损失的可能性,上文第1款中一咻学术对您的责任限制均应适用。
-9. 对关于符合适用国际知识产权法(包括中国的《著作权法》)的指称的著作权侵权通知做出回应以及终止重复侵权者帐户是一咻学术的政策,一咻学术不能对用户发表的回答或评论的正确性进行保证。
-用户在一咻学术发表的内容仅表明其个人的立场和观点,并不代表一咻学术的立场或观点。作为内容的发表者,需自行对所发表内容负责,因所发表内容引发的一切纠纷,由该内容的发表者承担全部法律及连带责任。一咻学术不承担任何法律及连带责任。
-一咻学术不保证网络服务一定能满足用户的要求,也不保证网络服务不会中断,对网络服务的及时性、安全性、准确性也都不作保证。在法律允许的范围内,一咻学术对以下情形导致的服务中断或受阻不承担责任:
-1.受到计算机病毒、木马或其他恶意程序、黑客攻击的破坏;
-2.用户或本公司电脑软件、系统、硬件和通信线路出现故障,用户操作不当;
-3.用户通过非本公司授权的方式使用服务;
-4.其他不可归因于一咻学术的事由;
-5.对于因不可抗力或一咻学术不能控制的原因造成的网络服务中断或其它缺陷,一咻学术不承担任何责任,但将尽力减少因此而给用户造成的损失和影响;
-6.本服务同大多数互联网服务一样,受包括但不限于用户原因、网络服务质量、社会环境等因素的差异影响,可能受到各种安全问题的侵扰,如他人利用用户的资料,造成现实生活中的骚扰;您应加强信息安全及使用者资料的保护意识,注意加强密码保护,以免遭致损失和骚扰;
-7.在使用本服务的过程中,可能会遇到网络信息或其他用户行为带来的风险,一咻学术不对任何第三方信息的真实性、适用性、合法性承担责任,也不对因第三人侵权行为给用户造成的损害(包括但不限于信息损失,服务中断,资料灭失)负责这些风险包括但不限于;
-8.来自他人匿名或冒名的含有威胁、诽谤、令人反感或非法内容的信息;
-9.因使用本协议项下的服务,遭受他人误导、欺骗或其他导致或可能导致的任何心理、生理上的伤害以及经济上的损失;
-10.其他因网络信息或用户行为引起的风险;
-11.一咻学术所有信息仅供参考。一咻学术致力于提供正确、完整的学术、健康资讯,但不保证信息的绝对正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。一咻学术所提供的任何学术、健康资讯,仅供参考,不能替代医生和其他医务人员的建议,如自行使用一咻学术资料发生偏差, 一咻学术不承担任何法律责任;
-九、其他内容
-1. 服务可包含对其他平台或内容或资源的超级链接,包括但不限于任何广告内容链接,以及该链接所指向网页之所有内容,均系该网页所属第三方的所有者制作和提供。第三方网站并非也不反映一咻学术之任何意见和主张,也不表示一咻学术同意或支持该第三方网页上的任何内容、主张或立场。一咻学术对第三方网页中内容之合法性、准确性、真实性、适用性、安全性和完整性等概不承担任何责任。任何单位或个人如需要第三方网站中内容(包括资讯、资料、消息、产品或服务介绍、报价等),并欲据此进行交易或其他行为前,应慎重辨别这些内容的合法性、准确性、真实性、适用性、完整性和安全性(包括下载第三方网站中内容是否会感染电脑病毒),并采取谨慎的预防措施。如您不确定这些内容是否合法、准确、真实、实用、完整和安全,建议您先咨询专业人士。一咻学术可能并不控制由一咻学术以外的公司或个人提供的任何平台或资源。
-2. 您认知并同意,一咻学术不对该等外部平台或资源的可用性负责,亦不对该等网络或资源上的或从该等平台或资源获得的任何广告、产品或其他材料加以认可。任何单位或者个人因相信、使用第三方网站中信息、服务、产品等内容,或据此进行交易等行为,而引致的人身伤亡、财产毁损(包括因下载而感染电脑病毒)、名誉或商誉诽谤、版权或知识产权等权利的侵犯等事件,及因该等事件所造成的损害后果,一咻学术概不承担任何法律责任。无论何种原因,一咻学术不对任何非与一咻学术直接发生的交易和行为承担任何直接、间接、附带或衍生的损失和责任。
-3. 您认知并同意,一咻学术不对由于您由于那些外部的平台或资源的可用性或您对该等平台或资源上的或从该等平台或资源获得的任何广告、产品或其他材料的完整性、准确性或存在的信赖而发生的任何损失或损害承担责任。
-十、本协议的变更
-1. 一咻学术可不时对通用条款或附加条款作出变更,内容更新后,在可能的情况下,公司将以包括但不限于系统提示、公告、站内信等方式通知用户,该等通知于发送之日视为已送达。修改后的协议一旦在一咻学术张贴公告即行生效,并自动代替原有协议。您可随时登陆一咻学术查阅最新协议;您有义务随时关注一咻学术公告并阅读最新协议。
-2. 如果您不同意所变更的内容,您可以停止使用服务并注销账号。您理解并同意,如果您在通用条款或附加条款变更日期之后使用服务,则一咻学术将把您的使用视为接受更新后的通用条款或附加条款。
-十一、一般法律条款
-1. 本协议及本协议条款项下您与一咻学术的关系,受中国法律管辖,但排除其冲突法规定。您与一咻学术均同意接受位于中国境内的【成都文依合创科技有限公司】所在地【成都市温江区海天腾逸广场】有管辖权的人民法院的管辖,以解决任何由本条款引起的法律事项。
-2. 本协议内容中的条款,请您着重阅读。您点击"同意"按钮即视为您完全接受本协议,在点击之前请您再次确认已知悉并完全理解本协议的全部内容。我们在此特别提示:本协议内容包括协议正文、法律声明及隐私权政策及所有一咻学术已经发布或将来可能发布的各类规则、规范、通知、公告等(合称"规则")。法律声明、隐私政策及所有规则为协议不可分割的一部分,与协议正文具有同等法律效力。
-3. 一咻学术未行使或执行本使用协议任何权利或规定,不构成对前述权利或权利之放弃。
-4. 倘若本用户协议之任何规定因与中华人民共和国法律抵触而无效,本协议其他规定仍应具有完整的效力及效果。
-5. 本使用协议之标题仅供方便而设,不具任何法律或契约效果。
-十二、如何联系我们
-如对本协议内容有任何疑问、意见或建议您可以通过在线客服与我们联系,一般情况下我们将在30个工作日内回复您的请求。
+### **用户服务协议**
+
+**导言**
+
+欢迎使用文依学术小程序及服务!
+
+**为使用文依学术小程序(以下简称“本平台”)及服务,用户应当阅读并遵守《文依学术用户服务协议》(以下简称“本协议”),以及《文依学术用户隐私保护协议》等相关协议。请用户务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款,以及开通或使用某项服务的单独协议,并选择接受或不接受。限制、免责条款可能以加粗形式提示用户注意。**
+
+**除非用户已阅读并接受本协议所有条款,否则用户无权注册、使用本软件及相关服务。用户的注册、使用、获取、登录文依学术等行为即视为用户已阅读并同意上述协议的约束。**
+
+一、重要提示
+
+1.1 本平台各项电子服务的所有权和运作权归属成都文依合创科技有限公司所有,您在注册使用本平台之前应仔细阅读本《文依学术用户服务协议》中的各项条款,**特别是免除或者限制责任的条款、法律适用和争议解决条款,以及其他以斜体、粗体等显著标识的涉及用户核心利益的重要条款。**如您对协议有任何疑问,可向文依学术客服咨询。**(未满18周岁的未成年人或其他不具备完全行为能力的人应当在其监护人陪同下阅读)。**
+
+1.2 您在点击“注册”同意本协议之前,应当认真阅读本协议。**您的注册行为及任何直接、间接使用本平台的部分或全部功能的行为,即视为已阅读并同意接受本协议的约束,包括接受更新后的本协议条款,愿意无条件、无保留地接受本协议所有条款约定并承担相应法律责任。如果您不同意本协议或其中任何条款约定,您应立即停止注册及使用程序。**
+
+1.3 本公司可根据情况制订、修改本协议及条款,您以明示同意或默示同意等任何方式同意接受修改后的协议或条款,变更后的协议和条款即自动对您产生法律效力。
+
+1.4 用户确认:本协议是处理双方权利义务的契约,始终有效,法律另有强制性规定或双方另有特别约定的,依其规定。
+
+1.5 **本公司保留在中华人民共和国大陆地区施行之法律允许的范围内独自决定拒绝部分或全部服务、关闭用户账户、清除或编辑内容或取消订单的权利。**
+
+二、定义
+
+2.1 平台:具体指成都文依合创科技有限公司开发、运营的“文依学术”微信小程序。
+
+2.2 文依学术服务/本服务:指用户可依托文依学术平台,基于互联网,为文依学术平台用户提供互联网信息服务。
+
+2.3 用户:指文依学术平台的使用人,在本协议中被称为“您”或“用户”。
+
+2.4 本公司:指成都文依合创科技有限公司。
+
+2.7 关联公司:指成都文依合创科技有限公司在中国境内设立或运营的实体,包括直接或间接控股的公司,参股或形成经营、协作的具有关联关系的企业。
+
+三、账号管理
+
+3.1 用户在注册帐号或使用本服务的过程中,需要提供一些必要的个人信息,例如:为向用户提供帐号注册服务或进行用户身份识别,需要填写手机号码、工作单位、岗位信息;通话功能需要用户授权访问手机通讯录等。若国家法律法规或政策有特殊规定的,用户需要提供真实的身份信息。若用户提供的信息不完整或不真实,则可能无法使用本服务或在使用过程中受到限制。您在注册填写用户信息时,应保证提供的资料真实、准确、完整、合法有效,**若提供的资料信息并非真实、准确、完整、合法有效,本公司有权随时暂停、冻结您的平台账号并要求您承担因此造成的法律后果。**
+
+3.2 您的账号注册与使用应符合网络道德,遵守中华人民共和国的相关法律法规。您的用户名和昵称中不能含有威胁、淫秽、谩骂、非法、侵害他人正当权益等有争议性的文字。您在本平台上的言论不得违法、不得违反公序良俗、不得使用攻击性语言恶意中伤他人,或作出虚假性陈述。**违反以上规定的,本平台有权随时采取暂停提供服务、删除内容、冻结账号等措施,且由此造成的一切不利后果由您自行承担。**
+
+3.3 您需自行妥善保管其平台账号有关个人资料,不得以任何方式将平台账号有关个人资料转让、告知或借予他人。**如因上述或其他不可归因于本公司的缘故导致您的平台账号有关个人资料遗失、被盗或泄露等情况致使您的自身相关权益受到损害的,皆由您自行承担责任。**
+
+3.4 用户授权行为:对本平台而言,您的帐号和密码是唯一验证登录用户真实身份的依据,只要使用了正确的帐号和密码无论是谁登录均视为您本人登录或已得到您本人的授权。您应当对以您的帐号进行的所有活动和事件负法律责任。
+
+3.5 如您发现平台账号相关个人资料被非法使用或其他异常状况,请立即通知本公司线上服务人员,线上服务人员验证用户有效身份后可暂时冻结该平台账号之登录和使用等操作,待经过相关部门查实审核后,如无异常状况即可恢复使用。
+
+3.6 **本公司保有暂停、清除各类不符合法律政策或不真实的信息内容而无须通知您的权利。若您未遵守国家法律法规及本协议规定,本平台有权作出独立判断并采取暂停或关闭您的帐号等措施。您须对自己在本平台发表的言论和行为承担法律责任。**
+
+四、用户责任和义务
+
+4.1 用户依法言行义务。根据国家相关法律法规和规章的规定,您在注册使用本平台相关服务的过程中,应严格遵守以下义务:
+
+(1)不得传输或发表:煽动抗拒、破坏宪法和法律、行政法规实施的言论,煽动颠覆国家政权,推翻社会主义制度的言论,煽动分裂国家、破坏国家统一的言论,煽动民族仇恨、民族歧视、破坏民族团结的言论;
+
+(2)从中国大陆向境外传输资料信息时必须符合中国有关法规;
+
+(3)不得利用本平台从事洗钱、窃取商业秘密、窃取个人信息、不正当竞争等违法犯罪活动;
+
+(4)不得干扰本平台的正常运转,不得侵入本平台及国家计算机信息系统;
+
+(5)不得传输或发表任何违法犯罪的、骚扰性的、中伤他人的、辱骂性的、恐吓性的、伤害性的、庸俗的、淫秽的、不文明的等信息资料;
+
+(6)不得传输或发表损害国家社会公共利益和涉及国家安全的信息资料或言论;
+
+(7)不得教唆他人从事本条所禁止的行为;
+
+(8)不得利用在本平台注册的账户进行牟利性经营活动或进行广告行为;
+
+(9)不得发布任何侵犯他人著作权、商标权等知识产权或合法权利的内容;
+
+    如您违反上述任一规则,导致相应法律后果的发生,您将以自己的名义独立承担所有法律责任。
+
+4.2 您在使用本平台接受服务时,应保证提供真实、完整、准确、合法有效的数据以及其他信息资料。如果资料发生变动,您应及时更改。因未按以上要求提供信息资料而导致的一切责任,由您自行承担。
+
+4.3 您在使用本平台接受服务时,应遵守国家法律、法规等规范性文件及本公司的各项规则和要求,保证您的言行不违背社会公共利益或公共道德,不损害他人的合法权益,不违反本协议所列条款之规定。您需对自己在本平台上的言行承担法律责任。
+
+4.4 如您未满18周岁或因其他原因不具备完全行为能力,您只能在父母或监护人的监护参与下才能使用本平台。
+
+4.5 您不得以任何形式转让或授权他人使用自己的文依学术用户名,亦不得盗用他人帐号,由以上行为造成的后果由用户自行承担。
+
+五、服务定位
+
+5.1 本平台提供线上打卡、签到、工作汇报、日常工作管理等功能。
+
+5.2 本平台仅为用户提供技术服务功能,对用户使用本平台过程中产生的内容、信息的真实性、正确性不承担责任。
+
+5.3 本平台提供的服务均符合国家法律、法规等规范性文件及本公司的各项规则和要求。
+
+六、平台权利及服务的暂停、终止
+
+6.1 如您提供虚假信息、实施违反法律法规或本协议的行为,本平台可立即中止对您提供部分或全部服务而无须为此承担责任,且本平台有权要求您赔偿因提供虚假信息或实施相关行为给本平台及第三方造成的损失。
+
+6.2 如您在接受本平台提供的服务过程中有下列情形之一的,本平台有权立即终止向其提供部分或全部服务,由此造成的法律和经济后果由您自行承担:
+
+(1)发布医托、强烈广告性质等内容;
+
+(2)从中国境内向境外传输技术性资料时违背中国有关法律法规;
+
+(3)利用本平台服务从事洗钱、窃取商业秘密、不正当竞争等非法行为;
+
+(4)以包括但不限于盗用他人账号、恶意编造或虚构信息、恶意投诉、未经允许进入他人电脑或手机系统等方式干扰或扰乱本平台服务;
+
+(5)传输非法、骚扰性、影射或中伤他人、辱骂性、恐吓性、伤害性、庸俗、带有煽动性、可能引起公众恐慌、淫秽的、散播谣言等信息资料;
+
+(6)传输教唆他人构成犯罪行为、危害社会治安、侵害自己或他人人身安全的资料,传输助长国内不利条件和涉及国家安全的资料,传输不符合当地法规、国家法律和国际法律的资料;
+
+(7)发布涉及政治、性别歧视、种族歧视或攻击他人的文字、图片或语言等信息;
+
+(8)其他严重违背社会公共利益和社会公德、违背本协议或补充协议、违反法律禁止性规定的行为。
+
+(9)其他本平台认为需要终止服务的情况。
+
+6.3 **因部分特殊原因致使暂停提供服务的,本平台不承担损害赔偿责任,该特殊原因包括但不限于:**
+
+(1)因地震、海啸、战争、黑客行为、系统故障、网络原因等不可抗力因素,造成系统运行障碍而暂停服务;
+
+(2)因电信系统、电信设备出现通信故障而暂停服务;
+
+(3)**因平台公告系统维护而暂停服务;**
+
+(4)**因其他非归因于本平台的原因致使暂停服务。**
+
+6.4 **本平台有权利但无义务对用户的注册数据及活动行为进行查阅,如发现注册数据或活动行为中存在任何问题或怀疑,均有权向用户发出询问复核及要求改正的通知或者在紧急情况下直接作出删除等处理。**
+
+6.5 经国家生效法律文书或行政处罚决定确认用户存在违法行为,或者本平台有足够事实依据可以认定用户存在违法或违反本协议的行为的,本平台有权以合理方式公布用户的违法行为。
+
+6.6 服务发生变更、中断、终止后,本平台仍有以下权利:
+
+(1)服务发生终止后,本平台有权将用户的注册数据及以前的行为记录进行匿名化处理;
+
+(2)如用户在服务变更、中断、终止前在本平台上存在违法行为或违反条款的行为,本平台仍可行使本协议所规定的权利。
+
+6.7 **对于您在本平台使用过程的不当行为或其它任何本平台认为应当终止服务的情况,本平台有权随时作出删除相关信息、终止服务提供等处理,而无须征得您的同意。**
+
+6.8 您理解并同意本公司将会尽其商业上的合理努力保障用户在本平台及服务中的数据存储安全,但是,本公司并不能就此提供完全保证,包括但不限于以下情形:
+
+
+6.8.1 本公司不对用户在本软件及服务中相关数据的删除或储存失败负责;
+
+6.82 本公司有权根据实际情况自行决定用户在本软件及服务中数据的最长储存期限,并在服务器上为其分配数据最大存储空间等。您可根据自己的需要自行备份本平台及服务中的相关数据;
+
+6.8.3 如果您停止使用本平台及服务或服务被终止、取消,本公司可以从服务器上永久地删除您的数据。服务停止、终止或取消后,本公司没有义务向您返还任何数据。
+
+6.8.4 您在使用本平台及服务时,须自行承担如下来自本公司不可掌控的风险内容,包括但不限于:
+
+6.8.4.1 由于不可抗拒因素可能引起的用户信息丢失、泄漏等风险;
+
+6.8.4.2 您必须选择与所安装终端设备相匹配的软件版本,否则,由于软件与终端设备型号不相匹配所导致的任何问题或损害,均由您自行承担;
+
+6.8.4.3 您在使用本平台访问第三方网站时,因第三方网站及相关内容所可能导致的风险,由您自行承担;
+
+6.8.4.4 您发布的内容被他人转发、分享,因此等传播可能带来的风险和责任;
+
+6.8.4.5 由于网络信号不稳定、网络带宽小等网络原因,所引起的本平台登录失败、资料同步不完整、页面打开速度慢等风险。
+
+七、用户信息保护
+
+7.1 本公司承诺积极保护您的个人信息资料(包括个人身份信息及其他相关信息;您使用本平台服务过程中提供、形成的信息中的非公开内容等)的安全并视情况采取必要保护措施。同时,为了运营和改善本平台的技术与服务,本平台将可能会自行收集使用或向第三方提供用户的非个人隐私信息,这将有助于本平台向用户提供更好的用户体验和服务质量。
+
+7.2 未经您的许可,本公司不会向任何第三方公开、提供或共享用户注册资料中的姓名、个人有效身份证件号码、联系方式、家庭住址等个人信息资料,但以下情况除外:
+
+(1)用户或其监护人授权本公司披露的;
+
+(2)司法机关或行政机关基于法定程序要求本公司提供或协助的。
+
+7.3 因服务必要,本平台可能会将相关网站链接至本平台开展合作的伙伴的网站(统称“第三方网站”)。您在使用本平台提供的链接访问第三方网站时,这些网站的运营商可能会收集用户的个人信息。本平台尽力要求所有链接的第三方网站采用不低于本平台的个人信息保护措施,**但本平台不对这些第三方网站上的活动、隐私权政策或隐私保护水平承担任何法律或其他责任。**
+
+7.4 **您在上传和管理组织成员名称、照片、手机号等个人信息时,请确保您已经事先获得组织成员的明确同意,仅收集为运营及功能实现目的而必需的用户信息,且已充分告知组织成员相关数据收集的目的、范围及使用方式等。**
+
+7.5 就您使用本平台及服务过程中所产生的及您所收集或被提供的任何个人信息(“个人信息”),您应根据所有可适用法律法规使用本服务,并依约履行您在本协议下的义务。本协议所指的“可适用法律法规”是指您通过本服务所提供的信息、服务或前述信息、服务可被接收的国家、地区的法律、法规、规章、规范性文件、政策。您承诺:
+
+7.5.1遵守不时修订的所有可适用的隐私和数据保护的法律法规,包括适用于个人信息的法律法规,并向我们提供必要信息以证明您已遵守前述法律法规及本协议约定;
+
+7.5.2 仅就使用本平台及本服务之目的使用、处理用户的个人信息,除非最终用户另行授权或同意;
+
+7.5.3 明确、准确地向您的客户描述您所收集的个人信息以及如何使用、向第三方分享这些信息等;
+
+7.5.4 采取适宜的技术及系统的安全措施,以保护个人信息免遭未经授权访问或使用,并对前述安全措施的有效性进行定期测试;
+
+7.5.5 确保所有有权访问个人信息的人员都受保密义务的约束;
+
+7.5.6 出现任何未经授权的访问或使用个人信息的情况下,及时联系本平台;
+
+7.5.7 更多有关个人信息和隐私保护的相关政策,请详见《文依学术用户隐私保护协议》
+
+7.6 用户使用或继续使用我们的服务,即意味着同意我们按照《文依学术用户隐私保护政策》收集、使用、储存和分享用户的相关信息。详情请参见《文依学术用户隐私保护政策》。
+
+
+
+八、对第三方责任的声明
+
+
+8.1 **平台上为您的便利而提供的外部链接,包括但不限于任何广告内容链接,以及该链接所指向网页之所有内容,均系该网页所属第三方的所有者制作和提供。第三方网站并非也不反映本平台之任何意见和主张,也不表示本平台同意或支持该第三方网页上的任何内容、主张或立场。本平台对第三方网页中内容之合法性、准确性、真实性、适用性、安全性和完整性等概不承担任何责任。任何单位或个人如需要第三方网站中内容(包括资讯、资料、消息、产品或服务介绍、报价等),并欲据此进行交易或其他行为前,应慎重辨别这些内容的合法性、准确性、真实性、适用性、完整性和安全性(包括下载第三方网站中内容是否会感染电脑病毒),并采取谨慎的预防措施。如您不确定这些内容是否合法、准确、真实、实用、完整和安全,建议您先咨询专业人士。**
+
+
+8.2 **任何单位或者个人因相信、使用第三方网站中信息、服务、产品等内容,或据此进行交易等行为,而引致的人身伤亡、财产毁损(包括因下载而感染电脑病毒)、名誉或商誉诽谤、版权或知识产权等权利的侵犯等事件,及因该等事件所造成的损害后果,本平台概不承担任何法律责任。无论何种原因,本平台不对任何非与本平台直接发生的交易和行为承担任何直接、间接、附带或衍生的损失和责任。**
+
+九、特别授权
+
+9.1 **您同意并授权本公司为储存、保护用户个人信息资料而与第三方进行合作建立信息数据库,授权本公司在提供服务过程中因服务需求与第三方共享个人信息及信息数据库。**
+
+9.2 您同意并授权本公司在不泄露个人信息资料的前提下,对个人信息数据库进行分析及大数据信息收集。
+
+9.3 **您同意并授权本公司根据您提供、使用本服务过程中形成的信息通过短信、邮件、电话、视频、音频或其他形式向您提供服务、活动及其他相关商业信息。**
+
+9.4 您同意并授权本公司在必要时使用您的注册信息、用户名、密码等信息,登陆进入您的注册账户,进行证据保全,包括但不限于公证、见证等。
+
+9.5 **您同意以上权利一经授予,不可撤销。**
+
+十、知识产权条款
+
+10.1 本公司是本平台及相关平台所承载所有内容(文、图、视频、音频等)的版权所有者。未经本公司的书面许可,任何单位或个人不得以任何方式非法地全部或部分复制、转载、引用、链接、抓取或以其他方式使用本平台的信息内容。如有违反,本公司有权追究其法律责任。
+
+10.2 本**公司是本平台的制作者,享有本平台内容及资源的著作权等合法权利,有权不时地对本协议及本平台的内容进行修改,并在本平台张贴,无须另行通知用户。**在法律允许的最大限度范围内,本公司对本协议及本平台内容拥有解释权。
+
+10.3 一旦您接受本协议,即表明您主动将您在任何时间段在本平台发表的任何形式的信息内容(包括但不限于用户评价、用户咨询、各类话题文章等信息内容)的财产性权利等任何可转让的权利,如著作权财产权(包括并不限于:复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权以及应当由著作权人享有的其他可转让权利),**全部独家且不可撤销地转让给本公司所有,您同意本公司有权就任何主体侵权而单独提起诉讼。**
+
+10.4 本协议已经构成《中华人民共和国著作权法》第二十五条及相关法律规定的著作财产权等权利转让书面协议,其效力及于本平台上发布的任何受著作权法保护的作品内容,无论该等内容形成于本协议订立前还是本协议订立后。
+
+10.5 您同意并已充分了解本协议的条款,承诺不将已发表于本平台的信息,以任何形式发布或授权其它主体以任何方式使用(包括且限于在各类网站、媒体上使用)。
+
+10.6 本平台所刊登的资料信息(诸如文字、图表、标识、按钮图标、图像、声音文件片段、数字下载、数据编辑和软件),均是本公司或其内容提供者的财产,受中国和国际版权法的保护。本平台上所有内容的汇编是本公司的排他财产,受中国和国际版权法的保护。本平台上的所有软件都是本公司或其关联公司或其软件供应商的财产,受中国和国际版权法的保护。
+
+十一、协议的修改、中止和终止
+
+11.1 您的任何意见和建议均可通过本平台向本公司工作人员反馈。经协商后双方如达成一致,则可对本协议相关内容进行调整。
+
+11.2 若您违反本协议或相关规定,本公司工作人员多次交涉未果;**或因您的行为对本公司造成损失的,本公司有权终止与您的协议,并冻结您的个人账号。**
+
+11.3 根据国家法律法规变化及网络运营需要,**本公司有权对本协议条款不时地进行修改,修改后的协议一旦在本平台张贴公告即行生效,并自动代替原有协议。**您可随时登陆本平台查阅最新协议;您有义务随时关注本平台公告并阅读最新协议。
+
+11.4 如您不同意更新后的协议,可以且应立即停止接受本平台依据本协议提供的服务或通告本平台停止对您帐号的该项服务,本平台停止您的服务后,您使用本服务的权利马上终止,即刻起,本平台不再对您承担任何义务和责任;如您继续使用本平台提供的服务,即视为同意更新后的协议。
+
+11.5 鉴于移动互联网服务的特殊性,本公司有权随时变更、中止或终止部分或全部的服务。如变更、中止或终止的服务属于免费服务,本公司无需通知您,也无需对您或任何第三方承担任何责任。
+
+11.6 如本协议中任何一条被视为废止、无效或因任何理由不可执行,该条应视为可分的且并不影响任何其余条款的有效性和可执行性。
+
+11.7 当您与平台发生有关争议时,以最新的服务协议为作为双方权利义务约定。
+
+十二、免责条款及不承诺担保
+
+12.1 在使用本平台服务的过程中,可能会遇到不可抗力等风险因素,使服务发生中断。不可抗力是指不能预见、不能克服并不能避免且对一方或双方造成重大影响的客观事件,包括但不限于自然灾害如洪水、地震、瘟疫流行和风暴等以及社会事件如战争、动乱、政府行为等。出现上述不可抗力情况时,本公司将努力在第一时间与相关单位配合,及时进行修复,但是由此造成的损失(包括但不限于信息损失,服务中断,资料灭失)本公司在法律允许的范围内免责。
+
+12.2 在法律允许的范围内,本公司对以下情形导致的服务中断或受阻不承担责任:
+
+(1) 受到计算机病毒、木马或其他恶意程序、黑客攻击的破坏;
+
+(2) 用户或本公司电脑软件、系统、硬件和通信线路出现故障;
+
+(3) 用户操作不当;
+
+(4) 用户通过非本公司授权的方式使用服务。
+
+(5)其他不可归因于本平台的事由。
+
+12.3 本服务同大多数互联网服务一样,受包括但不限于用户原因、网络服务质量、社会环境等因素的差异影响,可能受到各种安全问题的侵扰,如他人利用用户的资料,造成现实生活中的骚扰;您应加强信息安全及使用者资料的保护意识,注意加强密码保护,以免遭致损失和骚扰。
+
+12.4 在使用本服务的过程中,可能会遇到网络信息或其他用户行为带来的风险,本公司不对任何第三方信息的真实性、适用性、合法性承担责任,也不对因第三人侵权行为给用户造成的损害(包括但不限于信息损失,服务中断,资料灭失)负责。这些风险包括但不限于:
+
+(1) 来自他人匿名或冒名的含有威胁、诽谤、令人反感或非法内容的信息;
+
+(2) 因使用本协议项下的服务,遭受他人误导、欺骗或其他导致或可能导致的任何心理、生理上的伤害以及经济上的损失;
+
+(3) 其他因网络信息或用户行为引起的风险。
+
+12.5 不论在何种情况下,本公司均不对由于网络连接故障,电脑,通讯或其他系统的故障,电力故障,罢工,劳动争议,暴乱,起义,骚乱,生产力或生产资料不足,火灾,洪水,风暴,爆炸,不可抗力,战争,政府行为,国际、国内法院的命令或第三方的不作为等任何不可归因于本公司的原因而造成的不能服务或延迟服务承担责任。
+
+12.6 不论是否可以预见,不论源于何种形式的行为,本公司不对由以下原因造成的任何特别的、直接的、间接的、惩罚性的、突发性的或有因果关系的损害或其他任何损害(包括但不限于信息损失,服务中断,资料灭失)承担责任:
+
+(1) 使用或不能使用服务平台。
+
+(2) 未经授权的存取或修改数据或数据的传输。
+
+(3) 第三方通过服务所作的陈述或行为。
+
+(4) 其它与服务相关事件,包括疏忽等,所造成的损害。
+
+
+12.7 本平台所有信息仅供参考。本平台致力于提供正确、完整的信息资讯,但不保证信息的绝对正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
+
+12.8 除非另有明确的书面说明,本平台及其所包含的或以其它方式通过本平台提供给用户的全部信息、内容、材料、产品(包括软件)和服务,均是在“按现状”和“按现有”的基础上提供的。除非另有明确的书面说明,本公司不对本平台的运营及其包含在本平台上的信息、内容、材料、产品(包括软件)或服务作任何形式的、明示或默示的声明或担保(根据中华人民共和国法律另有规定的以外)。
+
+12.9 本平台不承诺网络服务一定能满足用户的要求,也不承诺网络服务不会中断,对网络服务的及时性、安全性、准确性也都不作承诺。本平台不承诺网页上设置的外部链接的准确性和完整性,同时,对于该等外部链接指向的不由本平台实际控制的任何网页上的内容,本平台不承担任何责任。
+
+12.10 **本平台所承载的内容(文、图、视频、音频)均为传播有益健康资讯目的,本公司不对其真实性、科学性、严肃性做任何形式保证。**
+
+十三、通告
+
+13.1 本协议下所规定的通知有权要求以书面形式通过以下邮址递交收悉,通知的到达以文依学术收悉为准。\
+文依学术地址:成都市温江区柳城街办致远路2号1栋1单元20层2017号
+
+收件人:文依学术项目组(收)
+
+联系电话:17716144271 
+
+**本协议项下所有的通知均可通过重要页面公告、电子邮件或常规的信件传送等方式进行;该等通知于发送之日视为已送达。**
+
+13.2 您对于本公司的通知应当通过本平台对外正式公布的通信地址、电子邮件地址等联系信息进行送达。
+
+十四、法律适用、管辖及其他
+
+14.1 本协议之效力、解释、变更、执行与争议解决均适用中华人民共和国法律,如无相关法律规定的,则应参照通用国际商业惯例、政府部门相关规定和(或)行业惯例。
+
+14.2 本协议签订地为本平台数据服务中心成都温江海天腾逸广场4号楼。因本协议产生之争议,由双方协商解决;协商不成的,任何一方均有权向本协议签订地人民法院提起诉讼。
+
+14.3 本协议构成您与本平台就服务之约定事项及其他有关事宜的完整协议,除服务条款规定的之外,未赋予服务条款各方其他权利。
+
+十五、其他约定
+
+15.1 我们在此特别提示:本协议内容包括协议正文、隐私权政策及所有文依学术已经发布或将来可能发布的各类规则、规范、通知、公告等(合称“规则”)。法律声明、隐私政策及所有规则为协议不可分割的一部分,与协议正文具有同等法律效力。
+
+
 成都文依合创科技有限公司
-                                                                                                       
+