Blame view

common/utils/common.js 7.45 KB
2764b83e   刘淇   分配养护员
1
  export const nextStepMap = {
5059c4dd   刘淇   养护员提交养护工单
2
3
    ylTeamLeader: {
      name: '养护组长分配',
7a96cf50   刘淇   重新提交
4
      btnText: '分配',
5059c4dd   刘淇   养护员提交养护工单
5
      operateTypePass: 110,
7a96cf50   刘淇   重新提交
6
7
8
      operateTypeNoPass: 210,  //养护组长退回:210
      backShow: true,
      renewShow: false
5059c4dd   刘淇   养护员提交养护工单
9
10
11
    },
    ylWorker: {
      name: '养护员待实施',
7a96cf50   刘淇   重新提交
12
      btnText: '实施',
5059c4dd   刘淇   养护员提交养护工单
13
      operateTypePass: 120,
dacff5e3   刘淇   养护员退回
14
      operateTypeNoPass: 220,
7a96cf50   刘淇   重新提交
15
16
      backShow: true,
      renewShow: false
5059c4dd   刘淇   养护员提交养护工单
17
18
19
    },
    ylTeamLeaderConfirm: {
      name: '养护组长验收',
7a96cf50   刘淇   重新提交
20
      btnText: '验收',
5059c4dd   刘淇   养护员提交养护工单
21
22
      operateTypePass: 130, //养护组长验收通过: 130
      operateTypeNoPass: 230,  // 养护组长验收不通过:230
7a96cf50   刘淇   重新提交
23
24
      backShow: false,
      renewShow: false
5059c4dd   刘淇   养护员提交养护工单
25
    },
7a96cf50   刘淇   重新提交
26
    ylInspector: {
1f1f236c   刘淇   工单详情
27
      name: '巡查员验收',
7a96cf50   刘淇   重新提交
28
      btnText: '验收',
1f1f236c   刘淇   工单详情
29
      operateTypePass: 140, //巡查员验收通过: 140
12e66ec8   刘淇   新增树
30
      operateTypeNoPass: 240,  // 巡查员验收不通过:240
7a96cf50   刘淇   重新提交
31
32
33
34
35
36
37
      backShow: false,
      renewShow: false
    },
    ylInspectorStart: {
      name: '发起人确认',
      btnText: '结束工单',
      operateTypePass: 200, //巡查员结束工单:200
12e66ec8   刘淇   新增树
38
      operateTypeNoPass: 240,  // 巡查员验收不通过:240
7a96cf50   刘淇   重新提交
39
40
41
42
      operateTypeRenew: 100,  //巡查员重新发起:100
      backShow: false,
      renewShow: true
    },
34d239d6   刘淇   全域巡查员
43
44
45
46
47
    regionManager: {
      name: '大区经理分配',
      btnText: '分配',
      operateTypePass: 80, // 大区经理分配:80
      operateTypeNoPass: 90,  //  大区经理退回:90
34d239d6   刘淇   全域巡查员
48
49
50
      backShow: true,
      renewShow: false
    },
2e2b95d3   刘淇   修改接口路径 和命名
51
52
53
54
55
    shRegionManager: {
      name: '督察员单子大区经理分配',
      btnText: '分配',
      operateTypePass: 60, // 大区经理分配:60
      operateTypeNoPass: 70,  //  大区经理退回:70
2e2b95d3   刘淇   修改接口路径 和命名
56
57
58
      backShow: true,
      renewShow: false
    },
4fa8cf12   刘淇   巡查员结束工单
59
60
  }
  
