Ver Fonte

Merge branch 'master' of http://git.lcpcp.cc/py/assess-app

# Conflicts:
#	yarn.lock
xiguaguazi há 3 semanas atrás
pai
commit
934a5aa7b2
38 ficheiros alterados com 3091 adições e 1247 exclusões
  1. 1 1
      .env.dev.js
  2. 1 1
      .env.prod.js
  3. 1 1
      .env.trial.js
  4. 6 0
      api/valuation.js
  5. 1 1
      common/system_popup/system_popup.vue
  6. 125 8
      common/task/loan-item.vue
  7. 1 4
      common/task/task-item.vue
  8. 43 23
      common/task/task_ima_tab.vue
  9. 19 17
      components/en-from/en-input/en-input.vue
  10. 1 1
      components/en-from/en-select/en-select.vue
  11. 13 9
      components/en-utils/en-nav/en-nav.vue
  12. 17 14
      components/en-utils/en-tab/en-tab.vue
  13. 110 96
      manifest.json
  14. 67 1
      package-lock.json
  15. 2 0
      package.json
  16. 46 29
      page_subpack/message/message.vue
  17. 61 57
      page_subpack/personal_details/personal_details.vue
  18. 1 2
      page_subpack/system_setting/system_setting.vue
  19. 196 193
      page_subpack/transition/to_excel.vue
  20. 0 27
      page_task/graph/index.vue
  21. 228 0
      page_task/task_details/module/entities.vue
  22. 638 0
      page_task/task_details/module/graph.vue
  23. 1 4
      page_task/task_details/module/steps.vue
  24. 103 0
      page_task/task_details/module/word.vue
  25. 346 360
      page_task/task_details/task_details.vue
  26. 27 27
      pages.json
  27. 84 34
      pages/index/index.vue
  28. 37 37
      pages/index/module/index_column.vue
  29. 148 0
      pages/index/module/popup-module.vue
  30. 1 1
      pages/loan/components/clientType.vue
  31. 39 15
      pages/loan/loan.vue
  32. 1 1
      pages/login/index.vue
  33. 402 133
      pages/task/task.vue
  34. 129 129
      service/ajax.js
  35. 20 13
      service/tools.js
  36. 121 7
      static/css/common.css
  37. 1 1
      uni_modules/k-tabs-swiper/components/k-tabs-swiper/k-tabs-swiper.vue
  38. 53 0
      yarn.lock

+ 1 - 1
.env.dev.js

@@ -1,5 +1,5 @@
 const config = {
-  baseUrl: 'https://api.wealfavor.cn',
+  baseUrl: 'https://asset-api.geltsch.cn',
   goUrl: 'http://127.0.0.1:8001',
   appName: '开发环境'
 }

+ 1 - 1
.env.prod.js

@@ -1,5 +1,5 @@
 const config = {
-    baseUrl: 'https://api.wealfavor.cn',
+    baseUrl: 'https://asset-api.geltsch.cn',
     goUrl: 'https://api.wealfavor.cn',
     appName:'正式环境'
 }

+ 1 - 1
.env.trial.js

@@ -1,5 +1,5 @@
 const config = {
-    baseUrl: 'https://test-api.wealfavor.cn',
+    baseUrl: 'https://asset-api.geltsch.cn',
     goUrl: 'https://test-api.wealfavor.cn',
     appName:'演示环境'
 }

+ 6 - 0
api/valuation.js

@@ -0,0 +1,6 @@
+import {request} from '@/service/ajax'
+
+const newsUrl = '/api/client/'
+// 评估
+export const predictProperty = (data) => request(newsUrl + 'predict', 'post', { ...data },false)
+

+ 1 - 1
common/system_popup/system_popup.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="system_content column-justify-sb center">
-		<view :style="{marginTop:`${$tools.topHeight()}px`}">
+		<view :style="{marginTop:`40px`}">
 			<view class="column justify-center avatar r-100">
 				<view class="avatar r-100" style="background-color: rgba(0, 0, 0, 0.1);"></view>
 				<view class="row-c avatar_name m-l20">

+ 125 - 8
common/task/loan-item.vue

@@ -1,14 +1,18 @@
 <template>
-	<view class="p-30 box-border-box flex-1 flex-direction">
-		<swiper class="swiper-box flex-direction animate__animated animate__fadeIn flex-1" circular>
-			<swiper-item v-for="(item,index) in taskList" :key="index" class="flex-direction flex-1">
-				<view class="item-box flex-direction flex-1 page-box-bg-fff m-b20 r-30 box-shadow-197">
+	<view class="flex-direction" :style="{height: (commonHeight + 40) + 'px'}">
+		<swiper class="swiper-box flex-direction animate__animated animate__fadeInRight flex-1" circular
+			v-if="taskList.length>0">
+			<swiper-item v-for="(item,index) in taskList" :key="index"
+				class="swiper-item flex-direction p-30 box-border-box flex-1">
+				<view class="item-box flex-direction flex-1 page-box-bg-fff r-30 box-shadow-197">
 					<view class="item-top box-border-box" :style="{background:lineColor[item.id%2]}">
 						<view class="center row-justify-sb mb-24">
 							<view class="center">
-								<uni-icons type="home-filled" size="30" class="mr-10"></uni-icons>
+								<view class="size-64 mr-10">
+									🏢
+								</view>
 								<view class="fc-155DFB sys-size-24 sys-weight-600 title-box">
-									Commercial Real Estate
+									商业地产
 								</view>
 							</view>
 							<view class="heart-box" @click.stop="heartBut(item,true)" v-if="!item.live">
@@ -34,7 +38,7 @@
 						<view class="center mb-14">
 							<uni-icons type="home" size="18" color="#99A1AF" class="mr-10"></uni-icons>
 							<view class="size-28 fc-99A1AF">
-								Borrower
+								借款人
 							</view>
 						</view>
 						<view class="sys-size-32 mb-12">
@@ -43,14 +47,81 @@
 						<view class="size-22 fc-99A1AF mb-40">
 							#{{item.time}}
 						</view>
+						<view class="amount-box box-border-box sys-radius-20 center">
+							<view class="mr-20 amount-icon">
+								<uni-icons type="wallet" size="18" color="#F54900"></uni-icons>
+							</view>
+							<view class="flex-direction">
+								<view class="fc-343C47 size-24">
+									本金
+								</view>
+								<view class="size-48">
+									${{item.amount}}M
+								</view>
+							</view>
+						</view>
+						<view class="flex-stretch flex-wrap mb-32">
+							<view class="mb-16 mr-20 bgc-F9FAFB r-40 b-F3F4F6-1 p-24 box-border-box w-49">
+								<view class="icon-box mb-16 bgc-fff">
+									<uni-icons type="arrow-up" size="18" color="#0F41AF"></uni-icons>
+								</view>
+								<view class="fc-6A7383 size-24 mb-16">
+									利率
+								</view>
+								<view class="size-36">
+									{{item.trend}}
+								</view>
+							</view>
+							<view class="mb-16 flex-1 bgc-F0FDF4 r-40 b-B9F8CF-1 p-24 box-border-box">
+								<view class="icon-box mb-16 bgc-DBFCE7">
+									<uni-icons type="locked" size="18" color="#00A63D"></uni-icons>
+								</view>
+								<view class="fc-6A7383 size-24 mb-16">
+									贷款房价比
+								</view>
+								<view class="size-36">
+									{{item.risk}}
+								</view>
+							</view>
+							<view class="mr-20 bgc-F9FAFB r-40 b-F3F4F6-1 p-24 box-border-box w-49">
+								<view class="icon-box mb-16 bgc-fff">
+									<uni-icons type="calendar" size="18" color="#9810FA"></uni-icons>
+								</view>
+								<view class="fc-6A7383 size-24 mb-16">
+									应付款
+								</view>
+								<view class="size-36">
+									Dec 31, 2027
+								</view>
+							</view>
+							<view class="bgc-F9FAFB flex-1 r-40 b-F3F4F6-1 p-24 box-border-box">
+								<view class="icon-box mb-16 bgc-fff">
+									<uni-icons type="close" size="18" color="#4E38F5"></uni-icons>
+								</view>
+								<view class="fc-6A7383 size-24 mb-16">
+									抵押品
+								</view>
+								<view class="size-36">
+									$13.5M
+								</view>
+							</view>
+						</view>
+						<view class="tiem-box box-border-box center flex-justify-around r-40">
+							<uni-icons type="checkbox" size="18" color="#008235"></uni-icons>
+							<view class="fc-008235 size-28">
+								活跃的
+							</view>
+						</view>
 					</view>
 				</view>
 			</swiper-item>
 		</swiper>
 		<!-- 		<view class="task-body animate__animated animate__fadeIn flex-1" v-if="taskList.length>0">
 
+		</view> -->
+		<view class="p-30 box-border-box flex-direction flex-1" v-else>
+			<en-blank class="flex-1"></en-blank>
 		</view>
-		<en-blank v-else></en-blank> -->
 	</view>
 </template>
 
@@ -75,6 +146,10 @@
 				type: Array,
 				default: () => []
 			},
+			commonHeight: {
+				type: Number,
+				default: 0
+			},
 			iconStatus: {
 				type: Number,
 				default: 1
@@ -124,6 +199,48 @@
 </script>
 
 <style lang="scss" scoped>
+	// .swiper-box{
+	// 	height: 800rpx;
+	// }
+	// .swiper-item{
+	// 	height: 800rpx;
+	// }
+	.tiem-box {
+		width: 200rpx;
+		padding: 16rpx 32rpx;
+		background: #F0FDF4;
+		border: .1rpx solid #B9F8CF;
+	}
+
+	.icon-box {
+		width: 64rpx;
+		height: 64rpx;
+		line-height: 64rpx;
+		text-align: center;
+		border-radius: 50%;
+	}
+
+	.w-49 {
+		width: 49%;
+	}
+
+	.amount-icon {
+		width: 96rpx;
+		height: 96rpx;
+		background: #fff;
+		line-height: 96rpx;
+		text-align: center;
+		border-radius: 40rpx;
+		box-shadow: 0 2rpx 12rpx 0 rgba(0, 0, 0, 0.2);
+	}
+
+	.amount-box {
+		width: 100%;
+		padding: 32rpx;
+		margin-bottom: 32rpx;
+		border: .1rpx solid #FFEED5;
+		background-image: linear-gradient(45deg, #FFF7ED 4%, #FDF3F7);
+	}
 
 	.en_button {
 		border: none;

+ 1 - 4
common/task/task-item.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="p-t20">
-		<view class="task-body m-lr20  animate__animated animate__fadeIn" v-if="taskList.length>0">
+		<view class="task-body m-lr20  animate__animated animate__slideInLeft" v-if="taskList.length>0">
 			<view class="item-box align-items-flex-start page-box-bg-fff m-b20 r-30 box-shadow-197 p-20 box-border-box"
 				v-for="(item,index) in taskList" :key="index" @click="onTaskDetails(item)">
 				<view class="main_string" :style="{background:lineColor[item.id%3]}"></view>
@@ -127,8 +127,6 @@
 				return `https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/new-xcx/task/${this.leftImg[this.leftImgStatus]}.png`
 			},
 			onTaskDetails(item) {
-				console.log(item,'1111111111');
-				return
 				if (item.business_id) {
 					uni.navigateTo({
 						url: '/page_task/task_details/task_details?taskId=' + item.business_id
@@ -138,7 +136,6 @@
 						url: '/page_task/task_details/task_details?taskId=' + item.id
 					})
 				}
-
 			}
 		}
 	}

+ 43 - 23
common/task/task_ima_tab.vue

@@ -25,14 +25,34 @@
 		data() {
 			return {
 				current: 0,
-
 				navList: [{
-					id: 0,
-					name: '全部',
-					product_name: '全部',
-					icon: 'https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/new-xcx/task/task-all.png',
-					num: 0
-				}],
+						id: 0,
+						name: '全部',
+						product_name: '全部',
+						icon: 'https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/new-xcx/task/task-all.png',
+						num: 0
+					},
+					{
+						id: 2,
+						name: '住宅',
+						icon: 'https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/new-xcx/task/task-refund.png'
+					},
+					{
+						id: 1,
+						name: '公建',
+						icon: 'https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/new-xcx/task/task-loan.png'
+					},
+					{
+						id: 3,
+						name: '土地',
+						icon: 'https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/new-xcx/task/task-financial.png'
+					},
+					{
+						id: 4,
+						name: '工业用房',
+						icon: 'https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/new-xcx/task/task-else.png'
+					}
+				],
 				typeList: [{
 						id: 2,
 						name: '垫资还款',
@@ -63,9 +83,8 @@
 			if (this.listType === 1) {
 				this.navList = this.typeList
 			} else {
-				this.getTaskType()
+				// this.getTaskType()
 			}
-
 		},
 		methods: {
 			getTaskType() {
@@ -74,32 +93,33 @@
 					'listType': this.listType
 				}).then(res => {
 					if (res.code === 1) {
-            this.navList[0].num=0
+						this.navList[0].num = 0
 						res.data.forEach(item => {
 							this.navList[0].num += item.num
 							if (this.numType > 0) {
 								item.name = item.product_name + '(' + item.num + ')'
-								this.navList[0].name = this.navList[0].product_name + '(' + this.navList[0].num + ')'
+								this.navList[0].name = this.navList[0].product_name + '(' + this.navList[0]
+									.num + ')'
 							} else {
 								item.name = item.product_name
 							}
-              this.setNavItem(item)
+							this.setNavItem(item)
 						})
 					}
 				})
 			},
-      setNavItem(item){
-        for (const navItemKey in this.navList) {
-          if(this.navList[navItemKey].id===item.id){
-            this.navList[navItemKey]=item
-            return
-          }
-        }
-        this.navList.push(item)
-      },
+			setNavItem(item) {
+				for (const navItemKey in this.navList) {
+					if (this.navList[navItemKey].id === item.id) {
+						this.navList[navItemKey] = item
+						return
+					}
+				}
+				this.navList.push(item)
+			},
 
 			changeTab(current) {
-				this.$emit('setProductId', this.navList[current].id)
+				// this.$emit('setProductId', this.navList[current].id)
 			},
 		}
 	}
@@ -107,4 +127,4 @@
 
 <style lang="scss" scoped>
 
-</style>
+</style>

+ 19 - 17
components/en-from/en-input/en-input.vue

@@ -2,7 +2,7 @@
 	<view class="wh-box">
 		<view class="row p-tb30" style="line-height: 30rpx;height: 30rpx;" :class="{'bor-bottom-1':is_border}">
 			<view class="wh-text size-28" :class="{'wh-text-long':isLong}">{{label}}<text></text></view>
-			<view class="row-c flex">
+			<view class="row-c flex" @click="inputBut">
 				<input class="wh-input sys-size-28 text-color-12 m-l40" placeholder-class="sys-size-28 text-color-999"
 					:maxlength="maxlength" :type="type" :focus="focus"
 					:placeholder="is_select ? '请选择' : placeholder?placeholder:`请输入${label}`" :disabled="disabled"
@@ -67,7 +67,7 @@
 			return {
 				inputValue: '',
 				showShake: false,
-        isLong:false
+				isLong: false
 			};
 		},
 		watch: {
@@ -83,20 +83,20 @@
 		},
 		mounted() {
 			this.inputValue = this.value
-      this.setLabelWidth()
+			this.setLabelWidth()
 		},
 		methods: {
 			nameInput(e) {
 				if (this.type === 'nickname') {
 					this.inputValue = e.detail.value
 				}
-
 			},
-      setLabelWidth(){
-        this.isLong=this.label.length>4
-      },
-			onSubmit() {
-
+			setLabelWidth() {
+				this.isLong = this.label.length > 4
+			},
+			onSubmit() {},
+			inputBut() {
+				this.$emit('inputBut')
 			}
 		}
 	}
@@ -119,7 +119,7 @@
 	}
 
 	.wh-text {
-		width: 110rpx;
+		width: 120rpx;
 		text-align: justify;
 		text-align-last: justify;
 		vertical-align: top;
@@ -135,10 +135,12 @@
 		display: inline-block;
 		overflow: hidden;
 	}
-  .wh-text-long {
-    width: 170rpx;
-  }
-  .wh-text-long:after{
-    width: 170rpx;
-  }
-</style>
+
+	.wh-text-long {
+		width: 170rpx;
+	}
+
+	.wh-text-long:after {
+		width: 170rpx;
+	}
+</style>

+ 1 - 1
components/en-from/en-select/en-select.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="box">
-		<view class="input-box" @click="showPickerObj">
+		<view class="input-box flex-shrink0" @click="showPickerObj">
 			<view class="input-box-left size-28" :style="{'letter-spacing':labelWidth}">
 				{{ label }}
 			</view>

+ 13 - 9
components/en-utils/en-nav/en-nav.vue

@@ -15,14 +15,14 @@
 				<text>{{title}}</text>
 			</view>
 		</view>
-		<view :style="[{height:is_fixed? `${60+bgHeight}px`:`${60+fixedHeight}px`}]">
+		<view :style="[{height:is_fixed? `${$tools.topHeight()+bgHeight}px`:`${$tools.topHeight()+fixedHeight}px`}]">
 		</view>
 		<!-- 带背景插槽 start-->
 		<slot></slot>
 		<!-- 带背景插槽 end-->
-		<view class="sys-list-background-color header" style="z-index: 2;"
-			:style="[{height:is_fixed?`${navsHeight}px` :`${fixedHeight}px`},{opacity:is_fixed?navOpacity:1}]">
-			<image class="" style="width: 100%;height: 100%;" :src="bgList[genre].nav_path" mode="">
+		<view class="header" style="z-index: 2;"
+			:style="[{height:is_fixed?`${$tools.topHeight()+navsHeight}px` :`${$tools.topHeight()+fixedHeight}px`},{opacity:is_fixed?navOpacity:1},{'background':bgckgroundBox}]">
+			<image v-if="genre>= 0" class="" style="width: 100%;height: 100%;" :src="bgList[genre].nav_path" mode="">
 			</image>
 		</view>
 	</view>
@@ -126,10 +126,12 @@
 		},
 
 		created() {
-			// const navTop = uni.getMenuButtonBoundingClientRect()
-			// this.height = navTop.height + 'px'
-			// this.paddingTop = navTop.top + 'px'
-			// this.navHeight = `${navTop.height+navTop.top}px`
+			// #ifdef MP-WEIXIN
+			const navTop = uni.getMenuButtonBoundingClientRect()
+			this.height = navTop.height + 'px'
+			this.paddingTop = navTop.top + 'px'
+			this.navHeight = `${navTop.height+navTop.top}px`
+			// #endif
 		},
 		watch: {
 			opacity(newValue, oldValue) {
@@ -193,7 +195,9 @@
 			font-size: 32rpx;
 			font-weight: bold;
 			font-family: Source Han Sans CN;
-			padding-top: 60rpx;
+			// #ifdef H5 || APP-PLUS
+			padding-top: 30rpx;
+			// #endif
 		}
 	}
 

+ 17 - 14
components/en-utils/en-tab/en-tab.vue

@@ -33,7 +33,7 @@
 		</view> -->
 		</view>
 		<view class="zw">
-			
+
 		</view>
 	</view>
 </template>
