common.js
5.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
export const nextStepMap = {
ylTeamLeader: {
name: '养护组长分配',
btnText: '分配',
operateTypePass: 110,
operateTypeNoPass: 210, //养护组长退回:210
backShow: true,
renewShow: false
},
ylWorker: {
name: '养护员待实施',
btnText: '实施',
operateTypePass: 120,
operateTypeNoPass: 220,
backShow: true,
renewShow: false
},
ylTeamLeaderConfirm: {
name: '养护组长验收',
btnText: '验收',
operateTypePass: 130, //养护组长验收通过: 130
operateTypeNoPass: 230, // 养护组长验收不通过:230
backShow: false,
renewShow: false
},
ylInspector: {
name: '巡查员验收',
btnText: '验收',
operateTypePass: 140, //巡查员验收通过: 140
operateTypeNoPass: 240, // 巡查员验收不通过:230
backShow: false,
renewShow: false
},
ylInspectorStart: {
name: '发起人确认',
btnText: '结束工单',
operateTypePass: 200, //巡查员结束工单:200
operateTypeNoPass: 240, // 巡查员验收不通过:230
operateTypeRenew: 100, //巡查员重新发起:100
backShow: false,
renewShow: true
},
}
export const buzStatusMap = {
'000' :'巡查员发起',
"210" : '养护组长退回',
"110" : '养护组长分配',
"200" : '巡查员结束工单',
"100" : '巡查员重新发起',
"220" : '养护员退回',
"120" : '养护员实施',
"130" : '养护组长验收通过',
"230" : '养护组长验收不通过',
"140" : '巡查员验收通过',
"240" : '巡查员验收不通过',
}
/**
* 计算两个时间的时间差,返回格式化字符串(天/小时/分钟/秒,按需显示,无无效单位)
* @param {string | Date | number} startTime - 开始时间(时间字符串/Date对象/10位/13位时间戳)
* @param {string | Date | number} endTime - 结束时间(时间字符串/Date对象/10位/13位时间戳)
* @returns {string} - 格式化时间差字符串(如:3天5小时2分钟30秒、3小时2分钟30秒、2分钟30秒、30秒)
*/
export const calculateFormatTimeDiff = (startTime, endTime) => {
// 辅助函数:将任意合法时间格式转换为13位毫秒级时间戳
const to13BitTimestamp = (time) => {
let timestamp = 0;
// 情况1:数字类型(时间戳)
if (typeof time === 'number') {
const timeStr = time.toString();
if (timeStr.length === 10) {
timestamp = time * 1000; // 10位秒级转13位毫秒级
} else if (timeStr.length === 13) {
timestamp = time; // 13位毫秒级直接使用
} else {
console.error('非法时间戳:仅支持10位/13位数字', time);
return 0;
}
return timestamp;
}
// 情况2:Date对象
if (time instanceof Date) {
timestamp = time.getTime();
if (isNaN(timestamp)) {
console.error('无效的Date对象', time);
return 0;
}
return timestamp;
}
// 情况3:字符串类型
if (typeof time === 'string') {
const timeStr = time.trim().replace(/\//g, '-'); // 统一分隔符,兼容YYYY/MM/DD
const date = new Date(timeStr);
timestamp = date.getTime();
if (isNaN(timestamp)) {
console.error('无效的时间字符串', time);
return 0;
}
return timestamp;
}
// 非法类型
console.error('不支持的时间类型:仅支持string/Date/number', time);
return 0;
};
// 1. 统一转换为13位时间戳
const startTimestamp = to13BitTimestamp(startTime);
const endTimestamp = to13BitTimestamp(endTime);
// 2. 校验时间戳有效性
if (startTimestamp === 0 || endTimestamp === 0) {
return '0秒';
}
// 3. 计算总毫秒差(取绝对值,确保时间差为正数,不影响单位计算)
const totalMsDiff = Math.abs(endTimestamp - startTimestamp);
// 4. 定义时间单位换算(毫秒)
const oneDayMs = 24 * 60 * 60 * 1000;
const oneHourMs = 60 * 60 * 1000;
const oneMinuteMs = 60 * 1000;
const oneSecondMs = 1000;
// 5. 计算各单位的差值(向下取整,获取整数单位)
const days = Math.floor(totalMsDiff / oneDayMs);
const remainingMsAfterDay = totalMsDiff % oneDayMs; // 扣除天数后剩余的毫秒数
const hours = Math.floor(remainingMsAfterDay / oneHourMs);
const remainingMsAfterHour = remainingMsAfterDay % oneHourMs; // 扣除小时后剩余的毫秒数
const minutes = Math.floor(remainingMsAfterHour / oneMinuteMs);
const remainingMsAfterMinute = remainingMsAfterHour % oneMinuteMs; // 扣除分钟后剩余的毫秒数
const seconds = Math.floor(remainingMsAfterMinute / oneSecondMs);
// 6. 组装格式化字符串(按需添加单位,无无效单位)
const timeParts = [];
if (days > 0) {
timeParts.push(`${days}天`);
}
if (hours > 0 || (days > 0 && hours === 0)) { // 有天数时,小时即使为0也可保留(可选:删除 || 后的条件则不显示0小时)
timeParts.push(`${hours}小时`);
}
if (minutes > 0 || (timeParts.length > 0 && minutes === 0)) { // 有天/小时时,分钟即使为0也可保留(可选:删除 || 后的条件则不显示0分钟)
timeParts.push(`${minutes}分钟`);
}
// 秒数始终保留(即使为0,保证最后有一个有效单位)
timeParts.push(`${seconds}秒`);
// 7. 过滤掉可能存在的「0单位」(可选优化:避免出现“0小时”等无效字段)
const validTimeParts = timeParts.filter(part => {
const num = parseInt(part);
return num > 0 || (timeParts.length === 1 && num === 0); // 仅当只有秒数时,允许0秒
});
// 8. 拼接并返回结果
return validTimeParts.join('');
};