Bläddra i källkod

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

Yannay 2 månader sedan
förälder
incheckning
7d1f25beb7

+ 148 - 30
pages/orderDetailNew/components/pageOne.vue

@@ -6,7 +6,7 @@
6 6
             </u-col>
7 7
             <u-col span="3.5">
8 8
                 <u-button size="small" @click="copyAllImages"
9
-                    style="border-radius: 20rpx;border-color: #007AFF;color: #007AFF;">复制全部图片</u-button>
9
+                    style="border-radius: 20rpx;border-color: #007AFF;color: #007AFF;">保存全部图片</u-button>
10 10
             </u-col>
11 11
         </u-row>
12 12
 
@@ -149,26 +149,19 @@ export default {
149 149
             console.log('电话卡片被点击', '电话号码:', this.orderDetail.phone)
150 150
             if (this.orderDetail.phone) {
151 151
                 //拨打电话
152
-                // uni.makePhoneCall({
153
-                //     phoneNumber: this.orderDetail.phone,
154
-                //     success: () => {
155
-                //         this.$store.commit("call/SET_FORM", {
156
-                //             clueId: this.orderDetail.clueId,
157
-                //             type: "3",
158
-                //             callee: this.orderDetail.phone,
159
-                //         });
160
-                //     },
161
-                // });
152
+                uni.makePhoneCall({
153
+                    phoneNumber: this.orderDetail.phone
154
+                });
162 155
                 //先暂时复制电话号码
163
-                uni.setClipboardData({
164
-                    data: this.orderDetail.phone,
165
-                    success: () => {
166
-                        uni.showToast({
167
-                            title: '电话号码已复制',
168
-                            icon: 'none'
169
-                        })
170
-                    }
171
-                })
156
+                // uni.setClipboardData({
157
+                //     data: this.orderDetail.phone,
158
+                //     success: () => {
159
+                //         uni.showToast({
160
+                //             title: '电话号码已复制',
161
+                //             icon: 'none'
162
+                //         })
163
+                //     }
164
+                // })
172 165
             } else {
173 166
                 uni.showToast({
174 167
                     title: '该订单暂时没有电话号码',
@@ -226,17 +219,21 @@ export default {
226 219
             const allImages = [...this.trueUploadList, ...this.chatRecordsUploadList];
227 220
             //取出所有图的url
228 221
             const allUrls = allImages.map(item => item.fileUrl);
229
-            console.log('所有图片:', allUrls)
230
-            console.log('合并后的图片列表:', allUrls)
231 222
             if (allUrls.length > 0) {
232
-                // 复制到剪贴板
233
-                uni.setClipboardData({
234
-                    data: JSON.stringify(allUrls),
235
-                    success: () => {
236
-                        uni.showToast({
237
-                            title: '所有图片已复制',
238
-                            icon: 'none'
239
-                        })
223
+                // 显示保存图片确认弹窗
224
+                uni.showModal({
225
+                    title: '保存图片',
226
+                    content: `是否将 ${allUrls.length} 张图片保存到本地相册?`,
227
+                    confirmText: '保存',
228
+                    // cancelText: '仅复制链接',
229
+                    success: (res) => {
230
+                        if (res.confirm) {
231
+                            // 用户选择保存图片
232
+                            this.saveImagesToLocal(allUrls);
233
+                        } else if (res.cancel) {
234
+                            // 用户选择仅复制链接
235
+                            this.copyImageUrls(allUrls);
236
+                        }
240 237
                     }
241 238
                 })
242 239
             } else {
@@ -247,6 +244,127 @@ export default {
247 244
             }
248 245
         },
249 246
 
247
+        // 保存图片到本地相册
248
+        async saveImagesToLocal(imageUrls) {
249
+            try {
250
+                uni.showLoading({
251
+                    title: '正在保存图片...',
252
+                    mask: true
253
+                });
254
+
255
+                const savedImages = [];
256
+                const failedImages = [];
257
+
258
+                // 逐个保存图片
259
+                for (let i = 0; i < imageUrls.length; i++) {
260
+                    const url = imageUrls[i];
261
+                    try {
262
+                        await this.saveSingleImage(url);
263
+                        savedImages.push(url);
264
+                    } catch (error) {
265
+                        console.error(`保存图片失败: ${url}`, error);
266
+                        failedImages.push(url);
267
+                    }
268
+                    
269
+                    // 更新进度
270
+                    uni.showLoading({
271
+                        title: `正在保存图片... (${i + 1}/${imageUrls.length})`,
272
+                        mask: true
273
+                    });
274
+                }
275
+
276
+                uni.hideLoading();
277
+
278
+                // 显示结果
279
+                let message = `成功保存 ${savedImages.length} 张图片`;
280
+                if (failedImages.length > 0) {
281
+                    message += `,${failedImages.length} 张保存失败`;
282
+                }
283
+
284
+                uni.showToast({
285
+                    title: message,
286
+                    icon: 'none',
287
+                    duration: 3000
288
+                });
289
+
290
+                // 如果有失败的图片,也复制链接作为备选
291
+                if (failedImages.length > 0) {
292
+                    const allUrls = [...savedImages, ...failedImages];
293
+                    this.copyImageUrls(allUrls);
294
+                }
295
+
296
+            } catch (error) {
297
+                uni.hideLoading();
298
+                console.error('保存图片过程中发生错误:', error);
299
+                uni.showToast({
300
+                    title: '保存图片失败',
301
+                    icon: 'error'
302
+                });
303
+            }
304
+        },
305
+
306
+        // 保存单张图片
307
+        saveSingleImage(url) {
308
+            return new Promise((resolve, reject) => {
309
+                // 先下载图片
310
+                uni.downloadFile({
311
+                    url: url,
312
+                    success: (res) => {
313
+                        if (res.statusCode === 200) {
314
+                            // 保存到相册
315
+                            uni.saveImageToPhotosAlbum({
316
+                                filePath: res.tempFilePath,
317
+                                success: () => {
318
+                                    console.log('图片保存成功:', url);
319
+                                    resolve();
320
+                                },
321
+                                fail: (err) => {
322
+                                    console.error('保存到相册失败:', err);
323
+                                    // 如果是权限问题,尝试请求权限
324
+                                    if (err.errMsg.includes('auth denied')) {
325
+                                        uni.showModal({
326
+                                            title: '权限不足',
327
+                                            content: '需要访问相册权限来保存图片,是否去设置?',
328
+                                            success: (modalRes) => {
329
+                                                if (modalRes.confirm) {
330
+                                                    // 打开设置页面
331
+                                                    uni.openSetting({
332
+                                                        success: (settingRes) => {
333
+                                                            console.log('设置页面结果:', settingRes);
334
+                                                        }
335
+                                                    });
336
+                                                }
337
+                                            }
338
+                                        });
339
+                                    }
340
+                                    reject(err);
341
+                                }
342
+                            });
343
+                        } else {
344
+                            reject(new Error('下载失败'));
345
+                        }
346
+                    },
347
+                    fail: (err) => {
348
+                        console.error('下载图片失败:', err);
349
+                        reject(err);
350
+                    }
351
+                });
352
+            });
353
+        },
354
+
355
+        // 复制图片链接
356
+        copyImageUrls(urls) {
357
+            uni.setClipboardData({
358
+                data: JSON.stringify(urls),
359
+                success: () => {
360
+                    uni.showToast({
361
+                        title: '图片链接已复制',
362
+                        icon: 'none'
363
+                    })
364
+                }
365
+            })
366
+        },
367
+
250 368
     },
251 369
 
252 370
 }

+ 4 - 3
pages/orderDetailNew/components/pageThree.vue

@@ -38,10 +38,10 @@
38 38
                 <view class="detail-image-content">
39 39
                     <view class="detail-image-list">
40 40
                         <!-- 占位符元素 -->
41
-                        <view v-show="placeholderIndex !== -1" class="detail-image-placeholder"
41
+                        <!-- <view v-show="placeholderIndex !== -1" class="detail-image-placeholder"
42 42
                             :style="{ transform: placeholderStyle }">
43 43
                             <u-icon name="arrow-right" size="40rpx" color="#108cff"></u-icon>
44
-                        </view>
44
+                        </view> -->
45 45
 
46 46
                         <!-- 图片列表 -->
47 47
                         <view class="detail-image-item" v-for="(item, index) in detailImages.slice(0, 6)"
@@ -501,6 +501,7 @@ export default {
501 501
         display: flex;
502 502
         flex-wrap: wrap;
503 503
         gap: 20rpx;
504
+        position: relative;
504 505
     }
505 506
 
506 507
     .detail-image-item {
@@ -534,7 +535,7 @@ export default {
534 535
         position: absolute;
535 536
         width: 200rpx;
536 537
         height: 200rpx;
537
-        border: 2rpx dashed #108cff;
538
+        border: 2rpx dashed red;
538 539
         background-color: rgba(16, 140, 255, 0.1);
539 540
         border-radius: 8rpx;
540 541
         display: flex;

+ 128 - 0
pages/orderDetailNew/components/pageTwo.vue

@@ -231,7 +231,135 @@ export default {
231 231
 
232 232
         // 复制所有高清细节图链接
233 233
         copyAllDetailImages() {
234
+            // 合并所有图片
235
+            const allImages = [...this.detailImages];
236
+            //取出所有图的url
237
+            const allUrls = allImages.map(item => item.fileUrl);
238
+            if (allUrls.length > 0) {
239
+                // 显示保存图片确认弹窗
240
+                uni.showModal({
241
+                    title: '保存图片',
242
+                    content: `是否将 ${allUrls.length} 张图片保存到本地相册?`,
243
+                    confirmText: '保存',
244
+                    success: (res) => {
245
+                        if (res.confirm) {
246
+                            // 用户选择保存图片
247
+                            this.saveImagesToLocal(allUrls);
248
+                        }
249
+                    }
250
+                })
251
+            } else {
252
+                uni.showToast({
253
+                    title: '没有图片可复制',
254
+                    icon: 'none'
255
+                })
256
+            }
257
+        },
258
+        // 保存图片到本地相册
259
+        async saveImagesToLocal(imageUrls) {
260
+            try {
261
+                uni.showLoading({
262
+                    title: '正在保存图片...',
263
+                    mask: true
264
+                });
265
+
266
+                const savedImages = [];
267
+                const failedImages = [];
268
+
269
+                // 逐个保存图片
270
+                for (let i = 0; i < imageUrls.length; i++) {
271
+                    const url = imageUrls[i];
272
+                    try {
273
+                        await this.saveSingleImage(url);
274
+                        savedImages.push(url);
275
+                    } catch (error) {
276
+                        console.error(`保存图片失败: ${url}`, error);
277
+                        failedImages.push(url);
278
+                    }
279
+                    
280
+                    // 更新进度
281
+                    uni.showLoading({
282
+                        title: `正在保存图片... (${i + 1}/${imageUrls.length})`,
283
+                        mask: true
284
+                    });
285
+                }
286
+
287
+                uni.hideLoading();
234 288
 
289
+                // 显示结果
290
+                let message = `成功保存 ${savedImages.length} 张图片`;
291
+                if (failedImages.length > 0) {
292
+                    message += `,${failedImages.length} 张保存失败`;
293
+                }
294
+
295
+                uni.showToast({
296
+                    title: message,
297
+                    icon: 'none',
298
+                    duration: 3000
299
+                });
300
+
301
+                // 如果有失败的图片,也复制链接作为备选
302
+                if (failedImages.length > 0) {
303
+                    const allUrls = [...savedImages, ...failedImages];
304
+                    this.copyImageUrls(allUrls);
305
+                }
306
+
307
+            } catch (error) {
308
+                uni.hideLoading();
309
+                console.error('保存图片过程中发生错误:', error);
310
+                uni.showToast({
311
+                    title: '保存图片失败',
312
+                    icon: 'error'
313
+                });
314
+            }
315
+        },
316
+        // 保存单张图片
317
+        saveSingleImage(url) {
318
+            return new Promise((resolve, reject) => {
319
+                // 先下载图片
320
+                uni.downloadFile({
321
+                    url: url,
322
+                    success: (res) => {
323
+                        if (res.statusCode === 200) {
324
+                            // 保存到相册
325
+                            uni.saveImageToPhotosAlbum({
326
+                                filePath: res.tempFilePath,
327
+                                success: () => {
328
+                                    console.log('图片保存成功:', url);
329
+                                    resolve();
330
+                                },
331
+                                fail: (err) => {
332
+                                    console.error('保存到相册失败:', err);
333
+                                    // 如果是权限问题,尝试请求权限
334
+                                    if (err.errMsg.includes('auth denied')) {
335
+                                        uni.showModal({
336
+                                            title: '权限不足',
337
+                                            content: '需要访问相册权限来保存图片,是否去设置?',
338
+                                            success: (modalRes) => {
339
+                                                if (modalRes.confirm) {
340
+                                                    // 打开设置页面
341
+                                                    uni.openSetting({
342
+                                                        success: (settingRes) => {
343
+                                                            console.log('设置页面结果:', settingRes);
344
+                                                        }
345
+                                                    });
346
+                                                }
347
+                                            }
348
+                                        });
349
+                                    }
350
+                                    reject(err);
351
+                                }
352
+                            });
353
+                        } else {
354
+                            reject(new Error('下载失败'));
355
+                        }
356
+                    },
357
+                    fail: (err) => {
358
+                        console.error('下载图片失败:', err);
359
+                        reject(err);
360
+                    }
361
+                });
362
+            });
235 363
         },
236 364
 
237 365
         // 下一步按钮点击事件

+ 30 - 5
pages/pagereceivecenter/pagereceivecenter.vue

@@ -19,16 +19,41 @@ export default {
19 19
             currentOrder: {},
20 20
             followUpModelShow: false,
21 21
             followUpNotes: '',
22
+            countdown: 3000,
23
+            countdownIntervals: null
22 24
         }
23 25
     },
24 26
     onLoad() {
25 27
         //初始调用
26 28
         this.getOrderList();
29
+        this.countdownInterval()
27 30
         // uni.navigateTo({
28 31
         //     url: `/pages/orderDetailNew/index?orderId=5464&item=测试发单&type=undefined&clueId=1973381744953516033`,
29 32
         // })
30 33
     },
34
+    onUnload() {
35
+        clearInterval(this.countdownInterval);
36
+    },
37
+    watch: {
38
+        countdown: {
39
+            handler(newVal, oldVal) {
40
+                if (newVal <= 0) {
41
+                    this.orderList.forEach(order => {
42
+                        if(order.status == 1){
43
+                            this.handleBtnClick('isBusy',order)
44
+                        }
45
+                    })
46
+                }
47
+            },
48
+            immediate: true
49
+        }
50
+    },
31 51
     methods: {
52
+        countdownInterval(){
53
+            this.countdownInterval = setInterval(() => {
54
+                this.countdown--
55
+            }, 1000);
56
+        },
32 57
         //获取列表数据
33 58
         async getOrderList() {
34 59
             try {
@@ -222,13 +247,13 @@ export default {
222 247
                         <view class="Btns">
223 248
 
224 249
                             <view class="btnGroup"
225
-                                v-if="item && (item.status == '1' || item.status == null || item.status === undefined)">
250
+                                v-if="item && (item.status == '1')">
226 251
                                 <view class="card-button" @click.stop="handleBtnClick('acceptOrder', item)">立即接单</view>
227
-                                <view class=" card-button isBusy" @click.stop="handleBtnClick('isBusy', item)">在忙</view>
252
+                                <view class=" card-button isBusy" @click.stop="handleBtnClick('isBusy', item)">在忙({{countdown}}s)</view>
228 253
                             </view>
229 254
 
230 255
                             <view class="btnGroup"
231
-                                v-if="item && (item.status == '2' || item.status == null || item.status === undefined)">
256
+                                v-if="item && (item.status == '2')">
232 257
                                 <view class="card-button willFollow" @click.stop="handleBtnClick('willFollow', item)">
233 258
                                     待跟进
234 259
                                 </view>
@@ -236,12 +261,12 @@ export default {
236 261
                             </view>
237 262
 
238 263
                             <view class="btnGroup"
239
-                                v-if="item && (item.status == '3' || item.status == null || item.status === undefined)">
264
+                                v-if="item && (item.status == '3')">
240 265
                                 <view class="card-button share" @click.stop="handleBtnClick('share', item)">一键分享</view>
241 266
                             </view>
242 267
 
243 268
                             <view class="btnGroup"
244
-                                v-if="item && (item.status == '4' || item.status == null || item.status === undefined)">
269
+                                v-if="item && (item.status == '4')">
245 270
                                 <view class="card-button oneFollow" @click.stop="handleBtnClick('oneFollow', item)">待跟进
246 271
                                 </view>
247 272
                             </view>