diff --git a/api/tree-archive/tree-archive.js b/api/tree-archive/tree-archive.js index c05bd3c..6270f74 100644 --- a/api/tree-archive/tree-archive.js +++ b/api/tree-archive/tree-archive.js @@ -31,18 +31,30 @@ export const addTree = (data) => { }; +/** + * 树更变记录 + * @param {Object} params + * @returns {Promise} + */ +export const treeLogReq = (params) => { + return get('/app-api/garden/tree-change-log/page', params); +}; + + +/** + * 修改树 + * @param {Object} params + * @returns {Promise} + */ +export const updateTree = (data) => { + return put(' /app-api/garden/tree/update', data); +}; + // // 树基本详情 // export const treeDetailReq = (params) => request.get('/business/tree/'+params ) // ==> // /app-api/garden/tree/get // -// // 修改树 -// export const updateTree = (params) => request.put('/business/tree/',params ) -// ==> -// /app-api/garden/tree/update -// -// // 树更变记录 -// export const treeLogReq = (params) => request.get('/gardentree/logs/list/',params ) -// ==> -// /app-api/garden/tree-change-log/page + + diff --git a/common/utils/common.js b/common/utils/common.js index f5ea93f..e736120 100644 --- a/common/utils/common.js +++ b/common/utils/common.js @@ -27,7 +27,7 @@ export const nextStepMap = { name: '巡查员验收', btnText: '验收', operateTypePass: 140, //巡查员验收通过: 140 - operateTypeNoPass: 240, // 巡查员验收不通过:230 + operateTypeNoPass: 240, // 巡查员验收不通过:240 backShow: false, renewShow: false }, @@ -35,54 +35,47 @@ export const nextStepMap = { name: '发起人确认', btnText: '结束工单', operateTypePass: 200, //巡查员结束工单:200 - operateTypeNoPass: 240, // 巡查员验收不通过:230 + operateTypeNoPass: 240, // 巡查员验收不通过:240 operateTypeRenew: 100, //巡查员重新发起:100 backShow: false, renewShow: true }, - regionManager: { name: '大区经理分配', btnText: '分配', operateTypePass: 80, // 大区经理分配:80 operateTypeNoPass: 90, // 大区经理退回:90 - // operateTypeRenew: 100, //巡查员重新发起:100 backShow: true, renewShow: false }, - - shRegionManager: { name: '督察员单子大区经理分配', btnText: '分配', operateTypePass: 60, // 大区经理分配:60 operateTypeNoPass: 70, // 大区经理退回:70 - // operateTypeRenew: 100, //巡查员重新发起:100 backShow: true, renewShow: false }, } - export const buzStatusMap = { - '000' :'发起', - "210" : '退回', - "110" : '分配', - "200" : '结束工单', - "100" : '重新发起', - "220" : '退回', - "120" : '实施', - "130" : '验收通过', - "230" : '验收不通过', - "140" : '验收通过', - "240" : '验收不通过', - '90' : '退回', - '80' : '分配', + '000': '发起', + "210": '退回', + "110": '分配', + "200": '结束工单', + "100": '重新发起', + "220": '退回', + "120": '实施', + "130": '验收通过', + "230": '验收不通过', + "140": '验收通过', + "240": '验收不通过', + '90': '退回', + '80': '分配', '70': '退回', '60': '分配', } - /** * 计算两个时间的时间差,返回格式化字符串(天/小时/分钟/秒,按需显示,无无效单位) * @param {string | Date | number} startTime - 开始时间(时间字符串/Date对象/10位/13位时间戳) @@ -170,32 +163,30 @@ export const calculateFormatTimeDiff = (startTime, endTime) => { if (days > 0) { timeParts.push(`${days}天`); } - if (hours > 0 || (days > 0 && hours === 0)) { // 有天数时,小时即使为0也可保留(可选:删除 || 后的条件则不显示0小时) + if (hours > 0 || (days > 0 && hours === 0)) { timeParts.push(`${hours}小时`); } - if (minutes > 0 || (timeParts.length > 0 && minutes === 0)) { // 有天/小时时,分钟即使为0也可保留(可选:删除 || 后的条件则不显示0分钟) + if (minutes > 0 || (timeParts.length > 0 && minutes === 0)) { timeParts.push(`${minutes}分钟`); } - // 秒数始终保留(即使为0,保证最后有一个有效单位) timeParts.push(`${seconds}秒`); - // 7. 过滤掉可能存在的「0单位」(可选优化:避免出现“0小时”等无效字段) + // 7. 过滤掉可能存在的「0单位」 const validTimeParts = timeParts.filter(part => { const num = parseInt(part); - return num > 0 || (timeParts.length === 1 && num === 0); // 仅当只有秒数时,允许0秒 + return num > 0 || (timeParts.length === 1 && num === 0); }); // 8. 拼接并返回结果 return validTimeParts.join(''); }; - /** * 将日期数组 [年, 月, 日] 转为标准日期字符串(兼容 iOS/Android) * @param {Array} dateArr 日期数组,如 [2025, 12, 20] * @returns {String} 标准日期字符串,如 '2025-12-20' */ -export const convertArrToDateStr= (dateArr)=> { +export const convertArrToDateStr = (dateArr) => { // 边界判断:非数组/长度不足3,返回空 if (!Array.isArray(dateArr) || dateArr.length < 3) { return dateArr; @@ -206,4 +197,35 @@ export const convertArrToDateStr= (dateArr)=> { const formatDay = day.toString().padStart(2, '0'); // 拼接为标准字符串 return `${year}-${formatMonth}-${formatDay}`; +} + +/** + * 角色编码 转 中文名称 公共方法 + * @param {Array} 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(','); } \ No newline at end of file diff --git a/common/utils/inputFilter.js b/common/utils/inputFilter.js new file mode 100644 index 0000000..6821d57 --- /dev/null +++ b/common/utils/inputFilter.js @@ -0,0 +1,27 @@ +/** + * 全局输入框过滤工具 - 增强版(100%生效,解决小程序延迟问题) + * 核心功能:实时禁止开头空格 + 实时过滤所有表情 + */ +// 最全表情正则:覆盖所有微信/系统/颜文字/特殊符号 +const regEmoji = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA]|\u2B05-\u2B07|\u2B1B\u2B1C|\u2B50\u2B55|\u231A\u231B|\u2328\u23CF|\u23E9-\u23F3|\u23F8-\u23FA|\u24C2|\u25AA\u25AB|\u25B6\u25C0|\u25FB-\u25FE|\u2600-\u26FF|\u2700-\u27BF|\u2934\u2935|\u2B00-\u2BFF|\u3030\u303D|\u3297\u3299]|\uD830-\uD83D[\uDC00-\uDFFF]|\uD83E[\uDD00-\uDDFF]/g; +// 匹配开头所有空格(半角+全角) +const regStartSpace = /^(^\s+)|(^ +)/g; + +/** + * 增强版过滤方法:强制实时更新,解决小程序输入延迟 + * @param {String} val 输入框原始值 + * @returns {String} 过滤后的合法值 + */ +export const inputFilter = (val) => { + if (!val || typeof val !== 'string') return val; + let filterVal = val; + // 1. 先过滤表情 + filterVal = filterVal.replace(regEmoji, ''); + // 2. 过滤开头空格(核心:确保开头绝对无空格) + filterVal = filterVal.replace(regStartSpace, ''); + // 3. 强制去重过滤:防止小程序输入延迟导致的残留 + if (filterVal !== val) { + filterVal = filterVal.replace(regEmoji, '').replace(regStartSpace, ''); + } + return filterVal; +}; \ No newline at end of file diff --git a/main.js b/main.js index cec9938..52b8fba 100644 --- a/main.js +++ b/main.js @@ -2,6 +2,7 @@ import App from './App' import uviewPlus from '@/uni_modules/uview-plus' // 导入 Pinia 实例(你的 stores/index.js 导出的 pinia) +import { inputFilter } from '@/common/utils/inputFilter.js' import pinia from '@/pinia/index' import EmptyView from '@/components/empty-view/empty-view.vue'; import UploadImage from '@/components/upload-image/upload-image.vue'; @@ -16,7 +17,7 @@ export function createApp() { // 3. 注册 uviewPlus(保持原有逻辑) app.use(uviewPlus) - + app.config.globalProperties.$inputFilter = inputFilter; // 4. 注册 Pinia(核心:在 app 挂载前注册) app.use(pinia) // 全局注入字典工具(关键:provide需在app实例上注册) diff --git a/pages-sub/data/tree-archive/addTree.vue b/pages-sub/data/tree-archive/addTree.vue index 5a16a90..65467a6 100644 --- a/pages-sub/data/tree-archive/addTree.vue +++ b/pages-sub/data/tree-archive/addTree.vue @@ -2,23 +2,22 @@ - + - - + -