| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453 |
- import { getOrderInfo, getOrderLogs, uploadFile, clockIn } from '@/api/fulfiller'
- import { getServiceList } from '@/api/service'
- export default {
- data() {
- return {
- orderId: null,
- orderType: 1,
- orderStatus: 2,
- stepsPickup: ['到达打卡', '确认出发', '送达打卡'],
- stepsWalkWash: ['到达打卡', '开始服务', '服务结束'],
- currentStep: 1,
- orderDetail: {
- type: 1,
- price: '0.00',
- timeLabel: '服务时间',
- time: '',
- petAvatar: '/static/dog.png',
- petName: '',
- petBreed: '',
- serviceTag: '',
- startLocation: '',
- startAddress: '',
- endLocation: '',
- endAddress: '',
- serviceContent: '',
- remark: '',
- orderNo: '',
- createTime: '',
- progressLogs: []
- },
- serviceList: [],
- showPetModal: false,
- currentPetInfo: {},
- showNavModal: false,
- navTargetPointType: '',
- showUploadModal: false,
- modalMediaList: [],
- modalRemark: '',
- showSumModal: false,
- sumContent: '',
- sumDate: '',
- sumSigner: '张*哥',
- showPetRemarkInput: false,
- petRemarkText: ''
- }
- },
- computed: {
- steps() {
- return this.orderType === 1 ? this.stepsPickup : this.stepsWalkWash;
- },
- displayStatusText() {
- if (this.currentStep === 4) return '待商家确认';
- if (this.currentStep >= this.steps.length) return '已完成';
- let status = this.steps[this.currentStep];
- if (status === '已完成' || status === '完成') return '已完成';
- if (status === '已拒绝') return '已拒绝';
- if (status === '接单') {
- return this.orderType === 1 ? '待接送' : '待服务';
- }
- // 对于其他活跃状态 (出发, 到达, 送达, 开始, 结束)
- return this.orderType === 1 ? '配送中' : '服务中';
- },
- currentStatusText() {
- if (this.currentStep === 4) return '待确认';
- return this.currentStep >= this.steps.length ? '已完成' : this.steps[this.currentStep];
- },
- currentTaskTitle() {
- if (this.currentStep === 4) return '待商家确认';
- if (this.currentStep >= this.steps.length) return '订单已完成';
- let action = this.steps[this.currentStep];
- if (action === '到达打卡') return '到达打卡';
- if (action === '开始服务') return '开始服务';
- if (action === '确认出发') return '确认出发';
- if (action === '送达打卡' || action === '服务结束') return '服务完成';
- return action;
- },
- currentTaskDesc() {
- if (this.currentStep === 4) return '服务已提交,请等待商家确认完成后即可结束订单';
- if (this.currentStep >= this.steps.length) return '感谢您的服务,请注意休息';
- let action = this.steps[this.currentStep];
- if (action === '到达打卡') {
- return '打卡穿着工装消毒站门口的照片或视频';
- }
- if (this.orderType === 1) {
- if (action === '确认出发') return '拍摄宠物上车/出发时的状态照片或视频';
- if (action === '送达打卡') return '打卡确认送达的照片或视频';
- } else {
- if (action === '开始服务') return '开始服务并拍摄照片 or 视频';
- if (action === '服务结束') return '服务完成拍摄照片或视频';
- }
- return '请按要求提交照片或视频及备注';
- }
- },
- async onLoad(options) {
- if (options.id) {
- this.orderId = options.id
- }
- await this.loadServiceList()
- await this.loadOrderDetail()
- },
- methods: {
- async loadServiceList() {
- try {
- const res = await getServiceList()
- this.serviceList = res.data || []
- } catch (err) {
- console.error('获取服务类型失败:', err)
- }
- },
- async loadOrderDetail() {
- if (!this.orderId) {
- console.log('订单ID缺失')
- uni.showToast({ title: '订单ID缺失', icon: 'none' })
- return
- }
- try {
- console.log('请求订单详情,ID:', this.orderId)
- const res = await getOrderInfo(this.orderId)
- console.log('订单详情响应:', res)
- const order = res.data
- if (!order) {
- console.log('订单数据为空')
- uni.showToast({ title: '订单不存在', icon: 'none' })
- return
- }
- console.log('订单数据:', order)
- this.transformOrderData(order)
- await this.loadOrderLogs()
- } catch (err) {
- console.error('获取订单详情失败:', err)
- uni.showToast({ title: '加载失败', icon: 'none' })
- }
- },
- async loadOrderLogs() {
- try {
- const res = await getOrderLogs(this.orderId)
- const logs = res.data || []
- console.log('订单日志:', logs)
- if (logs.length > 0) {
- console.log('第一条日志详情:', JSON.stringify(logs[0]))
- }
- const progressLogs = logs.filter(log => log.logType === 1)
- this.orderDetail.progressLogs = progressLogs.map(log => ({
- status: log.title || '',
- time: log.createTime || '',
- medias: log.photoUrls || [],
- remark: log.content || ''
- }))
- // 根据打卡日志的 actionType 确定下一步骤。规则:最新的打卡记录是什么,下一步就往后延。
- // 仅筛选打卡类型的日志(logType: 1),并按时间倒序排列,取最新的一条作为当前进度的基准
- const validLogs = logs.filter(log => log.logType === 1 && log.actionType !== undefined)
- .sort((a, b) => new Date(b.createTime).getTime() - new Date(a.createTime).getTime())
- if (validLogs.length > 0) {
- const latestLog = validLogs[0]
- const actionType = latestLog.actionType
- // 如果日志显示待商家确认,则为无需打卡
- if (latestLog.actionType >= 7) {
- this.currentStep = 4 // 无需打卡状态
- } else if (actionType === 7) {
- this.currentStep = 3 // 已完成
- } else if (actionType === 6) {
- this.currentStep = 2 // 当前应进行:送达打卡/服务结束
- } else if (actionType === 4) {
- this.currentStep = 1 // 当前应进行:确认出发/开始服务
- } else if (actionType === 2 || actionType === 3) {
- this.currentStep = 0 // 已接单,当前应进行:到达打卡
- } else {
- this.currentStep = 0
- }
- } else {
- this.currentStep = 0
- }
- console.log('根据最新日志推算的当前步骤:', this.currentStep)
- } catch (err) {
- console.error('获取订单日志失败:', err)
- }
- },
- transformOrderData(order) {
- const mode = order.mode || 0
- const isRoundTrip = mode === 1
- this.orderType = isRoundTrip ? 1 : 2
- this.orderStatus = order.status || 2
- this.orderDetail = {
- type: this.orderType,
- price: (order.price / 100).toFixed(2),
- timeLabel: isRoundTrip ? '取货时间' : '服务时间',
- time: order.serviceTime || '',
- petAvatar: '/static/dog.png',
- petName: order.petName || order.contact || '',
- petBreed: order.breed || '',
- serviceTag: order.groupPurchasePackageName || '',
- startLocation: order.fromAddress || '',
- startAddress: order.fromAddress || '',
- endLocation: (order.contact || '') + ' ' + (order.contactPhoneNumber || ''),
- endAddress: order.toAddress || '',
- serviceContent: '',
- remark: '',
- orderNo: order.code || 'T' + order.id,
- createTime: order.serviceTime || '',
- progressLogs: [
- { status: '您已接单', time: order.serviceTime || '' }
- ]
- }
- },
- updateStepByStatus() {
- if (this.orderStatus === 2) {
- this.currentStep = 0
- } else if (this.orderStatus === 3) {
- this.currentStep = 1
- } else if (this.orderStatus === 5) {
- this.currentStep = this.steps.length - 1
- } else {
- this.currentStep = 0
- }
- },
- showPetProfile() {
- // Use orderDetail basic info and mock the rest
- this.currentPetInfo = {
- ...this.orderDetail,
- petGender: 'M',
- petAge: '2岁',
- petWeight: '15kg',
- petPersonality: '活泼亲人,精力旺盛',
- petHobby: '喜欢追飞盘,爱吃肉干',
- petRemark: '肠胃较弱,不能乱喂零食;出门易爆冲,请拉紧牵引绳。',
- petTags: ['拉响警报', '不能吃鸡肉', '精力旺盛'],
- petLogs: [
- { date: '2026-02-09 14:00', content: '今天遛弯拉了两次粑粑,精神状态很好。', recorder: '王阿姨' },
- { date: '2026-02-08 10:30', content: '有些挑食,剩了小半碗狗粮。', recorder: '李师傅' },
- { date: '2026-02-05 09:00', content: '建档。', recorder: '系统记录' }
- ]
- };
- this.showPetModal = true;
- },
- closePetProfile() {
- this.showPetModal = false;
- },
- openPetRemarkInput() {
- this.petRemarkText = '';
- this.showPetRemarkInput = true;
- },
- closePetRemarkInput() {
- this.showPetRemarkInput = false;
- },
- submitPetRemark() {
- if (!this.petRemarkText.trim()) {
- uni.showToast({ title: '备注内容不能为空', icon: 'none' });
- return;
- }
- const now = new Date();
- const date = `${now.getFullYear()}/${String(now.getMonth() + 1).padStart(2, '0')}/${String(now.getDate()).padStart(2, '0')}`;
- if (!this.currentPetInfo.petLogs) {
- this.currentPetInfo.petLogs = [];
- }
- this.currentPetInfo.petLogs.unshift({
- date: date,
- content: this.petRemarkText,
- recorder: '张*哥'
- });
- this.closePetRemarkInput();
- uni.showToast({ title: '备注已添加', icon: 'success' });
- },
- goToAnomaly() {
- uni.navigateTo({
- url: '/pages/orders/anomaly?orderId=' + (this.orderDetail.orderNo || '')
- });
- },
- callPhone() {
- uni.makePhoneCall({ phoneNumber: '18900008451' });
- },
- openNavigation(type) {
- this.navTargetPointType = type;
- this.showNavModal = true;
- },
- closeNavModal() {
- this.showNavModal = false;
- },
- chooseMap(mapType) {
- let pointType = this.navTargetPointType;
- let name = pointType === 'start' ? this.orderDetail.startLocation : this.orderDetail.endLocation;
- let address = pointType === 'start' ? this.orderDetail.startAddress : this.orderDetail.endAddress;
- this.showNavModal = false;
- uni.openLocation({
- latitude: 30.52, // Mock lat
- longitude: 114.31, // Mock lng
- name: name || '目的地',
- address: address || '默认地址',
- success: function () {
- console.log('打开导航成功: ' + mapType);
- }
- });
- },
- openUploadModal() {
- this.modalMediaList = [];
- this.modalRemark = '';
- this.showUploadModal = true;
- },
- closeUploadModal() {
- this.showUploadModal = false;
- },
- handleConfirmUpload() {
- console.log('handleConfirmUpload被调用');
- this.confirmUploadModal();
- },
- async chooseModalMedia() {
- console.log('chooseModalMedia被调用');
- uni.chooseImage({
- count: 5 - this.modalMediaList.length,
- success: async (res) => {
- console.log('选择图片成功,文件路径:', res.tempFilePaths);
- uni.showLoading({ title: '上传中...' });
- try {
- for (const filePath of res.tempFilePaths) {
- console.log('上传文件:', filePath);
- const uploadRes = await uploadFile(filePath);
- console.log('上传响应:', uploadRes);
- if (uploadRes.code === 200) {
- this.modalMediaList.push({
- url: uploadRes.data.url,
- ossId: uploadRes.data.ossId,
- localPath: filePath
- });
- console.log('上传成功,url:', uploadRes.data.url);
- }
- }
- uni.hideLoading();
- console.log('当前modalMediaList:', this.modalMediaList);
- uni.showToast({ title: '上传成功', icon: 'success' });
- } catch (err) {
- uni.hideLoading();
- console.error('上传失败:', err);
- uni.showToast({ title: '上传失败', icon: 'none' });
- }
- },
- fail: (err) => {
- console.error('选择图片失败:', err);
- }
- });
- },
- removeModalMedia(index) {
- this.modalMediaList.splice(index, 1);
- },
- getCurrentTime() {
- const now = new Date();
- const y = now.getFullYear();
- const m = String(now.getMonth() + 1).padStart(2, '0');
- const d = String(now.getDate()).padStart(2, '0');
- const h = String(now.getHours()).padStart(2, '0');
- const min = String(now.getMinutes()).padStart(2, '0');
- return `${y}/${m}/${d} ${h}:${min}`;
- },
- async confirmUploadModal() {
- console.log('confirmUploadModal被调用,文件数量:', this.modalMediaList.length);
- if (this.modalMediaList.length === 0) {
- uni.showToast({ title: '请上传至少一张图片或视频', icon: 'none' });
- return;
- }
- try {
- uni.showLoading({ title: '提交中...' });
- const uploadedMedias = this.modalMediaList.map(item => item.url);
- const ossIds = this.modalMediaList.map(item => item.ossId);
- console.log('准备打卡,ossIds:', ossIds);
- const currentAction = this.steps[this.currentStep];
- let clockInType = 4;
- if (currentAction === '到达打卡') {
- clockInType = 4;
- } else if (currentAction === '确认出发' || currentAction === '开始服务') {
- clockInType = 6;
- } else if (currentAction === '送达打卡' || currentAction === '服务结束') {
- clockInType = 7;
- }
- const clockInData = {
- orderId: this.orderId,
- photos: ossIds,
- content: this.modalRemark || '',
- type: clockInType,
- title: this.currentTaskTitle
- };
- console.log('打卡数据:', clockInData);
- await clockIn(clockInData);
- uni.hideLoading();
- this.closeUploadModal();
- uni.showToast({ title: '打卡成功', icon: 'success' });
- await this.loadOrderDetail();
- } catch (err) {
- uni.hideLoading();
- console.error('打卡失败:', err);
- uni.showToast({ title: '打卡失败,请重试', icon: 'none' });
- }
- },
- copyOrderNo() {
- uni.setClipboardData({
- data: this.orderDetail.orderNo,
- success: () => {
- uni.showToast({ title: '复制成功', icon: 'none' });
- }
- });
- },
- openSumModal() {
- // 初始化日期
- const now = new Date();
- const y = now.getFullYear();
- const m = String(now.getMonth() + 1).padStart(2, '0');
- const d = String(now.getDate()).padStart(2, '0');
- this.sumDate = `${y}/${m}/${d}`;
- // 预设服务内容模板
- if (!this.sumContent) {
- this.sumContent =
- '1. 精神/身体状态:\n' +
- '2. 进食/饮水:\n' +
- '3. 排泤情况:\n' +
- '4. 卫生情况:\n' +
- '5. 互动情况:\n' +
- '6. 特殊情况/备注:';
- }
- this.showSumModal = true;
- },
- closeSumModal() {
- this.showSumModal = false;
- },
- submitSumModal() {
- if (!this.sumContent.trim()) {
- uni.showToast({ title: '请填写服务内容', icon: 'none' });
- return;
- }
- this.closeSumModal();
- uni.showToast({ title: '小结已提交', icon: 'success' });
- }
- }
- }
|