Przeglądaj źródła

Merge branch 'master' of http://106.52.242.177:3000/askqvn/crm-app into priceCenter

zhangxin 2 miesięcy temu
rodzic
commit
22474b782f

Plik diff jest za duży
+ 455 - 0
components/brand-select/brand-select.vue


+ 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>

+ 92 - 0
components/soundRecorder/soundRecorder.vue

@@ -0,0 +1,92 @@
1
+<template>
2
+    <view class="sound-recorder">
3
+        <view class="top-text">{{ topText }}</view>
4
+        <view class="file-name">{{ dataInner.fileName }}</view>
5
+        <view class="call-history">{{ callHistory }}</view>
6
+        <audio :src="dataInner.fileUrl" controls></audio>
7
+        <view @click="handleDelete">
8
+            <u-icon class="delectIcon" name="trash" size="22"></u-icon>
9
+        </view>
10
+    </view>
11
+</template>
12
+
13
+<script>
14
+export default {
15
+    props: {
16
+        data: {
17
+            type: Object,
18
+            default: () => ({})
19
+        }
20
+    },
21
+    data() {
22
+        return {
23
+            dataInner: {}
24
+        }
25
+    },
26
+    watch: {
27
+        data: {
28
+            deep: true,
29
+            immediate: true,
30
+            handler(newVal) {
31
+                this.dataInner = { ...newVal }
32
+            }
33
+        }
34
+    },
35
+    computed: {
36
+        topText() {
37
+            return `${this.dataInner.createTime}号码(${this.dataInner.caller})上传录音`
38
+        },
39
+        callHistory() {
40
+            return `${this.dataInner.caller} 打给 ${this.dataInner.callee}`
41
+        }
42
+    },
43
+    methods: {
44
+        handleDelete() {
45
+            console.log('点击了删除录音的按钮')
46
+            // this.$emit('delete', this.dataInner)
47
+        }
48
+    }
49
+
50
+}
51
+</script>
52
+<style lang="scss" scoped>
53
+.sound-recorder {
54
+    background: #ffffff;
55
+    border-radius: 20rpx;
56
+    box-shadow: 0 4rpx 24rpx rgba(0, 0, 0, 0.08);
57
+    padding: 32rpx;
58
+    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
59
+    border: 2rpx solid #f0f0f0;
60
+    position: relative;
61
+    margin-bottom: 10rpx;
62
+
63
+    .top-text {
64
+        font-size: 20rpx;
65
+        color: #888;
66
+        line-height: 1.4;
67
+    }
68
+
69
+    .call-history {
70
+        font-size: 30rpx;
71
+        color: #333;
72
+        font-weight: 500;
73
+        margin-bottom: 20rpx;
74
+        line-height: 1.5;
75
+    }
76
+
77
+    .file-name {
78
+        font-size: 20rpx;
79
+        color: #666;
80
+        line-height: 1.4;
81
+        word-break: break-all;
82
+    }
83
+
84
+
85
+    .delectIcon {
86
+        position: absolute;
87
+        right: 32rpx;
88
+        top: 32rpx;
89
+        z-index: 1;
90
+    }
91
+}
92
+</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,

+ 31 - 40
pages.json

@@ -141,9 +141,8 @@
141 141
 			}
142 142
 		},