4fa8cf12   刘淇   巡查员结束工单
61
  export const buzStatusMap = {
12e66ec8   刘淇   新增树
62
63
64
65
66
67
68
69
70
71
72
73
74
    '000': '发起',
    "210": '退回',
    "110": '分配',
    "200": '结束工单',
    "100": '重新发起',
    "220": '退回',
    "120": '实施',
    "130": '验收通过',
    "230": '验收不通过',
    "140": '验收通过',
    "240": '验收不通过',
    '90': '退回',
    '80': '分配',
2e2b95d3   刘淇   修改接口路径 和命名
75
76
    '70': '退回',
    '60': '分配',
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
77
78
  }
  
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
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
  /**
   * 计算两个时间的时间差,返回格式化字符串(天/小时/分钟/秒,按需显示,无无效单位)
   * @param {string | Date | number} startTime - 开始时间(时间字符串/Date对象/10/13位时间戳)
   * @param {string | Date | number} endTime - 结束时间(时间字符串/Date对象/10/13位时间戳)
   * @returns {string} - 格式化时间差字符串(如:35小时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}天`);
    }
12e66ec8   刘淇   新增树
166
    if (hours > 0 || (days > 0 && hours === 0)) {
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
167
168
      timeParts.push(`${hours}小时`);
    }
12e66ec8   刘淇   新增树
169
    if (minutes > 0 || (timeParts.length > 0 && minutes === 0)) {
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
170
171
      timeParts.push(`${minutes}分钟`);
    }
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
172
173
    timeParts.push(`${seconds}秒`);
  
12e66ec8   刘淇   新增树
174
    // 7. 过滤掉可能存在的「0单位」
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
175
176
    const validTimeParts = timeParts.filter(part => {
      const num = parseInt(part);
12e66ec8   刘淇   新增树
177
      return num > 0 || (timeParts.length === 1 && num === 0);
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
178
179
180
181
    });
  
    // 8. 拼接并返回结果
    return validTimeParts.join('');
e6a04285   刘淇   单图情况 宽高70*70
182
183
  };
  
e6a04285   刘淇   单图情况 宽高70*70
184
185
186
187
188
  /**
   * 将日期数组 [, , ] 转为标准日期字符串(兼容 iOS/Android
   * @param {Array} dateArr 日期数组,如 [2025, 12, 20]
   * @returns {String} 标准日期字符串,如 '2025-12-20'
   */
12e66ec8   刘淇   新增树
189
  export const convertArrToDateStr = (dateArr) => {
e6a04285   刘淇   单图情况 宽高70*70
190
191
192
193
194
195
196
197
198
199
    // 边界判断:非数组/长度不足3,返回空
    if (!Array.isArray(dateArr) || dateArr.length < 3) {
      return dateArr;
    }
    // 解构年、月、日,补零处理(确保格式统一,如 12月→12,2月→02)
    const [year, month, day] = dateArr;
    const formatMonth = month.toString().padStart(2, '0');
    const formatDay = day.toString().padStart(2, '0');
    // 拼接为标准字符串
    return `${year}-${formatMonth}-${formatDay}`;
12e66ec8   刘淇   新增树
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
  }
  
  /**
   * 角色编码  中文名称 公共方法
   * @param {Array<string>} roles 角色编码数组 如:["team_leader_yl", "team_leader_wy"] | ["team_leader_yl"]
   * @returns {string} 拼接后的中文角色字符串 如:"管理员,子公司管理员" | "管理员"
   */
  export const translateRoles = (roles = []) => {
    // 角色编码与中文名称映射表
    const roleMap = {
      'super_admin': '超级管理员',
      'common': '普通角色',
      'admin': '管理员',
      'zgs_leader': '子公司管理员',
      'regional_manager': '大区经理',
      'patrol_leader': '巡查组长',
      'dispatcher': '业务调度员',
      'patrol_global': '全域巡查员',
      'yl_inspector': '园林巡查员',
      'team_leader_yl': '园林养护组长',
      'wy_inspector': '物业巡查员',
      'yl_worker': '园林养护员',
      'wy_worker': '物业养护员',
      'Inspector_global': '全域督察员',
      'AI_dispatcher': 'AI工单派发人员',
    };
    // 过滤有效角色 + 翻译 + 中文逗号拼接
    return roles
      .filter(role => role && roleMap[role])
      .map(role => roleMap[role])
      .join(',');
e6a04285   刘淇   单图情况 宽高70*70
231
  }