Quellcode durchsuchen

修复一些bug,增加一些新功能

Yannay vor 2 Monaten
Ursprung
Commit
5cbf748ee3

+ 181 - 0
components/order-file-upload-old/order-file-upload.vue

@@ -0,0 +1,181 @@
1
+<template>
2
+	<view class="order-file-upload">
3
+		<view class="upload-section">
4
+			<view class="upload-title">
5
+				<text class="title-text">{{ title }}</text>
6
+				<text class="upload-btn" @click="handleUpload">上传文件</text>
7
+			</view>
8
+
9
+			<view class="file-list" v-if="fileList.length > 0">
10
+				<view class="file-item" v-for="(item, index) in fileList" :key="index">
11
+					<view class="file-info">
12
+						<text class="file-name">{{ item.fileName }}</text>
13
+						<text class="file-size">{{ item.fileSize }}</text>
14
+					</view>
15
+					<view class="file-actions">
16
+						<text class="delete-btn" @click="handleDelete(index)">删除</text>
17
+					</view>
18
+				</view>
19
+			</view>
20
+
21
+			<view class="upload-tip" v-else>
22
+				<text class="tip-text">{{ tipText }}</text>
23
+			</view>
24
+		</view>
25
+	</view>
26
+</template>
27
+
28
+<script>
29
+import upload from '../../mixins/upload';
30
+export default {
31
+	name: 'OrderFileUpload',
32
+	mixins: [upload],
33
+	props: {
34
+		title: {
35
+			type: String,
36
+			default: '文件上传'
37
+		},
38
+		orderFileType: {
39
+			type: String,
40
+			required: true
41
+		},
42
+		fileList: {
43
+			type: Array,
44
+			default: () => []
45
+		},
46
+		tipText: {
47
+			type: String,
48
+			default: '点击上传文件'
49
+		},
50
+		fileType: {
51
+			type: String,
52
+			default: 'all',
53
+			desc: '文件选择类型:all(所有)、image(图片)、video(视频)、audio(音频)、document(文档)等'
54
+		},
55
+	},
56
+	data() {
57
+		return {
58
+		}
59
+	},
60
+	watch: {
61
+		fileList: {
62
+			handler(newVal) {
63
+				this.uploadList = [...newVal];
64
+			},
65
+			immediate: true
66
+		}
67
+	},
68
+	methods: {
69
+		handleUploadSuccess() {
70
+			uni.$u.toast("上传成功");
71
+		},
72
+		// 删除文件
73
+		handleDelete(index) {
74
+			uni.showModal({
75
+				title: '提示',
76
+				content: '确定要删除该文件吗?',
77
+				success: (res) => {
78
+					if (res.confirm) {
79
+						this.uploadList.splice(index, 1);
80
+						this.$emit('update:fileList', this.uploadList);
81
+						this.$emit('change', {
82
+							type: this.orderFileType,
83
+							fileList: this.uploadList
84
+						});
85
+					}
86
+				}
87
+			});
88
+		}
89
+	}
90
+}
91
+</script>
92
+
93
+<style lang="scss" scoped>
94
+.order-file-upload {
95
+	.upload-section {
96
+		background: #fff;
97
+		margin-bottom: 20rpx;
98
+		border-radius: 16rpx;
99
+		overflow: hidden;
100
+	}
101
+
102
+	.upload-title {
103
+		display: flex;
104
+		justify-content: space-between;
105
+		align-items: center;
106
+		padding: 30rpx 40rpx;
107
+		border-bottom: 1rpx solid #f5f5f5;
108
+
109
+		.title-text {
110
+			font-size: 32rpx;
111
+			font-weight: 500;
112
+			color: #333;
113
+		}
114
+
115
+		.upload-btn {
116
+			padding: 12rpx 24rpx;
117
+			background: #007aff;
118
+			color: #fff;
119
+			border-radius: 8rpx;
120
+			font-size: 28rpx;
121
+		}
122
+	}
123
+
124
+	.file-list {
125
+		padding: 20rpx 40rpx;
126
+	}
127
+
128
+	.file-item {
129
+		display: flex;
130
+		justify-content: space-between;
131
+		align-items: center;
132
+		padding: 20rpx 0;
133
+		border-bottom: 1rpx solid #f5f5f5;
134
+
135
+		&:last-child {
136
+			border-bottom: none;
137
+		}
138
+	}
139
+
140
+	.file-info {
141
+		flex: 1;
142
+		min-width: 0; // 防止flex子元素溢出
143
+
144
+		.file-name {
145
+			display: block;
146
+			font-size: 30rpx;
147
+			color: #333;
148
+			margin-bottom: 8rpx;
149
+			overflow: hidden;
150
+			text-overflow: ellipsis;
151
+			white-space: nowrap;
152
+			max-width: 400rpx; // 设置最大宽度防止过长
153
+		}
154
+
155
+		.file-size {
156
+			font-size: 26rpx;
157
+			color: #999;
158
+		}
159
+	}
160
+
161
+	.file-actions {
162
+		.delete-btn {
163
+			padding: 12rpx 24rpx;
164
+			background: #ff4757;
165
+			color: #fff;
166
+			border-radius: 8rpx;
167
+			font-size: 26rpx;
168
+		}
169
+	}
170
+
171
+	.upload-tip {
172
+		padding: 40rpx;
173
+		text-align: center;
174
+
175
+		.tip-text {
176
+			font-size: 28rpx;
177
+			color: #999;
178
+		}
179
+	}
180
+}
181
+</style>

+ 141 - 133
components/order-file-upload/order-file-upload.vue