143 143
 		{
144
-			"path" : "pages/addClue/index",
145
-			"style" : 
146
-			{
144
+			"path": "pages/addClue/index",
145
+			"style": {
147 146
 				"navigationBarTitleText": "",
148 147
 				"enablePullDownRefresh": false,
149 148
 				"navigationBarBackgroundColor": "#108cff",
@@ -151,72 +150,64 @@
151 150
 			}
152 151
 		},
153 152
 		{
154
-			"path" : "pages/publicClue/index",
155
-			"style" : 
156
-			{
157
-				"navigationBarTitleText" : "线索公海",
153
+			"path": "pages/publicClue/index",
154
+			"style": {
155
+				"navigationBarTitleText": "线索公海",
158 156
 				"enablePullDownRefresh": true,
159 157
 				"navigationStyle": "custom"
160 158
 			}
161 159
 		},
162 160
 		{
163
-			"path" : "pages/wareHouse/index",
164
-			"style" : 
165
-			{
166
-				"navigationBarTitleText" : "仓库",
161
+			"path": "pages/wareHouse/index",
162
+			"style": {
163
+				"navigationBarTitleText": "仓库",
167 164
 				"enablePullDownRefresh": true,
168 165
 				"navigationStyle": "custom"
169 166
 			}
170 167
 		},
171 168
 		{
172
-			"path" : "pages/wareHouse/detail",
173
-			"style" : 
174
-			{
175
-				"navigationBarTitleText" : "仓库详情",
169
+			"path": "pages/wareHouse/detail",
170
+			"style": {
171
+				"navigationBarTitleText": "仓库详情",
176 172
 				"enablePullDownRefresh": true,
177 173
 				"navigationStyle": "custom"
178 174
 			}
179 175
 		},
180 176
 		{
181
-			"path" : "pages/wareHouse/add",
182
-			"style" : 
183
-			{
184
-				"navigationBarTitleText" : "仓库新增",
177
+			"path": "pages/wareHouse/add",
178
+			"style": {
179
+				"navigationBarTitleText": "仓库新增",
185 180
 				"enablePullDownRefresh": true,
186 181
 				"navigationStyle": "custom"
187 182
 			}
188 183
 		},
189 184
 		{
190
-			"path" : "pages/wareHouse/openOrder",	
191
-			"style" : 
192
-			{
193
-				"navigationBarTitleText" : "销售业务开单",
185
+			"path" : "pages/wareHouse/openOrder",
186
+			"style": {
187
+				"navigationBarTitleText": "销售业务开单",
194 188
 				"enablePullDownRefresh": true,
195 189
 				"navigationStyle": "custom"
196 190
 			}
197 191
 		},
198 192
 		{
199
-			"path" : "pages/privateClue/index",
200
-			"style" : 
201
-			{
202
-				"navigationBarTitleText" : "销售线索",
193
+			"path": "pages/privateClue/index",
194
+			"style": {
195
+				"navigationBarTitleText": "销售线索",
203 196
 				"enablePullDownRefresh": true,
204 197
 				"navigationStyle": "custom"
205 198
 			}
206 199
 		},
207 200
 		{
208
-			"path" : "pages/auth/auth",
209
-			"style" : 
210
-			{
211
-			    "navigationBarTitleText": "",
212
-			    "enablePullDownRefresh": false,
201
+			"path": "pages/auth/auth",
202
+			"style": {
203
+				"navigationBarTitleText": "",
204
+				"enablePullDownRefresh": false,
213 205
 				"navigationStyle": "custom"
214 206
 			}
215 207
 		},
216 208
 		{
217
-			"path" : "pages/bindSuccess/index",
218
-			"style" : 
219
-			{
209
+			"path": "pages/bindSuccess/index",
210
+			"style": {
220 211
 				"navigationStyle": "custom"
221 212
 			}
222 213
 		},
@@ -254,7 +245,7 @@
254 245
 			"path": "pages/orderDetailNew/index",
255 246
 			"style": {
256 247
 				"navigationBarTitleText": "",
257
-				"enablePullDownRefresh": true,
248
+				"enablePullDownRefresh": false,
258 249
 				"navigationStyle": "custom"
259 250
 			}
260 251
 		},
@@ -285,7 +276,7 @@
285 276
 				"navigationStyle": "custom"
286 277
 			}
287 278
 		},
288
-			{
279
+		{
289 280
 			"path": "pages/pagereceivecenter/pagereceivecenter",
290 281
 			"style": {
291 282
 				"navigationBarTitleText": "接单中心",
@@ -366,15 +357,15 @@
366 357
 				"pagePath": "pages/privateClue/index",
367 358
 				"iconPath": "static/tabs/private.png",
368 359
 				"selectedIconPath": "static/tabs/private1.png",
369
-				"visible": false		
370
-			}, 
360
+				"visible": false
361
+			},
371 362
 			{
372 363
 				"text": "接单中心",
373 364
 				"pagePath": "pages/order/index",
374 365
 				"iconPath": "static/tabs/order.png",
375 366
 				"selectedIconPath": "static/tabs/order1.png",
376 367
 				"visible": false
377
-			}, 
368
+			},
378 369
 			{
379 370
 				"text": "我的",
380 371
 				"pagePath": "pages/person/index",

+ 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>

Plik diff jest za duży
+ 752 - 747
pages/clue/components/filterQuery.vue


+ 88 - 88
pages/clue/mixins/clue.js

@@ -1,8 +1,8 @@
1 1
 import pullUpRefresh from "@/utils/pullUpRefresh";
2
-import dayjs from  "dayjs";
2
+import dayjs from "dayjs";
3 3
 export default {
4 4
 	mixins: [pullUpRefresh],
5
-	
5
+
6 6
 	computed: {
7 7
 		currentIndex() {
8 8
 			return this.queryParams.type == 1 ? 0 : 1;
@@ -11,7 +11,7 @@ export default {
11 11
 	onPullDownRefresh() {
12 12
 		uni.stopPullDownRefresh();
13 13
 		// 刷新
14
-		
14
+
15 15
 	},
16 16
 	data() {
17 17
 		return {
@@ -25,59 +25,59 @@ export default {
25 25
 			clueTagGroupVoList: [],
26 26
 
27 27
 			dicts: {
28
-					caseStatusDicts: [],
29
-					crmFollowStatus: [],
30
-					crmCallStatus: [],
31
-					clueEntranceType: [],
32
-					crmClueBiz: [],
33
-					crmClueObj: [],
34
-					crmClueType: []
35
-				},
28
+				caseStatusDicts: [],
29
+				crmFollowStatus: [],
30
+				crmCallStatus: [],
31
+				clueEntranceType: [],
32
+				crmClueBiz: [],
33
+				crmClueObj: [],
34
+				crmClueType: []
35
+			},
36 36
 
37 37
 			options: [{
38
-					value: "3",
39
-					label: "电话/微信"
40
-				},
41
-				{
42
-					value: "1",
43
-					label: "姓名"
44
-				},
45
-				{
46
-					value: "8",
47
-					label: "广告主ID"
48
-				},
49
-				{
50
-					value: "7",
51
-					label: "广告主名称"
52
-				},
53
-				{
54
-					value: "10",
55
-					label: "广告ID"
56
-				},
57
-				{
58
-					value: "9",
59
-					label: "广告名称"
60
-				},
61
-				{
62
-					value: "11",
63
-					label: "标题ID"
64
-				},
65
-				{
66
-					value: "12",
67
-					label: "视频ID"
68
-				},
69
-				{
70
-					value: "5",
71
-					label: "qq号"
72
-				},
73
-				{
74
-					value: "6",
75
-					label: "邮箱"
76
-				},
77
-				{
78
-					value: "2",
79
-					label: "线索ID"
80
-				},
38
+				value: "3",
39
+				label: "电话/微信"
40
+			},
41
+			{
42
+				value: "1",
43
+				label: "姓名"
44
+			},
45
+			{
46
+				value: "8",
47
+				label: "广告主ID"
48
+			},
49
+			{
50
+				value: "7",
51
+				label: "广告主名称"
52
+			},
53
+			{
54
+				value: "10",
55
+				label: "广告ID"
56
+			},
57
+			{
58
+				value: "9",
59
+				label: "广告名称"
60
+			},
61
+			{
62
+				value: "11",
63
+				label: "标题ID"
64
+			},
65
+			{
66
+				value: "12",
67
+				label: "视频ID"
68
+			},
69
+			{
70
+				value: "5",
71
+				label: "qq号"
72
+			},
73
+			{
74
+				value: "6",
75
+				label: "邮箱"
76
+			},
77
+			{
78
+				value: "2",
79
+				label: "线索ID"
80
+			},
81 81
 			],
82 82
 
83 83
 			queryParams: {
@@ -91,7 +91,7 @@ export default {
91 91
 				batchCodes: [],
92 92
 				clueIds: [],
93 93
 				deptName: undefined,
94
-				deptId: undefined,
94
+				deptIds: [],
95 95
 				type: "1",
96 96
 				pageNum: 1,
97 97
 				pageSize: 20,
@@ -119,9 +119,9 @@ export default {
119 119
 				sortField: undefined,
120 120
 				appNames: [],
121 121
 				appNameLabel: undefined,
122
-				isRepetitionOperWeixinName : '',
123
-				isRepetitionOperationName : '',
124
-				isVideoIdIsNull : '',
122
+				isRepetitionOperWeixinName: '',
123
+				isRepetitionOperationName: '',
124
+				isVideoIdIsNull: '',
125 125
 				advName: "",
126 126
 				promotionName: "",
127 127
 				advId: "",
@@ -178,32 +178,32 @@ export default {
178 178
 			this.resetData();
179 179
 		},
180 180
 		async getDicts() {
181
-				this.$getDicts('crm_clue_phase').then(res => {
182
-					this.dicts.caseStatusDicts = res;
183
-				});
184
-				this.$getDicts('crm_follow_status').then(res => {
185
-					this.dicts.crmFollowStatus = res;
186
-				})
187
-				this.$getDicts('crm_call_status').then(res => {
188
-					this.dicts.crmCallStatus = res;
189
-				})
190
-				this.$getDicts('clue_entrance_type').then(res => {
191
-					this.dicts.clueEntranceType = res;
192
-				});
193
-				this.$getDicts('crm_clue_biz').then(res => {
194
-					this.dicts.crmClueBiz = res;
195
-				});
196
-				this.$getDicts('crm_clue_obj').then(res => {
197
-					this.dicts.crmClueObj = res;
198
-				});
199
-				this.$getDicts('crm_clue_type').then(res => {
200
-					this.dicts.crmClueType = res;
201
-				});
202
-				uni.$u.api.getClueTagGroupVoList({ tagGroupApplication : '1' }).then(({
203
-					data
204
-				}) => {
205
-					this.clueTagGroupVoList = data;
206
-				});
181
+			this.$getDicts('crm_clue_phase').then(res => {
182
+				this.dicts.caseStatusDicts = res;
183
+			});
184
+			this.$getDicts('crm_follow_status').then(res => {
185
+				this.dicts.crmFollowStatus = res;
186
+			})
187
+			this.$getDicts('crm_call_status').then(res => {
188
+				this.dicts.crmCallStatus = res;
189
+			})
190
+			this.$getDicts('clue_entrance_type').then(res => {
191
+				this.dicts.clueEntranceType = res;
192
+			});
193
+			this.$getDicts('crm_clue_biz').then(res => {
194
+				this.dicts.crmClueBiz = res;
195
+			});
196
+			this.$getDicts('crm_clue_obj').then(res => {
197
+				this.dicts.crmClueObj = res;
198
+			});
199
+			this.$getDicts('crm_clue_type').then(res => {
200
+				this.dicts.crmClueType = res;
201
+			});
202
+			uni.$u.api.getClueTagGroupVoList({ tagGroupApplication: '1' }).then(({
203
+				data
204
+			}) => {
205
+				this.clueTagGroupVoList = data;
206
+			});
207 207
 		},
208 208
 		getOtherData() {
209 209
 			this.statisticsCaseState();
@@ -254,15 +254,15 @@ export default {
254 254
 				pageSize,
255 255
 				pageNum
256 256
 			}, params);
257
-			rows.forEach(v=>{
258
-				if(v.repetitionOperationName){
257
+			rows.forEach(v => {
258
+				if (v.repetitionOperationName) {
259 259
 					// 按逗号分割成数组
260 260
 					const parts = v.repetitionOperationName.split(',');
261 261
 					// 对每个部分提取 '-' 前面的内容
262 262
 					const result = parts.map(part => part.split('-')[0]).join(',');
263 263
 					v.repetitionOperationName = result;
264 264
 				}
265
-				if(v.repetitionOperWeixinName){
265
+				if (v.repetitionOperWeixinName) {
266 266
 					// 按逗号分割成数组
267 267
 					const parts = v.repetitionOperWeixinName.split(',');
268 268
 					// 对每个部分提取 '-' 前面的内容
@@ -270,7 +270,7 @@ export default {
270 270
 					v.repetitionOperWeixinName = result;
271 271
 				}
272 272
 			})
273
-			
273
+
274 274
 			return rows;
275 275
 		}
276 276
 	}

+ 3 - 2
pages/clue/post/index.vue

@@ -50,10 +50,10 @@
50 50
 				</view>
51 51
 			</view>
52 52
 		</view>
53
-		<view class="sendOrder inquiry" @click.stop="handleInquiry(item)">
53
+		<!-- <view class="sendOrder inquiry" @click.stop="handleInquiry(item)">
54 54
 			<image src='/static/publicClue/inquiry.png' mode="aspectFit" class="sendOrder_img"></image>
55 55
 			<view>询价</view>
56
-		</view>
56
+		</view> -->
57 57
 		<view class="sendOrder" @click.stop="handleSendOrder(item)">
58 58
 			<image src='/static/publicClue/littlePlane.png' mode="aspectFit" class="sendOrder_img"></image>
59 59
 			<view>发单</view>
@@ -274,6 +274,7 @@ export default {
274 274
 			height: 20px;
275 275
 		}
276 276
 	}
277
+
277 278
 	.inquiry {
278 279
 		right: 140rpx;
279 280
 		color: #2563eb;

+ 74 - 73
pages/clue/scss/clue.scss

@@ -1,7 +1,7 @@
1
-.suspension_button{
1
+.suspension_button {
2 2
 	position: fixed;
3 3
 	bottom: 200rpx;
4
-	right: 100rpx;
4
+	left: 50rpx;
5 5
 	border-radius: 50%;
6 6
 	width: 100rpx;
7 7
 	line-height: 100rpx;
@@ -10,94 +10,95 @@
10 10
 	text-align: center;
11 11
 	background-color: #4c8afe;
12 12
 }
13
+
13 14
 .clueDetail_tabber {
14
-		::v-deep .u-tabbar__content {
15
-			background: #108cff;
16
-			border-top-right-radius: 10px;
17
-			border-top-left-radius: 10px;
18
-		}
15
+	::v-deep .u-tabbar__content {
16
+		background: #108cff;
17
+		border-top-right-radius: 10px;
18
+		border-top-left-radius: 10px;
19 19
 	}
20
+}
20 21
 
21
-	.clue_state_wrap {
22
-		width: 690rpx;
23
-		padding: 0 30rpx;
24
-		margin-top: 20rpx;
25
-		display: flex;
22
+.clue_state_wrap {
23
+	width: 690rpx;
24
+	padding: 0 30rpx;
25
+	margin-top: 20rpx;
26
+	display: flex;
26 27
 
27
-		.clue_state_list {
28
-			display: flex;
28
+	.clue_state_list {
29
+		display: flex;
29 30
 
30
-			.clue_state_item {
31
-				font-size: 30rpx;
32
-				display: inline-flex;
33
-				/* 关键改动:改为行内弹性盒子 */
34
-				align-items: center;
35
-				/* 垂直居中 */
36
-				background: #fff;
37
-				margin-right: 30rpx;
38
-				padding: 8rpx 16rpx;
39
-				/* 增加内边距 */
40
-				white-space: nowrap;
41
-				/* 关键:禁止文本换行 */
42
-				border-radius: 6rpx;
31
+		.clue_state_item {
32
+			font-size: 30rpx;
33
+			display: inline-flex;
34
+			/* 关键改动:改为行内弹性盒子 */
35
+			align-items: center;
36
+			/* 垂直居中 */
37
+			background: #fff;
38
+			margin-right: 30rpx;
39
+			padding: 8rpx 16rpx;
40
+			/* 增加内边距 */
41
+			white-space: nowrap;
42
+			/* 关键:禁止文本换行 */
43
+			border-radius: 6rpx;
43 44
 
44
-				&.active {
45
-					color: #fff;
46
-					background: #4c8afe;
47
-				}
45
+			&.active {
46
+				color: #fff;
47
+				background: #4c8afe;
48 48
 			}
49 49
 		}
50 50
 	}
51
+}
51 52
 
52
-	.clueTagsSelect {
53
-		height: 0;
54
-		overflow: hidden;
55
-	}
53
+.clueTagsSelect {
54
+	height: 0;
55
+	overflow: hidden;
56
+}
56 57
 
57
-	.queryParams_wrap {
58
-		display: flex;
59
-		background: #fff;
60
-		padding: 14px 0;
58
+.queryParams_wrap {
59
+	display: flex;
60
+	background: #fff;
61
+	padding: 14px 0;
61 62
 
62
-		.query,
63
-		.sort {
64
-			display: flex;
65
-			align-items: center;
66
-			justify-content: center;
67
-			flex: 1;
68
-			font-size: 16px;
69
-			font-weight: 700;
70
-			color: #202020;
71
-		}
63
+	.query,
64
+	.sort {
65
+		display: flex;
66
+		align-items: center;
67
+		justify-content: center;
68
+		flex: 1;
69
+		font-size: 16px;
70
+		font-weight: 700;
71
+		color: #202020;
72 72
 	}
73
+}
73 74
 
74
-	#navbar_center_wrap {
75
-		width: 320rpx;
76
-		margin: auto;
77
-		padding: 15px;
78
-		background-color: #fff;
79
-	}
75
+#navbar_center_wrap {
76
+	width: 320rpx;
77
+	margin: auto;
78
+	padding: 15px;
79
+	background-color: #fff;
80
+}
80 81
 
81
-	.post_wrap {
82
-		margin: 10px 0;
83
-	}
82
+.post_wrap {
83
+	margin: 10px 0;
84
+}
84 85
 
85
-	.case_top_wrap {
86
-		background-color: #fff;
87
-		padding: 0px 30rpx 15rpx 30rpx;
88
-		display: flex;
89
-		align-items: center;
90
-		justify-content: space-between;
86
+.case_top_wrap {
87
+	background-color: #fff;
88
+	padding: 0px 30rpx 15rpx 30rpx;
89
+	display: flex;
90
+	align-items: center;
91
+	justify-content: space-between;
91 92
 
92
-		.conditionSelect {
93
-			width: 200rpx;
94
-		}
93
+	.conditionSelect {
94
+		width: 200rpx;
95 95
 	}
96
+}
96 97
 
97
-	.case_wrap {
98
-		padding-bottom: 30px;
98
+.case_wrap {
99
+	padding-bottom: 30px;
99 100
 
100
-		.case_main_wrap {
101
-			padding: 15px;
102
-		}
103
-	}
101
+	.case_main_wrap {
102
+		padding: 15px;
103
+	}
104
+}

+ 5 - 5
pages/clueDetail/page/clueDetail.vue

@@ -119,14 +119,14 @@
119 119
 			:safeAreaInsetBottom="true">
120 120
 			<u-tabbar-item text="拨打电话" icon="../../static/clueDetail/icon-phone.png"
121 121
 				@click="handleCallPhone"></u-tabbar-item>
122
-			<!-- 			<u-tabbar-item text="转移线索" icon="../../static/clueDetail/icon-clue.png"
123
-				@click="handleDistribution"></u-tabbar-item> -->
124
-			<u-tabbar-item text="发单" icon="../../static/clueDetail/icon-order.png"
122
+				<u-tabbar-item text="发单" icon="../../static/clueDetail/icon-order.png"
125 123
 				@click="handleClueSend"></u-tabbar-item>
126
-			<u-tabbar-item text="写新跟进" icon="../../static/caseDetail/icon-follow.png"
124
+				<u-tabbar-item text="写新跟进" icon="../../static/caseDetail/icon-follow.png"
127 125
 				@click="handleAddFollow"></u-tabbar-item>
128
-			<u-tabbar-item text="上传录音" icon="../../static/caseDetail/icon-record.png"
126
+				<u-tabbar-item text="上传录音" icon="../../static/caseDetail/icon-record.png"
129 127
 				@click="handleUploadRecord"></u-tabbar-item>
128
+				<u-tabbar-item text="分配" icon="../../static/clueDetail/icon-clue.png"
129
+				@click="handleDistribution"></u-tabbar-item>
130 130
 		</u-tabbar>
131 131
 
132 132
 		<distribution-modal :clueDetail="clueDetail" ref="distribution"

+ 226 - 15
pages/orderDetailNew/components/pageFour.vue

@@ -33,28 +33,74 @@
33 33
                 </u-row>
34 34
 
35 35
                 <!-- 单独一行的收单物品 -->
36
-                <u-row class="info-row">
37
-                    <u-col span="12">
36
+                <u-row class="info-row" justify="space-between">
37
+                    <u-col span="5.8">
38 38
                         <u-form-item label="收单物品" prop="item">
39 39
                             <u--input v-model="warehouseInfo.item" placeholder="请输入收单物品" class="info-input" />
40 40
                         </u-form-item>
41 41
                     </u-col>
42
+                    <!-- 收单类型 -->
43
+                    <u-col span="5.8">
44
+                        <u-form-item label="收单类型" prop="customerServiceNameLabel" @tap="selectCustomerServiceName">
45
+                            <view class="click-wrapper">
46
+                                <u--input v-model="warehouseInfo.customerServiceNameLabel" placeholder="点击选择收单类型"
47
+                                    class="info-input" disabled />
48
+                            </view>
49
+                        </u-form-item>
50
+                        <!-- 收单类型选择 -->
51
+                        <u-picker :show="showCustomerServicePicker" :columns="customerServiceColumns" confirm
52
+                            keyName="label" @confirm="handleConfirmCustomerService"
53
+                            @cancel="showCustomerServicePicker = false"></u-picker>
54
+                    </u-col>
42 55
                 </u-row>
43 56
 
44
-                <!-- 查码费和表款同一行 -->
45 57
                 <u-row class="info-row" justify="space-between">
58
+                    <!-- 收单类别 -->
46 59
                     <u-col span="5.8">
47
-                        <u-form-item label="查码费">
48
-                            <u--input v-model="warehouseInfo.checkCodeFee" placeholder="请输入查码费" class="info-input"
49
-                                type="number" />
60
+                        <u-form-item label="类别" prop="category" @tap="selectCategory">
61
+                            <view class="click-wrapper">
62
+                                <u--input v-model="warehouseInfo.categoryLabel" placeholder="点击选择类别" class="info-input"
63
+                                    disabled />
64
+                            </view>
50 65
                         </u-form-item>
66
+                        <!-- 收单类型选择 -->
67
+                        <u-picker :show="showCategoryPicker" :columns="categoryColumns" confirm keyName="label"
68
+                            @confirm="handleConfirmCategory" @cancel="showCategoryPicker = false"></u-picker>
51 69
                     </u-col>
70
+
71
+
72
+                    <!-- 是否需要查码 -->
73
+                    <u-col span="5.8">
74
+                        <u-form-item label="是否需要查码" prop="needCheckCode" @tap="selectNeedCheckCode">
75
+                            <view class="click-wrapper">
76
+                                <u--input v-model="warehouseInfo.needCheckCodeLabel" placeholder="点击选择是否需要查码"
77
+                                    class="info-input" disabled />
78
+                            </view>
79
+                        </u-form-item>
80
+                        <!-- 是否需要查码选择 -->
81
+                        <u-picker :show="showNeedCheckCodePicker" :columns="needCheckCodeColumns" confirm
82
+                            keyName="label" @confirm="handleConfirmNeedCheckCode"
83
+                            @cancel="showNeedCheckCodePicker = false"></u-picker>
84
+                    </u-col>
85
+
86
+                </u-row>
87
+
88
+
89
+
90
+                <!-- 查码费和表款同一行 -->
91
+                <u-row class="info-row" justify="space-between">
52 92
                     <u-col span="5.8">
53 93
                         <u-form-item label="表款">
54 94
                             <u--input v-model="warehouseInfo.watchPrice" placeholder="请输入表款" class="info-input"
55 95
                                 type="number" />
56 96
                         </u-form-item>
57 97
                     </u-col>
98
+                    <u-col span="5.8">
99
+                        <u-form-item label="查码费">
100
+                            <u--input v-model="warehouseInfo.checkCodeFee" placeholder="请输入查码费" class="info-input"
101
+                                type="number" :disabled="warehouseInfo.needCheckCode == '2'" />
102
+                        </u-form-item>
103
+                    </u-col>
58 104
                 </u-row>
59 105
 
60 106
                 <u-row class="info-row" justify="space-between">
@@ -81,12 +127,33 @@
81 127
                         </u-form-item>
82 128
                     </u-col>
83 129
                     <u-col span="5.8">
84
-                        <u-form-item label="毛业绩">
85
-                            <u--input v-model="warehouseInfo.grossPerformance" placeholder="请输入毛业绩" class="info-input"
130
+                        <u-form-item label="分单比例(0~100)">
131
+                            <u--input v-model="warehouseInfo.splitRatio" placeholder="请输入分单比例(0~100)" class="info-input"
86 132
                                 type="number" />
87 133
                         </u-form-item>
88 134
                     </u-col>
89 135
                 </u-row>
136
+                <!-- 业绩 -->
137
+                <u-row class="info-row" justify="space-between">
138
+                    <u-col span="3.8">
139
+                        <u-form-item label="成本合计">
140
+                            <u--input :disabled="true" :value="computedTotalCost" placeholder="成本合计自动计算"
141
+                                class="info-input" type="number" />
142
+                        </u-form-item>
143
+                    </u-col>
144
+                    <u-col span="3.8">
145
+                        <u-form-item label="业绩">
146
+                            <u--input :disabled="true" :value="computedPerformance" placeholder="业绩自动计算"
147
+                                class="info-input" type="number" />
148
+                        </u-form-item>
149
+                    </u-col>
150
+                    <u-col span="3.8">
151
+                        <u-form-item label="毛业绩">
152
+                            <u--input :disabled="true" :value="computedGrossPerformance" placeholder="毛业绩自动计算"
153
+                                class="info-input" type="number" />
154
+                        </u-form-item>
155
+                    </u-col>
156
+                </u-row>
90 157
 
91 158
                 <!-- 收单备注 -->
92 159
                 <u-row class="info-row">
@@ -198,7 +265,7 @@
198 265
 
199 266
         <!-- 确认入库按钮 -->
200 267
         <div class="confirm-button-container">
201
-            <u-button type="success" @click="confirmWarehouseEntry" style="border-radius: 11px;">
268
+            <u-button class='next-btn' type="success" @click="confirmWarehouseEntry" style="border-radius: 11px;">
202 269
                 <u-icon name="checkmark-circle-fill" size="28rpx" color="#fff"></u-icon>
203 270
                 <text style="margin-left: 8rpx;">确认入库</text>
204 271
             </u-button>
@@ -206,7 +273,7 @@
206 273
 
207 274
         <!-- 组织选择 -->
208 275
         <u-picker :show="showOrgPicker" title="请选择组织" :columns="columnsOrgList" keyName="label"
209
-            @confirm="handleOrgConfirmOrg" @cancel='showOrgPicker = false'></u-picker>
276
+            @confirm="handleOrgConfirmOrg" @cancel=' showOrgPicker = false'></u-picker>
210 277
 
211 278
 
212 279
         <!-- 人员选择 -->
@@ -215,6 +282,9 @@
215 282
 
216 283
         <u-toast ref="uToast"></u-toast>
217 284
 
285
+
286
+
287
+
218 288
     </view>
219 289
 </template>
220 290
 
@@ -288,13 +358,49 @@ export default {
288 358
                         freight: data.freight || '',//运费
289 359
                         repairAmount: data.repairAmount || '',//维修金额
290 360
                         grossPerformance: data.grossPerformance || '',//毛业绩
361
+                        performance: data.performance || '',//业绩
291 362
                         remarks: data.receiptRemark?.split(';')[0] || '',//收单备注  截取备注第一部分
363
+                        splitRatio: data.splitRatio || '',//分单比例
364
+                        customerServiceName: data.customerServiceName || '',//收单类型,1收单类,2维修类,3销售类
365
+                        customerServiceNameLabel: this.customerServiceColumns[0].filter(item => item.value == data.customerServiceName)[0].label || '',//收单类型,1收单类,2维修类,3销售类
366
+                        category: data.category || '',//类别
367
+                        categoryLabel: this.categoryColumns[0].filter(item => item.value == data.category)[0].label || '',//类别
368
+                        needCheckCode: data.needCheckCode || '',//是否需要查码
369
+                        needCheckCodeLabel: this.needCheckCodeColumns[0].filter(item => item.value == data.needCheckCode)[0].label || '',//是否需要查码
292 370
                     }
293 371
                     this.getShareList()
294 372
                 }
295 373
             },
296 374
         }
297 375
     },
376
+    computed: {
377
+
378
+        computedTotalCost() {
379
+            //成本  合计 = 运费 + 好处费+ 查码费 + 表款(支付总额)+ 维修费。
380
+            const freight = this.warehouseInfo.freight || 0
381
+            const benefitFee = this.warehouseInfo.benefitFee || 0
382
+            const checkCodeFee = this.warehouseInfo.checkCodeFee || 0
383
+            const watchPrice = this.warehouseInfo.watchPrice || 0
384
+            const repairAmount = this.warehouseInfo.repairAmount || 0
385
+            return Number(freight) + Number(benefitFee) + Number(checkCodeFee) + Number(watchPrice) + Number(repairAmount)
386
+        },
387
+        computedPerformance() {
388
+            //业绩   //sellingPrice - (totalCost// 成本合计 =   运费1 + 好处费1 + 查码费1 + 表款(支付总额)1+ 维修费1。)
389
+            const sellingPrice = this.currentReceipt.sellingPrice || 0
390
+            const totalCost = Number(this.warehouseInfo.watchPrice) + Number(this.warehouseInfo.freight) + Number(this.warehouseInfo.benefitFee) + Number(this.warehouseInfo.checkCodeFee) + Number(this.warehouseInfo.repairAmount)
391
+
392
+            return sellingPrice - totalCost
393
+        },
394
+
395
+        computedGrossPerformance() {
396
+            // 毛业绩  //毛利 performance*splitRatio,分单比例
397
+            const performance = Number(this.computedPerformance) || 0
398
+            //保留小数点后两位
399
+            const p = performance * (Number(this.warehouseInfo.splitRatio) / 100 || 0)
400
+            return p.toFixed(2)
401
+        },
402
+
403
+    },
298 404
     data() {
299 405
         return {
300 406
             // 入库信息相关的数据
@@ -309,7 +415,12 @@ export default {
309 415
                 freight: '',//运费
310 416
                 repairAmount: '',//维修金额
311 417
                 grossPerformance: '',//毛业绩
418
+                performance: '',//业绩
419
+                splitRatio: '',//分单比例
312 420
                 remarks: '',//收单备注
421
+                customerServiceNameLabel: '',//收单类型,1收单类,2维修类,3销售类
422
+                customerServiceName: '',//收单类型,1收单类,2维修类,3销售类
423
+
313 424
             },
314 425
             // 分成信息相关的数据
315 426
             profitSharingList: [
@@ -326,6 +437,25 @@ export default {
326 437
             columnsOrgList: [],
327 438
             //传入的分成人名单
328 439
             columnsPersonList: [],
440
+            showCustomerServicePicker: false,//显示选择收单类型的弹窗
441
+            customerServiceColumns: [[
442
+                { label: '收单类', value: '1' },
443
+                { label: '维修类', value: '2' },
444
+                { label: '销售类', value: '3' }
445
+            ]],
446
+            showCategoryPicker: false,//显示选择类别弹窗
447
+            categoryColumns: [[
448
+                { label: '腕表', value: '1' },
449
+                { label: '包包', value: '2' },
450
+                { label: '首饰', value: '4' },
451
+                { label: '其他', value: '3' }
452
+            ]],
453
+            showNeedCheckCodePicker: false,//显示选择是否需要查码弹窗
454
+            needCheckCodeColumns: [[
455
+                { label: '是', value: '1' },
456
+                { label: '否', value: '2' }
457
+            ]],
458
+            currentEditItem: '',
329 459
 
330 460
         };
331 461
     },
@@ -446,15 +576,24 @@ export default {
446 576
                             benefitFee: this.warehouseInfo.benefitFee || '',//好处费
447 577
                             freight: this.warehouseInfo.freight || '',//运费
448 578
                             repairAmount: this.warehouseInfo.repairAmount || '',//维修金额
449
-                            grossPerformance: this.warehouseInfo.grossPerformance || '',//毛业绩
579
+                            grossPerformance: this.computedGrossPerformance || '',//毛业绩
580
+                            performance: this.computedPerformance || '',//毛业绩
581
+                            splitRatio: this.warehouseInfo.splitRatio || '',//分单比例
450 582
                             receiptRemark: this.warehouseInfo.remarks + ';' + this.warehouseInfo.uploadedImage || '',//收单备注
583
+                            customerServiceName: this.warehouseInfo.customerServiceName || '',//收单类型,1收单类,2维修类,3销售类
584
+                            category: this.warehouseInfo.category || '',//类别
585
+                            needCheckCode: this.warehouseInfo.needCheckCode || '',//是否需要查码
586
+                            totalCost: this.computedTotalCost || '',//成本合计
451 587
                         });
452 588
 
589
+                        //废弃
453 590
                         //上传物流表单数据
454 591
                         // this.$emit('confirmInterStore', {
455 592
                         //     warehouseInfo: this.warehouseInfo,
456 593
                         // })
457 594
                         //保存入库信息
595
+                        //废弃
596
+
458 597
 
459 598
 
460 599
                         //上传分成数据
@@ -465,8 +604,14 @@ export default {
465 604
                             message: "入库成功",
466 605
                             iconUrl: "https://uviewui.com/demo/toast/success.png",
467 606
                             complete() {
468
-                                uni.navigateTo({
469
-                                    url: '/pages/pagereceivecenter/pagereceivecenter',
607
+                                // uni.navigateTo({
608
+                                //     url: '/pages/pagereceivecenter/pagereceivecenter',
609
+                                // })
610
+
611
+                                //退回上一页
612
+                                uni.navigateBack({
613
+                                    delta: 1,
614
+                                    animationType: 'pop-out'
470 615
                                 })
471 616
                             },
472 617
                         });
@@ -570,6 +715,7 @@ export default {
570 715
         handleSelectOrg(item) {
571 716
             console.log(item.uuid, '当前选择的行的uuid')
572 717
             this.currentEditItem = item.uuid
718
+            console.log(this.currentEditItem, '当前选择的行')
573 719
             // this.showOrgPicker = true
574 720
             this.showPersonPicker = true
575 721
             //把当前的组织赋值给当前的组件
@@ -661,8 +807,56 @@ export default {
661 807
         handleCancelPerson() {
662 808
             this.columnsPersonList = []
663 809
             this.showPersonPicker = false
664
-        }
810
+        },
811
+        //点击选择收单类型
812
+        selectCustomerServiceName() {
813
+            console.log('点击了选择收单类型')
665 814
 
815
+            //打开选择收单类型的弹窗
816
+            this.showCustomerServicePicker = true
817
+        },
818
+        handleConfirmCustomerService({ value }) {
819
+            //选择了收单类型
820
+            console.log(value[0].label, '选择的收单类型')
821
+            console.log(value[0].value, '选择的收单类型')
822
+            //把值赋值给当前行
823
+            this.warehouseInfo.customerServiceNameLabel = value[0].label
824
+            this.warehouseInfo.customerServiceName = value[0].value
825
+            //关闭弹窗
826
+            this.showCustomerServicePicker = false
827
+        },
828
+        //点击选择类别
829
+        selectCategory() {
830
+            console.log('点击了选择类别')
831
+            //打开选择类别弹窗
832
+            this.showCategoryPicker = true
833
+        },
834
+        handleConfirmCategory({ value }) {
835
+            //选择了类别
836
+            console.log(value[0].label, '选择的类别')
837
+            console.log(value[0].value, '选择的类别')
838
+            //把值赋值给当前行
839
+            this.warehouseInfo.categoryLabel = value[0].label
840
+            this.warehouseInfo.category = value[0].value
841
+            //关闭弹窗
842
+            this.showCategoryPicker = false
843
+        },
844
+        //点击选择是否需要查码
845
+        selectNeedCheckCode() {
846
+            console.log('点击了选择是否需要查码')
847
+            //打开选择是否需要查码弹窗
848
+            this.showNeedCheckCodePicker = true
849
+        },
850
+        handleConfirmNeedCheckCode({ value }) {
851
+            //选择了是否需要查码
852
+            console.log(value[0].label, '选择的是否需要查码')
853
+            console.log(value[0].value, '选择的是否需要查码')
854
+            //把值赋值给当前行
855
+            this.warehouseInfo.needCheckCodeLabel = value[0].label
856
+            this.warehouseInfo.needCheckCode = value[0].value
857
+            //关闭弹窗
858
+            this.showNeedCheckCodePicker = false
859
+        },
666 860
     }
667 861
 };
668 862
 </script>
@@ -736,9 +930,12 @@ export default {
736 930
     white-space: nowrap;
737 931
 }
738 932
 
739
-
933
+::v-deep .u-form-item__body {
934
+    padding: 0;
935
+}
740 936
 
741 937
 // 图片上传样式
938
+
742 939
 .image-uploader {
743 940
     width: 100%;
744 941
     height: 65rpx;
@@ -1055,4 +1252,18 @@ export default {
1055 1252
 .delectBtn ::v-deep .u-button--mini {
1056 1253
     min-width: 20rpx !important;
1057 1254
 }
1255
+
1256
+
1257
+
1258
+.next-btn {
1259
+    position: fixed;
1260
+    bottom: 10rpx;
1261
+    left: 2.5%;
1262
+    width: 95%;
1263
+    height: 80rpx;
1264
+    line-height: 80rpx;
1265
+    text-align: center;
1266
+    @include font-styles($size: medium, $weight: bold, $color: #fff);
1267
+    border-radius: 0rpx 0rpx 20rpx 20rpx;
1268
+}
1058 1269
 </style>

+ 95 - 20
pages/orderDetailNew/components/pageOne.vue

@@ -16,7 +16,7 @@
16 16
             <view class="image-upload-container">
17 17
                 <view class="image-list">
18 18
                     <view class="image-item" v-for="(item, index) in trueUploadList" :key="'truePic-' + index">
19
-                        <pic-comp :src="item.fileUrl"></pic-comp>
19
+                        <pic-comp @needPreviewPic='previewImageTrue' :src="item.fileUrl"></pic-comp>
20 20
                         <view class="delete-btn" @click="deleteImage(item)">×</view>
21 21
                     </view>
22 22
                     <view class="upload-btn" @click="uploadImage('truePic', currentReceipt.id)">
@@ -28,12 +28,17 @@
28 28
 
29 29
         <!-- 聊天记录卡片 -->
30 30
         <view class="card_wrap">
31
-            <view class="card-title">聊天记录</view>
32
-            <view class="image-upload-container">
31
+            <view class="card-title">
32
+                <text @click="chatRecordOrCallRecord = 'chatRecords'">聊天记录</text>
33
+                <text style="margin: 0 10rpx;">|</text>
34
+                <text @click="chatRecordOrCallRecord = 'callRecords'">通话记录</text>
35
+            </view>
36
+            <!-- 聊天记录卡片 -->
37
+            <view class="image-upload-container" v-if="chatRecordOrCallRecord === 'chatRecords'">
33 38
                 <view class="image-list">
34 39
                     <view class="image-item" v-for="(item, index) in chatRecordsUploadList"
35 40
                         :key="'chatRecords-' + index">
36
-                        <pic-comp :src="item.fileUrl"></pic-comp>
41
+                        <pic-comp @needPreviewPic='previewImageChat' :src="item.fileUrl"></pic-comp>
37 42
                         <view class="delete-btn" @click="deleteImage(item)">×</view>
38 43
                     </view>
39 44
                     <view class="upload-btn" @click="uploadImage('chatRecords', currentReceipt.id)">
@@ -41,6 +46,15 @@
41 46
                     </view>
42 47
                 </view>
43 48
             </view>
49
+            <!-- 通话录音卡片 -->
50
+            <view class="image-upload-container" v-if="chatRecordOrCallRecord === 'callRecords'">
51
+                <view>
52
+
53
+                    <sound-recorder v-for="item in soundRecordList" :key="item.fileName" :data="item"></sound-recorder>
54
+
55
+                </view>
56
+
57
+            </view>
44 58
         </view>
45 59
 
46 60
         <!-- 基本信息卡片 -->
@@ -84,13 +98,20 @@
84 98
             </view>
85 99
         </view>
86 100
 
87
-        <u-button @click="handleNextClick" type="primary" size="middle" style="border-radius: 20rpx;">下一步</u-button>
101
+        <view class="space-block">
102
+
103
+        </view>
104
+
105
+        <u-button class='next-btn' @click="handleNextClick" type="primary" size="middle"
106
+            style="border-radius: 20rpx;">下一步</u-button>
88 107
 
89 108
     </view>
90 109
 </template>
91 110
 <script>
92 111
 import picComp from './picComp.vue'
93 112
 import imgUploadAndDownLoad from '../mixin/imgUploadAndDownLoad.js'
113
+import soundRecorder from '@/components/soundRecorder/soundRecorder.vue'
114
+
94 115
 export default {
95 116
     mixins: [imgUploadAndDownLoad],
96 117
     props: {
@@ -108,7 +129,7 @@ export default {
108 129
         },
109 130
     },
110 131
     components: {
111
-        picComp
132
+        picComp, soundRecorder
112 133
     },
113 134
     data() {
114 135
         return {
@@ -117,6 +138,8 @@ export default {
117 138
             chatRecordsUploadList: [],
118 139
             // 待绑定的图片列表
119 140
             bindList: [],
141
+            chatRecordOrCallRecord: 'chatRecords',
142
+            soundRecordList: [],//录音记录
120 143
         }
121 144
     },
122 145
     watch: {
@@ -136,32 +159,41 @@ export default {
136 159
                     setTimeout(() => {
137 160
                         this.getList('2', '1', newVal.id, this.orderDetail.itemBrand);
138 161
                         this.getList('2', '2', newVal.id, this.orderDetail.itemBrand);
162
+                        this.getCallRecords();
139 163
                     }, 100)
140 164
 
141 165
                 }
142 166
             }
143 167
         },
144 168
     },
169
+
145 170
     methods: {
146 171
 
147 172
         // 电话卡片点击事件
148 173
         handlePhoneClick() {
149 174
             console.log('电话卡片被点击', '电话号码:', this.orderDetail.phone)
150 175
             if (this.orderDetail.phone) {
151
-                //拨打电话,需要设置权限
152
-                // uni.makePhoneCall({
153
-                //     phoneNumber: this.orderDetail.phone
154
-                // });
155
-                //先暂时复制电话号码
156
-                uni.setClipboardData({
157
-                    data: this.orderDetail.phone,
176
+                uni.makePhoneCall({
177
+                    phoneNumber: this.orderDetail.phone,
158 178
                     success: () => {
159
-                        uni.showToast({
160
-                            title: '电话号码已复制',
161
-                            icon: 'none'
162
-                        })
163
-                    }
164
-                })
179
+                        this.$store.commit("call/SET_FORM", {
180
+                            clueId: this.orderDetail.clueId,
181
+                            type: "3",
182
+                            callee: this.orderDetail.phone,
183
+                        });
184
+                        console.log('this.currentReceipt333', this.$store.state.call.form.callee)
185
+                    },
186
+                });
187
+                //先暂时复制电话号码
188
+                // uni.setClipboardData({
189
+                //     data: this.orderDetail.phone,
190
+                //     success: () => {
191
+                //         uni.showToast({
192
+                //             title: '电话号码已复制',
193
+                //             icon: 'none'
194
+                //         })
195
+                //     }
196
+                // })
165 197
             } else {
166 198
                 uni.showToast({
167 199
                     title: '该订单暂时没有电话号码',
@@ -364,6 +396,31 @@ export default {
364 396
                 }
365 397
             })
366 398
         },
399
+        // 预览真实图片
400
+        previewImageTrue(src) {
401
+            const urlList = this.trueUploadList.map(item => item.fileUrl);
402
+
403
+            uni.previewImage({
404
+                urls: urlList,
405
+                current: src
406
+            })
407
+        },
408
+        previewImageChat(src) {
409
+            const urlList = this.chatRecordsUploadList.map(item => item.fileUrl);
410
+
411
+            uni.previewImage({
412
+                urls: urlList,
413
+                current: src
414
+            })
415
+        },
416
+        //获取通话记录
417
+        async getCallRecords() {
418
+            console.log('这里是参数', this.currentReceipt.clueId);
419
+            const { data } = await uni.$u.api.getCallClueFileByClueId({ clueId: this.currentReceipt.clueId });
420
+            // const { data } = await uni.$u.api.getCallClueFileByClueId({ clueId: '1998278069905854466' });
421
+            console.log('通话记录:', data);
422
+            this.soundRecordList = data;
423
+        },
367 424
 
368 425
     },
369 426
 
@@ -476,7 +533,7 @@ export default {
476 533
 .connect-card {
477 534
     flex: 1;
478 535
     @include card;
479
-    padding: 30rpx;
536
+    padding: 10rpx;
480 537
     display: flex;
481 538
     flex-direction: column;
482 539
     align-items: center;
@@ -508,4 +565,22 @@ export default {
508 565
     border-radius: 50%;
509 566
     box-shadow: 0 0 4rpx rgba(255, 77, 79, 0.3);
510 567
 }
568
+
569
+
570
+
571
+.next-btn {
572
+    position: fixed;
573
+    bottom: 10rpx;
574
+    left: 2.5%;
575
+    width: 95%;
576
+    height: 80rpx;
577
+    line-height: 80rpx;
578
+    text-align: center;
579
+    @include font-styles($size: medium, $weight: bold, $color: #fff);
580
+    border-radius: 0rpx 0rpx 20rpx 20rpx;
581
+}
582
+
583
+.space-block {
584
+    height: 80rpx;
585
+}
511 586
 </style>

+ 115 - 20
pages/orderDetailNew/components/pageThree.vue

@@ -11,7 +11,9 @@
11 11
                 </u-col>
12 12
                 <u-col span="5.8">
13 13
                     <view class="info-label">银行名称</view>
14
-                    <u-input v-model="paymentInfo.bankName" placeholder="请输入银行名称" class="info-input" />
14
+                    <u-input v-model="paymentInfo.bankName" placeholder="请输入银行名称" class="info-input"
15
+                        @blur="handleBankNameInput" />
16
+
15 17
                 </u-col>
16 18
             </u-row>
17 19
             <!-- 银行账号单独一行 -->
@@ -28,6 +30,26 @@
28 30
                     <u-input v-model="paymentInfo.idNumber" placeholder="请输入身份证号" class="info-input" />
29 31
                 </u-col>
30 32
             </u-row>
33
+            <!-- 支付方式 -->
34
+            <u-row class="info-row">
35
+                <u-col span="12">
36
+                    <view class="info-label">支付方式选择</view>
37
+                    <u-radio-group iconPlacement="left" v-model="paymentMethodRadio" placement="row"
38
+                        @change='handlePaymentMethodRadioChange'>
39
+                        <u-radio shape="circle" label="小葫芦线上支付" name="online"></u-radio>
40
+                        <u-radio shape="circle" label="线下支付" name="offline"></u-radio>
41
+                    </u-radio-group>
42
+                </u-col>
43
+            </u-row>
44
+
45
+            <u-row class="info-row">
46
+                <u-col span="12">
47
+                    <view class="info-label">支付方式</view>
48
+                    <u-input :disabled="paymentMethodRadio == 'online'" v-model="paymentMethod" placeholder="请输入支付方式"
49
+                        class="info-input" />
50
+                </u-col>
51
+            </u-row>
52
+
31 53
         </view>
32 54
 
33 55
         <view class="card_wrap">
@@ -50,7 +72,7 @@
50 72
                                 'can-drop': canDropIndex === index
51 73
                             }" @touchstart.stop="onTouchStart($event, index)" @touchmove.stop="onTouchMove($event)"
52 74
                             @touchend.stop="onTouchEnd" @touchcancel.stop="onTouchEnd">
53
-                            <pic-comp :src="item.fileUrl"></pic-comp>
75
+                            <pic-comp @needPreviewPic='previewImageDetail' :src="item.fileUrl"></pic-comp>
54 76
                             <view class="image-type-tag">{{ getImageType(index) }}</view>
55 77
                             <view class="detail-delete-btn" @click.stop="handleYinCang(item, index)">×</view>
56 78
                         </view>
@@ -69,8 +91,7 @@
69 91
             <view class="payment-section">
70 92
                 <view class="payment-total-container">
71 93
                     <text class="payment-label">支付总额</text>
72
-                    <u-input v-model="paymentAmount" placeholder="0.00" class="payment-amount" type="number" decimal="2"
73
-                        prefix="¥" />
94
+                    <u-input v-model="paymentAmount" class="payment-amount" type="number" decimal="2" prefix="¥" />
74 95
                 </view>
75 96
 
76 97
                 <view class="payment-buttons-row">
@@ -89,20 +110,23 @@
89 110
                 </view>
90 111
             </view>
91 112
         </view>
92
-        <u-button @click="handleNextClick" type="primary" size="middle" style="border-radius: 20rpx;">下一步</u-button>
113
+        <u-button class='next-btn' @click="handleNextClick" type="primary" size="middle"
114
+            style="border-radius: 20rpx;">下一步</u-button>
93 115
 
94
-        <u-modal :show="unpaidModelShow" :title="'未收评级'" :showConfirmButton="false">
116
+        <u-modal showCancelButton showConfirmButton @confirm="confirmUnpaid" @cancel="unpaidModelShow = false"
117
+            :show="unpaidModelShow" :title="'未收评级'">
95 118
             <view class="modal-content">
96 119
                 <u-rate v-model="unpaidRating" :count="5" :size="50" active-color="#ff9500"></u-rate>
97
-                <u-button type="primary" size="large" @click="confirmUnpaid" style="margin-top: 40rpx;">确认未收</u-button>
120
+                <!-- <u-button type="primary" size="large" @click="confirmUnpaid" style="margin-top: 40rpx;">确认未收</u-button> -->
98 121
             </view>
99 122
         </u-modal>
100 123
 
101
-        <u-modal :show="followUpModelShow" :title="'填写跟进细节'" :showConfirmButton="false">
124
+        <u-modal showCancelButton showConfirmButton @confirm="confirmFollowUp" @cancel="followUpModelShow = false"
125
+            :show="followUpModelShow" :title="'填写跟进细节'">
102 126
             <view class="modal-content">
103 127
                 <u--textarea v-model="followUpNotes" placeholder="请输入情况" confirm-type="done"
104 128
                     style="width: 100%; margin-bottom: 30rpx;"></u--textarea>
105
-                <u-button type="primary" size="large" @click="confirmFollowUp">确认</u-button>
129
+                <!-- <u-button type="primary" size="large" @click="confirmFollowUp">确认</u-button> -->
106 130
             </view>
107 131
         </u-modal>
108 132
 
@@ -115,7 +139,7 @@
115 139
                 <view class="payment-info-section">
116 140
                     <view class="info-item">
117 141
                         <text class="info-label">收款姓名:</text>
118
-                        <text class="info-value">{{ paymentInfo.accountHolder || '未填写' }}</text>
142
+                        <text class="info-value">{{ paymentInfo.customName || '未填写' }}</text>
119 143
                     </view>
120 144
                     <view class="info-item">
121 145
                         <text class="info-label">开户银行:</text>
@@ -125,6 +149,10 @@
125 149
                         <text class="info-label">银行卡号:</text>
126 150
                         <text class="info-value">{{ paymentInfo.bankAccount || '未填写' }}</text>
127 151
                     </view>
152
+                    <view class="info-item">
153
+                        <text class="info-label">支付方式:</text>
154
+                        <text class="info-value">{{ paymentMethod || '未填写' }}</text>
155
+                    </view>
128 156
                 </view>
129 157
 
130 158
                 <!-- 确认转账按钮 -->
@@ -162,11 +190,14 @@ export default {
162 190
         orderDetail: {
163 191
             handler(newVal) {
164 192
                 if (newVal) {
193
+                    // console.log('这里是page3的orderDetail', newVal)
165 194
                     this.paymentInfo.customName = newVal.customName || ''
166 195
                     this.paymentInfo.bankName = newVal.bankName || ''
167 196
                     this.paymentInfo.bankAccount = newVal.bankCardNumber || ''
168 197
                     this.paymentInfo.idNumber = newVal.idCard || ''
169 198
                     // this.paymentAmount = newVal.tableFee || '0.00'
199
+                    //支付方式初始化
200
+                    this.initPaymentMethod(newVal.paymentMethod)
170 201
                 }
171 202
             },
172 203
             deep: true,
@@ -174,7 +205,7 @@ export default {
174 205
         currentReceipt: {
175 206
             handler(newVal) {
176 207
                 if (newVal) {
177
-                    console.log('这里是page3的', newVal.tableFee)
208
+                    // console.log('这里是page3的currentReceipt', newVal)
178 209
                     this.paymentAmount = newVal.tableFee || '0.00'
179 210
                     setTimeout(() => {
180 211
                         this.getList('2', '3', newVal.id, this.orderDetail.itemBrand);
@@ -220,12 +251,22 @@ export default {
220 251
 
221 252
             detailImages: [],// 高清细节图数组
222 253
             // 绑定订单相关
223
-            bindList: [] // 待绑定的图片列表
254
+            bindList: [], // 待绑定的图片列表
255
+
256
+            paymentMethodRadio: 'offline', // 支付方式
257
+            paymentMethod: '',//支付方式输入框
224 258
         };
225 259
     },
226 260
 
227 261
     methods: {
228 262
 
263
+        // 银行名称输入处理 - 只允许中文和英文
264
+        handleBankNameInput(value) {
265
+            const strValue = String(value || '');
266
+            const reg = /[0-9]/g;
267
+            // 用replace + 全局正则替代replaceAll
268
+            this.paymentInfo.bankName = strValue.replace(reg, '');
269
+        },
229 270
 
230 271
 
231 272
 
@@ -355,6 +396,8 @@ export default {
355 396
 
356 397
         // 立即支付按钮点击事件
357 398
         async handlePayNowClick() {
399
+
400
+
358 401
             //保存
359 402
             await uni.$u.api.updateReceiptForm({
360 403
                 id: this.currentReceipt.id,
@@ -369,8 +412,19 @@ export default {
369 412
                 bankName: this.paymentInfo.bankName || '',
370 413
                 bankCardNumber: this.paymentInfo.bankAccount || '',
371 414
                 idCard: this.paymentInfo.idNumber || '',
415
+                paymentMethod: this.paymentMethod || '',
372 416
             });
373 417
 
418
+            // 判断是否填写了支付信息
419
+            if (!this.paymentInfo.customName || !this.paymentInfo.bankName || !this.paymentInfo.bankAccount || !this.paymentInfo.idNumber || !this.paymentMethod) {
420
+                uni.$u.toast('请填写完整的支付信息');
421
+                return;
422
+            }
423
+            if (this.paymentAmount <= 0) {
424
+                uni.$u.toast('请填写正确的支付总额');
425
+                return;
426
+            }
427
+
374 428
             console.log('点击了立即支付按钮');
375 429
             this.payNowModelShow = true;
376 430
 
@@ -412,12 +466,13 @@ export default {
412 466
             });
413 467
 
414 468
             console.log('page3点击了下一步按钮', this.detailImages);
415
-            // this.$emit('handleNextClick', {
416
-            //     nowPage: 'formThree',
417
-            //     form: {
418
-            //         ...this.paymentInfo
419
-            //     }
420
-            // });
469
+
470
+            this.$emit('handleNextClick', {
471
+                nowPage: 'formThree',
472
+                form: {
473
+                    ...this.paymentInfo
474
+                }
475
+            });
421 476
         },
422 477
 
423 478
         // 确认未收按钮点击事件
@@ -462,6 +517,34 @@ export default {
462 517
                 this.detailImages.splice(itemIndex, 1);
463 518
                 uni.$u.toast('图片已隐藏');
464 519
             }
520
+        },
521
+        previewImageDetail(src) {
522
+            const urlList = this.detailImages.map(item => item.fileUrl);
523
+
524
+            uni.previewImage({
525
+                urls: urlList,
526
+                current: src
527
+            })
528
+        },
529
+        //页面开始初始化支付方式
530
+        initPaymentMethod(newvalue) {
531
+            console.log('这里是初始化的支付方式', newvalue)
532
+            if (newvalue == '小葫芦线上支付') {
533
+                this.paymentMethod = '小葫芦线上支付'
534
+                this.paymentMethodRadio = 'online'
535
+            } else {
536
+                this.paymentMethod = newvalue
537
+                this.paymentMethodRadio = 'offline'
538
+            }
539
+        },
540
+        //支付方式选择改变触发回调
541
+        handlePaymentMethodRadioChange(value) {
542
+            console.log('支付方式选择改变:', value)
543
+            if (value == 'online') {
544
+                this.paymentMethod = '小葫芦线上支付'
545
+            } else {
546
+                this.paymentMethod = ''
547
+            }
465 548
         }
466 549
     }
467 550
 }
@@ -683,7 +766,7 @@ export default {
683 766
     background-color: #f5f7fa;
684 767
     border: 2rpx solid #e5e7eb;
685 768
     border-radius: 12rpx;
686
-    padding: 24rpx 30rpx;
769
+    padding: 0rpx 30rpx;
687 770
     box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
688 771
     display: flex;
689 772
     align-items: center;
@@ -730,7 +813,7 @@ export default {
730 813
 .payment-button {
731 814
     flex: 1;
732 815
     border-radius: 12rpx;
733
-    padding: 24rpx 0;
816
+    padding: 5rpx 0;
734 817
     display: flex;
735 818
     flex-direction: column;
736 819
     align-items: center;
@@ -828,6 +911,18 @@ export default {
828 911
 .info-value {
829 912
     font-size: 28rpx;
830 913
     color: #333;
914
+}
831 915
 
916
+
917
+.next-btn {
918
+    position: fixed;
919
+    bottom: 10rpx;
920
+    left: 2.5%;
921
+    width: 95%;
922
+    height: 80rpx;
923
+    line-height: 80rpx;
924
+    text-align: center;
925
+    @include font-styles($size: medium, $weight: bold, $color: #fff);
926
+    border-radius: 0rpx 0rpx 20rpx 20rpx;
832 927
 }
833 928
 </style>

+ 31 - 7
pages/orderDetailNew/components/pageTwo.vue

@@ -111,7 +111,7 @@
111 111
                 <div class="detail-image-upload-container">
112 112
                     <view class="detail-image-list">
113 113
                         <view class="detail-image-item" v-for="(item, index) in detailImages" :key="'detail-' + index">
114
-                            <pic-comp :src="item.fileUrl"></pic-comp>
114
+                            <pic-comp @needPreviewPic='previewImageDetail' :src="item.fileUrl"></pic-comp>
115 115
                             <view class="detail-delete-btn" @click="deleteImage(item)">×</view>
116 116
                         </view>
117 117
                         <view class="detail-upload-btn" @click="uploadImage('detailImages', currentReceipt.id)">
@@ -122,7 +122,8 @@
122 122
             </view>
123 123
         </view>
124 124
 
125
-        <u-button @click="handleNextClick" type="primary" size="middle" style="border-radius: 20rpx;">下一步</u-button>
125
+        <u-button class='next-btn' @click="handleNextClick" type="primary" size="middle"
126
+            style="border-radius: 20rpx;">下一步</u-button>
126 127
     </view>
127 128
 </template>
128 129
 
@@ -276,7 +277,7 @@ export default {
276 277
                         console.error(`保存图片失败: ${url}`, error);
277 278
                         failedImages.push(url);
278 279
                     }
279
-                    
280
+
280 281
                     // 更新进度
281 282
                     uni.showLoading({
282 283
                         title: `正在保存图片... (${i + 1}/${imageUrls.length})`,
@@ -517,6 +518,15 @@ export default {
517 518
             })
518 519
         },
519 520
 
521
+        previewImageDetail(src) {
522
+            const urlList = this.detailImages.map(item => item.fileUrl);
523
+
524
+            uni.previewImage({
525
+                urls: urlList,
526
+                current: src
527
+            })
528
+        }
529
+
520 530
 
521 531
 
522 532
 
@@ -914,7 +924,7 @@ u-checkbox {
914 924
     display: flex;
915 925
     justify-content: center;
916 926
     gap: 16rpx;
917
-    margin: 16rpx 0;
927
+    margin: 5rpx 0;
918 928
     width: 100%;
919 929
     max-width: 800rpx;
920 930
 }
@@ -923,7 +933,7 @@ u-checkbox {
923 933
     flex: 1;
924 934
     border-radius: 12rpx;
925 935
     font-size: 36rpx;
926
-    padding: 20rpx 0;
936
+    padding: 10rpx 0;
927 937
     min-width: 0;
928 938
     text-align: center;
929 939
     color: #ffffff;
@@ -967,7 +977,7 @@ u-checkbox {
967 977
     background-color: #f5f7fa;
968 978
     border: 2rpx solid #e5e7eb;
969 979
     border-radius: 12rpx;
970
-    padding: 20rpx 24rpx;
980
+    padding: 0rpx 24rpx;
971 981
     box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
972 982
     display: flex;
973 983
     align-items: center;
@@ -991,7 +1001,7 @@ u-checkbox {
991 1001
 // 价格输入框样式
992 1002
 .price-input {
993 1003
     width: 100%;
994
-    height: auto;
1004
+    // height: auto;
995 1005
     border: none;
996 1006
     outline: none;
997 1007
     background-color: transparent;
@@ -1017,4 +1027,18 @@ u-checkbox {
1017 1027
 .price-input:focus {
1018 1028
     background-color: transparent;
1019 1029
 }
1030
+
1031
+
1032
+
1033
+.next-btn {
1034
+    position: fixed;
1035
+    bottom: 10rpx;
1036
+    left: 2.5%;
1037
+    width: 95%;
1038
+    height: 80rpx;
1039
+    line-height: 80rpx;
1040
+    text-align: center;
1041
+    @include font-styles($size: medium, $weight: bold, $color: #fff);
1042
+    border-radius: 0rpx 0rpx 20rpx 20rpx;
1043
+}
1020 1044
 </style>

+ 1 - 4
pages/orderDetailNew/components/picComp.vue

@@ -13,10 +13,7 @@ export default {
13 13
     },
14 14
     methods: {
15 15
         click() {
16
-            uni.previewImage({
17
-                urls: [this.src],
18
-                current: this.src
19
-            })
16
+            this.$emit('needPreviewPic', this.src)
20 17
         }
21 18
     }
22 19
 }

+ 3 - 0
pages/orderDetailNew/index.vue

@@ -31,9 +31,12 @@
31 31
         <!-- 加一单选择模态窗 -->
32 32
         <u-modal :show="addOneModelShow" :title="'加一单'" showCancelButton @cancel="addOneModelShow = false"
33 33
             @confirm="handleAddOneConfirm">
34
+            <!-- 品牌选择按钮 -->
34 35
             <u-button type="primary" plain @click="showBrandSelector = true;"
35 36
                 :text="currentAddBrand.dictLabel || '点击请选择品牌'"></u-button>
37
+            <!-- 物品选择按钮 -->
36 38
         </u-modal>
39
+
37 40
         <!-- 加一单品牌选择器 -->
38 41
         <u-picker :show="showBrandSelector" @confirm="handleBrandConfirm" :columns="brandColumns"
39 42
             @cancel='showBrandSelector = false' keyName="dictLabel"></u-picker>

+ 85 - 63
pages/orderForm/index.vue

@@ -8,8 +8,8 @@
8 8
 			<u--form labelPosition="top" labelWidth="100" :model="form" :rules="rules" ref="form" class="form_wrap"
9 9
 				:errorType="'toast'">
10 10
 				<u-form-item label="品牌" prop="brand" class="brand_wrap">
11
-					<ld-select :list="brandDict" label-key="dictLabel" value-key="dictValue" placeholder="请选择物品品牌"
12
-						v-model="form.brand" :border="false" border></ld-select>
11
+					<BrandSelect :list="brandDict" label-key="dictLabel" value-key="dictValue" placeholder="请选择物品品牌"
12
+						v-model="form.brand" :border="false" border></BrandSelect>
13 13
 					<u-icon slot="right" name="arrow-right"></u-icon>
14 14
 				</u-form-item>
15 15
 
@@ -19,11 +19,11 @@
19 19
 							<u--input v-model="form.model" placeholder="例如:CF小号" border="surround"></u--input>
20 20
 						</u-form-item>
21 21
 					</u-col>
22
-					 <u-col span="6">
23
-                        <u-form-item label="实价" prop="price">
22
+					<u-col span="6">
23
+						<u-form-item label="实价" prop="price">
24 24
 							<u--input v-model="form.price" placeholder="0.00" border="surround"></u--input>
25
-					</u-form-item>
26
-                    </u-col>
25
+						</u-form-item>
26
+					</u-col>
27 27
 				</u-row>
28 28
 
29 29
 				<u-row gutter="5" justify="space-between">
@@ -32,7 +32,7 @@
32 32
 							<u--input v-model="form.phone" placeholder="电话号" border="surround"></u--input>
33 33
 						</u-form-item>
34 34
 					</u-col>
35
-					 <u-col span="6">
35
+					<u-col span="6">
36 36
 						<u-form-item label="客户微信" prop="wechat">
37 37
 							<u--input v-model="form.wechat" placeholder="微信号" border="surround"></u--input>
38 38
 						</u-form-item>
@@ -44,11 +44,13 @@
44 44
 						<view>地址信息</view>
45 45
 					</view>
46 46
 					<u-form-item label="详细地址" prop="address" class='form_card'>
47
-						<pick-regions :defaultRegion="defaultRegion" @getRegion="handleGetRegion" clearable class="region-picker">
47
+						<pick-regions :defaultRegion="defaultRegion" @getRegion="handleGetRegion" clearable
48
+							class="region-picker">
48 49
 							<view>
49 50
 								<template v-if="form.province">
50
-									<u--input :value="form.province + '/' + form.city + '/' + form.area" placeholder="点击选择"
51
-										readonly suffixIcon="arrow-right" suffixIconStyle="color : #c0c4cc"></u--input>
51
+									<u--input :value="form.province + '/' + form.city + '/' + form.area"
52
+										placeholder="点击选择" readonly suffixIcon="arrow-right"
53
+										suffixIconStyle="color : #c0c4cc"></u--input>
52 54
 								</template>
53 55
 								<template v-else>
54 56
 									<u--input placeholder="点击选择" readonly suffixIcon="arrow-right"
@@ -57,19 +59,21 @@
57 59
 							</view>
58 60
 						</pick-regions>
59 61
 					</u-form-item>
60
-					<u--textarea v-model="form.address" placeholder="粘贴地址自动识别(例如:浙江省杭州市...)" confirmType="done" @blur="handleAddressBlur"></u--textarea>
62
+					<u--textarea v-model="form.address" placeholder="粘贴地址自动识别(例如:浙江省杭州市...)" confirmType="done"
63
+						@blur="handleAddressBlur"></u--textarea>
61 64
 				</view>
62 65
 				<u-form-item label="上门时间" prop="visitTime" class="visit_time_wrap">
63 66
 					<date-time-picker v-model="form.visitTime" :value-format="'YYYY-MM-DD HH:mm:ss'" :type="'datetime'">
64 67
 					</date-time-picker>
65 68
 				</u-form-item>
66 69
 
67
-				<u-form-item label="类型" prop="category" class="category_wrap">
68
-					<view class="category_select_wrap">
69
-						<ld-select :list="categoryDict" label-key="dictLabel" value-key="dictValue" placeholder="请选择类型"
70
-							v-model="form.category" :border="false"></ld-select>
71
-						<u-icon slot="right" name="arrow-right"></u-icon>
72
-					</view>
70
+				<!-- <u-form-item label="类型" prop="category" class="category_wrap"> -->
71
+				<u-form-item label="类型" prop="category" class="brand_wrap">
72
+					<!-- <view class="category_select_wrap"> -->
73
+					<ld-select :list="categoryDict" label-key="dictLabel" value-key="dictValue" placeholder="请选择类型"
74
+						v-model="form.category" :border="false"></ld-select>
75
+					<u-icon slot="right" name="arrow-right"></u-icon>
76
+					<!-- </view> -->
73 77
 				</u-form-item>
74 78
 
75 79
 				<u-form-item label="价格范围" prop="priceRange">
@@ -86,7 +90,8 @@
86 90
 				</u-form-item>
87 91
 
88 92
 				<u-form-item label="备注信息" prop="remarks" class="remarks_wrap">
89
-					<u--textarea v-model="form.remarks" placeholder="填写线索来源、客户特殊要求等..." count confirmType="done"></u--textarea>
93
+					<u--textarea v-model="form.remarks" placeholder="填写线索来源、客户特殊要求等..." count
94
+						confirmType="done"></u--textarea>
90 95
 				</u-form-item>
91 96
 
92 97
 			</u--form>
@@ -120,11 +125,13 @@
120 125
 import orderFileUpload from '@/components/order-file-upload/order-file-upload.vue'
121 126
 import dateTimePicker from "@/components/dateTimePicker/dateTimePicker.vue"
122 127
 import ldSelect from "@/components/ld-select/ld-select.vue"
128
+import BrandSelect from "@/components/brand-select/brand-select.vue"
123 129
 export default {
124 130
 	components: {
125 131
 		orderFileUpload,
126 132
 		dateTimePicker,
127
-		ldSelect
133
+		ldSelect,
134
+		BrandSelect
128 135
 	},
129 136
 	data() {
130 137
 		return {
@@ -145,7 +152,7 @@ export default {
145 152
 				address: '',
146 153
 				visitTime: '',
147 154
 				remarks: '',
148
-				category: '',
155
+				category: '1',
149 156
 				brand: '',
150 157
 				model: '',
151 158
 				price: '',
@@ -194,13 +201,13 @@ export default {
194 201
 				},
195 202
 				wechat: {
196 203
 					type: 'string',
197
-					required: true,
204
+					required: false,
198 205
 					message: '请输入客户微信',
199 206
 					trigger: ['blur', 'change']
200 207
 				},
201 208
 				phone: {
202 209
 					type: 'string',
203
-					required: true,
210
+					required: false,
204 211
 					message: '请输入联系电话',
205 212
 					trigger: ['blur', 'change']
206 213
 				},
@@ -260,17 +267,17 @@ export default {
260 267
 			this.form.province = provinceData.name;
261 268
 			this.form.city = cityData.name;
262 269
 			this.form.area = areaData.name;
263
-			
270
+
264 271
 			// 构建完整的地区信息
265 272
 			const regionText = this.form.province + this.form.city + this.form.area;
266
-			
273
+
267 274
 			// 检查当前地址内容是否为纯地区信息(没有具体街道等)
268
-			const isPureRegion = !this.form.address || 
269
-								this.form.address.trim() === '' ||
270
-								this.form.address.trim().includes(this.form.province) ||
271
-								this.form.address.trim().includes(this.form.city) ||
272
-								this.form.address.trim().includes(this.form.area);
273
-			
275
+			const isPureRegion = !this.form.address ||
276
+				this.form.address.trim() === '' ||
277
+				this.form.address.trim().includes(this.form.province) ||
278
+				this.form.address.trim().includes(this.form.city) ||
279
+				this.form.address.trim().includes(this.form.area);
280
+
274 281
 			// 如果是纯地区信息或者是空地址,则更新为选择的地区
275 282
 			if (isPureRegion) {
276 283
 				this.form.address = regionText;
@@ -435,90 +442,106 @@ export default {
435 442
 	padding: 10rpx;
436 443
 	/* 确保内容不会溢出 */
437 444
 	overflow: hidden;
438
-	.u-input--square{
445
+
446
+	.u-input--square {
439 447
 		border-radius: 20rpx;
440 448
 	}
449
+
441 450
 	.u-input--square:focus-within,
442 451
 	.u-input--square.u-input--focus {
443 452
 		border: 2rpx solid #2563eb !important;
444 453
 		background-color: #fff !important;
445 454
 	}
446 455
 }
447
-.brand_wrap{
448
-	::v-deep .u-form-item__body__right__content{
449
-		border:1px solid #dadbde;
450
-		padding:10rpx;
456
+
457
+.brand_wrap {
458
+	::v-deep .u-form-item__body__right__content {
459
+		border: 1px solid #dadbde;
460
+		padding: 10rpx;
451 461
 		border-radius: 20rpx;
452
-		.inputWrap{
453
-			border:none;
462
+
463
+		.inputWrap {
464
+			border: none;
454 465
 		}
455 466
 	}
456 467
 }
468
+
457 469
 .address_wrap {
458 470
 	border-radius: 20rpx;
459
-	padding:24rpx;
471
+	padding: 24rpx;
460 472
 	display: flex;
461 473
 	flex-direction: column;
462 474
 	background-color: #fff;
463 475
 	box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
464 476
 	margin: 0 10rpx;
477
+
465 478
 	.address_title {
466 479
 		display: flex;
467 480
 		align-items: center;
468 481
 		background-color: #fff;
469 482
 		padding-bottom: 12rpx;
470
-		gap:16rpx;
471
-		font-size:26rpx;
483
+		gap: 16rpx;
484
+		font-size: 26rpx;
472 485
 		color: #6b7280;
473 486
 		font-weight: 600;
474 487
 	}
475
-	::v-deep .u-form-item{
476
-		margin-bottom:0 !important;
477
-		padding:0;
478
-		.u-input--square{
488
+
489
+	::v-deep .u-form-item {
490
+		margin-bottom: 0 !important;
491
+		padding: 0;
492
+
493
+		.u-input--square {
479 494
 			background-color: #f9fafb;
480 495
 		}
481 496
 	}
482
-	::v-deep .u-textarea--radius{
497
+
498
+	::v-deep .u-textarea--radius {
483 499
 		border-radius: 20rpx;
484 500
 	}
501
+
485 502
 	.region-picker {
486 503
 		width: 100%;
487 504
 	}
488
-	::v-deep .u-textarea{
505
+
506
+	::v-deep .u-textarea {
489 507
 		background-color: #f9fafb;
490 508
 	}
491 509
 }
492 510
 
493
-.visit_time_wrap{
494
-	::v-deep .uni-date-x{
511
+.visit_time_wrap {
512
+	::v-deep .uni-date-x {
495 513
 		border-radius: 10px;
496 514
 		padding: 8rpx 10rpx;
497
-		border:1px solid #dadbde;
515
+		border: 1px solid #dadbde;
498 516
 		background-color: #f8f9fa;
499 517
 	}
500 518
 }
501
-.category_wrap{
502
-	.category_select_wrap{
519
+
520
+.category_wrap {
521
+	.category_select_wrap {
503 522
 		border-radius: 20rpx;
504
-		border:1px solid #dadbde;
505
-		padding:6rpx;
506
-		width:100%;
507
-		::v-deep .ldSelectInput{
523
+		border: 1px solid #dadbde;
524
+		padding: 6rpx;
525
+		width: 100%;
526
+
527
+		::v-deep .ldSelectInput {
508 528
 			font-size: 28rpx !important;
509 529
 		}
510 530
 	}
531
+
511 532
 	.category_select_wrap:focus-within,
512 533
 	.category_select_wrap:focus {
513 534
 		border: 2rpx solid #2563eb !important;
514 535
 		background-color: #fff !important;
515 536
 	}
516 537
 }
517
-.remarks_wrap{
518
-	.u-textarea{
538
+
539
+.remarks_wrap {
540
+	.u-textarea {
519 541
 		background-color: #fff;
520 542
 	}
521
-	::v-deep .u-textarea--radius{
543
+
544
+	::v-deep .u-textarea--radius {
522 545
 		border-radius: 20rpx;
523 546
 	}
524 547
 }
@@ -536,9 +559,9 @@ export default {
536 559
 
537 560
 .u-button {
538 561
 	border-radius: 40rpx;
539
-	background-color:#2563eb;
540
-	border:none;
541
-	color:#fff;
562
+	background-color: #2563eb;
563
+	border: none;
564
+	color: #fff;
542 565
 	font-weight: 700;
543 566
 	font-size: 40rpx;
544 567
 	height: 100rpx;
@@ -596,8 +619,7 @@ export default {
596 619
 	opacity: 1;
597 620
 }
598 621
 
599
-.u-textarea{
622
+.u-textarea {
600 623
 	background-color: #f5f5f5;
601 624
 }
602
-
603 625
 </style>

+ 224 - 12
pages/pagereceivecenter/pagereceivecenter.vue

@@ -1,6 +1,7 @@
1 1
 <script>
2 2
 // import orderCard from "./compounts/orderCard.vue";
3 3
 
4
+// status 状态 1 发单(刚发出来) 2 接单(处理中) 3 收单(入库了) 4 未收(没有收到)
4 5
 export default {
5 6
     components: {
6 7
         // orderCard,
@@ -20,12 +21,27 @@ export default {
20 21
             followUpModelShow: false,
21 22
             followUpNotes: '',
22 23
             countdown: 300,
23
-            countdownIntervals: null
24
+            countdownIntervals: null,
25
+
26
+            //筛选条件
27
+            filterList: [
28
+                { name: '全部列表', type: 1 },
29
+                { name: '我的接发单', type: 2 }
30
+            ],
31
+
32
+            statisticsSendStatus: [],//中间统计数据
33
+            activeType: 1,//当前选择的筛选类型,顶部tab的类型
34
+            activeStatus: '',//当前选择的状态,统计数据的类型
35
+
36
+            currentFollowUp: [],//当前订单的跟进记录
37
+            showMoreFollowUp: false
24 38
         }
25 39
     },
26 40
     onLoad() {
27 41
         //初始调用
28 42
         this.getOrderList();
43
+        this.getStatisticsSendStatus();
44
+
29 45
         this.countdownInterval()
30 46
         // uni.navigateTo({
31 47
         //     url: `/pages/orderDetailNew/index?orderId=5464&item=测试发单&type=undefined&clueId=1973381744953516033`,
@@ -43,6 +59,7 @@ export default {
43 59
                             this.handleBtnClick('isBusy', order)
44 60
                         }
45 61
                     })
62
+                    clearInterval(this.countdownInterval);
46 63
                 }
47 64
             },
48 65
             immediate: true
@@ -60,12 +77,16 @@ export default {
60 77
                 const result = await uni.$u.api.selectClueOrderFormList({
61 78
                     pageSize: this.page.pageSize,
62 79
                     pageNum: this.page.pageNum,
80
+                }, {
81
+                    type: this.activeType,
82
+                    status: this.activeStatus,
63 83
                 });
64 84
 
65 85
                 console.log('接单列表', result);
66 86
                 // 把数组按照status的大小排序,从小到大
67 87
                 result.rows.sort((a, b) => {
68 88
                     return a.status - b.status;
89
+                    // return b.status - a.status;
69 90
                 })
70 91
 
71 92
 
@@ -78,9 +99,15 @@ export default {
78 99
                 uni.$u.toast('获取订单列表失败,请稍后重试');
79 100
             }
80 101
         },
102
+        //获取统计数据
103
+        async getStatisticsSendStatus() {
104
+            const { data } = await uni.$u.api.statisticsSendStatus({ type: this.activeType });
105
+            // console.log('统计数据是', data)
81 106
 
107
+            this.statisticsSendStatus = data;
108
+        },
82 109
         // 处理按钮点击事件
83
-        handleBtnClick(btnType, order) {
110
+        async handleBtnClick(btnType, order) {
84 111
 
85 112
             if (btnType == 'acceptOrder') {
86 113
                 //去接单
@@ -120,6 +147,8 @@ export default {
120 147
                 //打开模态窗
121 148
                 this.followUpModelShow = true;
122 149
                 this.currentOrder = order
150
+
151
+
123 152
             } else if (btnType == 'tag') {
124 153
                 //打标签
125 154
                 console.log('打标签', order)
@@ -136,6 +165,9 @@ export default {
136 165
                 console.log('待跟进', order)
137 166
                 this.followUpModelShow = true;
138 167
                 this.currentOrder = order
168
+
169
+
170
+
139 171
             }
140 172
         },
141 173
         // 跳转订单详情
@@ -155,12 +187,13 @@ export default {
155 187
 
156 188
         //滑动加载
157 189
         scrolltolower() {
158
-            console.log('到底了');
159
-            // if (this.orderList.length >= this.page.total) {
160
-            //     return uni.$u.toast('没有更多了');
161
-            // }
162
-            this.page.pageNum++;
163
-            this.getOrderList();
190
+            // console.log('到底了');
191
+            if (this.orderList.length >= this.page.total) {
192
+                //到底了,没有更多
193
+            } else {
194
+                this.page.pageNum++;
195
+                this.getOrderList();
196
+            }
164 197
         },
165 198
 
166 199
         //获取全部标签
@@ -202,6 +235,60 @@ export default {
202 235
             }
203 236
             this.followUpNotes = '';
204 237
         },
238
+
239
+        // 切换筛选条件
240
+        async changeFilter(param) {
241
+            this.activeType = param.type;
242
+
243
+            this.page.pageNum = 1;
244
+            this.orderList = [];
245
+
246
+            this.getOrderList();
247
+            this.getStatisticsSendStatus()
248
+        },
249
+        //切换统计数据的类型
250
+        changeStatus(param) {
251
+            if (param == this.activeStatus) {
252
+                //如果当前点击的状态和当前选中的状态相同,则取消选中
253
+                this.activeStatus = '';
254
+                this.page.pageNum = 1;
255
+                this.orderList = [];
256
+                this.getOrderList();
257
+            } else {
258
+                //如果当前点击的状态和当前选中的状态不同,则切换选中状态
259
+                this.activeStatus = param;
260
+                this.page.pageNum = 1;
261
+                this.orderList = [];
262
+                this.getOrderList();
263
+            }
264
+        },
265
+        //点击查看更多的跟进
266
+        async handleShowMoreFollowUp() {
267
+            //当前的order是
268
+            console.log()
269
+            const { data } = await uni.$u.api.getDuplicateOrderFollowListByClueId({
270
+                clueId: this.currentOrder.clueId
271
+            });
272
+            console.log('这里是跟进', data)
273
+
274
+            const allData = []
275
+
276
+            for (const key in data) {
277
+                allData.push(...data[key])
278
+            }
279
+            const filterData = allData.filter(item => {
280
+                console.log('过滤', item)
281
+                //过滤出来tem.content不包括联系师傅、师傅拍图技巧、到达客户面对面、未收评分、待跟进_
282
+                return item.content.indexOf('联系师傅') == -1 && item.content.indexOf('师傅拍图技巧') == -1 && item.content.indexOf('到达客户面对面') == -1 && item.content.indexOf('未收评分') == -1 && item.content.indexOf('待跟进_') == -1
283
+            })
284
+
285
+            console.log('筛选后的跟进', filterData)
286
+
287
+            this.currentFollowUp = filterData || [];
288
+            this.showMoreFollowUp = true
289
+
290
+
291
+        }
205 292
     }
206 293
 }
207 294
 </script>
@@ -210,6 +297,21 @@ export default {
210 297
     <view class="container">
211 298
         <u-navbar title="接单中心" :autoBack="true" :placeholder="true" v-hideNav></u-navbar>
212 299
 
300
+        <!-- 筛选条件 -->
301
+        <u-tabs :list="filterList" @click="changeFilter"></u-tabs>
302
+
303
+        <!-- 统计数据 -->
304
+        <scroll-view scroll-x class="statusScrollView" style="width: 100%;">
305
+            <view class="statisticsContainer">
306
+                <view v-for="item in statisticsSendStatus" :key="item.status" @click="changeStatus(item.status)"
307
+                    class="statisticsItem" :class="{ 'activeStatusClass': item.status == activeStatus }">
308
+                    <view>{{ item.statusName }}</view>
309
+                    <view>({{ item.count || 0 }})</view>
310
+                </view>
311
+            </view>
312
+        </scroll-view>
313
+
314
+
213 315
         <view class="scrollViewContainer">
214 316
             <scroll-view class="scrollView" scroll-y @scrolltolower="scrolltolower">
215 317
                 <transition-group name="order-move" tag="div">
@@ -265,11 +367,18 @@ export default {
265 367
                         </view>
266 368
 
267 369
                         <view class="Btns">
370
+                            <!-- status 状态 1 发单(刚发出来) 2 接单(处理中) 3 收单(入库了) 4 未收(没有收到) -->
268 371
 
269 372
                             <view class="btnGroup" v-if="item && (item.status == '1')">
270 373
                                 <view class="card-button" @click.stop="handleBtnClick('acceptOrder', item)">立即接单</view>
271 374
                                 <view class=" card-button isBusy" @click.stop="handleBtnClick('isBusy', item)">
272
-                                    在忙({{ countdown }}s)</view>
375
+                                    <view>
376
+                                        在忙
377
+                                    </view>
378
+                                    <view v-if="countdown > 0">
379
+                                        ({{ countdown }} s)
380
+                                    </view>
381
+                                </view>
273 382
                             </view>
274 383
 
275 384
                             <view class="btnGroup" v-if="item && (item.status == '2')">
@@ -292,7 +401,7 @@ export default {
292 401
                     </view>
293 402
                 </transition-group>
294 403
                 <view class="hasMore">
295
-                    <!-- {{ orderList.length >= page.total ? '没有更多了~' : '向下滑动加载更多~' }} -->
404
+                    {{ orderList.length >= page.total ? '没有更多了~' : '向下滑动加载更多~' }}
296 405
                 </view>
297 406
             </scroll-view>
298 407
         </view>
@@ -313,11 +422,31 @@ export default {
313 422
 
314 423
         <u-modal showCancelButton :show="followUpModelShow" :title="'填写跟进细节'" @confirm="confirmFollowUp"
315 424
             @cancel="followUpModelShow = false">
425
+
316 426
             <view class="modal-content">
317 427
                 <u--textarea v-model="followUpNotes" placeholder="请输入情况" confirm-type="done"
318
-                    style="width: 400rpx; margin-bottom: 30rpx;"></u--textarea>
428
+                    style="width: 400rpx;margin-bottom: 10rpx; "></u--textarea>
429
+                <u-button type="primary" @click="handleShowMoreFollowUp">点击查看更多跟进</u-button>
430
+
319 431
             </view>
320 432
         </u-modal>
433
+
434
+        <!-- 更多跟进 -->
435
+        <u-modal :show="showMoreFollowUp" title="详细跟进记录" @confirm="showMoreFollowUp = false">
436
+            <!-- <view class="followUpBox"> -->
437
+            <scroll-view class="followUpBox" scroll-y>
438
+                <view v-for="value in currentFollowUp" :key="value.id" class="followUpItem">
439
+                    <view class="followUpInfo">
440
+                        <view class="followUpNickname">
441
+                            账号:{{ value.createNickname }}
442
+                        </view>
443
+                        <view class="followUpOrgName">{{ value.orgName }}</view>
444
+                    </view>
445
+                    <view class="followUpContent">{{ value.content }}</view>
446
+                </view>
447
+            </scroll-view>
448
+            <!-- </view> -->
449
+        </u-modal>
321 450
     </view>
322 451
 </template>
323 452
 
@@ -330,7 +459,11 @@ export default {
330 459
 }
331 460
 
332 461
 .scrollViewContainer {
333
-    height: calc(100vh - 44px);
462
+    height: calc(100vh - 44px - 44px - 27px - 10rpx);
463
+}
464
+
465
+.followUpScroll {
466
+    height: 600rpx;
334 467
 }
335 468
 
336 469
 .scrollView {
@@ -491,6 +624,8 @@ export default {
491 624
     background-color: #fff;
492 625
     color: #6B7280;
493 626
     border-color: #6B7280;
627
+    display: flex;
628
+    justify-content: center;
494 629
 }
495 630
 
496 631
 /* 待跟进状态按钮 */
@@ -520,4 +655,81 @@ export default {
520 655
     display: grid;
521 656
     grid-template-columns: repeat(2, 1fr);
522 657
 }
658
+
659
+
660
+
661
+
662
+
663
+
664
+.statisticsContainer {
665
+    display: flex;
666
+    align-items: center;
667
+    flex-wrap: nowrap;
668
+    white-space: nowrap;
669
+    padding: 0 0rpx;
670
+}
671
+
672
+.statisticsItem {
673
+    display: flex;
674
+    justify-content: center;
675
+    align-items: center;
676
+    background-color: #fff;
677
+    padding: 10rpx 20rpx;
678
+    border-radius: 15rpx;
679
+    font-size: 24rpx;
680
+    font-weight: 700;
681
+    margin: 0 10rpx;
682
+    white-space: nowrap;
683
+    flex-shrink: 0;
684
+}
685
+
686
+.activeStatusClass {
687
+    background-color: #2563EB;
688
+    color: #fff;
689
+
690
+}
691
+
692
+::v-deep .u-tabs__wrapper__nav__line {
693
+    top: 7px;
694
+}
695
+
696
+
697
+
698
+.followUpItem {
699
+    background-color: #F7FBFE;
700
+    width: 540rpx;
701
+    margin: 20rpx;
702
+    padding: 20rpx;
703
+    box-sizing: border-box;
704
+
705
+    .followUpInfo {
706
+        display: flex;
707
+        justify-content: space-between;
708
+        align-items: center;
709
+        gap: 10rpx;
710
+        margin-bottom: 10rpx;
711
+    }
712
+
713
+    .followUpNickname {
714
+        font-size: 24rpx;
715
+        font-weight: 700;
716
+        color: #2563EB;
717
+    }
718
+
719
+    .followUpOrgName {
720
+        font-size: 24rpx;
721
+        font-weight: 700;
722
+        color: #6B7280;
723
+    }
724
+
725
+    .followUpContent {
726
+        font-size: 24rpx;
727
+        font-weight: 700;
728
+        color: #374751;
729
+    }
730
+}
731
+
732
+.followUpBox {
733
+    height: 600rpx;
734
+}
523 735
 </style>