@@ -49,23 +49,24 @@
 		data() {
 			return {
 				tabList: [{
-						name: '工作台',
+						name: '首页',
+						path: '/pages/loan/loan',
+						iconPath: 'loan-default',
+						selectedIconPath: 'loan-select',
+					},
+					{
+						name: '市场',
 						path: '/pages/index/index',
 						iconPath: 'home-default',
 						selectedIconPath: 'home-select',
 					},
-					// {
-					// 	name: '任务',
-					// 	path: '/pages/task/task',
-					// 	iconPath: 'task-default',
-					// 	selectedIconPath: 'task-select',
-					// },
 					{
-						name: '贷后',
-						path: '/pages/loan/loan',
-						iconPath: 'loan-default',
-						selectedIconPath: 'loan-select',
+						name: '任务',
+						path: '/pages/task/task',
+						iconPath: 'task-default',
+						selectedIconPath: 'task-select',
 					},
+
 					// {
 					// 	name: '统计',
 					// 	path: '/pages/statistics/statistics',
@@ -80,6 +81,7 @@
 		},
 		methods: {
 			setTab(path) {
+        console.log(path)
 				uni.switchTab({
 					url: path
 				})
@@ -99,9 +101,10 @@
 </script>
 
 <style lang="scss">
-	.zw{
+	.zw {
 		height: 120rpx;
 	}
+
 	.tab-box {
 		display: flex;
 		justify-content: space-around;
@@ -150,4 +153,4 @@
 			}
 		}
 	}
-</style>
+</style>

+ 110 - 96
manifest.json

@@ -1,97 +1,111 @@
 {
-    "name" : "万汇融通云",
-    "appid" : "__UNI__E819C2B",
-    "description" : "",
-    "versionName" : "1.0.13",
-    "versionCode" : 101,
-    "transformPx" : false,
-    /* 5+App特有相关 */
-    "app-plus" : {
-        "usingComponents" : true,
-        "nvueStyleCompiler" : "万汇融通云",
-        "compilerVersion" : 3,
-        "splashscreen" : {
-            "alwaysShowBeforeRender" : true,
-            "waiting" : true,
-            "autoclose" : true,
-            "delay" : 0
-        },
-        /* 模块配置 */
-        "modules" : {},
-        /* 应用发布信息 */
-        "distribute" : {
-            /* android打包配置 */
-            "android" : {
-                "permissions" : [
-                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
-                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
-                ]
-            },
-            /* ios打包配置 */
-            "ios" : {},
-            /* SDK配置 */
-            "sdkConfigs" : {},
-            "plugins" : {
-                "mp-weixin" : {
-                    "version" : "2.5.0"
-                }
-            }
-        }
-    },
-    /* 快应用特有相关 */
-    "quickapp" : {},
-    /* 小程序特有相关 */
-    "mp-weixin" : {
-        "appid" : "wx26b6136cd5860186",
-        "optimization" : {
-            "subPackages" : true
-        },
-        "setting" : {
-            "urlCheck" : false,
-            "minified" : true
-        },
-        "usingComponents" : true,
-        "version" : "2.5.0"
-    },
-    "mp-alipay" : {
-        "usingComponents" : true
-    },
-    "mp-baidu" : {
-        "usingComponents" : true
-    },
-    "mp-toutiao" : {
-        "usingComponents" : true
-    },
-    "uniStatistics" : {
-        "enable" : false
-    },
-    "vueVersion" : "2",
-    "h5" : {
-        "devServer" : {
-            "https" : false,
-            "proxy" : {
-                "/api" : {
-                    "target" : "https://test-api.wealfavor.cn/",
-                    "changeOrigin" : true,
-                    "secure" : false,
-                    "pathRewrite" : {
-                        "^/api" : "api"
-                    }
-                }
-            }
-        }
-    }
-}
+	"name": "万汇融通云",
+	"appid": "__UNI__E819C2B",
+	"description": "",
+	"versionName": "1.0.13",
+	"versionCode": 101,
+	"transformPx": false,
+	/* 5+App特有相关 */
+	"app-plus": {
+		"usingComponents": true,
+		"nvueStyleCompiler": "万汇融通云",
+		"compilerVersion": 3,
+		"splashscreen": {
+			"alwaysShowBeforeRender": true,
+			"waiting": true,
+			"autoclose": true,
+			"delay": 0
+		},
+		/* 模块配置 */
+		"modules": {},
+		/* 应用发布信息 */
+		"distribute": {
+			/* android打包配置 */
+			"android": {
+				"permissions": [
+					"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+					"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+					"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+					"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CAMERA\"/>",
+					"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+					"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+					"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+					"<uses-feature android:name=\"android.hardware.camera\"/>",
+					"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+				]
+			},
+			/* ios打包配置 */
+			"ios": {},
+			/* SDK配置 */
+			"sdkConfigs": {
+				"maps": {
+					"amap": {
+						"name": "",
+						"appkey_ios": "",
+						"appkey_android": ""
+					}
+				}
+			},
+			"plugins": {
+				"mp-weixin": {
+					"version": "2.5.0"
+				}
+			}
+		}
+	},
+	/* 快应用特有相关 */
+	"quickapp": {},
+	/* 小程序特有相关 */
+	"mp-weixin": {
+		"appid": "wx26b6136cd5860186",
+		"optimization": {
+			"subPackages": true
+		},
+		"setting": {
+			"urlCheck": false,
+			"minified": true
+		},
+		"usingComponents": true,
+		"permission": {
+			"scope.userLocation": {
+				"desc": "你的位置信息将用于小程序位置接口的效果展示" // 这里会展示在授权弹窗上
+			}
+		},
+		"requiredPrivateInfos": ["getLocation","chooseLocation"],
+		"version": "2.5.0"
+	},
+	"mp-alipay": {
+		"usingComponents": true
+	},
+	"mp-baidu": {
+		"usingComponents": true
+	},
+	"mp-toutiao": {
+		"usingComponents": true
+	},
+	"uniStatistics": {
+		"enable": false
+	},
+	"vueVersion": "2",
+	"h5": {
+		"devServer": {
+			"https": false,
+			"proxy": {
+				"/api": {
+					"target": "https://test-api.wealfavor.cn/",
+					"changeOrigin": true,
+					"secure": false,
+					"pathRewrite": {
+						"^/api": "api"
+					}
+				}
+			}
+		}
+	}
+}

+ 67 - 1
package-lock.json

@@ -5,6 +5,8 @@
   "packages": {
     "": {
       "dependencies": {
+        "@amap/amap-jsapi-loader": "^1.0.1",
+        "@types/three": "^0.181.0",
         "3d-force-graph": "^1.79.0",
         "animate.css": "^4.1.1",
         "echarts": "^6.0.0",
@@ -25,6 +27,12 @@
         "vue-waterfall-easy": "^2.4.4"
       }
     },
+    "node_modules/@amap/amap-jsapi-loader": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
+      "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==",
+      "license": "MIT"
+    },
     "node_modules/@babel/parser": {
       "version": "7.19.0",
       "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz",
@@ -45,6 +53,12 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@dimforge/rapier3d-compat": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz",
+      "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==",
+      "license": "Apache-2.0"
+    },
     "node_modules/@tweenjs/tween.js": {
       "version": "25.0.0",
       "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz",
@@ -56,6 +70,33 @@
       "integrity": "sha512-OklP5lrmLq8/6TUOLgWc0LndUVvAiTWX5dnyoCFhIUtFW9opWsnCtG/UxPgeuC28Rv2XNbFfft/hEEI39P/4Ag==",
       "dev": true
     },
+    "node_modules/@types/stats.js": {
+      "version": "0.17.4",
+      "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz",
+      "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/three": {
+      "version": "0.181.0",
+      "resolved": "https://registry.npmjs.org/@types/three/-/three-0.181.0.tgz",
+      "integrity": "sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==",
+      "license": "MIT",
+      "dependencies": {
+        "@dimforge/rapier3d-compat": "~0.12.0",
+        "@tweenjs/tween.js": "~23.1.3",
+        "@types/stats.js": "*",
+        "@types/webxr": "*",
+        "@webgpu/types": "*",
+        "fflate": "~0.8.2",
+        "meshoptimizer": "~0.22.0"
+      }
+    },
+    "node_modules/@types/three/node_modules/@tweenjs/tween.js": {
+      "version": "23.1.3",
+      "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz",
+      "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==",
+      "license": "MIT"
+    },
     "node_modules/@types/uni-app": {
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/@types/uni-app/-/uni-app-1.4.4.tgz",
@@ -65,6 +106,12 @@
         "vue": "^2.6.8"
       }
     },
+    "node_modules/@types/webxr": {
+      "version": "0.5.24",
+      "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz",
+      "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==",
+      "license": "MIT"
+    },
     "node_modules/@vue/compiler-sfc": {
       "version": "2.7.10",
       "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.10.tgz",
@@ -76,6 +123,12 @@
         "source-map": "^0.6.1"
       }
     },
+    "node_modules/@webgpu/types": {
+      "version": "0.1.66",
+      "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.66.tgz",
+      "integrity": "sha512-YA2hLrwLpDsRueNDXIMqN9NTzD6bCDkuXbOSe0heS+f8YE8usA6Gbv1prj81pzVHrbaAma7zObnIC+I6/sXJgA==",
+      "license": "BSD-3-Clause"
+    },
     "node_modules/3d-force-graph": {
       "version": "1.79.0",
       "resolved": "https://registry.npmjs.org/3d-force-graph/-/3d-force-graph-1.79.0.tgz",
@@ -352,6 +405,12 @@
         "zrender": "6.0.0"
       }
     },
+    "node_modules/fflate": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
+      "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
+      "license": "MIT"
+    },
     "node_modules/float-tooltip": {
       "version": "1.7.5",
       "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz",
@@ -437,6 +496,12 @@
       "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
       "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
     },
+    "node_modules/meshoptimizer": {
+      "version": "0.22.0",
+      "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz",
+      "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==",
+      "license": "MIT"
+    },
     "node_modules/mpvue-echarts": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/mpvue-echarts/-/mpvue-echarts-1.0.0.tgz",
@@ -558,7 +623,8 @@
     "node_modules/three": {
       "version": "0.181.1",
       "resolved": "https://registry.npmjs.org/three/-/three-0.181.1.tgz",
-      "integrity": "sha512-bz9xZUQMw3pJbjKy7roiwXWgAp+oVUa+4k5o0oBAQ+IFJuru1xzvtk63h6k72XZanXS/SgoEhV6927Vgazyq2w=="
+      "integrity": "sha512-bz9xZUQMw3pJbjKy7roiwXWgAp+oVUa+4k5o0oBAQ+IFJuru1xzvtk63h6k72XZanXS/SgoEhV6927Vgazyq2w==",
+      "license": "MIT"
     },
     "node_modules/three-forcegraph": {
       "version": "1.43.0",

+ 2 - 0
package.json

@@ -1,5 +1,7 @@
 {
   "dependencies": {
+    "@amap/amap-jsapi-loader": "^1.0.1",
+    "@types/three": "^0.181.0",
     "3d-force-graph": "^1.79.0",
     "animate.css": "^4.1.1",
     "echarts": "^6.0.0",

+ 46 - 29
page_subpack/message/message.vue

@@ -1,12 +1,13 @@
 <template>
-	<view class="total-page page-env-20 page-box scroll_content task-bg">
+	<view class="flex-common-css page-box box-bg">
 		<Nav :title="'消息'" :genre="1" is_fixed></Nav>
-		<view class="" :style="{top:`${$tools.topHeight()}px`}">
+		<view class="page-box-bg-fff m-lr20 r-20">
 			<z-tabs ref="tabs" :list="tabsList" :active-style="{color:'#10B261',fontWeight:'bold',fontSize:'30rpx'}"
 				:bar-style="{background:'#10B261'}" :inactive-style="{fontWeight:'bold',fontSize:'28rpx'}"
 				:current="current" :bar-animate-mode="'worm'" @change="tabsChange" />
 		</view>
-		<EnScroll ref="scroll" class="main" @onRefresh="onRefresh" @onScrollBottom="onScrollBottom">
+		<view class="scroll-view-css flex-direction">
+			<!-- <EnScroll ref="scroll" class="main" @onRefresh="onRefresh" @onScrollBottom="onScrollBottom"> -->
 			<view class="m-t20" v-if="list.length <=0">
 				<Enblank :message="'暂无消息'">
 				</Enblank>
@@ -16,7 +17,7 @@
 					v-for="(item,index) in list" :key="index">
 					<view class="icon-box">
 						<view class="read-dot" v-if="item.is_read === 0"></view>
-						<image class="wh-80" :src="getLeftImg(item.type)" mode=""></image>
+						<image class="wh-80 r-circle" :src="item.type" mode=""></image>
 					</view>
 					<view class="flex m-l20">
 						<view class="row-justify-sb center flex">
@@ -30,7 +31,8 @@
 					</view>
 				</view>
 			</view>
-		</EnScroll>
+		</view>
+		<!-- </EnScroll> -->
 
 	</view>
 </template>
@@ -68,24 +70,33 @@
 				}],
 				leftImg: ['task-house', 'task-house', 'task-business', 'task-repayment', 'task-repayment'],
 				iconList: ['task-audit', 'task-do', 'task-stay', 'task-stay', 'task-stay'],
-				list: [],
+				list: [{
+					is_read: 0,
+					type: 'https://copyright.bdstatic.com/vcg/creative/d6c6a351be227d5d3b3e8c1f96f56e50.jpg@h_1280',
+					title: '您有最新的留言',
+					content: '万汇房产',
+					created_date: '2024-10-10 16:24'
+				},
+				{
+					is_read: 0,
+					type: 'https://pic.rmb.bdstatic.com/bjh/3ea195479f8a/250303/f53064611fee7c092312f3b6ea8e439d.jpeg',
+					title: '您有最新的看房留言',
+					content: '万汇房产',
+					created_date: '2024-10-10 16:24'
+				}],
 				page: 1,
 				isEnd: false,
-        isAJAX:false
+				isAJAX: false
 			}
 		},