@@ -2,180 +2,188 @@
2 2
 	<view class="order-file-upload">
3 3
 		<view class="upload-section">
4 4
 			<view class="upload-title">
5
-				<text class="title-text">{{title}}</text>
5
+				<text class="title-text">{{ title }}</text>
6 6
 				<text class="upload-btn" @click="handleUpload">上传文件</text>
7 7
 			</view>
8 8
 
9 9
 			<view class="file-list" v-if="fileList.length > 0">
10 10
 				<view class="file-item" v-for="(item, index) in fileList" :key="index">
11
-					<view class="file-info">
12
-						<text class="file-name">{{item.fileName}}</text>
13
-						<text class="file-size">{{item.fileSize}}</text>
14
-					</view>
11
+					<pictureViewer @delete="handleDelete(index)" :src="item.fileUrl" @needPreviewPic="needPreviewPic">
12
+					</pictureViewer>
15 13
 					<view class="file-actions">
16
-						<text class="delete-btn" @click="handleDelete(index)">删除</text>
14
+						<!-- <text class="delete-btn" @click="handleDelete(index)">x</text> -->
17 15
 					</view>
18 16
 				</view>
19 17
 			</view>
20 18
 
21 19
 			<view class="upload-tip" v-else>
22
-				<text class="tip-text">{{tipText}}</text>
20
+				<text class="tip-text">{{ tipText }}</text>
23 21
 			</view>
24 22
 		</view>
25 23
 	</view>
26 24
 </template>
27 25
 
28 26
 <script>
