feat: 添加设备归还功能和时间解析逻辑

在订单页面中添加了设备归还按钮,允许用户在订单状态为1时归还设备。同时,在归还页面中优化了时间解析逻辑,确保能够正确处理后端返回的时间格式,并更新使用时长和费用信息。删除了不再使用的axios相关文件,整合了uview-ui库以提升项目性能。
This commit is contained in:
8vd8
2025-04-10 14:19:05 +08:00
parent 3fecd77739
commit 3491d93e27
16 changed files with 1174 additions and 2712 deletions
+1
View File
@@ -19,6 +19,7 @@
<view class="order-header"> <view class="order-header">
<text class="order-no">订单号{{ order.orderNo }}</text> <text class="order-no">订单号{{ order.orderNo }}</text>
<text class="order-status" :class="OrderStatusMap[order.status]?.class">{{ OrderStatusMap[order.status]?.text }}</text> <text class="order-status" :class="OrderStatusMap[order.status]?.class">{{ OrderStatusMap[order.status]?.text }}</text>
<navigator v-if="order.status === 1" :url="`/pages/return/index?deviceId=${order.deviceId}&orderId=${order.orderNo}`" class="return-btn">归还设备</navigator>
</view> </view>
<view class="order-content"> <view class="order-content">
<view class="device-info"> <view class="device-info">
+16 -18
View File
@@ -101,8 +101,18 @@ export default {
if (result.code === 200 && result.data) { if (result.code === 200 && result.data) {
const orderData = result.data const orderData = result.data
// 格式化开始时间 const rawTime = orderData.startTime
this.orderInfo.startTime = this.formatTime(new Date(orderData.createTime)) console.log('原始时间:', rawTime)
const fixedTime = rawTime.replace(' ', 'T')
const date = new Date(fixedTime)
console.log('原始时间:', rawTime);
if (isNaN(date.getTime())) {
this.orderInfo.startTime = '时间解析错误'
} else {
console.log('原始时间:', rawTime);
this.orderInfo.startTime = this.formatTime(date)
}
// 计算使用时长 // 计算使用时长
this.calculateUsedTime(orderData.createTime) this.calculateUsedTime(orderData.createTime)
// 设置当前费用 // 设置当前费用
@@ -138,22 +148,10 @@ export default {
return `${year}-${month}-${day} ${hour}:${minute}` return `${year}-${month}-${day} ${hour}:${minute}`
}, },
// 计算使用时长 // 使用后端返回的使用时长和费用数据
calculateUsedTime(startTime) { updateOrderInfo(orderData) {
const start = new Date(startTime) this.orderInfo.usedTime = orderData.usedTime || '0分钟';
const now = new Date() this.orderInfo.currentFee = orderData.currentFee || '0.00';
const diffMs = now - start
// 计算分钟数
const minutes = Math.floor(diffMs / (1000 * 60))
if (minutes < 60) {
this.orderInfo.usedTime = `${minutes}分钟`
} else {
const hours = Math.floor(minutes / 60)
const remainMinutes = minutes % 60
this.orderInfo.usedTime = `${hours}小时${remainMinutes}分钟`
}
}, },
// 更新使用时长的定时器 // 更新使用时长的定时器
+9 -19
View File
@@ -1,25 +1,15 @@
{ {
"hash": "cbb77b90", "hash": "eecc45c6",
"configHash": "02d49493", "configHash": "e4fbd916",
"lockfileHash": "a9202ca1", "lockfileHash": "78df9316",
"browserHash": "41ab211e", "browserHash": "8d847c28",
"optimized": { "optimized": {
"axios": { "uview-ui": {
"src": "../../../../../node_modules/axios/index.js", "src": "../../../../../node_modules/uview-ui/index.js",
"file": "axios.js", "file": "uview-ui.js",
"fileHash": "a532ef26", "fileHash": "b095c49f",
"needsInterop": false
},
"uniapp-axios-adapter": {
"src": "../../../../../node_modules/uniapp-axios-adapter/lib/index.esm.js",
"file": "uniapp-axios-adapter.js",
"fileHash": "63f5b0fe",
"needsInterop": false "needsInterop": false
} }
}, },
"chunks": { "chunks": {}
"chunk-U6PB43C6": {
"file": "chunk-U6PB43C6.js"
}
}
} }
-39
View File
@@ -1,39 +0,0 @@
import {
Axios,
AxiosError,
AxiosHeaders,
Cancel,
CancelToken,
CanceledError,
HttpStatusCode,
VERSION,
all,
axios_default,
formToJSON,
getAdapter,
isAxiosError,
isCancel,
mergeConfig,
spread,
toFormData
} from "./chunk-U6PB43C6.js";
export {
Axios,
AxiosError,
AxiosHeaders,
Cancel,
CancelToken,
CanceledError,
HttpStatusCode,
VERSION,
all,
axios_default as default,
formToJSON,
getAdapter,
isAxiosError,
isCancel,
mergeConfig,
spread,
toFormData
};
//# sourceMappingURL=axios.js.map
-7
View File
@@ -1,7 +0,0 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
-54
View File
@@ -1,54 +0,0 @@
import {
axios_default
} from "./chunk-U6PB43C6.js";
// ../../../共享风扇1-3/fs/node_modules/uniapp-axios-adapter/lib/index.esm.js
var getResponse = (res, config) => {
const { statusCode, errMsg } = res;
const response = {
...res,
status: statusCode,
statusText: errMsg,
config,
request: null
};
return response;
};
var uniAdapter = (config) => {
if (!uni) {
throw new Error("please use this in uni-app project!");
}
return new Promise((resolve, reject) => {
const { baseURL, url, headers, data, params } = config;
const uniConfig = {
...config,
url: baseURL + url,
header: headers
};
if (data || params) {
try {
uniConfig.data = JSON.parse(data || params);
} catch (e) {
uniConfig.data = data || params;
}
}
uni.request({
...uniConfig,
success(res) {
const response = getResponse(res, config);
resolve(response);
},
fail(res) {
const response = getResponse(res, config);
reject(response);
}
});
});
};
var UniAdapter = uniAdapter;
axios_default.defaults.adapter = uniAdapter;
export {
UniAdapter,
axios_default as default
};
//# sourceMappingURL=uniapp-axios-adapter.js.map
@@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../../../../node_modules/uniapp-axios-adapter/lib/index.esm.js"],
"sourcesContent": ["import axios from 'axios';\nexport { default } from 'axios';\n\nconst getResponse = (res, config) => {\n const { statusCode, errMsg } = res;\n const response = {\n ...res,\n status: statusCode,\n statusText: errMsg,\n config,\n request: null,\n };\n\n return response;\n};\n\nconst uniAdapter = (config) => {\n if (!uni) {\n throw new Error(\"please use this in uni-app project!\");\n }\n return new Promise((resolve, reject) => {\n const { baseURL, url, headers, data, params } = config;\n const uniConfig = {\n ...config,\n url: baseURL + url,\n header: headers,\n };\n\n if (data || params) {\n try {\n uniConfig.data = JSON.parse(data || params);\n } catch (e) {\n uniConfig.data = data || params;\n }\n }\n uni.request({\n ...uniConfig,\n success(res) {\n const response = getResponse(res, config);\n resolve(response);\n },\n fail(res) {\n const response = getResponse(res, config);\n reject(response);\n },\n });\n });\n};\n\nconst UniAdapter = uniAdapter;\n\naxios.defaults.adapter = uniAdapter;\n\nexport { UniAdapter };\n"],
"mappings": ";;;;;AAGA,IAAM,cAAc,CAAC,KAAK,WAAW;AACnC,QAAM,EAAE,YAAY,OAAO,IAAI;AAC/B,QAAM,WAAW;AAAA,IACf,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEA,IAAM,aAAa,CAAC,WAAW;AAC7B,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,EAAE,SAAS,KAAK,SAAS,MAAM,OAAO,IAAI;AAChD,UAAM,YAAY;AAAA,MAChB,GAAG;AAAA,MACH,KAAK,UAAU;AAAA,MACf,QAAQ;AAAA,IACV;AAEA,QAAI,QAAQ,QAAQ;AAClB,UAAI;AACF,kBAAU,OAAO,KAAK,MAAM,QAAQ,MAAM;AAAA,MAC5C,SAAS,GAAG;AACV,kBAAU,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACF;AACA,QAAI,QAAQ;AAAA,MACV,GAAG;AAAA,MACH,QAAQ,KAAK;AACX,cAAM,WAAW,YAAY,KAAK,MAAM;AACxC,gBAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,KAAK,KAAK;AACR,cAAM,WAAW,YAAY,KAAK,MAAM;AACxC,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,aAAa;AAEnB,cAAM,SAAS,UAAU;",
"names": []
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"version":3,"file":"index.js","sources":["E:/迅雷下载/HBuilderX.4.57.2025032507/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvb3JkZXIvaW5kZXgudnVl"],"sourcesContent":["import MiniProgramPage from 'C:/Users/Administrator.DESKTOP-IRCM9I0/Desktop/locker-fans/locker-fans/uni-fans/pages/order/index.vue'\nwx.createPage(MiniProgramPage)"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,GAAG,WAAW,eAAe;"} {"version":3,"file":"index.js","sources":["E:/迅雷下载/HBuilderX.4.57.2025032507/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvb3JkZXIvaW5kZXgudnVl"],"sourcesContent":["import MiniProgramPage from 'C:/Users/Administrator.DESKTOP-IRCM9I0/Desktop/locker-fans/locker-fans/uni-fans/pages/order/index.vue'\nwx.createPage(MiniProgramPage)"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,GAAG,WAAW,eAAe;"}
@@ -1 +1 @@
{"version":3,"file":"index.js","sources":["E:/迅雷下载/HBuilderX.4.57.2025032507/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvcmV0dXJuL2luZGV4LnZ1ZQ"],"sourcesContent":["import MiniProgramPage from 'C:/Users/Administrator.DESKTOP-IRCM9I0/Desktop/locker-fans/locker-fans/uni-fans/pages/return/index.vue'\nwx.createPage(MiniProgramPage)"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,GAAG,WAAW,eAAe;"} {"version":3,"file":"index.js","sources":["E:/迅雷下载/HBuilderX.4.57.2025032507/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvcmV0dXJuL2luZGV4LnZ1ZQ"],"sourcesContent":["import MiniProgramPage from 'C:/Users/Administrator.DESKTOP-IRCM9I0/Desktop/locker-fans/locker-fans/uni-fans/pages/return/index.vue'\nwx.createPage(MiniProgramPage)"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,GAAG,WAAW,eAAe;"}
+13 -9
View File
@@ -34,7 +34,7 @@ const _sfc_main = {
} }
} }
} catch (error) { } catch (error) {
common_vendor.index.__f__("error", "at pages/order/index.vue:97", "获取订单详情失败:", error); common_vendor.index.__f__("error", "at pages/order/index.vue:98", "获取订单详情失败:", error);
} }
} }
await this.getOrderList(); await this.getOrderList();
@@ -54,7 +54,7 @@ const _sfc_main = {
})); }));
} }
} catch (error) { } catch (error) {
common_vendor.index.__f__("error", "at pages/order/index.vue:120", "获取订单列表失败:", error); common_vendor.index.__f__("error", "at pages/order/index.vue:121", "获取订单列表失败:", error);
common_vendor.index.showToast({ common_vendor.index.showToast({
title: "获取订单列表失败", title: "获取订单列表失败",
icon: "none" icon: "none"
@@ -80,16 +80,20 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
}), }),
b: common_vendor.f($data.orderList, (order, index, i0) => { b: common_vendor.f($data.orderList, (order, index, i0) => {
var _a, _b; var _a, _b;
return { return common_vendor.e({
a: common_vendor.t(order.orderNo), a: common_vendor.t(order.orderNo),
b: common_vendor.t((_a = $data.OrderStatusMap[order.status]) == null ? void 0 : _a.text), b: common_vendor.t((_a = $data.OrderStatusMap[order.status]) == null ? void 0 : _a.text),
c: common_vendor.n((_b = $data.OrderStatusMap[order.status]) == null ? void 0 : _b.class), c: common_vendor.n((_b = $data.OrderStatusMap[order.status]) == null ? void 0 : _b.class),
d: common_vendor.t(order.deviceId), d: order.status === 1
e: common_vendor.t(order.startTime), }, order.status === 1 ? {
f: common_vendor.t(order.endTime || "-"), e: `/pages/return/index?deviceId=${order.deviceId}&orderId=${order.orderNo}`
g: common_vendor.t(order.amount), } : {}, {
h: index f: common_vendor.t(order.deviceId),
}; g: common_vendor.t(order.startTime),
h: common_vendor.t(order.endTime || "-"),
i: common_vendor.t(order.amount),
j: index
});
}), }),
c: $data.orderList.length === 0 c: $data.orderList.length === 0
}, $data.orderList.length === 0 ? {} : {}); }, $data.orderList.length === 0 ? {} : {});
+1 -1
View File
@@ -1 +1 @@
<view class="order-container data-v-17a44f9d"><view class="tab-bar data-v-17a44f9d"><view wx:for="{{a}}" wx:for-item="tab" wx:key="b" class="{{['tab-item', 'data-v-17a44f9d', tab.c && 'active']}}" bindtap="{{tab.d}}">{{tab.a}}</view></view><view class="order-list data-v-17a44f9d"><view wx:for="{{b}}" wx:for-item="order" wx:key="h" class="order-item data-v-17a44f9d"><view class="order-header data-v-17a44f9d"><text class="order-no data-v-17a44f9d">订单号:{{order.a}}</text><text class="{{['order-status', 'data-v-17a44f9d', order.c]}}">{{order.b}}</text></view><view class="order-content data-v-17a44f9d"><view class="device-info data-v-17a44f9d"><text class="device-name data-v-17a44f9d">共享风扇</text><text class="device-id data-v-17a44f9d">设备号:{{order.d}}</text></view><view class="time-info data-v-17a44f9d"><view class="time-item data-v-17a44f9d"><text class="label data-v-17a44f9d">开始时间:</text><text class="value data-v-17a44f9d">{{order.e}}</text></view><view class="time-item data-v-17a44f9d"><text class="label data-v-17a44f9d">结束时间:</text><text class="value data-v-17a44f9d">{{order.f}}</text></view></view><view class="price-info data-v-17a44f9d"><text class="amount data-v-17a44f9d">¥{{order.g}}</text></view></view></view></view><view wx:if="{{c}}" class="empty-tip data-v-17a44f9d"><view class="empty-icon data-v-17a44f9d"></view><text class="data-v-17a44f9d">暂无订单记录</text></view></view> <view class="order-container data-v-17a44f9d"><view class="tab-bar data-v-17a44f9d"><view wx:for="{{a}}" wx:for-item="tab" wx:key="b" class="{{['tab-item', 'data-v-17a44f9d', tab.c && 'active']}}" bindtap="{{tab.d}}">{{tab.a}}</view></view><view class="order-list data-v-17a44f9d"><view wx:for="{{b}}" wx:for-item="order" wx:key="j" class="order-item data-v-17a44f9d"><view class="order-header data-v-17a44f9d"><text class="order-no data-v-17a44f9d">订单号:{{order.a}}</text><text class="{{['order-status', 'data-v-17a44f9d', order.c]}}">{{order.b}}</text><navigator wx:if="{{order.d}}" url="{{order.e}}" class="return-btn data-v-17a44f9d">归还设备</navigator></view><view class="order-content data-v-17a44f9d"><view class="device-info data-v-17a44f9d"><text class="device-name data-v-17a44f9d">共享风扇</text><text class="device-id data-v-17a44f9d">设备号:{{order.f}}</text></view><view class="time-info data-v-17a44f9d"><view class="time-item data-v-17a44f9d"><text class="label data-v-17a44f9d">开始时间:</text><text class="value data-v-17a44f9d">{{order.g}}</text></view><view class="time-item data-v-17a44f9d"><text class="label data-v-17a44f9d">结束时间:</text><text class="value data-v-17a44f9d">{{order.h}}</text></view></view><view class="price-info data-v-17a44f9d"><text class="amount data-v-17a44f9d">¥{{order.i}}</text></view></view></view></view><view wx:if="{{c}}" class="empty-tip data-v-17a44f9d"><view class="empty-icon data-v-17a44f9d"></view><text class="data-v-17a44f9d">暂无订单记录</text></view></view>
+15 -14
View File
@@ -35,7 +35,17 @@ const _sfc_main = {
const result = await config_user.queryById(this.orderInfo.orderId); const result = await config_user.queryById(this.orderInfo.orderId);
if (result.code === 200 && result.data) { if (result.code === 200 && result.data) {
const orderData = result.data; const orderData = result.data;
this.orderInfo.startTime = this.formatTime(new Date(orderData.createTime)); const rawTime = orderData.startTime;
common_vendor.index.__f__("log", "at pages/return/index.vue:105", "原始时间:", rawTime);
const fixedTime = rawTime.replace(" ", "T");
const date = new Date(fixedTime);
common_vendor.index.__f__("log", "at pages/return/index.vue:108", "原始时间:", rawTime);
if (isNaN(date.getTime())) {
this.orderInfo.startTime = "时间解析错误";
} else {
common_vendor.index.__f__("log", "at pages/return/index.vue:112", "原始时间:", rawTime);
this.orderInfo.startTime = this.formatTime(date);
}
this.calculateUsedTime(orderData.createTime); this.calculateUsedTime(orderData.createTime);
this.orderInfo.currentFee = orderData.amount || "0.00"; this.orderInfo.currentFee = orderData.amount || "0.00";
} else { } else {
@@ -64,19 +74,10 @@ const _sfc_main = {
const minute = date.getMinutes().toString().padStart(2, "0"); const minute = date.getMinutes().toString().padStart(2, "0");
return `${year}-${month}-${day} ${hour}:${minute}`; return `${year}-${month}-${day} ${hour}:${minute}`;
}, },
// 计算使用时长 // 使用后端返回的使用时长和费用数据
calculateUsedTime(startTime) { updateOrderInfo(orderData) {
const start = new Date(startTime); this.orderInfo.usedTime = orderData.usedTime || "0分钟";
const now = /* @__PURE__ */ new Date(); this.orderInfo.currentFee = orderData.currentFee || "0.00";
const diffMs = now - start;
const minutes = Math.floor(diffMs / (1e3 * 60));
if (minutes < 60) {
this.orderInfo.usedTime = `${minutes}分钟`;
} else {
const hours = Math.floor(minutes / 60);
const remainMinutes = minutes % 60;
this.orderInfo.usedTime = `${hours}小时${remainMinutes}分钟`;
}
}, },
// 更新使用时长的定时器 // 更新使用时长的定时器
startTimer() { startTimer() {