From f7e950f51ff86f24413d08e8148eba3d85f20d60 Mon Sep 17 00:00:00 2001 From: pengyuthon Date: Fri, 23 Jan 2026 09:24:39 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=89=93?= =?UTF-8?q?=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_hr_attendance/controllers/applet_attendance.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/yuthon_hr_attendance/controllers/applet_attendance.py b/yuthon_hr_attendance/controllers/applet_attendance.py index 10cbd5980..7a7f80c7f 100644 --- a/yuthon_hr_attendance/controllers/applet_attendance.py +++ b/yuthon_hr_attendance/controllers/applet_attendance.py @@ -107,7 +107,6 @@ class AppletAttendance(Controller): [('employee_id', '=', employee_id.id), ('current_data', '=', current_date)]) check_in = attendance_id.check_in + timedelta(hours=8) if attendance_id.check_in else '' check_out = attendance_id.check_out + timedelta(hours=8) if attendance_id.check_out else '' - _logger.info(f"------/yuthon/att/today---------接口收到响应-------------------------------") if attendance_id.shift_name: shift_name = attendance_id.shift_name else: @@ -206,14 +205,12 @@ class AppletAttendance(Controller): state = 'yes' wifi = kw['wifi_name'] _logger.info(f'{wifi}---wifi可以打卡----------') - _logger.info(f'{wifi}---wifi可以打卡----------') - _logger.info(f'{wifi}---wifi可以打卡----------') if self.is_workday(current_date): attendance_id_class = f"{shift_name} {start_time_str}-{end_time_str}" else: attendance_id_class = f"{shift_name}休息" data = { - 'location': "已被禁用", + 'location': " ", 'user_id': user_id.id, 'class': f"{attendance_id_class}", 'state_result': state_result, @@ -223,8 +220,6 @@ class AppletAttendance(Controller): 'check_out_status': check_out_status, 'state': state, }, - _logger.info(f"------/yuthon/att/today---------接口收到响应--------{state}\n{state}\n{state}\n{state}\n{state}\n{state}\n{state}\n{state}\n{state}\n-----------------------") - _logger.info(f'{data}--{message}-----------') return_data = {'data': data, 'code': '200', 'message': message, } return json.dumps(return_data) From c7972dae4cbedb393b8088f2ca6ab80a06c72d97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Fri, 23 Jan 2026 09:38:58 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/src/js/status_bar_buttons.js | 98 ++++++++++++++++++- .../static/src/scss/status_bar_buttons.scss | 22 ++++- .../static/src/xml/status_bar_buttons.xml | 24 ++--- 3 files changed, 123 insertions(+), 21 deletions(-) diff --git a/k_ry_mobile_form/static/src/js/status_bar_buttons.js b/k_ry_mobile_form/static/src/js/status_bar_buttons.js index 367153a10..38d937f80 100644 --- a/k_ry_mobile_form/static/src/js/status_bar_buttons.js +++ b/k_ry_mobile_form/static/src/js/status_bar_buttons.js @@ -2,18 +2,85 @@ import { StatusBarButtons } from "@web/views/form/status_bar_buttons/status_bar_buttons"; import { patch } from "@web/core/utils/patch"; +import { useEffect } from "@odoo/owl"; -// 覆盖 StatusBarButtons 组件的模板 +// 检测是否为移动设备(包括iOS Safari) +const isMobileDevice = () => { + if (typeof window === 'undefined') return false; + + // 检测触摸设备 + const hasTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0; + + // 检测用户代理(iOS设备) + const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; + + // 检测屏幕宽度 + const isSmallScreen = window.innerWidth <= 767; + + // 检测是否为移动设备(综合考虑) + return hasTouch && (isIOS || isSmallScreen); +}; + +// 覆盖 StatusBarButtons 组件,添加移动端检测逻辑 patch(StatusBarButtons, { template: "k_ry_mobile_form.StatusBarButtons", + setup() { + // 如果 env.isSmall 判断不准确,强制显示移动端按钮 + if (typeof window !== 'undefined') { + useEffect(() => { + const checkAndFixMobileButtons = () => { + // 如果是移动设备但 env.isSmall 为 false,强制显示移动端按钮 + if (isMobileDevice()) { + const mobileContainers = document.querySelectorAll('.o_statusbar_buttons_mobile_fixed'); + mobileContainers.forEach(container => { + container.style.display = 'block'; + container.style.visibility = 'visible'; + container.style.opacity = '1'; + }); + + // 隐藏桌面端按钮 + const desktopButtons = document.querySelectorAll('.o_form_statusbar > .o_statusbar_buttons:not(.o_statusbar_buttons_mobile_fixed .o_statusbar_buttons)'); + desktopButtons.forEach(btn => { + btn.style.display = 'none'; + }); + } + }; + + // 延迟执行,确保DOM已渲染 + setTimeout(checkAndFixMobileButtons, 100); + + // 监听窗口大小变化 + const handleResize = () => { + setTimeout(checkAndFixMobileButtons, 100); + }; + window.addEventListener('resize', handleResize); + + return () => { + window.removeEventListener('resize', handleResize); + }; + }); + } + }, }); -// iOS Safari修复:确保移动端按钮在iOS上可点击 +// iOS Safari修复:确保移动端按钮在iOS上可点击和可见 // 使用MutationObserver监听DOM变化,确保新添加的按钮也能正常工作 if (typeof window !== 'undefined' && typeof document !== 'undefined') { const fixIOSButtons = () => { + // 确保移动端按钮容器可见 const containers = document.querySelectorAll('.o_statusbar_buttons_mobile_fixed'); containers.forEach(container => { + // 如果是移动设备,确保容器可见 + if (isMobileDevice()) { + const computedStyle = getComputedStyle(container); + if (computedStyle.display === 'none') { + container.style.display = 'block'; + } + container.style.visibility = 'visible'; + container.style.opacity = '1'; + } + + // 修复按钮的交互性 const buttons = container.querySelectorAll('button, a.btn, .btn, a[role="button"], .o_statusbar_buttons > * > button'); buttons.forEach(button => { // 确保pointer-events正确设置 @@ -22,8 +89,18 @@ if (typeof window !== 'undefined' && typeof document !== 'undefined') { } button.style.cursor = 'pointer'; button.style.touchAction = 'manipulation'; + button.style.visibility = 'visible'; + button.style.opacity = '1'; }); }); + + // 在移动设备上,确保原始状态栏中的按钮被隐藏 + if (isMobileDevice()) { + const desktopButtons = document.querySelectorAll('.o_form_statusbar > .o_statusbar_buttons:not(.o_statusbar_buttons_mobile_fixed .o_statusbar_buttons)'); + desktopButtons.forEach(btn => { + btn.style.display = 'none'; + }); + } }; // 初始化函数:确保DOM准备好后再设置observer @@ -34,10 +111,14 @@ if (typeof window !== 'undefined' && typeof document !== 'undefined') { // 确保document.body存在后再创建observer if (document.body) { // 监听DOM变化,确保动态添加的按钮也能正常工作 - const observer = new MutationObserver(fixIOSButtons); + const observer = new MutationObserver(() => { + fixIOSButtons(); + }); observer.observe(document.body, { childList: true, - subtree: true + subtree: true, + attributes: true, + attributeFilter: ['style', 'class'] }); } else { // 如果body还不存在,等待DOMContentLoaded @@ -52,4 +133,13 @@ if (typeof window !== 'undefined' && typeof document !== 'undefined') { // 使用setTimeout确保DOM完全准备好 setTimeout(initIOSButtonFix, 0); } + + // 监听窗口大小变化和方向变化(iOS Safari 横竖屏切换) + window.addEventListener('resize', () => { + setTimeout(fixIOSButtons, 100); + }); + + window.addEventListener('orientationchange', () => { + setTimeout(fixIOSButtons, 200); + }); } diff --git a/k_ry_mobile_form/static/src/scss/status_bar_buttons.scss b/k_ry_mobile_form/static/src/scss/status_bar_buttons.scss index 1b7798e08..56122cd5b 100644 --- a/k_ry_mobile_form/static/src/scss/status_bar_buttons.scss +++ b/k_ry_mobile_form/static/src/scss/status_bar_buttons.scss @@ -62,10 +62,13 @@ } } -// 桌面端隐藏移动端悬浮栏 +// 桌面端隐藏移动端悬浮栏(但保留触摸设备的显示) @include media-breakpoint-up(md) { .o_statusbar_buttons_mobile_fixed { - display: none !important; + // 只在非触摸设备上隐藏(桌面浏览器) + @media (hover: hover) and (pointer: fine) { + display: none !important; + } } } @@ -74,7 +77,7 @@ .o_form_statusbar { // 隐藏状态栏中的按钮容器,但保留字段等其他内容 > .o_statusbar_buttons:not(.o_statusbar_buttons_mobile_fixed .o_statusbar_buttons) { - display: none; + display: none !important; } } @@ -83,3 +86,16 @@ padding-bottom: 80px; // 为底部悬浮栏预留空间 } } + +// iOS Safari 特殊处理:确保在 iOS 设备上按钮可见 +@media (hover: none) and (pointer: coarse) { + .o_statusbar_buttons_mobile_fixed { + display: block !important; + visibility: visible !important; + opacity: 1 !important; + } + + .o_form_statusbar > .o_statusbar_buttons:not(.o_statusbar_buttons_mobile_fixed .o_statusbar_buttons) { + display: none !important; + } +} diff --git a/k_ry_mobile_form/static/src/xml/status_bar_buttons.xml b/k_ry_mobile_form/static/src/xml/status_bar_buttons.xml index f27a576d5..8dc0df7f1 100644 --- a/k_ry_mobile_form/static/src/xml/status_bar_buttons.xml +++ b/k_ry_mobile_form/static/src/xml/status_bar_buttons.xml @@ -4,24 +4,20 @@ - - -
-
- - - -
-
-
- - -
+ +
+
- +
+ +
+ + + +