29
-	import upload from '../../mixins/upload';
30
-	export default {
31
-		name: 'OrderFileUpload',
32
-		mixins : [upload],
33
-		props: {
34
-			title: {
35
-				type: String,
36
-				default: '文件上传'
37
-			},
38
-			orderFileType: {
39
-				type: String,
40
-				required: true
41
-			},
42
-			fileList: {
43
-				type: Array,
44
-				default: () => []
45
-			},
46
-			tipText: {
47
-				type: String,
48
-				default: '点击上传文件'
49
-			},
50
-			fileType: {
51
-				type: String,
52
-				default: 'all',
53
-				desc: '文件选择类型:all(所有)、image(图片)、video(视频)、audio(音频)、document(文档)等'
54
-			},
27
+import upload from '../../mixins/upload';
28
+import pictureViewer from '../picture-viewer/picture-viewer.vue'
29
+export default {
30
+	name: 'OrderFileUpload',
31
+	mixins: [upload],
32
+	components: {
33
+		pictureViewer
34
+	},
35
+	props: {
36
+		title: {
37
+			type: String,
38
+			default: '文件上传'
55 39
 		},
56
-		data() {
57
-			return {
58
-			}
40
+		orderFileType: {
41
+			type: String,
42
+			required: true
59 43
 		},
60
-		watch: {
61
-			fileList: {
62
-				handler(newVal) {
63
-					this.uploadList = [...newVal];
64
-				},
65
-				immediate: true
66
-			}
44
+		fileList: {
45
+			type: Array,
46
+			default: () => []
67 47
 		},
68
-		methods: {
69
-			handleUploadSuccess(){
70
-				uni.$u.toast("上传成功");
48
+		tipText: {
49
+			type: String,
50
+			default: '点击上传文件'
51
+		},
52
+		fileType: {
53
+			type: String,
54
+			default: 'all',
55
+			desc: '文件选择类型:all(所有)、image(图片)、video(视频)、audio(音频)、document(文档)等'
56
+		},
57
+	},
58
+	data() {
59
+		return {
60
+		}
61
+	},
62
+	watch: {
63
+		fileList: {
64
+			handler(newVal) {
65
+				this.uploadList = [...newVal];
71 66
 			},
72
-			// 删除文件
73
-			handleDelete(index) {
74
-				uni.showModal({
75
-					title: '提示',
76
-					content: '确定要删除该文件吗?',
77
-					success: (res) => {
78
-						if (res.confirm) {
79
-							this.uploadList.splice(index, 1);
80
-							this.$emit('update:fileList', this.uploadList);
81
-							this.$emit('change', {
82
-								type: this.orderFileType,
83
-								fileList: this.uploadList
84
-							});
85
-						}
67
+			immediate: true
68
+		}
69
+	},
70
+	methods: {
71
+		handleUploadSuccess() {
72
+			uni.$u.toast("上传成功");
73
+		},
74
+		// 删除文件
75
+		handleDelete(index) {
76
+			uni.showModal({
77
+				title: '提示',
78
+				content: '确定要删除该文件吗?',
79
+				success: (res) => {
80
+					if (res.confirm) {
81
+						this.uploadList.splice(index, 1);
82
+						this.$emit('update:fileList', this.uploadList);
83
+						this.$emit('change', {
84
+							type: this.orderFileType,
85
+							fileList: this.uploadList
86
+						});
86 87
 					}
87
-				});
88
-			}
88
+				}
89
+			});
90
+		},
91
+		needPreviewPic(url) {
92
+			uni.previewImage({
93
+				urls: this.fileList.map(item => item.fileUrl),
94
+				current: url
95
+			});
89 96
 		}
90 97
 	}
98
+}
91 99
 </script>
92 100
 
93 101
 <style lang="scss" scoped>
94
-	.order-file-upload {
95
-		.upload-section {
96
-			background: #fff;
97
-			margin-bottom: 20rpx;
98
-			border-radius: 16rpx;
99
-			overflow: hidden;
102
+.order-file-upload {
103
+	.upload-section {
104
+		background: #fff;
105
+		margin-bottom: 20rpx;
106
+		border-radius: 16rpx;
107
+		overflow: hidden;
108
+	}
109
+
110
+	.upload-title {
111
+		display: flex;
112
+		justify-content: space-between;
113
+		align-items: center;
114
+		padding: 30rpx 40rpx;
115
+		border-bottom: 1rpx solid #f5f5f5;
116
+
117
+		.title-text {
118
+			font-size: 32rpx;
119
+			font-weight: 500;
120
+			color: #333;
100 121
 		}
101 122
 
102
-		.upload-title {
103
-			display: flex;
104
-			justify-content: space-between;
105
-			align-items: center;
106
-			padding: 30rpx 40rpx;
107
-			border-bottom: 1rpx solid #f5f5f5;
108
-
109
-			.title-text {
110
-				font-size: 32rpx;
111
-				font-weight: 500;
112
-				color: #333;
113
-			}
114
-
115
-			.upload-btn {
116
-				padding: 12rpx 24rpx;
117
-				background: #007aff;
118
-				color: #fff;
119
-				border-radius: 8rpx;
120
-				font-size: 28rpx;
121
-			}
123
+		.upload-btn {
124
+			padding: 12rpx 24rpx;
125
+			background: #007aff;
126
+			color: #fff;
127
+			border-radius: 8rpx;
128
+			font-size: 28rpx;
122 129
 		}
130
+	}
131
+
132
+	.file-list {
133
+		padding: 20rpx 20rpx;
134
+		display: grid;
135
+		//一行三个
136
+		grid-template-columns: repeat(3, 1fr);
137
+		gap: 20rpx;
138
+	}
123 139
 
124
-		.file-list {
125
-			padding: 20rpx 40rpx;
140
+	.file-item {
141
+		padding: 0rpx 0;
142
+
143
+		&:last-child {
144
+			border-bottom: none;
126 145
 		}
146
+	}
127 147
 
128
-		.file-item {
129
-			display: flex;
130
-			justify-content: space-between;
131
-			align-items: center;
132
-			padding: 20rpx 0;
133
-			border-bottom: 1rpx solid #f5f5f5;
148
+	.file-info {
149
+		flex: 1;
150
+		min-width: 0; // 防止flex子元素溢出
134 151
 
135
-			&:last-child {
136
-				border-bottom: none;
137
-			}
152
+		.file-name {
153
+			display: block;
154
+			font-size: 30rpx;
155
+			color: #333;
156
+			margin-bottom: 8rpx;
157
+			overflow: hidden;
158
+			text-overflow: ellipsis;
159
+			white-space: nowrap;
160
+			max-width: 400rpx; // 设置最大宽度防止过长
138 161
 		}
139 162
 
140
-		.file-info {
141
-			flex: 1;
142
-			min-width: 0; // 防止flex子元素溢出
143
-
144
-			.file-name {
145
-				display: block;
146
-				font-size: 30rpx;
147
-				color: #333;
148
-				margin-bottom: 8rpx;
149
-				overflow: hidden;
150
-				text-overflow: ellipsis;
151
-				white-space: nowrap;
152
-				max-width: 400rpx; // 设置最大宽度防止过长
153
-			}
154
-
155
-			.file-size {
156
-				font-size: 26rpx;
157
-				color: #999;
158
-			}
163
+		.file-size {
164
+			font-size: 26rpx;
165
+			color: #999;
159 166
 		}
167
+	}
160 168
 
161
-		.file-actions {
162
-			.delete-btn {
163
-				padding: 12rpx 24rpx;
164
-				background: #ff4757;
165
-				color: #fff;
166
-				border-radius: 8rpx;
167
-				font-size: 26rpx;
168
-			}
169
+	.file-actions {
170
+		.delete-btn {
171
+			padding: 12rpx 24rpx;
172
+			background: #ff4757;
173
+			color: #fff;
174
+			border-radius: 8rpx;
175
+			font-size: 26rpx;
169 176
 		}
177
+	}
170 178
 
171
-		.upload-tip {
172
-			padding: 40rpx;
173
-			text-align: center;
179
+	.upload-tip {
180
+		padding: 40rpx;
181
+		text-align: center;
174 182
 
175
-			.tip-text {
176
-				font-size: 28rpx;
177
-				color: #999;
178
-			}
183
+		.tip-text {
184
+			font-size: 28rpx;
185
+			color: #999;
179 186
 		}
180 187
 	}
188
+}
181 189
 </style>

+ 54 - 0
components/picture-viewer/picture-viewer.vue

@@ -0,0 +1,54 @@
1
+<template>
2
+    <view class="pic-comp-container">
3
+        <image class="picComp" :src="src" mode="aspectFill" @click="click"></image>
4
+        <view class="delete-btn" @click="handleDelete">×</view>
5
+    </view>
6
+</template>
7
+<script>
8
+export default {
9
+    props: {
10
+        src: {
11
+            type: String,
12
+            default: ''
13
+        }
14
+    },
15
+    methods: {
16
+        click() {
17
+            this.$emit('needPreviewPic', this.src)
18
+        },
19
+        handleDelete() {
20
+            this.$emit('delete')
21
+        }
22
+    }
23
+}
24
+</script>
25
+<style scoped>
26
+.pic-comp-container {
27
+    width: 200rpx;
28
+    height: 200rpx;
29
+    box-sizing: border-box;
30
+    /* overflow: hidden; */
31
+    position: relative;
32
+}
33
+
34
+.picComp {
35
+    width: 200rpx !important;
36
+    height: 200rpx !important;
37
+    object-fit: cover;
38
+    border-radius: 30rpx;
39
+
40
+}
41
+
42
+.delete-btn {
43
+    width: 40rpx;
44
+    height: 40rpx;
45
+    line-height: 40rpx;
46
+    text-align: center;
47
+    background: #ff4757;
48
+    color: #fff;
49
+    border-radius: 50%;
50
+    position: absolute;
51
+    top: -10rpx;
52
+    right: -20rpx;
53
+}
54
+</style>

+ 26 - 1
manifest.json

@@ -38,18 +38,43 @@
38 38
                 "permissions" : [
39 39
                     "<uses-feature android:name=\"android.hardware.camera\"/>",
40 40
                     "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
41
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
41 42
                     "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
43
+                    "<uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\"/>",
44
+                    "<uses-permission android:name=\"android.permission.ACCESS_MOCK_LOCATION\"/>",
42 45
                     "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
43 46
                     "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
47
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
44 48
                     "<uses-permission android:name=\"android.permission.CAMERA\"/>",
49
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
50
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
51
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
52
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
53
+                    "<uses-permission android:name=\"android.permission.GET_TASKS\"/>",
54
+                    "<uses-permission android:name=\"android.permission.INSTALL_SHORTCUT\"/>",
45 55
                     "<uses-permission android:name=\"android.permission.INTERNET\"/>",
56
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
57
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
58
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
46 59
                     "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
60
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
61
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
62
+                    "<uses-permission android:name=\"android.permission.READ_SMS\"/>",
63
+                    "<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
47 64
                     "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
65
+                    "<uses-permission android:name=\"android.permission.SEND_RESPOND_VIA_MESSAGE\"/>",
66
+                    "<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
67
+                    "<uses-permission android:name=\"android.permission.USE_FINGERPRINT\"/>",
48 68
                     "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
69
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
70
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
49 71
                     "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
72
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
73
+                    "<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
74
+                    "<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>",
50 75
                     "<uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"/>",
51 76
                     "<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\"/>",
52
-                    "<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_SPECIAL_USE\"/>"
77
+                    "<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_SPECIAL_USE\" />"
53 78
                 ],
54 79
                 "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ],
55 80
                 "minSdkVersion" : 21,

+ 205 - 205
pages/circumstances/index.vue

@@ -23,8 +23,8 @@
23 23
 					</view>
24 24
 					<view class="item-right">
25 25
 						<text>{{
26
-              callAccount ? callAccount.extenNum : "未配置分机号"
27
-            }}</text>
26
+							callAccount ? callAccount.extenNum : "未配置分机号"
27
+						}}</text>
28 28
 					</view>
29 29
 				</view>
30 30
 				<view class="option_item">
@@ -211,246 +211,246 @@
211 211
 </template>
212 212
 
213 213
 <script>
214
-	import {
215
-		mapState
216
-	} from "vuex";
217
-	import iconImg from "./components/iconImg.vue";
218
-	import permision from "@/js_sdk/wa-permission/permission.js";
214
+import {
215
+	mapState
216
+} from "vuex";
217
+import iconImg from "./components/iconImg.vue";
218
+import permision from "@/js_sdk/wa-permission/permission.js";
219 219
 
220
-	export default {
221
-		components: {
222
-			iconImg,
223
-		},
224
-		computed: {
225
-			...mapState({
226
-				nickName: (state) => state.user.userInfo.nickName,
227
-				callAccount: (state) => state.app.callAccount,
228
-				signInState: (state) => state.app.signInState,
229
-				ipAddress: (state) =>
230
-					state.app.registerInfo && state.app.registerInfo.register ?
220
+export default {
221
+	components: {
222
+		iconImg,
223
+	},
224
+	computed: {
225
+		...mapState({
226
+			nickName: (state) => state.user.userInfo.nickName,
227
+			callAccount: (state) => state.app.callAccount,
228
+			signInState: (state) => state.app.signInState,
229
+			ipAddress: (state) =>
230
+				state.app.registerInfo && state.app.registerInfo.register ?
231 231
 					state.app.registerInfo.register["IPv4"].slice(-3) : "异常",
232
-				redisStatus: (state) => state.app.redisStatus,
233
-				callSystem: (state) => state.app.callSystem,
234
-				uuid: (state) => state.user.uuid,
235
-				isCallOff: (state) => state.user.netConfig.isCallOff,
236
-				// 从call store获取权限状态
237
-				isAutoRecord: (state) => state.call.isAutoRecord,
238
-				hasStoragePermission: (state) => state.call.hasStoragePermission,
239
-				hasReadPhoneStatePermission: (state) => state.call.hasReadPhoneStatePermission,
240
-				hasCallPhonePermission: (state) => state.call.hasCallPhonePermission,
241
-				hasReadCallLogPermission: (state) => state.call.hasReadCallLogPermission,
242
-				hasReadPhoneNumbersPermission: (state) => state.call.hasReadPhoneNumbersPermission,
243
-				isPhoneListening: (state) => state.call.isPhoneListening,
244
-			}),
232
+			redisStatus: (state) => state.app.redisStatus,
233
+			callSystem: (state) => state.app.callSystem,
234
+			uuid: (state) => state.user.uuid,
235
+			isCallOff: (state) => state.user.netConfig.isCallOff,
236
+			// 从call store获取权限状态
237
+			isAutoRecord: (state) => state.call.isAutoRecord,
238
+			hasStoragePermission: (state) => state.call.hasStoragePermission,
239
+			hasReadPhoneStatePermission: (state) => state.call.hasReadPhoneStatePermission,
240
+			hasCallPhonePermission: (state) => state.call.hasCallPhonePermission,
241
+			hasReadCallLogPermission: (state) => state.call.hasReadCallLogPermission,
242
+			hasReadPhoneNumbersPermission: (state) => state.call.hasReadPhoneNumbersPermission,
243
+			isPhoneListening: (state) => state.call.isPhoneListening,
244
+		}),
245
+	},
246
+	data() {
247
+		return {
248
+			isX5: false,
249
+			isRecord: false,
250
+			isLocation: false,
251
+			system: "",
252
+			deviceBrand: "",
253
+			systemLocation: false,
254
+		};
255
+	},
256
+	methods: {
257
+		// 刷新
258
+		handleReset() {
259
+			this.getAllStatus();
260
+			uni.$u.toast("刷新成功");
245 261
 		},
246
-		data() {
247
-			return {
248
-				isX5: false,
249
-				isRecord: false,
250
-				isLocation: false,
251
-				system: "",
252
-				deviceBrand: "",
253
-				systemLocation: false,
254
-			};
262
+		// 打开设置
263
+		handleOpenSet() {
264
+			this.$store.dispatch('call/handleOpenSet');
255 265
 		},
256
-		methods: {
257
-			// 刷新
258
-			handleReset() {
259
-				this.getAllStatus();
260
-				uni.$u.toast("刷新成功");
261
-			},
262
-			// 打开设置
263
-			handleOpenSet() {
264
-				this.$store.dispatch('call/handleOpenSet');
265
-			},
266
-			// 请求文件访问权限
267
-			requestStoragePermission() {
268
-				this.$store.dispatch('call/requestStoragePermission');
269
-			},
270
-			// 跳转到通话录音设置页面
271
-			toCallRecorderSettings() {
272
-				this.$store.dispatch('call/toCallRecorderSettings');
273
-			},
274
-			// 跳转到系统通话录音界面
275
-			toSystemRecorderSettings() {
276
-				this.$store.dispatch('call/toSystemRecorderSettings');
277
-			},
278
-			// 切换电话监听状态
279
-			togglePhoneListener() {
280
-				this.$store.dispatch('call/togglePhoneListener')
281
-					.then(() => {
282
-						const status = this.isPhoneListening ? '已停止' : '已启动';
283
-						uni.$u.toast(`电话监听${status}`);
284
-					})
285
-					.catch(error => {
286
-						uni.$u.toast('操作失败,请重试');
287
-						console.error('切换电话监听状态失败:', error);
288
-					});
289
-			},
290
-			// 注册
291
-			handleRegisterFun() {
292
-				this.$store
293
-					.dispatch("app/getExtensionByUserId", {
294
-						userId: this.$store.state.user.userInfo.userId,
295
-					})
296
-					.then((res) => {
297
-						Promise.all([
298
-							permision.requestAndroidPermission(
299
-								"android.permission.RECORD_AUDIO"
300
-							),
301
-							permision.requestAndroidPermission(
302
-								"android.permission.MODIFY_AUDIO_SETTINGS"
303
-							),
304
-						]).then((result) => {
305
-							const flag = result.every((v) => v == 1);
306
-							if (flag) {
307
-								this.$store.dispatch("app/createWv");
308
-							}
309
-						});
266
+		// 请求文件访问权限
267
+		requestStoragePermission() {
268
+			this.$store.dispatch('call/requestStoragePermission');
269
+		},
270
+		// 跳转到通话录音设置页面
271
+		toCallRecorderSettings() {
272
+			this.$store.dispatch('call/toCallRecorderSettings');
273
+		},
274
+		// 跳转到系统通话录音界面
275
+		toSystemRecorderSettings() {
276
+			this.$store.dispatch('call/toSystemRecorderSettings');
277
+		},
278
+		// 切换电话监听状态
279
+		togglePhoneListener() {
280
+			this.$store.dispatch('call/togglePhoneListener')
281
+				.then(() => {
282
+					const status = this.isPhoneListening ? '已停止' : '已启动';
283
+					uni.$u.toast(`电话监听${status}`);
284
+				})
285
+				.catch(error => {
286
+					uni.$u.toast('操作失败,请重试');
287
+					console.error('切换电话监听状态失败:', error);
288
+				});
289
+		},
290
+		// 注册
291
+		handleRegisterFun() {
292
+			this.$store
293
+				.dispatch("app/getExtensionByUserId", {
294
+					userId: this.$store.state.user.userInfo.userId,
295
+				})
296
+				.then((res) => {
297
+					Promise.all([
298
+						permision.requestAndroidPermission(
299
+							"android.permission.RECORD_AUDIO"
300
+						),
301
+						permision.requestAndroidPermission(
302
+							"android.permission.MODIFY_AUDIO_SETTINGS"
303
+						),
304
+					]).then((result) => {
305
+						const flag = result.every((v) => v == 1);
306
+						if (flag) {
307
+							this.$store.dispatch("app/createWv");
308
+						}
310 309
 					});
311
-			},
312
-			// 检测定位服务是否开启
313
-			checkSystemEnableLocation() {
314
-				let context = plus.android.importClass("android.content.Context");
315
-				let locationManager = plus.android.importClass(
316
-					"android.location.LocationManager"
317
-				);
318
-				let main = plus.android.runtimeMainActivity();
319
-				let mainSvr = main.getSystemService(context.LOCATION_SERVICE);
320
-				let result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
321
-				return result;
322
-			},
323
-			getAllStatus() {
324
-				uni.getSystemInfo({
325
-					success: (res) => {
326
-						this.deviceBrand = res.deviceBrand + " " + res.model;
327
-						this.system = res.system ? res.system : "获取失败";
328
-						this.isX5 = res.browserName.includes("x5");
329
-					},
330 310
 				});
311
+		},
312
+		// 检测定位服务是否开启
313
+		checkSystemEnableLocation() {
314
+			let context = plus.android.importClass("android.content.Context");
315
+			let locationManager = plus.android.importClass(
316
+				"android.location.LocationManager"
317
+			);
318
+			let main = plus.android.runtimeMainActivity();
319
+			let mainSvr = main.getSystemService(context.LOCATION_SERVICE);
320
+			let result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
321
+			return result;
322
+		},
323
+		getAllStatus() {
324
+			uni.getSystemInfo({
325
+				success: (res) => {
326
+					this.deviceBrand = res.deviceBrand + " " + res.model;
327
+					this.system = res.system ? res.system : "获取失败";
328
+					this.isX5 = res.browserName.includes("x5");
329
+				},
330
+			});
331 331
 
332
-				// 检查麦克风权限
333
-				permision
334
-					.requestAndroidPermission("android.permission.RECORD_AUDIO")
335
-					.then((result) => {
336
-						this.isRecord = result == "1";
337
-					});
332
+			// 检查麦克风权限
333
+			permision
334
+				.requestAndroidPermission("android.permission.RECORD_AUDIO")
335
+				.then((result) => {
336
+					this.isRecord = result == "1";
337
+				});
338 338
 
339
-				// 检查定位服务状态
340
-				this.systemLocation = this.checkSystemEnableLocation();
339
+			// 检查定位服务状态
340
+			this.systemLocation = this.checkSystemEnableLocation();
341 341
 
342
-				// 检查定位权限
343
-				permision
344
-					.requestAndroidPermission("android.permission.ACCESS_FINE_LOCATION")
345
-					.then((result) => {
346
-						this.isLocation = result == "1";
347
-					});
342
+			// 检查定位权限
343
+			permision
344
+				.requestAndroidPermission("android.permission.ACCESS_FINE_LOCATION")
345
+				.then((result) => {
346
+					this.isLocation = result == "1";
347
+				});
348 348
 
349
-				// 从store检查所有其他权限状态
350
-				this.$store.dispatch('call/checkAllPermissions');
351
-			},
352
-		},
353
-		mounted() {
354
-			this.getAllStatus();
349
+			// 从store检查所有其他权限状态
350
+			this.$store.dispatch('call/checkAllPermissions');
355 351
 		},
356
-	};
352
+	},
353
+	mounted() {
354
+		this.getAllStatus();
355
+	},
356
+};
357 357
 </script>
358 358
 
359 359
 <style lang="scss" scoped>
360
-	.right_btn {
360
+.right_btn {
361
+	display: flex;
362
+	align-items: center;
363
+	font-size: 14px;
364
+
365
+	.copy_btn {
361 366
 		display: flex;
362 367
 		align-items: center;
363
-		font-size: 14px;
368
+		margin-right: 20rpx;
369
+	}
364 370
 
365
-		.copy_btn {
366
-			display: flex;
367
-			align-items: center;
368
-			margin-right: 20rpx;
369
-		}
371
+	.reset {
372
+		display: flex;
373
+		align-items: center;
374
+	}
375
+}
370 376
 
371
-		.reset {
372
-			display: flex;
373
-			align-items: center;
374
-		}
377
+.tips_wrap {
378
+	display: flex;
379
+	align-items: center;
380
+	justify-content: space-evenly;
381
+	height: 40px;
382
+	background: #ececec;
383
+	border-radius: 4px;
384
+	margin-top: 15px;
385
+	margin-left: 15px;
386
+	margin-right: 15px;
387
+	margin-bottom: 50px;
388
+
389
+	.right {
390
+		display: flex;
391
+		align-items: center;
375 392
 	}
376 393
 
377
-	.tips_wrap {
394
+	.left {
378 395
 		display: flex;
379 396
 		align-items: center;
380
-		justify-content: space-evenly;
381
-		height: 40px;
382
-		background: #ececec;
383
-		border-radius: 4px;
384
-		margin-top: 15px;
385
-		margin-left: 15px;
386
-		margin-right: 15px;
387
-		margin-bottom: 50px;
397
+	}
388 398
 
389
-		.right {
390
-			display: flex;
391
-			align-items: center;
392
-		}
399
+	.icon_img {
400
+		width: 40rpx;
401
+		height: 40rpx;
402
+		margin-right: 20rpx;
403
+	}
404
+}
393 405
 
394
-		.left {
406
+.option_list {
407
+	margin-top: 30rpx;
408
+	padding: 0 30rpx;
409
+
410
+	.option_item {
411
+		display: flex;
412
+		justify-content: space-between;
413
+		align-items: center;
414
+		padding-bottom: 36rpx;
415
+		padding-top: 36rpx;
416
+		border-bottom: 2rpx solid #dfdfdf;
417
+
418
+		.item_left {
395 419
 			display: flex;
396 420
 			align-items: center;
397
-		}
398 421
 
399
-		.icon_img {
400
-			width: 40rpx;
401
-			height: 40rpx;
402
-			margin-right: 20rpx;
403
-		}
404
-	}
422
+			image {
423
+				width: 32rpx;
424
+				height: 32rpx;
425
+				margin-right: 20rpx;
426
+			}
405 427
 
406
-	.option_list {
407
-		margin-top: 30rpx;
408
-		padding: 0 30rpx;
428
+			.label {
429
+				font-size: 28rpx;
430
+				color: #202020;
431
+			}
432
+		}
409 433
 
410
-		.option_item {
434
+		.item-right {
411 435
 			display: flex;
412 436
 			justify-content: space-between;
413 437
 			align-items: center;
414
-			padding-bottom: 36rpx;
415
-			padding-top: 36rpx;
416
-			border-bottom: 2rpx solid #dfdfdf;
417
-
418
-			.item_left {
419
-				display: flex;
420
-				align-items: center;
421
-
422
-				image {
423
-					width: 32rpx;
424
-					height: 32rpx;
425
-					margin-right: 20rpx;
426
-				}
427 438
 
428
-				.label {
429
-					font-size: 28rpx;
430
-					color: #202020;
431
-				}
439
+			text {
440
+				font-size: 24rpx;
441
+				color: #999999;
442
+				margin-right: 10rpx;
432 443
 			}
433 444
 
434
-			.item-right {
435
-				display: flex;
436
-				justify-content: space-between;
437
-				align-items: center;
438
-
439
-				text {
440
-					font-size: 24rpx;
441
-					color: #999999;
442
-					margin-right: 10rpx;
443
-				}
444
-
445
-				.btn {
446
-					color: #108cff;
447
-				}
445
+			.btn {
446
+				color: #108cff;
447
+			}
448 448
 
449
-				.icon_img {
450
-					width: 40rpx;
451
-					height: 40rpx;
452
-				}
449
+			.icon_img {
450
+				width: 40rpx;
451
+				height: 40rpx;
453 452
 			}
454 453
 		}
455 454
 	}
455
+}
456 456
 </style>

+ 28 - 13
pages/orderDetailNew/components/pageOne.vue

@@ -91,6 +91,10 @@
91 91
             </view>
92 92
         </view>
93 93
 
94
+        <view class="space-block">
95
+
96
+        </view>
97
+
94 98
         <u-button class='next-btn' @click="handleNextClick" type="primary" size="middle"
95 99
             style="border-radius: 20rpx;">下一步</u-button>
96 100
 
@@ -159,20 +163,27 @@ export default {
159 163
         handlePhoneClick() {
160 164
             console.log('电话卡片被点击', '电话号码:', this.orderDetail.phone)
161 165
             if (this.orderDetail.phone) {
162
-                //拨打电话,需要设置权限
163
-                // uni.makePhoneCall({
164
-                //     phoneNumber: this.orderDetail.phone
165
-                // });
166
-                //先暂时复制电话号码
167
-                uni.setClipboardData({
168
-                    data: this.orderDetail.phone,
166
+                uni.makePhoneCall({
167
+                    phoneNumber: this.orderDetail.phone,
169 168
                     success: () => {
170
-                        uni.showToast({
171
-                            title: '电话号码已复制',
172
-                            icon: 'none'
173
-                        })
174
-                    }
175
-                })
169
+                        this.$store.commit("call/SET_FORM", {
170
+                            clueId: this.orderDetail.clueId,
171
+                            type: "3",
172
+                            callee: this.orderDetail.phone,
173
+                        });
174
+                        console.log('this.currentReceipt333', this.$store.state.call.form.callee)
175
+                    },
176
+                });
177
+                //先暂时复制电话号码
178
+                // uni.setClipboardData({
179
+                //     data: this.orderDetail.phone,
180
+                //     success: () => {
181
+                //         uni.showToast({
182
+                //             title: '电话号码已复制',
183
+                //             icon: 'none'
184
+                //         })
185
+                //     }
186
+                // })
176 187
             } else {
177 188
                 uni.showToast({
178 189
                     title: '该订单暂时没有电话号码',
@@ -557,4 +568,8 @@ export default {
557 568
     @include font-styles($size: medium, $weight: bold, $color: #fff);
558 569
     border-radius: 0rpx 0rpx 20rpx 20rpx;
559 570
 }
571
+
572
+.space-block {
573
+    height: 80rpx;
574
+}
560 575
 </style>

+ 6 - 5
pages/orderDetailNew/components/pageThree.vue

@@ -12,7 +12,8 @@
12 12
                 <u-col span="5.8">
13 13
                     <view class="info-label">银行名称</view>
14 14
                     <u-input v-model="paymentInfo.bankName" placeholder="请输入银行名称" class="info-input"
15
-                        @input="handleBankNameInput" />
15
+                        @blur="handleBankNameInput" />
16
+
16 17
                 </u-col>
17 18
             </u-row>
18 19
             <!-- 银行账号单独一行 -->
@@ -231,10 +232,10 @@ export default {
231 232
 
232 233
         // 银行名称输入处理 - 只允许中文和英文
233 234
         handleBankNameInput(value) {
234
-            console.log('银行名称输入处理', value)
235
-            //如果value包括数字则返回空字符串
236
-
237
-
235
+            const strValue = String(value || '');
236
+            const reg = /[0-9]/g;
237
+            // 用replace + 全局正则替代replaceAll
238
+            this.paymentInfo.bankName = strValue.replace(reg, '');
238 239
         },
239 240
 
240 241
 

+ 101 - 2
pages/pagereceivecenter/pagereceivecenter.vue

@@ -31,6 +31,9 @@ export default {
31 31
             statisticsSendStatus: [],//中间统计数据
32 32
             activeType: 1,//当前选择的筛选类型,顶部tab的类型
33 33
             activeStatus: '',//当前选择的状态,统计数据的类型
34
+
35
+            currentFollowUp: [],//当前订单的跟进记录
36
+            showMoreFollowUp: false
34 37
         }
35 38
     },
36 39
     onLoad() {
@@ -102,7 +105,7 @@ export default {
102 105
             this.statisticsSendStatus = data;
103 106
         },
104 107
         // 处理按钮点击事件
105
-        handleBtnClick(btnType, order) {
108
+        async handleBtnClick(btnType, order) {
106 109
 
107 110
             if (btnType == 'acceptOrder') {
108 111
                 //去接单
@@ -142,6 +145,8 @@ export default {
142 145
                 //打开模态窗
143 146
                 this.followUpModelShow = true;
144 147
                 this.currentOrder = order
148
+
149
+
145 150
             } else if (btnType == 'tag') {
146 151
                 //打标签
147 152
                 console.log('打标签', order)
@@ -158,6 +163,9 @@ export default {
158 163
                 console.log('待跟进', order)
159 164
                 this.followUpModelShow = true;
160 165
                 this.currentOrder = order
166
+
167
+
168
+
161 169
             }
162 170
         },
163 171
         // 跳转订单详情
@@ -252,6 +260,33 @@ export default {
252 260
                 this.getOrderList();
253 261
             }
254 262
         },
263
+        //点击查看更多的跟进
264
+        async handleShowMoreFollowUp() {
265
+            //当前的order是
266
+            console.log()
267
+            const { data } = await uni.$u.api.getDuplicateOrderFollowListByClueId({
268
+                clueId: this.currentOrder.clueId
269
+            });
270
+            console.log('这里是跟进', data)
271
+
272
+            const allData = []
273
+
274
+            for (const key in data) {
275
+                allData.push(...data[key])
276
+            }
277
+            const filterData = allData.filter(item => {
278
+                console.log('过滤', item)
279
+                //过滤出来tem.content不包括联系师傅、师傅拍图技巧、到达客户面对面、未收评分、待跟进_
280
+                return item.content.indexOf('联系师傅') == -1 && item.content.indexOf('师傅拍图技巧') == -1 && item.content.indexOf('到达客户面对面') == -1 && item.content.indexOf('未收评分') == -1 && item.content.indexOf('待跟进_') == -1
281
+            })
282
+
283
+            console.log('筛选后的跟进', filterData)
284
+
285
+            this.currentFollowUp = filterData || [];
286
+            this.showMoreFollowUp = true
287
+
288
+
289
+        }
255 290
     }
256 291
 }
257 292
 </script>
@@ -384,11 +419,31 @@ export default {
384 419
 
385 420
         <u-modal showCancelButton :show="followUpModelShow" :title="'填写跟进细节'" @confirm="confirmFollowUp"
386 421
             @cancel="followUpModelShow = false">
422
+
387 423
             <view class="modal-content">
388 424
                 <u--textarea v-model="followUpNotes" placeholder="请输入情况" confirm-type="done"
389
-                    style="width: 400rpx; margin-bottom: 30rpx;"></u--textarea>
425
+                    style="width: 400rpx;margin-bottom: 10rpx; "></u--textarea>
426
+                <u-button type="primary" @click="handleShowMoreFollowUp">点击查看更多跟进</u-button>
427
+
390 428
             </view>
391 429
         </u-modal>
430
+
431
+        <!-- 更多跟进 -->
432
+        <u-modal :show="showMoreFollowUp" title="详细跟进记录" @confirm="showMoreFollowUp = false">
433
+            <!-- <view class="followUpBox"> -->
434
+            <scroll-view class="followUpBox" scroll-y>
435
+                <view v-for="value in currentFollowUp" :key="value.id" class="followUpItem">
436
+                    <view class="followUpInfo">
437
+                        <view class="followUpNickname">
438
+                            账号:{{ value.createNickname }}
439
+                        </view>
440
+                        <view class="followUpOrgName">{{ value.orgName }}</view>
441
+                    </view>
442
+                    <view class="followUpContent">{{ value.content }}</view>
443
+                </view>
444
+            </scroll-view>
445
+            <!-- </view> -->
446
+        </u-modal>
392 447
     </view>
393 448
 </template>
394 449
 
@@ -404,6 +459,10 @@ export default {
404 459
     height: calc(100vh - 44px - 44px - 27px - 10rpx);
405 460
 }
406 461
 
462
+.followUpScroll {
463
+    height: 600rpx;
464
+}
465
+
407 466
 .scrollView {
408 467
     height: 100%;
409 468
 }
@@ -630,4 +689,44 @@ export default {
630 689
 ::v-deep .u-tabs__wrapper__nav__line {
631 690
     top: 7px;
632 691
 }
692
+
693
+
694
+
695
+.followUpItem {
696
+    background-color: #F7FBFE;
697
+    width: 540rpx;
698
+    margin: 20rpx;
699
+    padding: 20rpx;
700
+    box-sizing: border-box;
701
+
702
+    .followUpInfo {
703
+        display: flex;
704
+        justify-content: space-between;
705
+        align-items: center;
706
+        gap: 10rpx;
707
+        margin-bottom: 10rpx;
708
+    }
709
+
710
+    .followUpNickname {
711
+        font-size: 24rpx;
712
+        font-weight: 700;
713
+        color: #2563EB;
714
+    }
715
+
716
+    .followUpOrgName {
717
+        font-size: 24rpx;
718
+        font-weight: 700;
719
+        color: #6B7280;
720
+    }
721
+
722
+    .followUpContent {
723
+        font-size: 24rpx;
724
+        font-weight: 700;
725
+        color: #374751;
726
+    }
727
+}
728
+
729
+.followUpBox {
730
+    height: 600rpx;
731
+}
633 732
 </style>