-		watch: {
-
-
-		},
+		watch: {},
 		mounted() {
-			this.startNotices();
+			// this.startNotices();
 		},
 		methods: {
 			goToInfo(index) {
-
 				let item = this.list[index];
-        console.log(item)
+				console.log(item)
 				if (item.type === 1) {
 					this.list[index].is_read = 1;
 					//跳转详情
@@ -104,19 +115,18 @@
 						uni.navigateTo({
 							url: '/page_task/task_details/task_details?taskId=' + item.relevance_id
 						});
-					}else if(item.type === 3){
-            uni.setStorageSync('taskType',1)
-            uni.switchTab({
-              url: '/pages/task/task'
-            });
-          }else {
+					} else if (item.type === 3) {
+						uni.setStorageSync('taskType', 1)
+						uni.switchTab({
+							url: '/pages/task/task'
+						});
+					} else {
 						//领取列表
 						uni.navigateTo({
 							url: '/page_task/gain_task/gain_task'
 						});
 					}
 				}
-
 			},
 			setRead(index) {
 				setRead({
@@ -138,24 +148,24 @@
 				if (this.isEnd || this.isAJAX) {
 					return;
 				}
-        this.isAJAX=true
+				this.isAJAX = true
 				getNotices({
 					'page': this.page,
 					'type': this.current
 				}).then((res) => {
-          this.isAJAX=false
+					this.isAJAX = false
 					if (res.code === 1) {
 						if (res.data.items.length <= 0) {
 							this.isEnd = true;
 						} else {
 							this.tabsList[1].name = '未读(' + res.data.unreadNum + ')'
-							this.tabsList[1].is_dot =  res.data.unreadNum>0
+							this.tabsList[1].is_dot = res.data.unreadNum > 0
 							res.data.items.forEach((item) => {
 								item.is_del = false;
 								this.list.push(item)
 							})
 							// this.list.push(...res.data)
-              tools.hideLoading()
+							tools.hideLoading()
 						}
 						++this.page;
 					}
@@ -163,14 +173,14 @@
 			},
 			tabsChange(index) {
 				this.current = index;
-        this.startNotices()
+				// this.startNotices()
 			},
 			getLeftImg(index) {
 				return `https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/new-xcx/task/${this.leftImg[index]}.png`
 			},
 			// 下拉刷新
 			onRefresh() {
-        tools.showLoading()
+				tools.showLoading()
 				this.startNotices()
 				setTimeout(() => {
 					this.$refs.scroll.onEndPulling()
@@ -182,7 +192,7 @@
 				// uni.showLoading({
 				// 	title: '数据加载中'
 				// })
-        tools.showLoading()
+				tools.showLoading()
 				this.getNotices()
 				// setTimeout(() => {
 				// 	uni.showToast({
@@ -196,6 +206,12 @@
 	}
 </script>
 <style lang="scss" scoped>
+	.box-bg {
+		background-image: url('https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/new-xcx/task/task-nav-bg.png');
+		background-repeat: no-repeat;
+		background-size: 100% auto;
+	}
+
 	.icon-box {
 		position: relative;
 
@@ -207,6 +223,7 @@
 			position: absolute;
 			top: 0rpx;
 			right: 10rpx;
+			z-index: 9;
 		}
 	}
-</style>
+</style>

+ 61 - 57
page_subpack/personal_details/personal_details.vue

@@ -46,23 +46,24 @@
 				</view>
 			</view>
 		</Nav>
-    <uni-popup ref="popup" type="bottom">
-      <view class="popup-block">
-        <view class="popup-row" @click="camera(1)">拍照</view>
-        <view class="popup-row" @click="camera(2)">从手机里面选择</view>
-        <view class="popup-row" @click="setUploading(false)">取消</view>
-      </view>
-    </uni-popup>
+		<uni-popup ref="popup" type="bottom">
+			<view class="popup-block">
+				<view class="popup-row" @click="camera(1)">拍照</view>
+				<view class="popup-row" @click="camera(2)">从手机里面选择</view>
+				<view class="popup-row" @click="setUploading(false)">取消</view>
+			</view>
+		</uni-popup>
 	</view>
 </template>
 
 <script>
 	import EnInput from "@/components/en-from/en-input/index.vue";
-  import {
-    getMemberInfo, updateMemberInfo
-  } from "@/api/user";
-  import txUploadFile from "@/service/txOssSts";
-  import tools from "@/service/tools";
+	import {
+		getMemberInfo,
+		updateMemberInfo
+	} from "@/api/user";
+	import txUploadFile from "@/service/txOssSts";
+	import tools from "@/service/tools";
 
 	export default {
 		components: {
@@ -83,53 +84,55 @@
 			}
 		},
 		onLoad(options) {
-			this.id = options.id
-			this.title = options.title
-			this.getMemberInfo()
-			uni.$on('updateMemberInfo', () => {
-				this.getMemberInfo()
-			})
+			// this.id = options.id
+			// this.title = options.title
+			// this.getMemberInfo()
+			// uni.$on('updateMemberInfo', () => {
+			// 	this.getMemberInfo()
+			// })
 		},
 		methods: {
-      camera(sourceType) {
-        console.log('chooseMedia接口调试-------------')
-        uni.chooseMedia({
-          mediaType: 'image',
-          count: 1, //默认9
-          sizeType: "compressed",
-          sourceType: [sourceType===1?'camera':'album'],
-          success: (res) => {
-            console.log(res)
-            if(res.tempFiles.length>0){
-              txUploadFile(res.tempFiles[0].tempFilePath).then(( data) => {
-                if(!data){
-                  tools.error('图片上传失败')
-                }else {
-                  this.memberData.head_img=data.Location;
-                  updateMemberInfo({'head_img':this.memberData.head_img}).then((res)=>{
-                    if(res.code===1){
-                      uni.$emit('updateMemberInfo')
-                    }else {
-                      tools.error(res.msg)
-                    }
-                  })
-                  this.setUploading(false);
-                }
+			camera(sourceType) {
+				console.log('chooseMedia接口调试-------------')
+				uni.chooseMedia({
+					mediaType: 'image',
+					count: 1, //默认9
+					sizeType: "compressed",
+					sourceType: [sourceType === 1 ? 'camera' : 'album'],
+					success: (res) => {
+						console.log(res)
+						if (res.tempFiles.length > 0) {
+							txUploadFile(res.tempFiles[0].tempFilePath).then((data) => {
+								if (!data) {
+									tools.error('图片上传失败')
+								} else {
+									this.memberData.head_img = data.Location;
+									updateMemberInfo({
+										'head_img': this.memberData.head_img
+									}).then((res) => {
+										if (res.code === 1) {
+											uni.$emit('updateMemberInfo')
+										} else {
+											tools.error(res.msg)
+										}
+									})
+									this.setUploading(false);
+								}
 
-              })
-            }else {
-              tools.error("请选择上传的图片")
-            }
-          },
-        });
-      },
-      setUploading(showImg){
-        if(showImg){
-          this.$refs.popup.open("bottom");
-        }else {
-          this.$refs.popup.close();
-        }
-      },
+							})
+						} else {
+							tools.error("请选择上传的图片")
+						}
+					},
+				});
+			},
+			setUploading(showImg) {
+				if (showImg) {
+					this.$refs.popup.open("bottom");
+				} else {
+					this.$refs.popup.close();
+				}
+			},
 			getMemberInfo() {
 				getMemberInfo({
 					'type': 2
@@ -158,7 +161,8 @@
 </script>
 
 <style lang="scss" scoped>
-@import "@/static/css/wh-common";
+	@import "@/static/css/wh-common";
+
 	.is-hovers {
 		background-color: #e5e5e5e5;
 	}

+ 1 - 2
page_subpack/system_setting/system_setting.vue

@@ -99,7 +99,7 @@
 		onLoad(options) {
 			this.id = options.id * 1
 			this.title = options.title
-			this.getMemberInfo()
+			// this.getMemberInfo()
 		},
 		methods: {
 			getMemberInfo() {
@@ -112,7 +112,6 @@
 				})
 			},
 			updateMemberInfo() {
-
 				updateMemberInfo(this.memberData).then((res) => {
 					if (res.code === 0) {
 						tools.success('设置成功')

+ 196 - 193
page_subpack/transition/to_excel.vue

@@ -1,205 +1,208 @@
 <template>
-  <view class="total-page page-box page-env-20 scroll_content task-bg">
-    <Nav title="转换工具" :genre="1" is_fixed></Nav>
-    <view class="header-filter">
-      <view class="row-justify-sb center  m-20">
-        <view class="subsection">
-          <uv-subsection :list="tabsDate" :bgColor="'#FFF'" :barBg="'#0FB160'" :activeColor="'#fff'"
-                         :inactiveColor="'#0FB160'" :fontSize="14" custom-style="height: 70rpx;border-radius: 30rpx;"
-                         custom-item-style="border-radius: 30rpx;" :current="subCurrent"
-                         @change="onSubChange"></uv-subsection>
-        </view>
-        <view class="row credit_earch center sys-background-fff r-30 p-l16">
-          <uni-icons type="search" size="18" color="#999"></uni-icons>
-          <input class="flex m-l10 m-r20 size-28 sys-background-fff" type="text" placeholder="搜索文件名称"
-                 placeholder-style="font-size:28rpx;color:#999" v-model="value" @change="startList" />
-        </view>
-      </view>
-      <view style="height: 100rpx;">
-        <z-tabs ref="tabs" :list="tabsList" :active-style="{color:'#10B261',fontWeight:'bold',fontSize:'28rpx'}"
-                :bar-style="{background:'#10B261'}" :inactive-style="{fontWeight:'bold',fontSize:'28rpx'}"
-                :current="current" :bar-animate-mode="'worm'" @change="tabsChange" />
-      </view>
-    </view>
-    <EnScroll ref="scroll" :navHeight="navHeight" is_tabHeight @onRefresh="onRefresh"
-              @onScrollBottom="onScrollBottom">
-      <CreditItem :list="list"></CreditItem>
-    </EnScroll>
-    <view class="fixed-button p-t20 p-lr30">
-      <button class="en-button button-background sys-weight-500 row-justify-c center" type="default"
-              hover-class="is-hover" @click="addPdf">
-<!--        <image class="wh-36 m-lr16" src="/static/img/task/task-phone.png" mode="aspectFill"></image>-->
-        添加转换文件
-      </button>
-    </view>
-    <uni-popup ref="popup" type="bottom">
-      <view class="page-env-160 sys-background-fff r-20">
-        <view class="row-justify-sb center p-lr30 p-t30">
-          <view class="wh-25"></view>
-          <text class="size-30 sys-weight-600">添加文件</text>
-          <image class="wh-25" src="/page_subpack/static/img/task-details/close.png" mode="" @click="endAdd(true)">
-          </image>
-        </view>
-        <add-file @newMsg="endAdd" :is_multifile="false"></add-file>
-      </view>
+	<view class="total-page page-box page-env-20 scroll_content task-bg">
+		<Nav title="转换工具" :genre="1" is_fixed></Nav>
+		<view class="header-filter">
+			<view class="row-justify-sb center  m-20">
+				<view class="subsection">
+					<uv-subsection :list="tabsDate" :bgColor="'#FFF'" :barBg="'#0FB160'" :activeColor="'#fff'"
+						:inactiveColor="'#0FB160'" :fontSize="14" custom-style="height: 70rpx;border-radius: 30rpx;"
+						custom-item-style="border-radius: 30rpx;" :current="subCurrent"
+						@change="onSubChange"></uv-subsection>
+				</view>
+				<view class="row credit_earch center sys-background-fff r-30 p-l16">
+					<uni-icons type="search" size="18" color="#999"></uni-icons>
+					<input class="flex m-l10 m-r20 size-28 sys-background-fff" type="text" placeholder="搜索文件名称"
+						placeholder-style="font-size:28rpx;color:#999" v-model="value" @change="startList" />
+				</view>
+			</view>
+			<view style="height: 100rpx;">
+				<z-tabs ref="tabs" :list="tabsList" :active-style="{color:'#10B261',fontWeight:'bold',fontSize:'28rpx'}"
+					:bar-style="{background:'#10B261'}" :inactive-style="{fontWeight:'bold',fontSize:'28rpx'}"
+					:current="current" :bar-animate-mode="'worm'" @change="tabsChange" />
+			</view>
+		</view>
+		<EnScroll ref="scroll" :navHeight="navHeight" is_tabHeight @onRefresh="onRefresh"
+			@onScrollBottom="onScrollBottom">
+			<CreditItem :list="list"></CreditItem>
+		</EnScroll>
+		<view class="fixed-button p-t20 p-lr30">
+			<button class="en-button button-background sys-weight-500 row-justify-c center" type="default"
+				hover-class="is-hover" @click="addPdf">
+				<!--        <image class="wh-36 m-lr16" src="/static/img/task/task-phone.png" mode="aspectFill"></image>-->
+				添加转换文件
+			</button>
+		</view>
+		<uni-popup ref="popup" type="bottom">
+			<view class="page-env-160 sys-background-fff r-20">
+				<view class="row-justify-sb center p-lr30 p-t30">
+					<view class="wh-25"></view>
+					<text class="size-30 sys-weight-600">添加文件</text>
+					<image class="wh-25" src="/page_subpack/static/img/task-details/close.png" mode=""
+						@click="endAdd(true)">
+					</image>
+				</view>
+				<add-file @newMsg="endAdd" :is_multifile="false"></add-file>
+			</view>
 
-    </uni-popup>
-  </view>
+		</uni-popup>
+	</view>
 </template>
 <script>
-import CreditItem from "./components/credit-item.vue";
-import tools from "@/service/tools";
-import AddFile from "@/page_subpack/transition/components/add-file.vue";
-import {getTransferList} from "@/api/transfer";
+	import CreditItem from "./components/credit-item.vue";
+	import tools from "@/service/tools";
+	import AddFile from "@/page_subpack/transition/components/add-file.vue";
+	import {
+		getTransferList
+	} from "@/api/transfer";
 
-export default {
-  components: {
-    AddFile,
-    CreditItem,
-  },
-  data() {
-    return {
-      value: '',
-      current: 0,
-      navHeight: 0,
-      swiperCurrent: 0,
-      tabsList: [{
-        name: '全部',
-        dot_color: 'red',
-        disabled: false,
-        'id': 0,
-      }, {
-        name: '待转换',
-        dot_color: 'yellow',
-        disabled: false,
-        'id': 1,
-      }, {
-        'id': 2,
-        name: '转换中',
-        dot_color: '',
-        disabled: false
-      }, {
-        'id': 3,
-        name: '已完成',
-        dot_color: '',
-        disabled: false
-      }, {
-        'id': 4,
-        name: '已完成',
-        dot_color: '',
-        disabled: false
-      }],
-      subCurrent: 0,
-      tabsDate: ['全部', '当日', '本周'],
-      list: [],
-      page: 1,
-      total: null,
-      isAjax: false,
+	export default {
+		components: {
+			AddFile,
+			CreditItem,
+		},
+		data() {
+			return {
+				value: '',
+				current: 0,
+				navHeight: 0,
+				swiperCurrent: 0,
+				tabsList: [{
+					name: '全部',
+					dot_color: 'red',
+					disabled: false,
+					'id': 0,
+				}, {
+					name: '待转换',
+					dot_color: 'yellow',
+					disabled: false,
+					'id': 1,
+				}, {
+					'id': 2,
+					name: '转换中',
+					dot_color: '',
+					disabled: false
+				}, {
+					'id': 3,
+					name: '已完成',
+					dot_color: '',
+					disabled: false
+				}, {
+					'id': 4,
+					name: '已完成',
+					dot_color: '',
+					disabled: false
+				}],
+				subCurrent: 0,
+				tabsDate: ['全部', '当日', '本周'],
+				list: [],
+				page: 1,
+				total: null,
+				isAjax: false,
 
-    }
-  },
-  onReady() {
-    this.getFilterHeight()
-  },
-  onLoad() {},
-  mounted() {
-    this.startList()
-  },
-  methods: {
-    addPdf(){
-      this.$refs.popup.open('bottom')
-    },
-    endAdd(type){
-      this.$refs.popup.close('bottom')
-      if(!type)this.startList()
-    },
-    startList() {
-      this.list = []
-      this.page = 1
-      this.scrollTop = 0
-      this.total = null
-      this.isAjax = false
-      this.getTransferList()
-    },
-    getTransferList() {
-      if (this.isAjax || this.list.length === this.total) {
-        return
-      }
-      getTransferList({
-        'status': this.current,
-        'dateType': this.subCurrent,
-        'text': this.value,
-      }).then(res => {
-        if (res.code === 1) {
-          this.list.push(...res.data.items)
-          this.total = res.data.total
-        } else {
-          tools.error(res.msg)
-        }
-        this.isAjax = false
-      })
-    },
-    tabsChange(index) {
-      if (index !== this.current) {
-        this.current = index;
-        this.startList()
-      }
-    },
-    onSubChange(current) {
-      this.subCurrent = current
-    },
-    // 下拉刷新
-    onRefresh() {
-      console.log('下拉刷新');
-      setTimeout(() => {
-        this.$refs.scroll.onEndPulling()
-      }, 500)
-    },
-    // 滚动到底部
-    onScrollBottom() {
-      console.log('滚动到底部');
-    },
-    getFilterHeight() {
-      const query = uni.createSelectorQuery().in(this);
-      query.select('.header-filter').boundingClientRect(data => {
-        if (data) {
-          console.log(data.height);
-          this.navHeight = data.height
-        }
-      }).exec();
-    }
-  },
-}
+			}
+		},
+		onReady() {
+			// this.getFilterHeight()
+		},
+		onLoad() {},
+		mounted() {
+			// this.startList()
+		},
+		methods: {
+			addPdf() {
+				this.$refs.popup.open('bottom')
+			},
+			endAdd(type) {
+				this.$refs.popup.close('bottom')
+				if (!type) this.startList()
+			},
+			startList() {
+				this.list = []
+				this.page = 1
+				this.scrollTop = 0
+				this.total = null
+				this.isAjax = false
+				this.getTransferList()
+			},
+			getTransferList() {
+				if (this.isAjax || this.list.length === this.total) {
+					return
+				}
+				getTransferList({
+					'status': this.current,
+					'dateType': this.subCurrent,
+					'text': this.value,
+				}).then(res => {
+					if (res.code === 1) {
+						this.list.push(...res.data.items)
+						this.total = res.data.total
+					} else {
+						tools.error(res.msg)
+					}
+					this.isAjax = false
+				})
+			},
+			tabsChange(index) {
+				if (index !== this.current) {
+					this.current = index;
+					this.startList()
+				}
+			},
+			onSubChange(current) {
+				this.subCurrent = current
+			},
+			// 下拉刷新
+			onRefresh() {
+				console.log('下拉刷新');
+				setTimeout(() => {
+					this.$refs.scroll.onEndPulling()
+				}, 500)
+			},
+			// 滚动到底部
+			onScrollBottom() {
+				console.log('滚动到底部');
+			},
+			getFilterHeight() {
+				const query = uni.createSelectorQuery().in(this);
+				query.select('.header-filter').boundingClientRect(data => {
+					if (data) {
+						console.log(data.height);
+						this.navHeight = data.height
+					}
+				}).exec();
+			}
+		},
+	}
 </script>
 <style lang="scss" scoped>
-.subsection {
-  width: 430rpx;
-}
+	.subsection {
+		width: 430rpx;
+	}
 
-.credit_earch {
-  width: 250rpx;
-  height: 69rpx;
-}
+	.credit_earch {
+		width: 250rpx;
+		height: 69rpx;
+	}
 
-.en-button {
-  color: #fff;
-  font-size: 30rpx;
-  border: 1rpx solid #0FB160 !important;
-  line-height: 80rpx;
-  border-radius: 100rpx;
-  background-color: #0FB160;
-}
+	.en-button {
+		color: #fff;
+		font-size: 30rpx;
+		border: 1rpx solid #0FB160 !important;
+		line-height: 80rpx;
+		border-radius: 100rpx;
+		background-color: #0FB160;
+	}
 
-.fixed-button {
-  position: fixed;
-  bottom: 0;
-  z-index: 10;
-  background: #fff;
-  width: calc(100% - 60rpx);
-  padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
-}
+	.fixed-button {
+		position: fixed;
+		bottom: 0;
+		z-index: 10;
+		background: #fff;
+		width: calc(100% - 60rpx);
+		padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
+	}
 
-button::after {
-  border: none;
-}
-</style>
+	button::after {
+		border: none;
+	}
+</style>

+ 0 - 27
page_task/graph/index.vue

@@ -1,27 +0,0 @@
-<template>
-  <view class="container">
-
-  </view>
-</template>
-
-<script>
-
-
-export default {
-  components: {
-
-  },
-  data() {
-    return {
-
-    }
-  },
-  methods: {
-
-  }
-}
-</script>
-
-<style scoped>
-
-</style>

+ 228 - 0
page_task/task_details/module/entities.vue

@@ -0,0 +1,228 @@
+<template>
+	<view class="m-20">
+    <view class="title-box p-b20">
+      <view class="size-32 sys-weight-600">债务</view>
+      <view class="size-20 title-num">{{stageList.length}}</view>
+    </view>
+    <view class="row-c r-20 sys-background-fff m-b20" v-for="(item,index) in stageList" :key="index">
+      <view class="file-box r-20">
+        <view class="file-data">
+          <view class="file-icon" style="background-color:#FC526A " >
+            <uni-icons type="calendar" color="#fff" size="20"></uni-icons>
+          </view>
+          <view>
+            <view class="attachment-text">{{item.attachmentName}}</view>
+            <view class="size-26 text-color-333 m-t20"><text class="text-icon">活跃</text><text>¥116,5710</text></view>
+          </view>
+        </view>
+        <view>
+          <uni-icons type="right" size="20"></uni-icons>
+        </view>
+
+      </view>
+    </view>
+
+    <view class="title-box p-b20">
+      <view class="size-32 sys-weight-600">借款人</view>
+      <view class="size-20 title-num">{{oneList.length}}</view>
+    </view>
+    <view class="row-c r-20 sys-background-fff m-b20" v-for="(item,index) in oneList" :key="index">
+      <view class="file-box r-20">
+        <view class="file-data">
+          <view class="file-icon" style="background-color:#9335FF " >
+            <uni-icons type="calendar" color="#fff" size="20"></uni-icons>
+          </view>
+          <view>
+            <view class="attachment-text">{{item.attachmentName}}</view>
+            <view class="size-26 text-color-333 m-t20"><text class="text-icon">活跃</text></view>
+          </view>
+        </view>
+        <view>
+          <uni-icons type="right" size="20"></uni-icons>
+        </view>
+
+      </view>
+    </view>
+
+    <view class="title-box p-b20">
+      <view class="size-32 sys-weight-600">担保人</view>
+      <view class="size-20 title-num">{{twoList.length}}</view>
+    </view>
+    <view class="row-c r-20 sys-background-fff m-b20" v-for="(item,index) in twoList" :key="index">
+      <view class="file-box r-20">
+        <view class="file-data">
+          <view class="file-icon" style="background-color:#009BF2 " >
+            <uni-icons type="calendar" color="#fff" size="20"></uni-icons>
+          </view>
+          <view>
+            <view class="attachment-text">{{item.attachmentName}}</view>
+            <view class="size-26 text-color-333 m-t20"><text class="text-icon">活跃</text></view>
+          </view>
+        </view>
+        <view>
+          <uni-icons type="right" size="20"></uni-icons>
+        </view>
+
+      </view>
+    </view>
+
+    <view class="title-box p-b20">
+      <view class="size-32 sys-weight-600">抵押物</view>
+      <view class="size-20 title-num">{{threeList.length}}</view>
+    </view>
+    <view class="row-c r-20 sys-background-fff m-b20" v-for="(item,index) in threeList" :key="index">
+      <view class="file-box r-20">
+        <view class="file-data">
+          <view class="file-icon" style="background-color:#00B05E " >
+            <uni-icons type="calendar" color="#fff" size="20"></uni-icons>
+          </view>
+          <view>
+            <view class="attachment-text">{{item.attachmentName}}</view>
+            <view class="size-26 text-color-333 m-t20"><text class="text-icon">活跃</text></view>
+          </view>
+        </view>
+        <view>
+          <uni-icons type="right" size="20"></uni-icons>
+        </view>
+
+      </view>
+    </view>
+
+    <view class="title-box p-b20">
+      <view class="size-32 sys-weight-600">债权人</view>
+      <view class="size-20 title-num">{{fourList.length}}</view>
+    </view>
+    <view class="row-c r-20 sys-background-fff m-b20" v-for="(item,index) in fourList" :key="index">
+      <view class="file-box r-20">
+        <view class="file-data">
+          <view class="file-icon" style="background-color:#FF7E00 " >
+            <uni-icons type="calendar" color="#fff" size="20"></uni-icons>
+          </view>
+          <view>
+            <view class="attachment-text">{{item.attachmentName}}</view>
+            <view class="size-26 text-color-333 m-t20"><text class="text-icon">活跃</text></view>
+          </view>
+        </view>
+        <view>
+          <uni-icons type="right" size="20"></uni-icons>
+        </view>
+
+      </view>
+    </view>
+
+
+	</view>
+</template>
+
+<script>
+
+  export default {
+    name:'entities',
+		props: {
+      businessId:{
+        default:0
+      }
+		},
+		data() {
+			return {
+        stageList: [],
+        oneList: [],
+        twoList: [],
+        threeList: [],
+        fourList: [],
+			}
+		},
+    watch:{
+      'businessId':function () {
+        // this.getStageList()
+      }
+    },
+    mounted() {
+      this.getStageList()
+    },
+    methods: {
+      getStageList() {
+        this.stageList=[{'attachmentName':'大连迈世未履行(2024)辽0211民初2861号民事判决书','attachmentFormat':'docx','attachmentSize':1165710},]
+        this.oneList=[{'attachmentName':'大连迈世农业发展有限公司','attachmentFormat':'docx','attachmentSize':1165710},]
+        this.twoList=[{'attachmentName':'迈世集团有限公司','attachmentFormat':'docx','attachmentSize':1165710},]
+        this.fourList=[{'attachmentName':'迈世集团有限公司','attachmentFormat':'docx','attachmentSize':1165710},]
+        this.threeList=[{'attachmentName':'中信银行股份有限公司大连分行','attachmentFormat':'docx','attachmentSize':1165710},{'attachmentName':'景山东园7号13层2号房屋','attachmentFormat':'docx','attachmentSize':1165710},]
+      },
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+  .title-box{
+    display:  flex;
+    justify-content: space-between;
+    align-items: center;
+    .title-num{
+      color: #ee9393;
+      background-color: #f6e8c4;
+      padding: 4rpx 16rpx;
+      border-radius: 12rpx;
+    }
+  }
+  .file-box{
+    box-shadow: 0 2rpx 6rpx 0  #0000001a, 0 2rpx 2px -2rpx  #0000001a;
+    width: 100%;
+    padding: 32rpx;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    .file-data{
+      display: flex;
+      justify-content: flex-start;
+      .attachment-text{
+        width: 410rpx;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+      .file-icon{
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        width: 96rpx;
+        height: 96rpx;
+        border-radius: 20rpx;
+        margin-right: 32rpx;
+        background-color: #FA4C78;
+      }
+      .text-icon{
+        padding: 4rpx 8rpx;
+        background-color: #DBFCE7;
+        color: #008236;
+        font-weight: 400;
+        font-size: 24rpx;
+        margin-right: 10rpx;
+      }
+      .file-icon-pdf{
+        background-color: #9033FF;
+      }
+      .file-icon-excel{
+        background-color:#00A5EC;
+      }
+      .file-icon-excel{
+        background-color:#00A762;
+      }
+      .file-icon-excel{
+        background-color:#FF7F00;
+      }
+      .file-icon-excel{
+        background-color:#8440FD;
+      }
+    }
+  }
+	.steps-item:last-child {
+		margin-bottom: 0;
+	}
+
+	.steps-line {
+		width: 2rpx;
+		background-color: #D9D9D9;
+		height: 90rpx;
+	}
+
+</style>

+ 638 - 0
page_task/task_details/module/graph.vue

@@ -0,0 +1,638 @@
+<template>
+  <view class="graph-container r-20">
+    <view class="canvas-wrapper r-20">
+      <canvas
+          canvas-id="graphCanvas"
+          class="graph-canvas r-20"
+          @touchstart="onTouchStart"
+          @touchmove="onTouchMove"
+          @touchend="onTouchEnd"
+      ></canvas>
+    </view>
+
+    <!-- 控制面板 -->
+<!--    <view class="control-panel">-->
+<!--      <view class="control-group">-->
+<!--        <text class="control-label">布局算法:</text>-->
+<!--        <picker @change="onLayoutChange" :value="layoutIndex" :range="layoutOptions">-->
+<!--          <view class="picker">{{ layoutOptions[layoutIndex] }}</view>-->
+<!--        </picker>-->
+<!--      </view>-->
+
+<!--      <view class="control-group">-->
+<!--        <text class="control-label">显示标签:</text>-->
+<!--        <switch :checked="showLabels" @change="toggleLabels" />-->
+<!--      </view>-->
+
+<!--      <view class="button-group">-->
+<!--        <button class="btn primary" @tap="addRandomNode">添加节点</button>-->
+<!--        <button class="btn secondary" @tap="resetView">重置视图</button>-->
+<!--        <button class="btn warning" @tap="exportData">导出数据</button>-->
+<!--      </view>-->
+<!--    </view>-->
+
+    <!-- 节点信息面板 -->
+<!--    <view v-if="selectedNode" class="node-info-panel">-->
+<!--      <view class="panel-header">-->
+<!--        <text class="panel-title">节点详情</text>-->
+<!--        <text class="close-btn" @tap="deselectNode">×</text>-->
+<!--      </view>-->
+<!--      <view class="node-details">-->
+<!--        <view class="detail-item">-->
+<!--          <text class="detail-label">名称:</text>-->
+<!--          <text class="detail-value">{{ selectedNode.name }}</text>-->
+<!--        </view>-->
+<!--        <view class="detail-item">-->
+<!--          <text class="detail-label">ID:</text>-->
+<!--          <text class="detail-value">{{ selectedNode.id }}</text>-->
+<!--        </view>-->
+<!--        <view class="detail-item">-->
+<!--          <text class="detail-label">类型:</text>-->
+<!--          <text class="detail-value">{{ selectedNode.type }}</text>-->
+<!--        </view>-->
+<!--        <view class="detail-item">-->
+<!--          <text class="detail-label">连接数:</text>-->
+<!--          <text class="detail-value">{{ getNodeDegree(selectedNode) }}</text>-->
+<!--        </view>-->
+<!--      </view>-->
+<!--    </view>-->
+
+
+    <!-- 统计信息 -->
+    <view class="stats-panel">
+      <view class="stats-box"> <view class="stats-icon-debt stats-icon"></view>  <text class="stat-item">债务</text></view>
+      <view class="stats-box"> <view class="stats-icon-borrower stats-icon"></view>  <text class="stat-item">借款人</text></view>
+      <view class="stats-box"> <view class="stats-icon-guarantor stats-icon"></view>  <text class="stat-item">担保人</text></view>
+      <view class="stats-box"> <view class="stats-icon-collateral stats-icon"></view>  <text class="stat-item">抵押物</text></view>
+<!--      <view class="stats-box"> <view class="stats-icon-company stats-icon"></view>  <text class="stat-item">借款人</text></view>-->
+<!--      <view class="stats-box"> <view class="stats-icon-g stats-icon"></view>  <text class="stat-item">法院</text></view>-->
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name:'graph',
+  data() {
+    return {
+      ctx: null,
+      canvasWidth: 750,
+      canvasHeight: 500,
+      graphData: {
+        nodes: [],
+        links: []
+      },
+      selectedNode: null,
+      hoveredNode: null,
+      showLabels: true,
+      layoutIndex: 2,
+      layoutOptions: ['力导向布局', '环形布局', '树状布局'],
+      isDragging: false,
+      dragStartX: 0,
+      dragStartY: 0,
+      offsetX: 0,
+      offsetY: 0,
+      scale: 1,
+      animationId: null
+    }
+  },
+
+  onUnload() {
+    this.stopAnimation();
+  },
+  mounted() {
+    this.initCanvas();
+    this.initGraphData();
+    this.startAnimation();
+  },
+  methods: {
+    initCanvas() {
+      this.ctx = uni.createCanvasContext('graphCanvas', this);
+
+      // 获取系统信息设置Canvas尺寸
+      const systemInfo = uni.getSystemInfoSync();
+      this.canvasWidth = systemInfo.windowWidth;
+      this.canvasHeight = systemInfo.windowHeight * 0.6;
+    },
+
+    initGraphData() {
+      // 示例数据
+      this.graphData = {
+        nodes: [
+          { id: 'node1', name: '债务', type: 'center', x: 275, y: 150, size: 20, color: '#ff6b35' },
+          { id: 'node2', name: '大连迈世农业发展有限公司', type: 'user', x: 275, y: 150, size: 15, color: '#8b5cf6' },
+          { id: 'node3', name: '迈世集团有限公司', type: 'product', x: 275, y: 150, size: 15, color: '#3b82f6' },
+          { id: 'node4', name: '宜居园81号2单元1层1号房屋', type: 'category', x: 275, y: 150, size: 15, color: '#10b981' },
+          { id: 'node6', name: '景山东园7号13层2号房屋', type: 'category', x: 275, y: 150, size: 15, color: '#10b981' },
+          { id: 'node5', name: '中信银行股份有限公司大连分行', type: 'service', x: 275, y: 150, size: 15, color: '#6366f1' }
+        ],
+        links: [
+          { source: 'node1', target: 'node2' },
+          { source: 'node1', target: 'node3' },
+          { source: 'node1', target: 'node4' },
+          { source: 'node1', target: 'node5' },
+          { source: 'node1', target: 'node6' },
+          { source: 'node2', target: 'node4' },
+          { source: 'node3', target: 'node6' },
+        ]
+      };
+    },
+
+    startAnimation() {
+      const animate = () => {
+        this.updateLayout();
+        this.drawGraph();
+        // this.animationId = requestAnimationFrame(animate);
+      };
+      animate();
+    },
+
+    stopAnimation() {
+      if (this.animationId) {
+        cancelAnimationFrame(this.animationId);
+      }
+    },
+
+    updateLayout() {
+      // 简单的力导向布局模拟
+      if (this.layoutIndex === 0) {
+        this.applyForceDirectedLayout();
+      } else if (this.layoutIndex === 1) {
+        this.applyCircularLayout();
+      } else if (this.layoutIndex === 2) {
+        this.applyTreeLayout();
+      }
+    },
+
+    applyForceDirectedLayout() {
+      const centerX = this.canvasWidth / 2 + this.offsetX;
+      const centerY = this.canvasHeight / 2 + this.offsetY;
+
+      // 简化的力导向布局
+      this.graphData.nodes.forEach((node, i) => {
+        if (node.id === 'node1') {
+          // 中心节点保持在中心
+          node.x = centerX;
+          node.y = centerY;
+          return;
+        }
+
+        // 向中心节点的引力
+        const centerNode = this.graphData.nodes[0];
+        const dx = centerNode.x - node.x;
+        const dy = centerNode.y - node.y;
+        const distance = Math.sqrt(dx * dx + dy * dy);
+
+        if (distance > 0) {
+          const force = 0.1;
+          node.x += dx * force;
+          node.y += dy * force;
+        }
+
+        // 节点间的斥力
+        this.graphData.nodes.forEach((otherNode, j) => {
+          if (i !== j) {
+            const dx = node.x - otherNode.x;
+            const dy = node.y - otherNode.y;
+            const distance = Math.sqrt(dx * dx + dy * dy);
+
+            if (distance > 0 && distance < 100) {
+              const force = 50 / (distance * distance);
+              node.x += dx * force * 0.1;
+              node.y += dy * force * 0.1;
+            }
+          }
+        });
+      });
+    },
+
+    applyCircularLayout() {
+      const centerX = this.canvasWidth / 2 + this.offsetX;
+      const centerY = this.canvasHeight / 2 + this.offsetY;
+      const radius = 150;
+
+      this.graphData.nodes.forEach((node, i) => {
+        if (node.id === 'node1') {
+          node.x = centerX;
+          node.y = centerY;
+        } else {
+          const angle = ((i - 1) / (this.graphData.nodes.length - 1)) * Math.PI * 2;
+          node.x = centerX + Math.cos(angle) * radius;
+          node.y = centerY + Math.sin(angle) * radius;
+        }
+      });
+    },
+
+    applyTreeLayout() {
+      const centerX = this.canvasWidth / 2 + this.offsetX;
+      const centerY = this.canvasHeight / 2 + this.offsetY;
+
+      this.graphData.nodes.forEach((node, i) => {
+        if (node.id === 'node1') {
+          node.x = centerX;
+          node.y = centerY;
+        } else {
+          const angle = ((i - 1) / (this.graphData.nodes.length - 1)) * Math.PI * 2;
+          const radius = 120;
+          node.x = centerX + Math.cos(angle) * radius;
+          node.y = centerY + Math.sin(angle) * radius;
+        }
+      });
+    },
+
+    drawGraph() {
+      if (!this.ctx) return;
+
+      // 清空画布
+      this.ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
+
+      // 设置缩放
+      this.ctx.scale(this.scale, this.scale);
+
+      // 绘制连接线
+      this.drawLinks();
+
+      // 绘制节点
+      this.drawNodes();
+
+      // 绘制标签
+      if (this.showLabels) {
+        this.drawLabels();
+      }
+
+      this.ctx.draw();
+    },
+
+    drawLinks() {
+      this.graphData.links.forEach(link => {
+        const sourceNode = this.graphData.nodes.find(n => n.id === link.source);
+        const targetNode = this.graphData.nodes.find(n => n.id === link.target);
+
+        if (sourceNode && targetNode) {
+          const isHighlighted = this.isLinkHighlighted(link);
+
+          this.ctx.beginPath();
+          this.ctx.moveTo(sourceNode.x, sourceNode.y);
+          this.ctx.lineTo(targetNode.x, targetNode.y);
+          this.ctx.strokeStyle = isHighlighted ? '#ff6b6b' : '#cccccc';
+          this.ctx.lineWidth = isHighlighted ? 3 : 2;
+          this.ctx.stroke();
+        }
+      });
+    },
+
+    drawNodes() {
+      this.graphData.nodes.forEach(node => {
+        const isSelected = this.selectedNode && this.selectedNode.id === node.id;
+        const isHovered = this.hoveredNode && this.hoveredNode.id === node.id;
+        const isHighlighted = isSelected || isHovered || this.isNodeConnected(node);
+
+        // 绘制节点
+        this.ctx.beginPath();
+        this.ctx.arc(node.x, node.y, isHighlighted ? node.size + 3 : node.size, 0, 2 * Math.PI);
+        this.ctx.fillStyle = node.color;
+        this.ctx.fill();
+
+        // 绘制边框
+        this.ctx.strokeStyle = isHighlighted ? '#ffffff' : node.color;
+        this.ctx.lineWidth = isHighlighted ? 3 : 2;
+        this.ctx.stroke();
+      });
+    },
+
+    drawLabels() {
+      this.graphData.nodes.forEach(node => {
+        this.ctx.setFontSize(12);
+        this.ctx.setFillStyle('#333333');
+        this.ctx.setTextAlign('center');
+        this.ctx.fillText(node.name, node.x, node.y - node.size - 8);
+      });
+    },
+
+    isNodeConnected(node) {
+      if (!this.selectedNode && !this.hoveredNode) return false;
+
+      const targetNode = this.selectedNode || this.hoveredNode;
+      return this.graphData.links.some(link =>
+          (link.source === node.id && link.target === targetNode.id) ||
+          (link.target === node.id && link.source === targetNode.id)
+      );
+    },
+
+    isLinkHighlighted(link) {
+      if (!this.selectedNode && !this.hoveredNode) return false;
+
+      const targetNode = this.selectedNode || this.hoveredNode;
+      return link.source === targetNode.id || link.target === targetNode.id;
+    },
+
+    getNodeDegree(node) {
+      return this.graphData.links.filter(link =>
+          link.source === node.id || link.target === node.id
+      ).length;
+    },
+
+    onTouchStart(e) {
+      this.isDragging = true;
+      this.dragStartX = e.touches[0].x;
+      this.dragStartY = e.touches[0].y;
+
+      // 检测点击的节点
+      const touchX = e.touches[0].x / this.scale;
+      const touchY = e.touches[0].y / this.scale;
+      this.selectedNode = this.getNodeAtPosition(touchX, touchY);
+      if (this.selectedNode) {
+        this.$emit('setNode',this.selectedNode)
+        // uni.vibrateShort(); // 触觉反馈
+      }
+    },
+
+    onTouchMove(e) {
+      if (!this.isDragging) return;
+
+      const touchX = e.touches[0].x;
+      const touchY = e.touches[0].y;
+
+      if (this.selectedNode) {
+        // 拖动节点
+        this.selectedNode.x = touchX / this.scale;
+        this.selectedNode.y = touchY / this.scale;
+      } else {
+        // 拖动画布
+        const deltaX = touchX - this.dragStartX;
+        const deltaY = touchY - this.dragStartY;
+
+        this.offsetX += deltaX;
+        this.offsetY += deltaY;
+
+        this.dragStartX = touchX;
+        this.dragStartY = touchY;
+      }
+    },
+
+    onTouchEnd() {
+      this.isDragging = false;
+      this.hoveredNode = null;
+    },
+
+    getNodeAtPosition(x, y) {
+      for (let i = this.graphData.nodes.length - 1; i >= 0; i--) {
+        const node = this.graphData.nodes[i];
+        const distance = Math.sqrt(Math.pow(node.x - x, 2) + Math.pow(node.y - y, 2));
+        if (distance <= node.size + 5) {
+          return node;
+        }
+      }
+      return null;
+    },
+
+    onLayoutChange(e) {
+      this.layoutIndex = parseInt(e.detail.value);
+      this.resetView();
+    },
+
+    toggleLabels(e) {
+      this.showLabels = e.detail.value;
+    },
+
+    addRandomNode() {
+      const nodeTypes = ['user', 'product', 'category', 'service'];
+      const colors = ['#4ecdc4', '#45b7d1', '#96ceb4', '#feca57'];
+
+      const newNode = {
+        id: `node${this.graphData.nodes.length + 1}`,
+        name: `新节点${this.graphData.nodes.length}`,
+        type: nodeTypes[Math.floor(Math.random() * nodeTypes.length)],
+        x: Math.random() * this.canvasWidth,
+        y: Math.random() * this.canvasHeight,
+        size: 12 + Math.random() * 8,
+        color: colors[Math.floor(Math.random() * colors.length)]
+      };
+
+      this.graphData.nodes.push(newNode);
+
+      // 连接到随机现有节点
+      if (this.graphData.nodes.length > 1) {
+        const randomIndex = Math.floor(Math.random() * (this.graphData.nodes.length - 1));
+        this.graphData.links.push({
+          source: newNode.id,
+          target: this.graphData.nodes[randomIndex].id
+        });
+      }
+    },
+
+    resetView() {
+      this.offsetX = 0;
+      this.offsetY = 0;
+      this.scale = 1;
+      this.selectedNode = null;
+    },
+
+    deselectNode() {
+      this.selectedNode = null;
+    },
+
+    exportData() {
+      const exportData = {
+        nodes: this.graphData.nodes,
+        links: this.graphData.links
+      };
+
+      uni.showModal({
+        title: '导出数据',
+        content: JSON.stringify(exportData, null, 2),
+        showCancel: false,
+        confirmText: '确定'
+      });
+    }
+  }
+}
+</script>
+
+<style scoped>
+.graph-container {
+  display: flex;
+  flex-direction: column;
+  height: calc(100vh - 295px);
+  background: #f5f5f5;
+  margin: 0 20rpx ;
+  border-radius: 50rpx;
+}
+
+.canvas-wrapper {
+  flex: 1;
+  background: white;
+  position: relative;
+}
+
+.graph-canvas {
+  width: 100%;
+  height: 100%;
+  display: block;
+}
+
+.control-panel {
+  background: white;
+  padding: 20rpx;
+  border-top: 1rpx solid #eee;
+}
+
+.control-group {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 20rpx;
+  padding: 15rpx 0;
+}
+
+.control-label {
+  font-size: 28rpx;
+  color: #333;
+}
+
+.picker {
+  background: #f0f0f0;
+  padding: 10rpx 20rpx;
+  border-radius: 8rpx;
+  font-size: 26rpx;
+}
+
+.button-group {
+  display: flex;
+  justify-content: space-between;
+}
+
+.btn {
+  flex: 1;
+  margin: 0 10rpx;
+  padding: 20rpx;
+  border: none;
+  border-radius: 8rpx;
+  font-size: 26rpx;
+}
+
+.btn.primary {
+  background: #4ecdc4;
+  color: white;
+}
+
+.btn.secondary {
+  background: #45b7d1;
+  color: white;
+}
+
+.btn.warning {
+  background: #ff6b6b;
+  color: white;
+}
+
+.node-info-panel {
+  position: absolute;
+  top: 20rpx;
+  right: 20rpx;
+  background: rgba(255, 255, 255, 0.95);
+  padding: 30rpx;
+  border-radius: 16rpx;
+  box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
+  max-width: 300rpx;
+  z-index: 100;
+}
+
+.panel-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20rpx;
+}
+
+.panel-title {
+  font-size: 30rpx;
+  font-weight: bold;
+  color: #333;
+}
+
+.close-btn {
+  font-size: 40rpx;
+  color: #999;
+  cursor: pointer;
+}
+
+.node-details {
+  margin-bottom: 20rpx;
+}
+
+.detail-item {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 10rpx;
+}
+
+.detail-label {
+  font-size: 26rpx;
+  color: #666;
+}
+
+.detail-value {
+  font-size: 26rpx;
+  color: #333;
+  font-weight: 500;
+}
+
+.stats-panel {
+  position: absolute;
+  bottom: 40rpx;
+  left: 30rpx;
+  background: rgba(0, 0, 0, 0.7);
+  padding: 20rpx;
+  border-radius: 8rpx;
+  z-index: 100;
+  display: flex;
+  justify-content: start;
+  width: 180rpx;
+  flex-wrap: wrap;
+}
+
+.stats-box{
+  width: 90rpx;
+  display: flex;
+  justify-content: start;
+  align-items: center;
+}
+.stats-icon{
+  width: 10rpx;
+  height: 10rpx;
+  margin-right: 8rpx;
+  background-color:#6b7280 ;
+}
+.stats-icon-debt{
+  background-color:#ff6b35 ;
+}
+
+.stats-icon-borrower{
+  background-color:#8b5cf6 ;
+}
+
+.stats-icon-guarantor{
+  background-color:#3b82f6 ;
+}
+
+.stats-icon-collateral{
+  background-color:#10b981 ;
+}
+
+.stats-icon-property{
+  background-color:#f59e0b ;
+}
+
+
+.stats-icon-company{
+  background-color:#6366f1 ;
+}
+
+.stat-item {
+  display: block;
+  color: white;
+  font-size: 24rpx;
+  margin-bottom: 5rpx;
+}
+</style>

+ 1 - 4
page_task/task_details/module/steps.vue

@@ -14,10 +14,7 @@
 						<text class="size-26 text-color-666">{{item.stage_name}}:</text>
 						<text class="size-26  text-color-000 sys-weight-600">{{item.name?item.name:'----'}}</text>
 					</view>
-<!--					<view v-else>-->
-<!--						<text class="size-28 text-color-666">外访:</text>-->
-<!--						<text class="size-28 text-color-12 sys-weight-600">张三</text>-->
-<!--					</view>-->
+
 				</view>
 			</view>
 		</view>

+ 103 - 0
page_task/task_details/module/word.vue

@@ -0,0 +1,103 @@
+<template>
+  <view class="m-20">
+
+    <view class="row-c r-20 sys-background-fff m-b20" v-for="(item,index) in stageList" :key="index">
+      <view class="file-box r-20">
+        <view class="file-data">
+          <view class="file-icon" v-if="item.attachmentFormat==='docx'">
+            <image class="wh-45 " src="/page_task/static/img/task-details/icon-word.png" mode="aspectFill"></image>
+          </view>
+          <view class="file-icon file-icon-excel" v-if="item.attachmentFormat==='xlsx'">
+            <image class="wh-45 " src="/page_task/static/img/task-details/icon-excel.png" mode="aspectFill"></image>
+          </view>
+          <view class="file-icon file-icon-pdf" v-if="item.attachmentFormat==='pdf'">
+            <image class="wh-45 " src="/page_task/static/img/task-details/icon-pdf.png" mode="aspectFill"></image>
+          </view>
+          <view>
+            <view>{{item.attachmentName}}</view>
+            <view class="size-26 text-color-333 m-t10"><text>{{item.attachmentFormat}}</text>•<text>{{(item.attachmentSize/1024/1024).toFixed(2)}}MB</text></view>
+          </view>
+        </view>
+        <view>
+          <uni-icons type="right" size="20"></uni-icons>
+        </view>
+
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+
+export default {
+  name:'entities',
+  props: {
+    businessId:{
+      default:0
+    }
+  },
+  data() {
+    return {
+      stageList: []
+    }
+  },
+  watch:{
+    'businessId':function () {
+      // this.getStageList()
+    }
+  },
+  mounted() {
+    this.getStageList()
+  },
+  methods: {
+    getStageList() {
+      this.stageList=[
+        {'attachmentName':'拍卖裁定书.docx','attachmentFormat':'docx','attachmentSize':465445,'attachmentAddress':'https://storage.jd.com/auction.gateway/5EB379EF1ADA205F9525D1BFA9DC1D4D20250616121557808.docx'},
+        {'attachmentName':'通知书(定向询价).pdf','attachmentFormat':'pdf','attachmentSize':284577,'attachmentAddress':'https://storage.jd.com/auction.gateway/2CC6F971D5CA2A11B829D01956446F3920250418151753793.pdf'},
+        {'attachmentName':'评估报告1.pdf','attachmentFormat':'pdf','attachmentSize':3276836,'attachmentAddress':'https://storage.jd.com/auction.gateway/7F7226679C6E76620D9381906217543920250612120816112.pdf'},
+      ]
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.file-box{
+  box-shadow: 0 2rpx 6rpx 0  #0000001a, 0 2rpx 2px -2rpx  #0000001a;
+  width: 100%;
+  padding: 32rpx;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  .file-data{
+    display: flex;
+    justify-content: flex-start;
+    .file-icon{
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      width: 96rpx;
+      height: 96rpx;
+      border-radius: 20rpx;
+      background-color:#f8f9ff;
+      margin-right: 32rpx;
+    }
+    .file-icon-pdf{
+      background-color: #fff8f8;
+    }
+    .file-icon-excel{
+      background-color:#f6fffb;
+    }
+  }
+}
+.steps-item:last-child {
+  margin-bottom: 0;
+}
+
+.steps-line {
+  width: 2rpx;
+  background-color: #D9D9D9;
+  height: 90rpx;
+}
+
+</style>

+ 346 - 360
page_task/task_details/task_details.vue

@@ -1,336 +1,322 @@
 <template>
-	<view class="total-page page-env-20 page-box">
-		<Nav :back="isReturn!==1" :title="'任务详情'" :genre="2" :fixedHeight="fixedHeight">
-			<view class="task-tabs m-b20" :style=" {top:`${$tools.topHeight()}px`}">
-				<view class="detail-bg m-lr20 m-b10 m-t10">
-					<image class="detail-img" src="/page_task/static/img/task-details/top-bg.png" mode="aspectFill">
-					</image>
-					<view class="detail-content">
-						<view class="row-c m-l10 m-t16 m-b20 text-color-fff">
-							<image class="wh-45 r-circle" src="https://img10.360buyimg.com/imgw/s288x1000_jfs/t1/307262/4/9992/255939/684f9a78Fbddd6f3f/e07bf46597371d37.jpg"
-								mode="aspectFill">
-							</image>
-							<text class="size-28 m-lr16  m-t6">大连市甘井子区宜居园81号2单元1层1号房屋</text>
-
-							<view class="row-c size-24 sys-bg-007038 r-100 p-lr16 p-tb6 m-l20" >
-								<text>住宅</text>
-							</view>
-							<image class="wh-60 animate__animated animate__fadeInDownBig"
-								style="position: absolute;right: 20rpx;"
-								:src="'/page_task/static/img/task-details/icon-1.png'"
-								mode="aspectFill">
-							</image>
-						</view>
-						<view class="row-justify-sb center buttom-titke sys-bg-BFD2CC text-color-12 size-24">
-							<text class="size-28 text-color-E21 sys-weight-600">{{applyFor.quota}}万</text>
-							<text>{{business.stageName}}</text>
-							<text>{{applyFor.use_date}}用款</text>
-							<view class="row-c">
-								<image class="wh-25 m-r10" src="/page_task/static/img/task-details/usrr.png" mode="">
-								</image>
-								<text>{{business.creation_name}}</text>
-							</view>
-						</view>
-					</view>
-				</view>
-				<TaskTab :current="current" @onChange="onChange"></TaskTab>
-			</view>
-		</Nav>
-    <view class="sys-list-background-color task-tabs-width "
-          :style="{top:`${$tools.topHeight()+fixedHeight}px`}">
-      <view v-if="current === 1"></view>
-      <view >
-        <graph></graph>
+  <view class="total-page page-env-20 page-box">
+    <Nav :back="isReturn!==1" :title="'任务详情'" :genre="2" :fixedHeight="fixedHeight">
+      <view class="task-tabs m-b20" :style=" {top:`${$tools.topHeight()}px`}">
+        <view class="detail-bg m-lr20 m-b10 m-t10">
+          <image class="detail-img" src="/page_task/static/img/task-details/top-bg.png" mode="aspectFill">
+          </image>
+          <view class="detail-content">
+            <view class="row-c m-l10 m-t16 m-b20 text-color-fff">
+              <image class="wh-45 r-circle" src="https://img10.360buyimg.com/imgw/s288x1000_jfs/t1/307262/4/9992/255939/684f9a78Fbddd6f3f/e07bf46597371d37.jpg"
+                     mode="aspectFill">
+              </image>
+              <text class="size-28 m-lr16  m-t6">大连市甘井子区宜居园81号2单元1层1号房屋</text>
+
+              <view class="row-c size-24 sys-bg-007038 r-100 p-lr16 p-tb6 m-l20" >
+                <text>住宅</text>
+              </view>
+              <image class="wh-60 animate__animated animate__fadeInDownBig"
+                     style="position: absolute;right: 20rpx;"
+                     :src="'/page_task/static/img/task-details/icon-1.png'"
+                     mode="aspectFill">
+              </image>
+            </view>
+            <view class="row-justify-sb center buttom-titke sys-bg-BFD2CC text-color-12 size-24">
+              <text class="size-28  sys-weight-600">72.47万</text>
+              <text  ><text class="size-28 text-color-E21 sys-weight-600">65.27万</text>起拍</text>
+              <text>7.01%</text>
+              <view class="row-c">
+                <image class="wh-25 m-r10" src="/page_task/static/img/task-details/usrr.png" mode="">
+                </image>
+                <text>京东</text>
+              </view>
+            </view>
+          </view>
+        </view>
+        <TaskTab :current="current" @onChange="onChange"></TaskTab>
       </view>
+    </Nav>
+    <view class="sys-list-background-color task-tabs-width ">
+        <view v-if="current === 1"></view>
+        <view v-else-if="current ===2">
+          <graph @setNode="setNode"></graph>
+        </view>
+        <view v-else-if="current ===3">
+          <entities></entities>
+        </view>
+        <view v-else>
+          <word></word>
+        </view>
+
+
     </view>
 
-		<!--		<EnButton :text="'冲销'" v-if="current === 1"></EnButton>-->
-		<!--		<EnButton is_both :leftText="'交接'" :rightText="'操作'"  @onSubmit="setTaskOperate(1)" @onLeftSubmit="openExecute"></EnButton>-->
-		<uni-popup ref="executePopup" type="bottom">
-			<EnSelect title="请选择任务接收人" :local-data="executeData" ref="system" v-model="executeId"
-				@setAffirm="setNewExecute" @close="closeExecutePopup"></EnSelect>
-		</uni-popup>
 
-	</view>
+    <uni-popup ref="executePopup" type="bottom">
+      <EnSelect title="请选择任务接收人" :local-data="executeData" ref="system" v-model="executeId"
+                @setAffirm="setNewExecute" @close="closeExecutePopup"></EnSelect>
+    </uni-popup>
+
+  </view>
 </template>
 
 <script>
-	import TaskTab from "@/common/task/task_tab.vue"
-	// 身份信息
-	import Identity from "./module/identity.vue"
-	// 申请信息
-	import Apply from "./module/apply.vue"
-	// 第三方信息
-	import ThirdParty from "./module/third_party.vue"
-	// 资产信息
-	import Property from "./module/property.vue"
-	// 审核进度
-	import Steps from "./module/steps.vue"
-	// 跟进记录
-	import Record from "./module/record.vue"
-	import tools from "@/service/tools";
-	import {
-		cancellation,
-		endTask,
-		getExecuteList,
-		getStageList,
-		getTaskDetail,
-		setExecute,
-		takeTask
-	} from "@/api/task";
-	import EnSelect from "@/components/en-utils/en-select/en-select.vue";
-	import CreditList from "@/page_task/credit/credit.vue";
-  import {type} from "@/uni_modules/uni-forms/components/uni-forms/utils";
-  import Graph from "@/page_task/graph/index.vue";
-
-	export default {
-		components: {
-      Graph,
-			CreditList,
-			EnSelect,
-			TaskTab,
-			Identity,
-			ThirdParty,
-			Apply,
-			Property,
-			Record,
-			Steps
-		},
-		data() {
-			return {
-				current: 1,
-				fixedHeight: 200,
-				options: {
-					// autoHeight: true,
-					slidesPerView: 1.1,
-					centeredSlides: true,
-					spaceBetween: 10,
-					effect: 'cards'
-				},
-				list: [1, 2, 3],
-				lists: [1, 2],
-				businessId: '',
-				product: {
-					product_name: '',
-					product_types: [],
-					type_data: []
-				},
-				business: {
-					id: 0,
-					status: 0,
-					phone: '',
-					identity_one: '',
-					identity_two: '',
-					marriage_img: [],
-					credit_img: [],
-				}, //基本信息
-				propertyList: [], //资产信息
-				applyFor: {}, //申请信息
-				credit: {}, //征信信息
-				postLoan: {}, //贷后信息
-				tripartite: [], //第三方信息
-				linkman: [], //联系人信息
-				stageData: {
-					stageName: '',
-					userName: ""
-				},
-				isAjax: false,
-				isExecute: 0,
-				msgList: [],
-				executeData: [],
-				showExecute: false,
-				auditType: 0,
-				previewList: [],
-				imgKey: 0,
-				imgList: [],
-				replyId: "",
-				stageList: [],
-				businessStageList: [],
-				businessFile: {
-					fileList: [],
-					imgList: [],
-					videoList: [],
-				},
-				videoUrl: '',
-				executeId: '',
-				clientKey: [],
-				propertyKey: [],
-				appliesKey: [],
-				tripartiteKey: [],
-				linkmanKey: [],
-				creditKey: [],
-				identityHeight: 0,
-				thirdPartHeight: 0,
-				applyHeight: 0,
-				propertyHeight: 0,
-				creditListHeight: 0,
-				maxHeight: '100%',
-				creditHeight: '100%',
-        basicType:['1'],
-        restType:['2'],
-        isReturn:0
-			}
-		},
-		onLoad(data) {
-      console.log('-----------aaaaa-----------')
-
-		},
-    mounted() {
+import TaskTab from "@/common/task/task_tab.vue"
+// 身份信息
+import Identity from "./module/identity.vue"
+// 申请信息
+import Apply from "./module/apply.vue"
+// 第三方信息
+import ThirdParty from "./module/third_party.vue"
+// 资产信息
+import Property from "./module/property.vue"
+// 审核进度
+import Word from "./module/word.vue"
+// 跟进记录
+import Record from "./module/record.vue"
+import tools from "@/service/tools";
+
+import EnSelect from "@/components/en-utils/en-select/en-select.vue";
+import CreditList from "@/page_task/credit/credit.vue";
+import Graph from "@/page_task/task_details/module/graph.vue";
+import Entities from "@/page_task/task_details/module/entities.vue";
+
+export default {
+  components: {
+    Entities,
+    Graph,
+    CreditList,
+    EnSelect,
+    TaskTab,
+    Identity,
+    ThirdParty,
+    Apply,
+    Property,
+    Record,
+    Word
+  },
+  data() {
+    return {
+      current: 1,
+      fixedHeight: 220,
+      options: {
+        // autoHeight: true,
+        slidesPerView: 1.1,
+        centeredSlides: true,
+        spaceBetween: 10,
+        effect: 'cards'
+      },
+      list: [1, 2, 3],
+      lists: [1, 2],
+      businessId: '',
+      product: {
+        product_name: '',
+        product_types: [],
+        type_data: []
+      },
+      business: {
+        id: 0,
+        status: 0,
+        phone: '',
+        identity_one: '',
+        identity_two: '',
+        marriage_img: [],
+        credit_img: [],
+      }, //基本信息
+      propertyList: [], //资产信息
+      applyFor: {}, //申请信息
+      credit: {}, //征信信息
+      postLoan: {}, //贷后信息
+      tripartite: [], //第三方信息
+      linkman: [], //联系人信息
+      stageData: {
+        stageName: '',
+        userName: ""
+      },
+      isAjax: false,
+      isExecute: 0,
+      msgList: [],
+      executeData: [],
+      showExecute: false,
+      auditType: 0,
+      previewList: [],
+      imgKey: 0,
+      imgList: [],
+      replyId: "",
+      stageList: [],
+      businessStageList: [],
+      businessFile: {
+        fileList: [],
+        imgList: [],
+        videoList: [],
+      },
+      videoUrl: '',
+      executeId: '',
+      clientKey: [],
+      propertyKey: [],
+      appliesKey: [],
+      tripartiteKey: [],
+      linkmanKey: [],
+      creditKey: [],
+      identityHeight: 0,
+      thirdPartHeight: 0,
+      applyHeight: 0,
+      propertyHeight: 0,
+      creditListHeight: 0,
+      maxHeight: '100%',
+      creditHeight: '100%',
+      basicType:['1'],
+      restType:['2'],
+      isReturn:0
+    }
+  },
+  onLoad(data) {
+    // #ifdef H5
+      this.fixedHeight=150
+    //#endif
+
+  },
+  mounted() {
+
+  },
+  methods: {
+    setNode(node){
+      console.log("----------事件回调----------")
+      console.log(node)
+    },
+    makingCall(phone){
+      tools.makingCall(phone)
+    },
+    onShowImg(item) {
+      console.log(this.businessFile.imgList)
+      let imgIndex=this.businessFile.imgList.indexOf(item)
+      if (imgIndex < 0) {
+        this.businessFile.imgList.push(item)
+        imgIndex=this.businessFile.imgList.length-1
+      }
+      console.log(this.businessFile.imgList)
+
+      // 预览图片
+      uni.previewImage({
+        current: imgIndex,
+        urls: this.businessFile.imgList,
+      });
+    },
+    auditTask(auditType) {
 
     },
-		methods: {
-      makingCall(phone){
-        tools.makingCall(phone)
-      },
-			onShowImg(item) {
-        console.log(this.businessFile.imgList)
-        let imgIndex=this.businessFile.imgList.indexOf(item)
-				if (imgIndex < 0) {
-					this.businessFile.imgList.push(item)
-          imgIndex=this.businessFile.imgList.length-1
-				}
-        console.log(this.businessFile.imgList)
+    setPostLoan() {
+
+    },
+    editTask() {
 
-				// 预览图片
-				uni.previewImage({
-					current: imgIndex,
-					urls: this.businessFile.imgList,
-				});
-			},
-			auditTask(auditType) {
+    },
+    cancellation() {
 
-			},
-			setPostLoan() {
+    },
+    endTask() {
 
-			},
-			editTask() {
+    },
+    takeTask() {
 
-			},
-			cancellation() {
+    },
+    closeExecutePopup(){
 
-			},
-			endTask() {
+    },
+    setNewExecute(type) {
 
-			},
-			takeTask() {
+      this.$refs.executePopup.close('bottom')
 
-			},
-      closeExecutePopup(){
+    },
+    openExecute() {
 
-      },
-			setNewExecute(type) {
-				if (type) {
-					//设置新执行人
-					if (this.executeId <= 0) {
-						tools.error('请选择执行人')
-						return
-					}
-					setExecute({
-						'business_id': this.businessId,
-						'user_id': this.executeId
-					}).then((res) => {
-						if (res.code === 1) {
-							tools.success(res.msg)
-							uni.$emit('newReceiving')
-							this.getTaskDetail()
-
-						} else {
-							tools.error(res.msg)
-						}
-					})
-				}
-				this.$refs.executePopup.close('bottom')
-
-			},
-			openExecute() {
-
-			},
-			setTaskOperate(type) {
-
-			},
-			async getTaskDetail() {
-
-			},
-
-			// 获取详情高度Swiper
-			getDetailsHeight() {
-				this.maxHeight = '100%'
-				this.$nextTick(() => {
-					const query = uni.createSelectorQuery().in(this);
-					setTimeout(() => {
-						query.select('.identity').boundingClientRect(data => {
-							if (data) {
-								this.maxHeight = data.height
-								console.log(this.maxHeight);
-								uni.pageScrollTo({
-									scrollTop: 0,
-									duration: 300
-								});
-							}
-						}).exec();
-					}, 200)
-				})
-			},
-			// 获取详情高度Swiper
-			onSwiper(swiper, index) {
-				this.maxHeight = '100%'
-				const query = uni.createSelectorQuery().in(this);
-				this.$nextTick(() => {
-					setTimeout(() => {
-						if (index == 0) {
-							query.select('.identity').boundingClientRect(data => {
-								if (data) {
-									this.maxHeight = data.height
-								}
-							}).exec();
-						}
-						if (index == 1) {
-							query.select('.apply').boundingClientRect(data => {
-								if (data) {
-									this.maxHeight = data.height
-								}
-							}).exec();
-						}
-						if (index == 2) {
-							query.select('.third_party').boundingClientRect(data => {
-								if (data) {
-									this.maxHeight = data.height
-								}
-							}).exec();
-						}
-						uni.pageScrollTo({
-							scrollTop: 0,
-							duration: 300
-						});
-					}, 200)
-				})
-			},
-			// 征信高度Swiper
-			onCreditHeight() {
-
-			},
-			// 征信高度Swiper
-			onCreditSwiper(swiper, index) {
-
-			},
-			onChange(current) {
-				if (current == 1) {
-					this.getDetailsHeight()
-				}
-				if (current == 2) {
-					this.onCreditHeight()
-				}
-				this.current = current
-				uni.pageScrollTo({
-					scrollTop: 0,
-					duration: 300
-				});
-			},
-			onSubmit() {
-
-			}
-		}
-	}
+    },
+    setTaskOperate(type) {
+
+    },
+    async getTaskDetail() {
+
+    },
+
+    // 获取详情高度Swiper
+    getDetailsHeight() {
+      this.maxHeight = '100%'
+      this.$nextTick(() => {
+        const query = uni.createSelectorQuery().in(this);
+        setTimeout(() => {
+          query.select('.identity').boundingClientRect(data => {
+            if (data) {
+              this.maxHeight = data.height
+              console.log(this.maxHeight);
+              uni.pageScrollTo({
+                scrollTop: 0,
+                duration: 300
+              });
+            }
+          }).exec();
+        }, 200)
+      })
+    },
+    // 获取详情高度Swiper
+    onSwiper(swiper, index) {
+      this.maxHeight = '100%'
+      const query = uni.createSelectorQuery().in(this);
+      this.$nextTick(() => {
+        setTimeout(() => {
+          if (index == 0) {
+            query.select('.identity').boundingClientRect(data => {
+              if (data) {
+                this.maxHeight = data.height
+              }
+            }).exec();
+          }
+          if (index == 1) {
+            query.select('.apply').boundingClientRect(data => {
+              if (data) {
+                this.maxHeight = data.height
+              }
+            }).exec();
+          }
+          if (index == 2) {
+            query.select('.third_party').boundingClientRect(data => {
+              if (data) {
+                this.maxHeight = data.height
+              }
+            }).exec();
+          }
+          uni.pageScrollTo({
+            scrollTop: 0,
+            duration: 300
+          });
+        }, 200)
+      })
+    },
+    // 征信高度Swiper
+    onCreditHeight() {
+
+    },
+    // 征信高度Swiper
+    onCreditSwiper(swiper, index) {
+
+    },
+    onChange(current) {
+      if (current == 1) {
+        this.getDetailsHeight()
+      }
+      if (current == 2) {
+        this.onCreditHeight()
+      }
+      this.current = current
+      uni.pageScrollTo({
+        scrollTop: 0,
+        duration: 300
+      });
+    },
+    onSubmit() {
+
+    }
+  }
+}
 </script>
 
 <style lang="scss" scoped>
@@ -344,51 +330,51 @@
     min-height: calc(100vh - 630rpx - 160rpx - env(safe-area-inset-bottom));
   }
 }
-	.details_body {
-		width: 100%;
-		position: absolute;
-	}
-
-	.detail-bg {
-		position: relative;
-	}
-
-	.detail-img {
-		width: calc(100%);
-		height: 220rpx;
-	}
-
-	.detail-content {
-		position: absolute;
-		top: 10rpx;
-		left: 20rpx;
-
-		.top-titke {
-			height: 75rpx;
-			line-height: 75rpx;
-			// background: red;
-		}
-
-		.detail-line {
-			width: 2rpx;
-			height: 24rpx;
-			background-color: #FFFFFF;
-		}
-
-		.buttom-titke {
-			flex: 1;
-			margin-top: 40rpx;
-			height: 90rpx;
-			width: 635rpx;
-			line-height: 90rpx;
-			border-radius: 20rpx;
-			padding: 0 20rpx;
-		}
-	}
-
-	.swiper-wrapper {
-		z-index: 0 !important;
-	}
+.details_body {
+  width: 100%;
+  position: absolute;
+}
+
+.detail-bg {
+  position: relative;
+}
+
+.detail-img {
+  width: calc(100%);
+  height: 220rpx;
+}
+
+.detail-content {
+  position: absolute;
+  top: 10rpx;
+  left: 20rpx;
+
+  .top-titke {
+    height: 75rpx;
+    line-height: 75rpx;
+    // background: red;
+  }
+
+  .detail-line {
+    width: 2rpx;
+    height: 24rpx;
+    background-color: #FFFFFF;
+  }
+
+  .buttom-titke {
+    flex: 1;
+    margin-top: 40rpx;
+    height: 90rpx;
+    width: 635rpx;
+    line-height: 90rpx;
+    border-radius: 20rpx;
+    padding: 0 20rpx;
+  }
+}
+
+.swiper-wrapper {
+  z-index: 0 !important;
+}
 .video-box {
   height: 70vh;
   width: 100vw;

+ 27 - 27
pages.json

@@ -7,6 +7,12 @@
         "disableScroll": true
       }
     },
+	{
+	  "path": "pages/loan/loan",
+	  "style": {
+	    "navigationBarTitleText": ""
+	  }
+	},
     {
       "path": "pages/index/index",
       "style": {
@@ -49,12 +55,6 @@
         "navigationBarTitleText": ""
       }
     },
-    {
-      "path": "pages/loan/loan",
-      "style": {
-        "navigationBarTitleText": ""
-      }
-    },
     {
       "path": "pages/statistics/statistics",
       "style": {
@@ -257,28 +257,28 @@
     "list": [
       {
         "name": "转换工具",
-        "path": "/page_subpack/transition/to_excel",
-        "query": "productId=1"
-      },
-      {
-        "name": "审核",
-        "path": "/pages/login/await-audit",
-        "query": "productId=1"
-      },
-      {
-        "name": "添加任务",
-        "path": "/page_task/information/information",
-        "query": "productId=1"
-      },
-      {
-        "name": "任务详情",
-        "path": "/page_task/task_details/task_details",
-        "query": "taskId=4290&isReturn=1"
-      },
-      {
-        "name": "文件识别",
-        "path": "page_subpack/transition/to_excel"
+        "path": "/pages/task/task",
+        "query": ""
       }
+      // {
+      //   "name": "审核",
+      //   "path": "/pages/login/await-audit",
+      //   "query": "productId=1"
+      // },
+      // {
+      //   "name": "添加任务",
+      //   "path": "/page_task/information/information",
+      //   "query": "productId=1"
+      // },
+      // {
+      //   "name": "任务详情",
+      //   "path": "/page_task/task_details/task_details",
+      //   "query": "taskId=4290&isReturn=1"
+      // },
+      // {
+      //   "name": "文件识别",
+      //   "path": "page_subpack/transition/to_excel"
+      // }
     ]
   }
 }

+ 84 - 34
pages/index/index.vue

@@ -1,26 +1,32 @@
 <template>
-	<view class="total-page page-env-160 page-box">
-		<Nav :title="'工作台导航'" :back="false" :is_fixed="true" :opacity="scrollTop" :justify="'left'" :color="'#fff'">
-			<view class="p-20">
-				<IndexPersonal ref="memberObj" @setMemberData="setMemberData"></IndexPersonal>
-				<!-- <IndexColumn ref="columnObj" :memberData="memberData" :model-time="modelTime"></IndexColumn> -->
-			</view>
-		</Nav>
+	<view class="flex-common-css page-box box-bg">
+		<Nav :title="'我的'" :genre="1" :back="false" :is_fixed='false'></Nav>
+		<Search :placeholder="'姓名或电话'" @setSearch="setSearch"></Search>
+		<task-ima-tab @setProductId="setProductId" :num-type="0"></task-ima-tab> 
+		<!-- 		<view class="page-box-bg-fff m-lr20 r-20">
+			<z-tabs ref="tabs" :list="tabsList" :active-style="{color:'#10B261',fontWeight:'bold',fontSize:'30rpx'}"
+				:bar-style="{background:'#10B261'}" :inactive-style="{fontWeight:'bold',fontSize:'28rpx'}"
+				:current="current" :bar-animate-mode="'worm'" @change="tabsChange" />
+		</view> -->
 		<view class="p-20">
 			<view class="personal m-lr10 row-justify-sb center">
-				<text class="sys-weight-600">我的待办</text>
-				<view class="row-justify-sb center">
+				<text class="sys-weight-600">精选系列</text>
+	<!-- 			<view class="row-justify-sb center">
 					<view class="personal_text">
 						<uni-datetime-picker type="date">
 							<view class="personal sys-background-fff size-24 sys-weight-600 p-lr30 r-40">{{indexTime}}
 							</view>
 						</uni-datetime-picker>
 					</view>
-				</view>
+				</view> -->
 			</view>
 		</view>
-		<TaskItem :type="5" :taskList="backlogList" @heartBut="heartBut"></TaskItem>
-		<Tab class="tabs_height" :tab-index="0"></Tab>
+		<view class="scroll-view-css flex-direction">
+			<TaskItem :type="5" :taskList="backlogList" @heartBut="heartBut"></TaskItem>
+		</view>
+		<Tab class="tabs_height" :tab-index="1"></Tab>
+		<!-- 弹窗 -->
+		<popupModuleVue ref="popupModuleRef"></popupModuleVue>
 	</view>
 
 </template>
@@ -36,38 +42,43 @@
 		getDateBacklogStatistics,
 		getDayBacklogList
 	} from "@/api/task";
+	import TaskImaTab from "@/common/task/task_ima_tab.vue";
 	import {
 		date
 	} from "@/uni_modules/uv-ui-tools/libs/function/test";
-
+	import popupModuleVue from "./module/popup-module.vue"
 	export default {
 		components: {
 			TaskItem,
 			PieChart,
 			CircleChart,
 			IndexColumn,
-			IndexPersonal
+			IndexPersonal,
+			TaskImaTab,
+			popupModuleVue
 		},
 		data() {
 			return {
+				current: 0,
 				modelTime: this.$tools.getDate('-'),
 				indexTime: this.$tools.getDate('-'),
 				is_admin: false,
 				scrollTop: 0,
 				topNavHeight: 0,
-				chartList: [{
-					name: "超期",
-					color: '#DE5847',
-					value: "0"
+				tabsList: [{
+					name: '全部',
+					disabled: false
 				}, {
-					name: "滞后",
-					color: '#EF8F27',
-					value: "0"
+					name: '未完成(0)',
+					dot_color: 'red',
+					is_dot: false,
+					disabled: false
 				}, {
-					name: "正常",
-					color: '#3ABF7D',
-					value: "0"
-				}, ],
+					name: '已完成',
+					dot_color: 'red',
+					is_dot: false,
+					disabled: false
+				}],
 				memberData: {
 					draftNum: 0,
 					creditNum: 0,
@@ -104,6 +115,9 @@
 		},
 		onReachBottom() {},
 		methods: {
+			setSearch() {
+				this.$refs.popupModuleRef.openPop()
+			},
 			heartBut(data) {
 				if (uni.getStorageSync('loanList')) {
 					this.loanList = uni.getStorageSync('loanList')
@@ -140,28 +154,41 @@
 					this.backlogList = [{
 							img: 'https://copyright.bdstatic.com/vcg/creative/d6c6a351be227d5d3b3e8c1f96f56e50.jpg@h_1280',
 							proportion: '37',
-							name: 'Downtown Office Tower -Prime Location',
+							name: '市中心写字楼 - 优越地段',
 							live: false,
 							percentage: '3.1',
-							description: 'Metro Properties LLC',
+							description: '地铁地产有限责任公司',
 							amount: '5.0',
 							trend: '7.5',
-							risk: 'LTV 37%',
+							risk: '客户终身价值 37%',
 							time: '2024-001',
 							id: 1,
 						},
 						{
 							img: 'https://pic.rmb.bdstatic.com/bjh/3ea195479f8a/250303/f53064611fee7c092312f3b6ea8e439d.jpeg',
 							proportion: '71',
-							name: 'Tower -Prime Location',
+							name: '塔楼-黄金地段',
 							live: false,
-							percentage: '5.1',
-							description: 'Healthcare Properties Inc',
+							percentage: '4.1',
+							description: '医疗地产公司',
 							amount: '5.0',
-							trend: '7.5',
-							risk: 'LTV 37%',
-							time: '2024-001',
+							trend: '5.5',
+							risk: '客户终身价值 77%',
+							time: '2024-002',
 							id: 2,
+						},
+						{
+							img: 'https://qcloud.dpfile.com/pc/3B5v9C_aeqiLmADxyv5K2oclwwy3V_g7gw7Dmq38AuV9VmaUI3Rb5Uvj6kJNMMCrY0q73sB2DyQcgmKUxZFQtw.jpg',
+							proportion: '60',
+							name: '豪华零售中心-高街',
+							live: false,
+							percentage: '1.5',
+							description: '奢侈品地产公司',
+							amount: '8.5',
+							trend: '6.8',
+							risk: '客户终身价值 10.5%',
+							time: '2024-002',
+							id: 3,
 						}
 					]
 					uni.setStorageSync('backlogList', this.backlogList)
@@ -171,6 +198,29 @@
 	}
 </script>
 <style lang="scss" scoped>
+	.box-bg{
+		background-image: url('https://wealfavor-1257406827.cos.ap-beijing.myqcloud.com/new-xcx/task/task-nav-bg.png');
+		background-repeat: no-repeat;
+		background-size: 100% auto;
+	}
+	.head-tab {
+		padding: 8rpx 16rpx;
+	}
+
+	.croll-view-item {
+		width: 320rpx;
+		height: 224rpx;
+		border-radius: 40rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.scroll-view {
+		white-space: nowrap;
+	}
+
 	.personal {
 		height: 55rpx;
 		line-height: 55rpx;

+ 37 - 37
pages/index/module/index_column.vue

@@ -1,6 +1,6 @@
-<template>
+ <template>
 	<view class="row-c m-t20">
-		<view class="column_item sys-background-dominant r-30 column-justify-sb" v-if="enteringType===1">
+		<!-- 		<view class="column_item sys-background-dominant r-30 column-justify-sb" v-if="enteringType===1">
 			<view class="column_build column-c">
 				<view class="row-c" @click="onCreationTask">
 					<image class="wh-80 m-r30"
@@ -29,17 +29,18 @@
 					</text>
 				</view>
 			</view>
-		</view>
-		<view class="column_item column-justify-sb" v-else>
+		</view> -->
+		<view class="column_item column-justify-sb">
 			<view class="column column_loan justify-center r-30 p-lr24">
 				<view class="row-c">
 					<view class="sys-background-dominant r-10" style="width: 8rpx;height: 24rpx;">
 					</view>
-					<text class="text-color-12 sys-weight-600 size-24 m-l10">今日放款</text>
+					<text class="text-color-12 sys-weight-600 size-24 m-l10">我的收藏</text>
 				</view>
 				<view class="row-justify-sb center m-t20 line-40">
 					<view class=" row-justify-l">
-            <en-number :end-num="moneyData.out_money" :text-color="'color-02154E'" :text-weight="'sys-weight-600'" :text-size="'size-30'"></en-number>
+						<en-number :end-num="moneyData.out_money" :text-color="'color-02154E'"
+							:text-weight="'sys-weight-600'" :text-size="'size-30'"></en-number>
 						<view class="row-justify-sb center line-40 sys-weight-600 color-02154E">万</view>
 					</view>
 					<view class="row-c">
@@ -49,7 +50,7 @@
 					</view>
 				</view>
 			</view>
-			<view class="column column_proceeds justify-center r-30 p-lr24">
+<!-- 			<view class="column column_proceeds justify-center r-30 p-lr24">
 				<view class="row-c">
 					<view class="sys-background-dominant r-10" style="width: 8rpx;height: 24rpx;">
 					</view>
@@ -57,7 +58,8 @@
 				</view>
 				<view class="row-justify-sb center m-t20 line-40">
 					<view class=" row-justify-l">
-						<en-number :end-num="moneyData.put_money" :text-color="'color-02154E'":text-weight="'sys-weight-600'" :text-size="'size-30'"></en-number>
+						<en-number :end-num="moneyData.put_money" :text-color="'color-02154E'"
+							:text-weight="'sys-weight-600'" :text-size="'size-30'"></en-number>
 						<view class="row-justify-sb center line-40 sys-weight-600 color-02154E">万</view>
 					</view>
 					<view class="row-c">
@@ -66,10 +68,10 @@
 						<text class="size-24 text-color-999 m-l10">笔</text>
 					</view>
 				</view>
-			</view>
+			</view> -->
 		</view>
 		<view class="column_item m-l20 column-justify-sb">
-			<view class="task_item row-justify center r-30" @click="onGetTask">
+<!-- 			<view class="task_item row-justify center r-30" @click="onGetTask">
 				<view class="m-l40" style="position: relative;">
 					<uni-badge class="" :text="memberData.take_num" absolute="rightTop" size="normal" :offset="[5,5]">
 						<image class="wh-90 r-circle"
@@ -79,7 +81,7 @@
 					</uni-badge>
 				</view>
 				<text class="text-color-12 sys-weight-600 m-l20">领取任务</text>
-			</view>
+			</view> -->
 			<view class="task_message row-justify center r-30" @click="onMessage">
 				<view class="m-l40" style="position: relative;">
 					<uni-badge class="" :text="memberData.unreadNum" absolute="rightTop" size="normal" :offset="[5,5]">
@@ -101,7 +103,9 @@
 		getSysCashier
 	} from "@/api/statistics";
 	import EnNumber from "@/components/en-utils/en-number/en-number.vue";
-  import {getDateCashier} from "@/api/task";
+	import {
+		getDateCashier
+	} from "@/api/task";
 
 	export default {
 		name: 'index_column',
@@ -109,21 +113,6 @@
 			EnNumber
 		},
 		props: {
-			memberData: {
-				default: {
-					position_name: "",
-					head_img: "",
-					id: 5,
-					name: "",
-					nickname: "",
-					phone: "",
-					draftNum: "0",
-					creditNum: "0",
-					noticeNum: "0",
-					take_num: "0",
-          unreadNum: "0",
-				}
-			},
 			is_admin: {
 				type: Boolean,
 				default: false
@@ -133,16 +122,27 @@
 				default: ''
 			}
 		},
-		watch: {
-			'modelTime': function() {
-        this.getSysCashier()
-			}
-		},
+		watch: {},
 		data() {
 			return {
+				memberData: {
+					default: {
+						position_name: "",
+						head_img: "",
+						id: 5,
+						name: "",
+						nickname: "",
+						phone: "",
+						draftNum: "0",
+						creditNum: "0",
+						noticeNum: "0",
+						take_num: "0",
+						unreadNum: "0",
+					}
+				},
 				enteringType: 1,
 				moneyData: {
-          out_money: 0,
+					out_money: 0,
 					out_num: 0,
 					put_money: 0,
 					put_num: 0,
@@ -164,10 +164,10 @@
 					return ''
 				}
 				this.dateTypeObj.selectDate = this.modelTime
-        getDateCashier(this.dateTypeObj).then((res) => {
+				getDateCashier(this.dateTypeObj).then((res) => {
 					if (res.code === 1) {
 						this.moneyData = res.data
-            console.log(	this.moneyData )
+						console.log(this.moneyData)
 					}
 				})
 			},
@@ -198,7 +198,7 @@
 <style lang="scss" scoped>
 	.column_item {
 		width: 50%;
-		height: 300rpx;
+		// height: 300rpx;
 	}
 
 	.column_build {
@@ -264,4 +264,4 @@
 		top: -10rpx;
 		// line-height: 30rpx;
 	}
-</style>
+</style>

+ 148 - 0
pages/index/module/popup-module.vue

@@ -0,0 +1,148 @@
+<template>
+	<uni-popup background-color="#fff" ref="popup" type="bottom" borderRadius="10px 10px 10px 10px">
+		<view class="p-24 box-border-box pop-box r-20">
+			<view class="r-40 p-20 box-border-box flex-stretch mb-48 box-shadow"
+				:class="colorType === 1?'bgc-F92A3B-E70073':colorType === 2?'bgc-AB46FF-8125FE':colorType === 3?'bgc-00B6DC-0F62FA':'bgc-00C651-009B65'">
+				<view class="mr-20 q-box fc-fff size-48"
+					:class="colorType === 1?'bgc-F8516C':colorType === 2?'bgc-B768FF':colorType === 3?'bgc-33B2EB':'bgc-34CC79'">
+					{{colorType === 1?'$':colorType === 2?'🏚':colorType === 3?'🛡':'🎁'}}
+				</view>
+				<view class="flex-direction flex-start">
+					<view class="size-24 fc-fff sys-weight-600 mb-10 zw-box"
+						:class="colorType === 1?'bgc-F8516C':colorType === 2?'bgc-B365FF':colorType === 3?'bgc-34B4EB':'bgc-34CA79'">
+						债务
+					</view>
+					<view class="fc-fff size-32 text-overflow-ellipsis-one mb-10">
+						优先担保贷款#2024-001
+					</view>
+					<view class="fc-fff hy-box size-24">
+						活跃的
+					</view>
+				</view>
+			</view>
+			<view class="p-tb30 bt-EDEEF0">
+				<view class="p-30 box-border-box bgc-EEFAFF r-40 mb-48 box-shadow b-DBEAFE flex-stretch">
+					<view class="ok-box r-circle bgc-DBEAFE box-border-box mr-20 center justify-center">
+						<view class="checkmarkempty-box r-circle center justify-center">
+							<uni-icons type="checkmarkempty" size="12" color="#155DFB"></uni-icons>
+						</view>
+					</view>
+					<view class="flex-direction flex-start">
+						<view class="center mb-10">
+							<view class="size-28 mr-18 fc-1B388E">
+								尽职调查状态
+							</view>
+							<view class="size-24 yz-box fc-008235 sys-weight-600">
+								已验证
+							</view>
+						</view>
+						<view class="size-24 fc-1547E6">
+							所有要求的文件均已验证并为最新文件
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="max-h">
+				<view class="size-32 mb-20">
+					实体详情
+				</view>
+				<view class="b-F3F4F6-1 box-shadow sys-radius-20">
+					<view class="p-30 box-border-box b-b-F3F4F6 center row-justify-sb" v-for="(item) in 14">
+						<view class="size-28">
+							实体类型
+						</view>
+						<view class="size-28">
+							公司
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</uni-popup>
+</template>
+
+<script>
+	export default {
+		components: {},
+		props: {
+			colorType: {
+				// 颜色状态 1红 2紫 3蓝 4绿
+				default: 3
+			}
+		},
+		data() {
+			return {}
+		},
+		onLoad(data) {},
+		mounted() {},
+		methods: {
+			openPop() {
+				this.$refs.popup.open()
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.max-h{
+		max-height: 40vh;
+		overflow: auto;
+	}
+	.b-b-F3F4F6 {
+		border-bottom: .1rpx solid #F3F4F6;
+	}
+
+	.pop-box {
+		border-radius: 20rpx 20rpx 0 0;
+	}
+
+	.box-shadow {
+		box-shadow: 5rpx 5rpx 5px 0 rgba(0, 0, 0, 0.2);
+	}
+
+	.q-box {
+		width: 88rpx;
+		height: 88rpx;
+		line-height: 88rpx;
+		text-align: center;
+		border-radius: 30rpx;
+	}
+
+	.zw-box {
+		padding: 4rpx 16rpx;
+		display: inline-block;
+		border-radius: 20rpx;
+	}
+
+	.hy-box {
+		padding: 4rpx 16rpx;
+		border-radius: 20rpx;
+		background: #00CA52;
+	}
+
+	.bt-EDEEF0 {
+		border-top: .1rpx solid #EDEEF0;
+	}
+
+	.b-DBEAFE {
+		border: .1rpx solid #DBEAFE;
+	}
+
+	.yz-box {
+		background: #DBFCE7;
+		border-radius: 40rpx;
+		padding: 4rpx 16rpx;
+		border: .1rpx solid #B9F8CF;
+	}
+
+	.ok-box {
+		width: 72rpx;
+		height: 72rpx;
+	}
+
+	.checkmarkempty-box {
+		width: 32rpx;
+		height: 32rpx;
+		border: 1rpx solid #155DFB;
+	}
+</style>

+ 1 - 1
pages/loan/components/clientType.vue

@@ -34,7 +34,7 @@
 		watch: {},
 
 		mounted() {
-			this.getClientType()
+			// this.getClientType()
 		},
 		methods: {
 			getClientType() {

+ 39 - 15
pages/loan/loan.vue

@@ -1,19 +1,18 @@
 <template>
 	<view class="flex-common-css page-box task-bg">
-		<Nav :title="'贷后管理'" :genre="1" :back="false" :is_fixed='false'></Nav>
-		<Search :placeholder="'贷款人姓名或电话'" @setSearch="setSearch"></Search>
-		<view class="page-box-bg-fff m-lr20 r-20">
-			<z-tabs ref="tabs" :list="tabsList" :active-style="{color:'#10B261',fontWeight:'bold',fontSize:'30rpx'}"
-				:bar-style="{background:'#10B261'}" :inactive-style="{fontWeight:'bold',fontSize:'28rpx'}"
-				:current="current" :bar-animate-mode="'worm'" @change="tabsChange" />
-		</view>
+		<Nav title=" " :back="false" :is_fixed="true" :justify="'left'" :color="'#fff'">
+			<view class="p-20">
+				<IndexPersonal ref="memberObj" @setMemberData="setMemberData"></IndexPersonal>
+				<IndexColumn ref="columnObj"></IndexColumn>
+			</view>
+		</Nav>
 		<!-- 			<EnScroll ref="scroll" :navHeight="100" is_tabHeight @onRefresh="onRefresh"
 				@onScrollBottom="onScrollBottom">
 			</EnScroll> -->
-		<view class="common-view-css flex-direction">
-			<LoanItem :task-list="list" @onCalculate="onCalculate"></LoanItem>
-		</view>			
-		<Tab :tab-index="1"></Tab>
+		<view class="common-view-css common-view-box flex-direction" ref="commonView" id="commonView">
+			<LoanItem :task-list="list" @onCalculate="onCalculate" :commonHeight='commonHeight'></LoanItem>
+		</view>
+		<Tab class="tabView" :tab-index="0"></Tab>
 		<uni-popup ref="popup" type="bottom" @touchmove.stop.prevent="moveHandle">
 			<view class="page-env-160 sys-background-fff r-20">
 				<view class="row-justify-sb center p-lr30 p-t30">
@@ -58,12 +57,17 @@
 	import loanItem from "@/common/task/loan-item.vue";
 	import EnSelect from "@/components/en-utils/en-select/en-select.vue";
 	import ClientType from "@/pages/loan/components/clientType.vue";
-
+	// 个人信息
+	import IndexColumn from "@/pages/index/module/index_column.vue"
+	// 顶部栏目
+	import IndexPersonal from "@/pages/index/module/index_personal.vue"
 	export default {
 		components: {
 			ClientType,
 			EnSelect,
-			LoanItem
+			LoanItem,
+			IndexColumn,
+			IndexPersonal
 		},
 		data() {
 			return {
@@ -101,7 +105,8 @@
 					id: 0,
 					new_rate: '',
 					client_id: '',
-				}
+				},
+				commonHeight: ''
 			}
 		},
 		watch: {},
@@ -110,8 +115,28 @@
 		},
 		onLoad() {},
 		mounted() {
+			this.commonViewHeight()
 		},
 		methods: {
+			commonViewHeight() {
+				this.$nextTick(() => {
+					let tabView = ''
+					uni.createSelectorQuery().select('.tabView').boundingClientRect(data => {
+						// this.commonHeight = data.height;
+						tabView = data.height
+					}).exec()
+					uni.createSelectorQuery().select('.common-view-box').boundingClientRect(data => {
+						console.log(data.height,tabView,'1111111');
+						this.commonHeight = data.height - tabView;
+						console.log(this.commonHeight,'1111111');
+					}).exec()
+					
+				});
+			},
+			// setMemberData(memberData) {
+			// 	this.memberData = memberData
+			// 	this.$refs.columnObj.updateMemberData()
+			// },
 			startList() {
 				this.fromData.status = this.current
 				this.total = 999;
@@ -119,7 +144,6 @@
 				this.page = 1;
 				this.isAjax = false;
 				this.getList();
-
 			},
 			setSearch(text) {
 				this.fromData.selectStr = text

+ 1 - 1
pages/login/index.vue

@@ -171,7 +171,7 @@
 				}
 				this.loginData.tabType = this.type === 1 ? 1 : 0
 				uni.reLaunch({
-					url: '/pages/index/index'
+					url: '/pages/loan/loan'
 				});
 			},
 			verifyData() {

+ 402 - 133
pages/task/task.vue

@@ -1,174 +1,443 @@
 <template>
-	<view class="total-page page-box page-env-20 scroll_content task-bg">
-		<view>
-			<Search :placeholder="'客户姓名或电话'" @setSearch="setSearch"></Search>
-			<view style="height: 100rpx;">
-				<z-tabs ref="tabs" :list="tabsList" :active-style="{color:'#10B261',fontWeight:'bold',fontSize:'28rpx'}"
-					:bar-style="{background:'#10B261'}" :inactive-style="{fontWeight:'bold',fontSize:'28rpx'}"
-					:current="current" :bar-animate-mode="'worm'" @change="tabsChange" />
+	<view class="total-page page-box task-bg">
+		<Nav title="法案查询" :genre="1" :toBack="true" is_fixed></Nav>
+		<view class="page-env-160">
+			<!-- 身份认证start -->
+			<view class="m-t20 m-lr30 text-color-12">
+				<view class="sys-background-fff r-20 p-lr30 p-t30">
+					<en-select v-model="propertyData.modelType" :local-data="typeOption" label="评估模型"
+						placeholder="请选择评估模型"></en-select>
+					<en-input v-model="propertyData.address" label="评估地址" disabled="disabled" placeholder="请输入评估地址"
+						@inputBut="inputBut"></en-input>
+					<en-input v-model="propertyData.complexName" :label="'小区名称'" disabled="disabled"
+						placeholder="请输入小区名称"> </en-input>
+					<en-input :value="propertyData.lng+','+propertyData.lat" disabled="disabled" label="评估坐标"
+						placeholder="地址经纬度"></en-input>
+					<en-input v-model="propertyData.area" :label="'建筑面积'" placeholder="请输入建筑面积"> </en-input>
+					<en-select v-model="propertyData.district" :local-data="districtOption" :label="'所属区域'"
+						placeholder="请选择所属区域"> </en-select>
+				</view>
 			</view>
-		</view>
-		<task-ima-tab @setProductId="setProductId" :num-type="0"></task-ima-tab>
-		<EnScroll ref="scroll" :navHeight="190" is_tabHeight @onRefresh="onRefresh" @onScrollBottom="onScrollBottom">
-			<view v-if="current===1">
-				<TaskItem :type="5" is_bottom :task-list="backlogList"></TaskItem>
+			<view class="sys-background-fff r-20 m-t20 p-lr30" v-if="propertyData.modelType===1">
+				<en-select v-model="propertyData.houseType" :local-data="houseTypeOption" label="房屋类型"
+					placeholder="请选择房屋类型"></en-select>
+			</view>
+			<view class="sys-background-fff r-20 m-t20 p-lr30" v-if="propertyData.modelType===2">
+				<EnRadio v-model="propertyData.is_rent" label="是否出租" :list="statusOption"> </EnRadio>
+				<EnRadio v-model="propertyData.is_morgaged" label="是否抵押" :list="statusOption"> </EnRadio>
+				<EnRadio v-model="propertyData.is_occupied" label="是否占用" :list="statusOption"> </EnRadio>
+				<EnRadio v-model="propertyData.is_seizured" label="是否查封" :list="statusOption"> </EnRadio>
 			</view>
-			<view v-else>
-				<TaskItem :type="1" is_bottom :task-list="taskList"></TaskItem>
+			<view class="sys-background-fff r-20 m-t20 p-lr30" v-if="propertyData.modelType===3">
+				<en-select v-model="propertyData.level_id" :local-data="levelOption" :label="'土地等级'"
+					placeholder="请选择土地等级"> </en-select>
+				<en-select v-model="propertyData.transfer_method" :local-data="transferMethodOption" :label="'出让方式'"
+					placeholder="请选择出让方式"> </en-select>
+				<en-select v-model="propertyData.land_use" :local-data="landUseOption" :label="'土地用途'"
+					placeholder="请选择土地用途"> </en-select>
+				<en-select v-model="propertyData.land_source" :local-data="landSourceOption" :label="'土地来源'"
+					placeholder="请选择土地来源"> </en-select>
+				<en-input v-model="propertyData.age_limit" :label="'出让年限'" placeholder="请输入出让年限"> </en-input>
+				<en-input v-model="propertyData.investment" :label="'投资强度'" placeholder="请输入投资强度"> </en-input>
+				<en-input v-model="propertyData.plot_mix" :label="'最小容积'" placeholder="请输入最小容积率"> </en-input>
+				<en-input v-model="propertyData.plot_max" :label="'最大容积'" placeholder="请输入最大容积率"> </en-input>
+				<en-input v-model="propertyData.greening_mix" :label="'最小绿化'" placeholder="请输入最小绿化面积"> </en-input>
+				<en-input v-model="propertyData.greening_max" :label="'最大绿化'" placeholder="请输入最大绿化面积"> </en-input>
+				<en-input v-model="propertyData.height_mix" :label="'最小高度'" placeholder="请输入最小建筑高度"> </en-input>
+				<en-input v-model="propertyData.height_max" :label="'最大高度'" placeholder="请输入最大建筑高度"> </en-input>
+			</view>
+		</view>
+		<EnButton :text="'评估'" @onSubmit="onSubmit"></EnButton>
+		<uni-popup ref="consentObj">
+			<view class="iPhone-padding agreement-data sys-background-fff">
 			</view>
-		</EnScroll>
-		<Tab :tab-index="1"></Tab>
+		</uni-popup>
 	</view>
 </template>
+
 <script>
-	// 任务列表
-	import TaskItem from "@/common/task/task-item.vue";
-	import TaskImaTab from "@/common/task/task_ima_tab.vue";
+	import EnUpload from "@/components/en-from/en-upload/en-upload.vue";
+	import EnSelect from "@/components/en-from/en-select/en-select.vue";
+	import EnRadio from "@/components/en-from/en-radio/en-radio.vue";
+	import EnInput from "@/components/en-from/en-input/en-input.vue";
 	import {
-		getDayBacklogList,
-		getTaskList
-	} from "@/api/task";
-
+		predictProperty
+	} from "@/api/valuation.js"
 	export default {
 		components: {
-			TaskImaTab,
-			TaskItem,
+			EnInput,
+			EnSelect,
+			EnRadio,
+			EnUpload,
 		},
 		data() {
 			return {
-				tabHeight: uni.getStorageSync('tab_height'),
-				current: 0,
-				swiperCurrent: 0,
-				tabsList: [{
-					name: '全部',
-					dot_color: 'red',
-					disabled: false,
-					'id': 0,
+				typeOption: [{
+					value: 1,
+					text: '住宅模型'
 				}, {
-					name: '新进',
-					dot_color: 'yellow',
-					disabled: false,
-					'id': 6,
+					value: 2,
+					text: '公建模型'
 				}, {
-					'id': 1,
-					name: '待办',
-					dot_color: '',
-					disabled: false
+					value: 3,
+					text: '土地模型'
 				}, {
-					'id': 2,
-					name: '完成',
-					dot_color: '',
-					disabled: false
+					value: 4,
+					text: '工业模型'
+				}],
+				statusOption: [{
+					value: 1,
+					text: '是'
 				}, {
-					'id': 3,
-					name: '拒绝',
-					dot_color: '',
-					disabled: false
+					value: 0,
+					text: '否'
 				}],
-				selectStr: '',
-				startDate: '',
-				endDate: '',
-				phone: '',
-				name: '',
-				productId: 0,
-				stageId: [],
-				departmentId: [],
-				totalNum: 99999,
-				taskList: [],
-				page: 1,
-				isAjax: false,
-				backlogList: [],
-			}
+				houseTypeOption: [],
+				levelOption: [],
+				transferMethodOption: [],
+				landUseOption: [],
+				landSourceOption: [],
+				districtOption: [{
+					value: 1,
+					text: '甘井子区'
+				}, {
+					value: 2,
+					text: '中山区'
+				}, {
+					value: 3,
+					text: '西岗区'
+				}, {
+					value: 4,
+					text: '沙河口区'
+				}, {
+					value: 5,
+					text: '旅顺口区'
+				}, {
+					value: 6,
+					text: '金州区'
+				}, {
+					value: 7,
+					text: '瓦房店市'
+				}, {
+					value: 8,
+					text: '庄河市'
+				}, {
+					value: 9,
+					text: '普兰店区'
+				}],
+				propertyData: {
+					level_id: 1,
+					transfer_method: 1,
+					land_use: 1,
+					land_source: 1,
+					investment: 0,
+					plot_mix: 0,
+					plot_max: 0,
+					height_mix: 0,
+					height_max: 0,
+					greening_mix: 0,
+					greening_max: 0,
+					age_limit: 0,
+					floor_area: 0,
+					lat: 0,
+					lng: 0,
+					is_sold: 0,
+					is_rent: 0,
+					is_morgaged: 0,
+					is_occupied: 0,
+					is_seizured: 0,
+					address: '',
+					modelType: '',
+					area: '',
+					district: '',
+					houseType: '',
+					complexName: '',
+				},
+				propertyRes: {
+					unit_price: '',
+					predict_msg: '',
+				},
+				location: {
+					lat: 0,
+					lng: 0,
+					address: '',
+					districtName: '',
+					complexName: ''
+				},
+			};
 		},
-		onLoad() {},
+		onLoad(options) {},
+		onShow() {},
+		watch: {},
 		mounted() {},
 		methods: {
-			setSearch(text) {
-				this.selectStr = text
-				this.startList()
+			async inputBut() {
+				let that = this;
+				try {
+					// 选择位置
+					uni.chooseLocation({
+						success: function(res) {
+							// 更新数据
+							that.propertyData.lng = res.longitude;
+							that.propertyData.lat = res.latitude;
+							that.propertyData.address = res.address;
+							that.propertyData.complexName = res.name || '';
+							// 根据地址信息设置区域
+							that.setDistrictByAddress(res.address);
+							console.log('当前位置的经度:' + res.longitude);
+							console.log('当前位置的纬度:' + res.latitude);
+						},
+						fail: async function(err) {
+							console.log('获取位置失败:', err);
+							// 如果是授权被拒绝
+							if (err.errMsg.indexOf('auth deny') !== -1) {
+								try {
+									// 引导用户手动开启授权
+									await showAuthorizeGuide();
+								} catch (e) {
+									console.log('授权引导失败:', e);
+								}
+							}
+						}
+					});
+				} catch (err) {
+					console.log('获取位置失败:', err);
+					if (err.errMsg && (err.errMsg.includes('auth deny') || err.errMsg.includes('fail cancel'))) {
+						uni.showToast({
+							title: '需要位置权限才能选择地址',
+							icon: 'none'
+						});
+					}
+				}
 			},
-			setProductId(productId) {
-				console.log('productId:' + productId)
-				this.productId = productId
-				this.startList()
+			// 检查位置权限
+			checkLocationAuth() {
+				return new Promise((resolve) => {
+					uni.getSetting({
+						success: (res) => {
+							const authSetting = res.authSetting;
+							resolve(authSetting['scope.userLocation'] || false);
+						},
+						fail: () => {
+							resolve(false);
+						}
+					});
+				});
 			},
-			startList() {
-				if (this.current === 1) {
-					this.getDayBacklogList()
-				} else {
-					this.totalNum = 999;
-					this.taskList = [];
-					this.page = 1;
-					this.isAjax = false;
-					this.getTaskReceiving();
-				}
-
+			// 选择位置
+			// chooseLocation() {
+			// 	return new Promise((resolve, reject) => {
+			// 		uni.chooseLocation({
+			// 			success: resolve,
+			// 			fail: reject
+			// 		});
+			// 	});
+			// },
+			showAuthorizeGuide() {
+				return new Promise((resolve, reject) => {
+					uni.showModal({
+						title: '位置权限未开启',
+						content: '需要您授权位置信息才能提供此服务,请到设置中开启权限',
+						confirmText: '去设置',
+						success: (modalRes) => {
+							if (modalRes.confirm) {
+								// 打开小程序设置页面
+								uni.openSetting({
+									success: (openRes) => {
+										if (openRes.authSetting['scope.userLocation']) {
+											uni.showToast({
+												title: '授权成功',
+												icon: 'success'
+											});
+											resolve();
+										} else {
+											uni.showToast({
+												title: '授权失败',
+												icon: 'none'
+											});
+											reject();
+										}
+									}
+								});
+							} else {
+								reject();
+							}
+						}
+					});
+				});
 			},
-			getDayBacklogList() {
-				if (this.isAjax || (this.totalNum <= this.backlogList.length)) {
-					return;
+			// 根据地址设置区域
+			setDistrictByAddress(address) {
+				if (!address) return;
+				const districtText = this.extractDistrictFromAddress(address);
+				if (districtText) {
+					const district = this.districtOption.find(item =>
+						districtText.includes(item.text) || item.text.includes(districtText)
+					);
+					if (district) {
+						this.propertyData.district = district.value;
+					}
 				}
-				getDayBacklogList({
-					'selectStr': this.selectStr
-				}).then((res) => {
-					if (res.code === 1) {
-						this.backlogList = res.data.items
-						this.totalNum = res.data.totalNum
+			},
+			// 从地址中提取区域信息
+			extractDistrictFromAddress(address) {
+				if (!address) return '';
+				// 简单的区域提取逻辑,可以根据实际需求调整
+				for (let district of this.districtOption) {
+					if (address.includes(district.text)) {
+						return district.text;
 					}
-				})
+				}
+				return '';
+			},
+			setLocation(res) {
+				console.log("收到监听", res)
+				this.propertyData.address = res.address
+				this.propertyData.lat = res.lat
+				this.propertyData.lng = res.lng
+				this.propertyData.complexName = res.complexName
+				this.setDistrictByAddress(res.address);
+				// this.districtOption.forEach(item => {
+				// 	if (res.districtName === item.text) {
+				// 		this.propertyData.district = item.value
+				// 	}
+				// })
 			},
-			getTaskReceiving() {
-				if (this.isAjax || (this.totalNum <= this.taskList.length)) {
-					return;
+			getValuationOption() {
+				if (this.propertyData.houseType === "") {
+					this.propertyData.houseType = 0
 				}
-				this.isAjax = true;
-				getTaskList({
-					'status': this.tabsList[this.current].id,
-					'selectStr': this.selectStr,
-					'phone': this.phone,
-					'name': this.name,
-					'productId': this.productId,
-					'stageId': this.stageId,
-					'departmentId': this.departmentId,
-					'startDate': this.startDate,
-					'endDate': this.endDate,
-					'page': this.page,
-				}).then((res) => {
-					this.isAjax = false;
-					if (res.code === 1) {
-						this.totalNum = res.data.totalNum
-						this.taskList.push(...res.data.items)
-							++this.page;
+				getValuationOption({
+					"modelType": this.propertyData.modelType
+				}).then(res => {
+					if (res.code === 0) {
+						if (this.propertyData.modelType === 1) {
+							this.houseTypeOption = res.data.houseTypeOption
+						} else if (this.propertyData.modelType === 3) {
+							this.levelOption = res.data.levelOption
+							this.transferMethodOption = res.data.transferMethodOption
+							this.landUseOption = res.data.landUseOption
+							this.landSourceOption = res.data.landSourceOption
+							this.propertyData.land_source = this.landSourceOption[0].id
+						}
 					}
 				})
 			},
-			tabsChange(index) {
-				if (index !== this.current) {
-					this.current = index;
-					this.startList()
-				}
-			},
-			// 下拉刷新
-			onRefresh() {
-				setTimeout(() => {
-					this.$refs.scroll.onEndPulling()
-				}, 200)
-				this.startList()
+			onSubmit() {
+				console.log('提交评估数据', this.propertyData)
+				predictProperty(this.propertyData).then(res => {
+					if (res.code === 0) {
+						console.log(res, 'res');
+						this.propertyRes = res.data
+					} else {
+						tools.error(res.msg)
+					}
+				})
 			},
-			// 滚动到底部
-			onScrollBottom() {
-
-				if (this.current === 1) {
-					this.getDayBacklogList()
+			setMapMarker(lng, lat, status) {
+				if (this.marker === undefined) {
+					this.marker = new AMap.Marker({
+						position: new AMap.LngLat(lng, lat),
+						offset: new AMap.Pixel(-10, -10),
+						icon: "//vdata.amap.com/icons/b18/1/2.png", //添加 icon 图标 URL
+						title: "标记位",
+					});
+					this.map.add(this.marker);
 				} else {
-					this.getTaskReceiving();
+					this.marker.setPosition(new AMap.LngLat(lng, lat));
+				}
+				if (status) {
+					this.location.lat = lat
+					this.location.lng = lng
+					AMap.plugin("AMap.Geocoder", () => {
+						let geocoder = new AMap.Geocoder({
+							city: "大连市", // city 指定进行编码查询的城市,支持传入城市名、adcode 和 citycode
+							extensions: "all"
+						});
+						let lnglat = [this.location.lng, this.location.lat];
+						geocoder.getAddress(lnglat, (status, result) => {
+							if (status === "complete" && result.info === "OK") {
+								// result为对应的地理位置详细信息
+								console.log(result.regeocode)
+								if (result.regeocode.formattedAddress !== undefined && result.regeocode
+									.formattedAddress !== "") {
+									this.location.address = result.regeocode.formattedAddress;
+									this.location.districtName = result.regeocode.addressComponent
+										.district;
+									if (result.regeocode.pois !== undefined && result.regeocode.pois
+										.length > 0) {
+										this.location.complexName = result.regeocode.pois[0].name
+									}
+								}
+							}
+						});
+					});
 				}
-
 			},
-
 		},
 	}
 </script>
+
 <style lang="scss" scoped>
+	.input-item:last-child {
+		margin-top: 30rpx;
+	}
+
+	.input-send {
+		display: flex;
+		justify-content: flex-start;
+		align-items: center;
+		border-bottom: 1px solid #E5E5E5;
+
+		.login-input {
+			width: calc(100% - 150rpx);
+		}
+
+		.login-send {
+			width: 100rpx;
+			text-align: center;
+			margin-left: 20rpx;
+			border: 1rpx solid #0FB160;
+			border-radius: 50rpx;
+		}
+	}
+
+	.left-w {
+		width: 210rpx;
+		min-width: 210rpx;
+		color: #333333;
+	}
+
+	.iconfont {
+		font-size: 36rpx;
+		color: #333333;
+	}
+
+	.class-c-6C6F93 {
+		color: #0FB160;
+	}
 
+	.agreement-data {
+		border-radius: 30rpx 30rpx 0 0;
+
+		.data-title {
+			width: 100%;
+			border-radius: 30rpx 30rpx 0 0;
+		}
+
+		.data-content {
+			padding: 20rpx 40rpx;
+
+			.content-box {
+				height: 600rpx;
+			}
+		}
+
+		.data-but {
+			height: 96rpx;
+			line-height: 96rpx;
+			text-align: center;
+			margin: 0 75rpx;
+		}
+	}
 </style>

+ 129 - 129
service/ajax.js

@@ -1,74 +1,74 @@
 import tools from "@/service/tools";
-let BASE_URL =''
+let BASE_URL = ''
 //#ifndef H5
-// BASE_URL = process.uniEnv.baseUrl;
+BASE_URL = process.uniEnv.baseUrl;
 //#endif
 
 
 /**
  * post请求封装
  */
-export const request = (url, method, data, show = false,isGo=false) => {
-  let token=uni.getStorageSync('token')
-  // data.token = token;
-  // data.m_id = uni.getStorageSync('m_id')
-  // if(isGo){
-  //   BASE_URL = process.uniEnv.goUrl;
-  // }else {
-  //   BASE_URL = process.uniEnv.baseUrl;
-  // }
+export const request = (url, method, data, show = false, isGo = false) => {
+	let token = uni.getStorageSync('token')
+	// data.token = token;
+	// data.m_id = uni.getStorageSync('m_id')
+	// if(isGo){
+	//   BASE_URL = process.uniEnv.goUrl;
+	// }else {
+	//   BASE_URL = process.uniEnv.baseUrl;
+	// }
 
-  if (show) {
-    tools.showLoading();
-  }
-  if (data === undefined) {
-    data = {};
-  }
-  if(url==='/api/task/add'){
-    console.log(data)
-  }
-  return new Promise((resolve, reject) => {
-    // 封装主体:网络请求
-    console.log(url)
-    uni.request({
-      url:BASE_URL+  url,
-      data: data,
-      method: method || 'post',
-      header: {
-        'content-type': 'application/json',
-        'hversion': '1.0',
-        'Authorization': token
-      },
-      success: (res) => {
-        if (res.statusCode === 200) {
-          // console.log('应答信息-----------------------')
-          // console.log(res.data); // 控制台显示数据信息
-          tools.hideLoading();
-          if (res.data.code * 1 === 401) {
-            // uni.clearStorageSync()
-            // uni.reLaunch({
-            //   url: '/pages/login/index'
-            // });
-          } else {
-            resolve(res.data)
-          }
-        }else if(res.statusCode === 401){
-          uni.clearStorageSync()
-          uni.reLaunch({
-            url: '/pages/login/index'
-          });
-        } else{
-          tools.error('网络错误!!')
-        }
-      },
-      fail: (err) => {
-        tools.error('网络错误!!')
-        // 返回错误消息
-        reject(err)
-        tools.hideLoading();
-      }
-    })
-  })
+	if (show) {
+		tools.showLoading();
+	}
+	if (data === undefined) {
+		data = {};
+	}
+	if (url === '/api/task/add') {
+		console.log(data)
+	}
+	return new Promise((resolve, reject) => {
+		// 封装主体:网络请求
+		console.log(url)
+		uni.request({
+			url: BASE_URL + url,
+			data: data,
+			method: method || 'post',
+			header: {
+				'content-type': 'application/json',
+				'hversion': '1.0',
+				'Authorization': token
+			},
+			success: (res) => {
+				if (res.statusCode === 200) {
+					// console.log('应答信息-----------------------')
+					// console.log(res.data); // 控制台显示数据信息
+					tools.hideLoading();
+					if (res.data.code * 1 === 401) {
+						// uni.clearStorageSync()
+						// uni.reLaunch({
+						//   url: '/pages/login/index'
+						// });
+					} else {
+						resolve(res.data)
+					}
+				} else if (res.statusCode === 401) {
+					uni.clearStorageSync()
+					uni.reLaunch({
+						url: '/pages/login/index'
+					});
+				} else {
+					tools.error('网络错误!!')
+				}
+			},
+			fail: (err) => {
+				tools.error('网络错误!!')
+				// 返回错误消息
+				reject(err)
+				tools.hideLoading();
+			}
+		})
+	})
 }
 
 /**
@@ -76,76 +76,76 @@ export const request = (url, method, data, show = false,isGo=false) => {
  */
 
 export const uploadImage = (filePath, imageName, data) => {
-  tools.showLoading();
-  return new Promise((resolve, reject) => {
-    uni.uploadFile({
-      url: BASE_URL + '/api/common/upload',
-      // header: {
-      // 	'Authorization': JSON.parse(uni.getStorageSync('userInfo')).token
-      // },
-      filePath: filePath,
-      name: imageName,
-      formData: data,
-      success: (res) => {
-        tools.hideLoading();
-        resolve(res)
-      },
-      fail(err) {
-        tools.hideLoading();
-        reject(err)
-      }
-    });
-  })
+	tools.showLoading();
+	return new Promise((resolve, reject) => {
+		uni.uploadFile({
+			url: BASE_URL + '/api/common/upload',
+			// header: {
+			// 	'Authorization': JSON.parse(uni.getStorageSync('userInfo')).token
+			// },
+			filePath: filePath,
+			name: imageName,
+			formData: data,
+			success: (res) => {
+				tools.hideLoading();
+				resolve(res)
+			},
+			fail(err) {
+				tools.hideLoading();
+				reject(err)
+			}
+		});
+	})
 }
 
 
 export const uploadFile = (url, file) => {
-  tools.showLoading();
-  let token = uni.getStorageSync('token') || '';
-  // data.app_version = plus.runtime.version;
-  // console.log('请求地址-----------------------')
-  // console.log(BASE_URL + url)
-  // console.log('请求参数-----------------------')
-  // console.log(data)
-  console.log(file)
-  return new Promise((resolve, reject) => {
-    // 封装主体:网络请求
-    console.log(BASE_URL + url)
-    uni.uploadFile({
-      url: BASE_URL + url, //仅为示例,非真实的接口地址
-      filePath: file,
-      name: 'file',
-      header: {
-        'content-type': 'application/json',
-        'apikey': '01ABA77B8BA6F26243D85B5A50FFB88624951C7B3A4078B3F9971983E667D5B8',
-        'hversion': '1.0',
-        'Authorization': token
-      },
-      success: (res) => {
-        tools.hideLoading();
-        if (res.statusCode === 200) {
-          // console.log('应答信息-----------------------')
-          res.data = JSON.parse(res.data)
-          // console.log(res.data); // 控制台显示数据信息
-          if (res.data.code * 1 === 401) {
-            uni.reLaunch({
-              url: '/pages/login/login'
-            });
-          } else {
-            resolve(res.data)
-          }
-        } else {
-          tools.error('网络错误!!')
-        }
-      },
-      fail: (err) => {
-        tools.error('网络错误!!')
-        // 返回错误消息
-        reject(err)
-        tools.hideLoading();
-      }
-    });
+	tools.showLoading();
+	let token = uni.getStorageSync('token') || '';
+	// data.app_version = plus.runtime.version;
+	// console.log('请求地址-----------------------')
+	// console.log(BASE_URL + url)
+	// console.log('请求参数-----------------------')
+	// console.log(data)
+	console.log(file)
+	return new Promise((resolve, reject) => {
+		// 封装主体:网络请求
+		console.log(BASE_URL + url)
+		uni.uploadFile({
+			url: BASE_URL + url, //仅为示例,非真实的接口地址
+			filePath: file,
+			name: 'file',
+			header: {
+				'content-type': 'application/json',
+				'apikey': '01ABA77B8BA6F26243D85B5A50FFB88624951C7B3A4078B3F9971983E667D5B8',
+				'hversion': '1.0',
+				'Authorization': token
+			},
+			success: (res) => {
+				tools.hideLoading();
+				if (res.statusCode === 200) {
+					// console.log('应答信息-----------------------')
+					res.data = JSON.parse(res.data)
+					// console.log(res.data); // 控制台显示数据信息
+					if (res.data.code * 1 === 401) {
+						uni.reLaunch({
+							url: '/pages/login/login'
+						});
+					} else {
+						resolve(res.data)
+					}
+				} else {
+					tools.error('网络错误!!')
+				}
+			},
+			fail: (err) => {
+				tools.error('网络错误!!')
+				// 返回错误消息
+				reject(err)
+				tools.hideLoading();
+			}
+		});
 
-  })
+	})
 
-}
+}

+ 20 - 13
service/tools.js

@@ -1,4 +1,6 @@
-import {wxLogin} from "@/api/login";
+import {
+	wxLogin
+} from "@/api/login";
 
 let tools = {}
 /**
@@ -268,11 +270,11 @@ tools.getDate = function(type) {
 	// let myHour = myDate.getHours(); //获取当前小时数(0-23)
 	// let myMinute = myDate.getMinutes(); //获取当前分钟数(0-59)
 	// let mySecond = myDate.getSeconds(); //获取当前秒数(0-59)
-	if(myMonth<10){
-		myMonth='0'+myMonth
+	if (myMonth < 10) {
+		myMonth = '0' + myMonth
 	}
-	if(myToday<10){
-		myToday='0'+myToday
+	if (myToday < 10) {
+		myToday = '0' + myToday
 	}
 	if (type === '-') {
 		return myDate.getFullYear() + '-' + (myMonth) + '-' + myToday
@@ -504,12 +506,17 @@ tools.getNextYear = function(d, num) {
 }
 
 tools.topHeight = function() {
+	// #ifdef MP-WEIXIN
 	const navTop = uni.getMenuButtonBoundingClientRect()
 	return navTop.height + navTop.top + 10
+	//#endif
+	// #ifdef H5
+	return 40
+	//#endif
 }
 
 
-tools.weiXinLogin=async function () {
+tools.weiXinLogin = async function() {
 	return new Promise((resolve, reject) => {
 		uni.login({
 			provider: "weixin",
@@ -519,17 +526,17 @@ tools.weiXinLogin=async function () {
 				}).then((res) => {
 					if (res.code === 403) {
 						tools.error('当前用户未注册')
-						resolve( -1)
+						resolve(-1)
 					} else if (res.code === 1) {
-						if(res.data.status===0){
+						if (res.data.status === 0) {
 							tools.setLoginData(res.data, false)
-							resolve( true)
-						}else {
+							resolve(true)
+						} else {
 							tools.error('信息正在审核...')
-							resolve( false)
+							resolve(false)
 						}
 					} else {
-						resolve( false)
+						resolve(false)
 					}
 				})
 			}
@@ -537,4 +544,4 @@ tools.weiXinLogin=async function () {
 	})
 }
 
-export default tools
+export default tools

+ 121 - 7
static/css/common.css

@@ -55,7 +55,9 @@
 	top: 84px;
 	z-index: 4;
 }
-
+.d-inline-block{
+	display: inline-block;
+}
 .scroll_content {
 	height: 100vh;
 	width: 100vw;
@@ -141,11 +143,23 @@
 	flex-wrap: wrap;
 }
 
+.flex-justify-around {
+	display: flex;
+	justify-content: space-around;
+}
+
 .center {
 	display: flex;
 	align-items: center;
 }
-
+.flex-stretch {
+	display: flex;
+	align-items: stretch;
+}
+.flex-start {
+	display: flex;
+	align-items: flex-start;
+}
 .justify-center {
 	justify-content: center;
 }
@@ -232,6 +246,10 @@
 	padding: 20rpx;
 }
 
+.p-24 {
+	padding: 24rpx;
+}
+
 .p-30 {
 	padding: 30rpx;
 }
@@ -402,11 +420,11 @@
 	padding-right: 40rpx;
 }
 
-.m-t6{
-	max-width: 50%;          /* 最大宽度 */
-	overflow: hidden;          /* 超出隐藏 */
-	text-overflow: ellipsis;   /* 显示省略号 */
-	white-space: nowrap;       /* 不换行 */
+.m-t6 {
+	max-width: 50%;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
 }
 
 /*margin大小*/
@@ -669,6 +687,14 @@
 	border: 2rpx dashed #E5E5E5;
 }
 
+.b-F3F4F6-1 {
+	border: .1rpx solid #F3F4F6;
+}
+
+.b-B9F8CF-1 {
+	border: .1rpx solid #B9F8CF;
+}
+
 .bor-bottom-1 {
 	border-bottom: 1rpx solid #E5E5E5;
 }
@@ -682,10 +708,82 @@
 	background: #CCCCCC;
 }
 
+.bgc-fff {
+	background-color: #fff;
+}
+
 .bgc-6A7383 {
 	background-color: #6A7383;
 }
 
+.bgc-F9FAFB {
+	background-color: #F9FAFB;
+}
+
+.bgc-F0FDF4 {
+	background-color: #F0FDF4;
+}
+
+.bgc-DBFCE7 {
+	background-color: #DBFCE7;
+}
+.bgc-5692FF {
+	background-color: #5692FF;
+}
+.bgc-7D99FF {
+	background-color: #7D99FF;
+}
+.bgc-33D595 {
+	background-color: #33D595;
+}
+.bgc-E87DD2 {
+	background-color: #E87DD2;
+}
+.bgc-F8516C {
+	background-color: #F8516C;
+}
+.bgc-EEFAFF {
+	background-color: #EEFAFF;
+}
+.bgc-DBEAFE {
+	background-color: #DBEAFE;
+}
+.bgc-B768FF {
+	background-color: #B768FF;
+}
+.bgc-B365FF {
+	background-color: #B365FF;
+}
+.bgc-33B2EB {
+	background-color: #33B2EB;
+}
+.bgc-34B4EB {
+	background-color: #34B4EB;
+}
+.bgc-34CC79 {
+	background-color: #34CC79;
+}
+.bgc-34CA79 {
+	background-color: #34CA79;
+}
+.bgc-00DC73-00BF7C {
+	background-image: linear-gradient(125deg, #00C858, #00BCA2);
+}
+.bgc-C579FF-F4399F {
+	background-image: linear-gradient(125deg, #C579FF , #F4399F);
+}
+.bgc-F92A3B-E70073 {
+	background-image: linear-gradient(125deg, #F92A3B , #E70073);
+}
+.bgc-AB46FF-8125FE {
+	background-image: linear-gradient(125deg, #AB46FF , #8125FE);
+}
+.bgc-00B6DC-0F62FA {
+	background-image: linear-gradient(125deg, #00B6DC , #0F62FA);
+}
+.bgc-00C651-009B65 {
+	background-image: linear-gradient(125deg, #00C651 , #009B65);
+}
 .fc-6A7383 {
 	color: #6A7383;
 }
@@ -694,6 +792,10 @@
 	color: #00A63D;
 }
 
+.fc-008235 {
+	color: #008235;
+}
+
 .fc-155DFB {
 	color: #155DFB;
 }
@@ -706,6 +808,18 @@
 	color: #4B5666;
 }
 
+.fc-343C47 {
+	color: #343C47;
+}
+.fc-fff{
+	color: #fff;
+}
+.fc-1547E6{
+	color: #1547E6;
+}
+.fc-1B388E{
+	color: #1B388E;
+}
 
 /*圆角*/
 .r-8 {

+ 1 - 1
uni_modules/k-tabs-swiper/components/k-tabs-swiper/k-tabs-swiper.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="v-tabs">
 		<scroll-view :id="getDomId" :scroll-x="scroll" :scroll-left="scroll ? scrollLeft : 0"
-			:scroll-with-animation="scroll" :style="{ position: fixed ? 'fixed' : 'relative', zIndex }">
+			:scroll-with-animation="scroll" :style="{ position: fixed ? 'fixed' : 'relative' }">
 			<view class="v-tabs__container" :style="{
           display: scroll ? 'inline-flex' : 'flex',
           whiteSpace: scroll ? 'nowrap' : 'normal',

+ 53 - 0
yarn.lock

@@ -2,6 +2,11 @@
 # yarn lockfile v1
 
 
+"@amap/amap-jsapi-loader@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.npmjs.org/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz"
+  integrity sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==
+
 "@babel/parser@^7.18.4":
   version "7.19.0"
   resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz"
@@ -12,6 +17,16 @@
   resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz"
   integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==
 
+"@dimforge/rapier3d-compat@~0.12.0":
+  version "0.12.0"
+  resolved "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz"
+  integrity sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==
+
+"@tweenjs/tween.js@~23.1.3":
+  version "23.1.3"
+  resolved "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz"
+  integrity sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==
+
 "@tweenjs/tween.js@18 - 25":
   version "25.0.0"
   resolved "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz"
@@ -22,6 +37,24 @@
   resolved "https://registry.npmjs.org/@types/html5plus/-/html5plus-1.0.2.tgz"
   integrity sha512-OklP5lrmLq8/6TUOLgWc0LndUVvAiTWX5dnyoCFhIUtFW9opWsnCtG/UxPgeuC28Rv2XNbFfft/hEEI39P/4Ag==
 
+"@types/stats.js@*":
+  version "0.17.4"
+  resolved "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz"
+  integrity sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==
+
+"@types/three@^0.181.0":
+  version "0.181.0"
+  resolved "https://registry.npmjs.org/@types/three/-/three-0.181.0.tgz"
+  integrity sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==
+  dependencies:
+    "@dimforge/rapier3d-compat" "~0.12.0"
+    "@tweenjs/tween.js" "~23.1.3"
+    "@types/stats.js" "*"
+    "@types/webxr" "*"
+    "@webgpu/types" "*"
+    fflate "~0.8.2"
+    meshoptimizer "~0.22.0"
+
 "@types/uni-app@^1.4.4":
   version "1.4.4"
   resolved "https://registry.npmjs.org/@types/uni-app/-/uni-app-1.4.4.tgz"
@@ -29,6 +62,11 @@
   dependencies:
     vue "^2.6.8"
 
+"@types/webxr@*":
+  version "0.5.24"
+  resolved "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz"
+  integrity sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==
+
 "@vue/compiler-sfc@2.7.10":
   version "2.7.10"
   resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.10.tgz"
@@ -38,6 +76,11 @@
     postcss "^8.4.14"
     source-map "^0.6.1"
 
+"@webgpu/types@*":
+  version "0.1.66"
+  resolved "https://registry.npmjs.org/@webgpu/types/-/types-0.1.66.tgz"
+  integrity sha512-YA2hLrwLpDsRueNDXIMqN9NTzD6bCDkuXbOSe0heS+f8YE8usA6Gbv1prj81pzVHrbaAma7zObnIC+I6/sXJgA==
+
 "3d-force-graph@^1.79.0":
   version "1.79.0"
   resolved "https://registry.npmjs.org/3d-force-graph/-/3d-force-graph-1.79.0.tgz"
@@ -229,6 +272,11 @@ echarts@^6.0.0:
     tslib "2.3.0"
     zrender "6.0.0"
 
+fflate@~0.8.2:
+  version "0.8.2"
+  resolved "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz"
+  integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==
+
 float-tooltip@^1.7:
   version "1.7.5"
   resolved "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz"
@@ -301,6 +349,11 @@ lodash-es@4:
   resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
   integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
 
+meshoptimizer@~0.22.0:
+  version "0.22.0"
+  resolved "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz"
+  integrity sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==
+
 mpvue-echarts@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/mpvue-echarts/-/mpvue-echarts-1.0.0.tgz"