From 7b23f31bc732f0c61ff324e8c335c0535e5c0356 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: Thu, 18 Dec 2025 15:21:20 +0800
Subject: [PATCH 01/14] =?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
---
.../models/yuthon_official_incoming_normal.py | 4 ++--
.../views/yuthon_dates_task_views.xml | 20 ++++++++++++++++++-
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/yuthon_official/models/yuthon_official_incoming_normal.py b/yuthon_official/models/yuthon_official_incoming_normal.py
index 7a303b096..9850cd85e 100644
--- a/yuthon_official/models/yuthon_official_incoming_normal.py
+++ b/yuthon_official/models/yuthon_official_incoming_normal.py
@@ -23,8 +23,8 @@ class YuthonOfficialIncomingNormal(models.Model):
secret_level = fields.Selection([('normal', '一般'), ('urgent', '秘密'), ('secret', '机密'), ('so_secret', '绝密')], string="密级")
time_date = fields.Datetime(string="日期", default=fields.Datetime.now)
users_id = fields.Many2one('res.users', string="拟办人", default=lambda self: self.env.user.id)
- department_id = fields.Many2one(related='users_id.employee_id.department_id', string="拟办部门")
- company_id = fields.Many2one(related='users_id.employee_id.company_id', string="公司")
+ department_id = fields.Many2one(related='users_id.employee_ids.department_id', string="拟办部门")
+ company_id = fields.Many2one(related='users_id.employee_ids.company_id', string="公司")
department_data = fields.Html(string="拟办意见")
red_suit = fields.Char(string="套红")
official_statu = fields.Selection([('done', '办结'), ('approval', '审核')], string="公文环节")
diff --git a/yuthon_will_task/views/yuthon_dates_task_views.xml b/yuthon_will_task/views/yuthon_dates_task_views.xml
index 34e84375a..44ba22079 100644
--- a/yuthon_will_task/views/yuthon_dates_task_views.xml
+++ b/yuthon_will_task/views/yuthon_dates_task_views.xml
@@ -4,7 +4,10 @@
yuthon.dates.task.tree
yuthon.dates.task
-
+
@@ -12,9 +15,24 @@
+
+ yuthon.dates.task.search
+ yuthon.dates.task
+
+
+
+
+
+
+
+
+
日程任务
yuthon.dates.task
tree
+
+
+ {'search_default_task_state':1}
From 5f9bf884e91d03b945eb67fd85bdaed6bfc3fba6 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: Thu, 18 Dec 2025 15:29:01 +0800
Subject: [PATCH 02/14] =?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
---
yuthon_will_task/models/yuthon_will_task.py | 2 +-
yuthon_will_task/views/yuthon_dates_task_views.xml | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/yuthon_will_task/models/yuthon_will_task.py b/yuthon_will_task/models/yuthon_will_task.py
index 13a6dd314..edecf7f17 100644
--- a/yuthon_will_task/models/yuthon_will_task.py
+++ b/yuthon_will_task/models/yuthon_will_task.py
@@ -248,7 +248,7 @@ class YuthonWillTask(models.Model):
reminder_employees = self.employee_ids | self.employee_ids2
if not reminder_employees:
return
- old_tasks = self.env['yuthon.dates.task'].search([('yuthon_will_task_id', '=', self.id)])
+ old_tasks = self.env['yuthon.dates.task'].search([('yuthon_will_task_id', '=', self.id), ('task_state', '=', 'to_do')])
if old_tasks:
old_tasks.unlink()
start_hour = float(self.request_hour_from)
diff --git a/yuthon_will_task/views/yuthon_dates_task_views.xml b/yuthon_will_task/views/yuthon_dates_task_views.xml
index 44ba22079..fe55a105a 100644
--- a/yuthon_will_task/views/yuthon_dates_task_views.xml
+++ b/yuthon_will_task/views/yuthon_dates_task_views.xml
@@ -21,10 +21,10 @@
+
+
+
-
-
-
From 302a30e2c8389fb171021bf51fa28139d109d229 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: Thu, 18 Dec 2025 15:47:25 +0800
Subject: [PATCH 03/14] =?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
---
yuthon_holiday/models/inherit_hr_leave.py | 14 +++++---------
yuthon_holiday/views/hr_leave_batch.xml | 2 +-
yuthon_will_task/views/yuthon_dates_task_views.xml | 2 +-
3 files changed, 7 insertions(+), 11 deletions(-)
diff --git a/yuthon_holiday/models/inherit_hr_leave.py b/yuthon_holiday/models/inherit_hr_leave.py
index 1be16707a..b1d54cfda 100644
--- a/yuthon_holiday/models/inherit_hr_leave.py
+++ b/yuthon_holiday/models/inherit_hr_leave.py
@@ -229,6 +229,7 @@ class HrLeave(models.Model):
else:
hours = 0.0
holiday.number_of_hours = hours
+ holiday.leave_hours = hours
if holiday.holiday_status_id.type_of_work == "0":
if holiday.request_hour_from and holiday.request_hour_to:
start_hour = float(holiday.request_hour_from)
@@ -236,13 +237,17 @@ class HrLeave(models.Model):
if start_hour < 12 and end_hour > 12:
hour = end_hour - start_hour - 1
holiday.number_of_hours = hour
+ holiday.leave_hours = hour
elif start_hour == 9 and end_hour == 12:
holiday.number_of_hours = 4
+ holiday.leave_hours = 4
else:
hour = end_hour - start_hour
holiday.number_of_hours = hour
+ holiday.leave_hours = hour
else:
holiday.number_of_hours = 0
+ holiday.leave_hours = 0
# 按天请假
days = holiday.batch_id._compute_duration_day(holiday.holiday_status_id, holiday.request_date_from , holiday.request_date_to)
@@ -686,7 +691,6 @@ class HolidaysRequestBatch(models.Model):
total_days = 0
first_hour_leave = self.hour_leave_ids[0] if self.hour_leave_ids else None
holiday_status_names = []
- # 处理leave_ids:收集假期类型、日期和天数
for leave in self.leave_ids:
# 收集假期类型名称(去重)
if leave.holiday_status_id and leave.holiday_status_id.name:
@@ -700,10 +704,8 @@ class HolidaysRequestBatch(models.Model):
if leave.request_date_to:
all_dates.append(leave.request_date_to)
- # 累加天数
total_days += leave.number_of_days_display if hasattr(leave, 'number_of_days_display') else 0
- # 处理hour_leave_ids:收集日期
for line in self.hour_leave_ids:
if line.request_date_from:
all_dates.append(line.request_date_from)
@@ -721,17 +723,11 @@ class HolidaysRequestBatch(models.Model):
# 生成名称:员工名 + 假期类型 + 日期范围 + 天数/小时
if self.employee_id:
name_parts = [f"{self.employee_id.name}的"]
-
- # 拼接假期类型
if holiday_status_names:
name_parts.append(','.join(holiday_status_names))
-
- # 拼接日期范围
if self.start_date and self.end_date:
date_part = f"{self.start_date.strftime('%Y-%m-%d')}~{self.end_date.strftime('%Y-%m-%d')}"
name_parts.append(date_part)
-
- # 拼接整请假天数
if self.leave_ids:
name_parts.append(f"共计{int(total_days)}天")
diff --git a/yuthon_holiday/views/hr_leave_batch.xml b/yuthon_holiday/views/hr_leave_batch.xml
index 569761cc2..64ebe943e 100644
--- a/yuthon_holiday/views/hr_leave_batch.xml
+++ b/yuthon_holiday/views/hr_leave_batch.xml
@@ -70,6 +70,7 @@
'default_employee_id': employee_id,
}" string=" " style="width: 150%;">
+
@@ -116,7 +117,6 @@
-
diff --git a/yuthon_will_task/views/yuthon_dates_task_views.xml b/yuthon_will_task/views/yuthon_dates_task_views.xml
index fe55a105a..7a3c17076 100644
--- a/yuthon_will_task/views/yuthon_dates_task_views.xml
+++ b/yuthon_will_task/views/yuthon_dates_task_views.xml
@@ -6,7 +6,7 @@
From 138c1de8a45c8d55d91c68bb9a2eb36ae282636c 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: Thu, 18 Dec 2025 15:59:44 +0800
Subject: [PATCH 04/14] =?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
---
yuthon_holiday/models/inherit_hr_leave.py | 34 -------------------
yuthon_holiday/views/hr_leave_batch.xml | 1 -
.../views/yuthon_will_task_views.xml | 2 +-
3 files changed, 1 insertion(+), 36 deletions(-)
diff --git a/yuthon_holiday/models/inherit_hr_leave.py b/yuthon_holiday/models/inherit_hr_leave.py
index b1d54cfda..429e9b969 100644
--- a/yuthon_holiday/models/inherit_hr_leave.py
+++ b/yuthon_holiday/models/inherit_hr_leave.py
@@ -118,32 +118,6 @@ class HrLeave(models.Model):
hour_batch_id = fields.Many2one(string='批量', comodel_name='hr.leave.batch', ondelete='cascade')
leave_documents_ids = fields.Many2many(related='holiday_status_id.leave_documents_id', string="假期详情说明", readonly=True)
details = fields.Text(string="假期流程说明")
- request_hour_from_real = fields.Selection([
- ('0', '0:00'), ('0.5', '0:30'),
- ('1', '01:00'), ('1.5', '01:30'),
- ('2', '02:00'), ('2.5', '02:30'),
- ('3', '03:00'), ('3.5', '03:30'),
- ('4', '04:00'), ('4.5', '04:30'),
- ('5', '05:00'), ('5.5', '05:30'),
- ('6', '06:00'), ('6.5', '06:30'),
- ('7', '07:00'), ('7.5', '07:30'),
- ('8', '08:00'), ('8.5', '08:30'),
- ('9', '09:00'), ('9.5', '09:30'),
- ('10', '10:00'), ('10.5', '10:30'),
- ('11', '11:00'), ('11.5', '11:30'),
- ('12', '12:00'), ('12.5', '12:30'),
- ('13', '13:00'), ('13.5', '13:30'),
- ('14', '14:00'), ('14.5', '14:30'),
- ('15', '15:00'), ('15.5', '15:30'),
- ('16', '16:00'), ('16.5', '16:30'),
- ('17', '17:00'), ('17.5', '17:30'),
- ('18', '18:00'), ('18.5', '18:30'),
- ('19', '19:00'), ('19.5', '19:30'),
- ('20', '20:00'), ('20.5', '20:30'),
- ('21', '21:00'), ('21.5', '21:30'),
- ('22', '22:00'), ('22.5', '22:30'),
- ('23', '23:00'), ('23.5', '23:30')],
- string='实际开始时间', compute='_compute_request_hour_from_real')
# custom_document_ids = fields.Many2many(
# string='文件',
# comodel_name='ir.attachment',
@@ -209,14 +183,6 @@ class HrLeave(models.Model):
for leave in leave_ids:
leave.state = 'draft'
- @api.depends('request_hour_from')
- def _compute_request_hour_from_real(self):
- for record in self:
- if record.request_hour_from == '9':
- record.request_hour_from_real = '8'
- else:
- record.request_hour_from_real = record.request_hour_from
-
@api.depends('date_from', 'date_to', 'resource_calendar_id', 'holiday_status_id.request_unit')
def _compute_duration(self):
super()._compute_duration()
diff --git a/yuthon_holiday/views/hr_leave_batch.xml b/yuthon_holiday/views/hr_leave_batch.xml
index 64ebe943e..e9d0609e3 100644
--- a/yuthon_holiday/views/hr_leave_batch.xml
+++ b/yuthon_holiday/views/hr_leave_batch.xml
@@ -230,7 +230,6 @@
-
diff --git a/yuthon_will_task/views/yuthon_will_task_views.xml b/yuthon_will_task/views/yuthon_will_task_views.xml
index 102ef78d0..c8940b950 100644
--- a/yuthon_will_task/views/yuthon_will_task_views.xml
+++ b/yuthon_will_task/views/yuthon_will_task_views.xml
@@ -255,7 +255,7 @@
领导日程
yuthon.will.task
tree,calendar,form
- [('user_role_ids.name', 'in', ['董事长', '分管领导', '总经理', '部门副经理', '副总经理'])]
+ [('user_role_ids.name', 'in', ['董事长', '分管领导', '总经理', '部门副经理', '副总经理', '司机'])]
{'search_default_next_seven_days': 1}
From f9807cd879529c314bd5af0361cb183d6a8a18d4 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: Thu, 18 Dec 2025 16:17:40 +0800
Subject: [PATCH 05/14] =?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
---
yuthon_property_approval/models/property_lease_contract.py | 2 --
1 file changed, 2 deletions(-)
diff --git a/yuthon_property_approval/models/property_lease_contract.py b/yuthon_property_approval/models/property_lease_contract.py
index 5f2df437d..9717f24aa 100644
--- a/yuthon_property_approval/models/property_lease_contract.py
+++ b/yuthon_property_approval/models/property_lease_contract.py
@@ -1636,7 +1636,6 @@ class PropertyLeaseContract(models.Model):
electricity_list = []
water_list = []
title_address = []
- fee_list = []
for record in rec.lease_ids:
if record.address_id and record.address_id.title_address:
lease_name.append(record.address_id.name)
@@ -1963,7 +1962,6 @@ class PropertyLeaseContract(models.Model):
def _onchange_name(self):
if self.property_name:
self.address_for_delivery = self.property_name
- self.use_address = self.property_name
@api.onchange("admin_id")
def _onchange_admin_id(self):
From 91257fbd8e5a98e09b0d85385a1c418b6fe48660 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: Thu, 18 Dec 2025 16:54:46 +0800
Subject: [PATCH 06/14] =?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
---
.../wizard/choose_property_wizard.py | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/yuthon_property_approval/wizard/choose_property_wizard.py b/yuthon_property_approval/wizard/choose_property_wizard.py
index 3cdb74ad1..bd24128f6 100644
--- a/yuthon_property_approval/wizard/choose_property_wizard.py
+++ b/yuthon_property_approval/wizard/choose_property_wizard.py
@@ -24,6 +24,7 @@ class ChoosePropertyWizard(models.Model):
lease_ids_to_add = []
title_deed = []
title_address = []
+ financial_address_list = []
for record in self.property_ids:
lease_name.append(record.name if record.name is not None else "")
title_addr_name = record.title_address.name if (record.title_address and record.title_address.name) else ""
@@ -50,12 +51,18 @@ class ChoosePropertyWizard(models.Model):
rec.admin_id = admin_id
rec.company_id = company_id
rec.precinct_id = precinct_id
+ fin_addr = record.financial_address if record.financial_address else ""
+ if fin_addr: # 仅添加非空地址
+ financial_address_list.append(fin_addr)
existing_names = []
for lease in self.lease_contract_id.lease_ids:
if lease.address_id:
name_val = lease.address_id.name
existing_names.append(name_val if name_val is not None else "无")
+ fin_addr_exist = lease.address_id.financial_address if lease.address_id.financial_address else ""
+ if fin_addr_exist:
+ financial_address_list.append(fin_addr_exist)
title_name = []
for lease in self.lease_contract_id.lease_ids:
@@ -63,9 +70,9 @@ class ChoosePropertyWizard(models.Model):
addr_name = lease.address_id.title_address.name if (lease.address_id.title_address and lease.address_id.title_address.name) else ""
title_name.append(str(addr_name))
- # 过滤空字符串,避免拼接时出现空内容
all_names = [name for name in list(set(existing_names + lease_name)) if name]
title_address_combined = [addr for addr in list(set(title_address + title_name)) if addr]
+ use_address_combined = [addr for addr in list(set(financial_address_list)) if addr]
existing_lease_ids = [(4, lease.id) for lease in self.lease_contract_id.lease_ids]
@@ -77,7 +84,7 @@ class ChoosePropertyWizard(models.Model):
'title_address': ','.join(title_address_combined),
'lessor_id': self.lease_contract_id.lease_ids[0].address_id.company_id.id
if self.lease_contract_id.lease_ids else False,
- 'use_address': ','.join(all_names),
+ 'use_address': ','.join(use_address_combined),
'address_for_delivery': ','.join(all_names),
'total_area': sum([lease.property_area for lease in rec.lease_ids])
})
From 6807ea63783ba8ed8b0d1236020164fd62fa364a 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: Thu, 18 Dec 2025 17:03:28 +0800
Subject: [PATCH 07/14] =?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
---
yuthon_hr_employee/views/yuthon_hr_employee_views.xml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
index c7584139e..bac66ee1e 100644
--- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
+++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
@@ -574,7 +574,7 @@
-
+
@@ -659,7 +659,6 @@
会员列表
hr.employee
[('is_membership', '=', True), ('is_company', '=', True)]
- {'header_search_default_user_state': 1}
tree,kanban,form,search
- 时间
- 至
+
+ →
@@ -174,9 +174,9 @@
时间
+ style="max-width: 10rem !important;"/>
至
+ style="max-width: 5rem !important;"/>→
From a58367177545ff5d857639c679c678df5a15c941 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: Thu, 18 Dec 2025 17:58:08 +0800
Subject: [PATCH 09/14] =?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
---
soong_workflow/wizard/soong_workflow_comment_wizard.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py
index 987fd467a..a81a1bab8 100644
--- a/soong_workflow/wizard/soong_workflow_comment_wizard.py
+++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py
@@ -145,8 +145,8 @@ class SoongWorkflowCommentWizard(models.TransientModel):
for idx, link in enumerate(sorted_all_links):
if link.id == current_link.id and link.sequence == current_link.sequence:
approvers = self._get_approvers_for_link(link, record_id)
- if not approvers:
- invalid_links |= link
+ # if not approvers:
+ # invalid_links |= link
if record_id.log_ids2:
log_records = record_id.log_ids2
From 98a20f84ff0eaa391749b1ddeeb40da336b32797 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: Thu, 18 Dec 2025 18:06:31 +0800
Subject: [PATCH 10/14] =?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
---
soong_workflow/views/soong_workflow_record.xml | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/soong_workflow/views/soong_workflow_record.xml b/soong_workflow/views/soong_workflow_record.xml
index c03a8c85c..ba7dc3a8b 100644
--- a/soong_workflow/views/soong_workflow_record.xml
+++ b/soong_workflow/views/soong_workflow_record.xml
@@ -18,7 +18,7 @@
-
+
@@ -51,7 +51,9 @@
-
+
+
+
From 95554ddf7e99f30734403e074789b59be2c0a391 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, 19 Dec 2025 09:32:04 +0800
Subject: [PATCH 11/14] =?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
---
yuthon_will_task/models/yuthon_will_task.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/yuthon_will_task/models/yuthon_will_task.py b/yuthon_will_task/models/yuthon_will_task.py
index edecf7f17..ee4c93af6 100644
--- a/yuthon_will_task/models/yuthon_will_task.py
+++ b/yuthon_will_task/models/yuthon_will_task.py
@@ -176,12 +176,10 @@ class YuthonWillTask(models.Model):
def add_comment(self):
"日程定时任务提醒"
now = fields.datetime.now() + timedelta(hours=8)
- _logger.info(f'定时任务已执行:当前提醒时间:{now}')
dates_task_ids = self.env['yuthon.dates.task'].search([('task_state', '=', 'to_do'), ('reminder_time', '<', fields.datetime.now() + timedelta(days=1))])
for task in dates_task_ids:
hour1 = (task.reminder_time + timedelta(hours=8)).hour
minute1 = (task.reminder_time + timedelta(hours=8)).minute
- _logger.info(f'任务实际小时:{hour1}:{minute1}\n 当前提醒小时:{now.hour}:{now.minute}')
if minute1 == now.minute and hour1 == now.hour:
task.write({'task_state': 'done'})
will_id = task.yuthon_will_task_id
@@ -269,6 +267,9 @@ class YuthonWillTask(models.Model):
elif unit == '天':
reminder_hours = num * 24.0
reminder_datetime = task_start_datetime - timedelta(hours=reminder_hours)
+ now = fields.datetime.now() + timedelta(hours=8)
+ if now > reminder_datetime:
+ continue
existing_dates_task = self.env['yuthon.dates.task'].search([
('yuthon_will_task_id', '=', self.id),
('reminder_time', '=', reminder_datetime)
From bca58db8a1e7d16ff8110972bde2a0497e420e62 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, 19 Dec 2025 10:07:11 +0800
Subject: [PATCH 12/14] =?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
---
yuthon_property_approval/__manifest__.py | 1 +
.../models/inherit_yuthon_property.py | 11 +++-
.../security/ir.model.access.csv | 3 +-
yuthon_property_approval/wizard/__init__.py | 3 +-
.../wizard/action_refuse_wizard.py | 51 +++++++++++++++++++
.../wizard/action_refuse_wizard_views.xml | 22 ++++++++
6 files changed, 88 insertions(+), 3 deletions(-)
create mode 100644 yuthon_property_approval/wizard/action_refuse_wizard.py
create mode 100644 yuthon_property_approval/wizard/action_refuse_wizard_views.xml
diff --git a/yuthon_property_approval/__manifest__.py b/yuthon_property_approval/__manifest__.py
index 332fdab41..520e6db7e 100644
--- a/yuthon_property_approval/__manifest__.py
+++ b/yuthon_property_approval/__manifest__.py
@@ -94,6 +94,7 @@
'wizard/contract_signature_wizard_viwes.xml',
'wizard/penalty_line_wizard_viwes.xml',
'wizard/build_pop_wizard_viwes.xml',
+ 'wizard/action_refuse_wizard_views.xml',
'wizard/property_bills_wizard_views.xml',
'wizard/property_meeting_wizard_views.xml',
'views/property_menu_all.xml',
diff --git a/yuthon_property_approval/models/inherit_yuthon_property.py b/yuthon_property_approval/models/inherit_yuthon_property.py
index 36cfbbd7e..3e4244fde 100644
--- a/yuthon_property_approval/models/inherit_yuthon_property.py
+++ b/yuthon_property_approval/models/inherit_yuthon_property.py
@@ -873,7 +873,16 @@ class PropertyAccountsReceivable(models.Model):
valid_management_types = list(model_type_data.values())
for rec in archives_ids:
if rec.is_reconciliation == True:
- raise UserError("已对账的记录不能退回!请先银行流水撤销再退回")
+ return {
+ "name": "批量退回提醒弹窗",
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'action.refuse.wizard',
+ "view_mode": "form",
+ 'target': 'new',
+ 'context': {
+ 'default_receivable_ids': archives_ids.ids,
+ }
+ }
model_type = model_type_data.get(rec.management_type_id.name)
if model_type not in valid_management_types:
rec.unlink()
diff --git a/yuthon_property_approval/security/ir.model.access.csv b/yuthon_property_approval/security/ir.model.access.csv
index 654d19221..95063af1f 100644
--- a/yuthon_property_approval/security/ir.model.access.csv
+++ b/yuthon_property_approval/security/ir.model.access.csv
@@ -121,4 +121,5 @@ access_property_bills_line,property_bills_line,model_property_bills_line,base.gr
access_property_payment_notice,property_payment_notice,model_property_payment_notice,base.group_user,1,1,1,1
access_print_payment_wizard,print_payment_wizard,model_print_payment_wizard,base.group_user,1,1,1,1
access_property_bills_list,property_bills_list,model_property_bills_list,base.group_user,1,1,1,1
-access_property_bills_wizard,property_bills_wizard,model_property_bills_wizard,base.group_user,1,1,1,1
\ No newline at end of file
+access_property_bills_wizard,property_bills_wizard,model_property_bills_wizard,base.group_user,1,1,1,1
+access_action_refuse_wizard,action_refuse_wizard,model_action_refuse_wizard,base.group_user,1,1,1,1
\ No newline at end of file
diff --git a/yuthon_property_approval/wizard/__init__.py b/yuthon_property_approval/wizard/__init__.py
index c7b3bb482..c2e72931d 100644
--- a/yuthon_property_approval/wizard/__init__.py
+++ b/yuthon_property_approval/wizard/__init__.py
@@ -13,4 +13,5 @@ from . import contract_signature_wizard
from . import build_pop_wizard
from . import penalty_line_wizard
from . import print_payment_wizard
-from . import property_bills_wizard
\ No newline at end of file
+from . import property_bills_wizard
+from . import action_refuse_wizard
\ No newline at end of file
diff --git a/yuthon_property_approval/wizard/action_refuse_wizard.py b/yuthon_property_approval/wizard/action_refuse_wizard.py
new file mode 100644
index 000000000..6eec72c1e
--- /dev/null
+++ b/yuthon_property_approval/wizard/action_refuse_wizard.py
@@ -0,0 +1,51 @@
+from odoo import models, fields, api, _, SUPERUSER_ID
+from odoo.exceptions import UserError, ValidationError
+from datetime import datetime, timedelta, date
+from dateutil.relativedelta import relativedelta
+
+
+class ActionRefuseWizard(models.TransientModel):
+ _name = 'action.refuse.wizard'
+ _description = '批量退回提醒弹窗'
+
+ receivable_ids = fields.Many2many('property.accounts.receivable', string='关联应收账单')
+
+ def confirm(self):
+ model_type_data = {
+ '水费': 'meter.water.line',
+ '电费': 'meter.archives.line',
+ '押金': 'property.deposit.list',
+ '租金': 'property.rent.list',
+ '管理费': 'property.management.list',
+ }
+ for rec in self.receivable_ids:
+ if rec.is_reconciliation == True:
+ continue
+ model_type = model_type_data.get(rec.management_type_id.name)
+ valid_management_types = list(model_type_data.values())
+ if model_type not in valid_management_types:
+ rec.unlink()
+ continue
+ if model_type in ('meter.archives.line', 'meter.water.line'):
+ if not rec.charging_range:
+ raise UserError("请输入计费区间, 按照应为'YYYY-MM-DD 到 YYYY-MM-DD格式")
+ charging_range = rec.charging_range.strip()
+ start_str, end_str = [x.strip() for x in charging_range.split("到")]
+ start_date = (datetime.strptime(end_str, "%Y-%m-%d").date()).replace(day=1)
+ end_date = datetime.strptime(end_str, "%Y-%m-%d").date()
+ model_id = self.env[model_type].search([
+ ('contract_id', '=', rec.contract_id.id),
+ ('meter_date', '>=', start_date),
+ ('meter_date', '<=', end_date)
+ ])
+ else:
+ last_day = rec.due_date + relativedelta(months=1) - timedelta(days=1)
+ model_id = self.env[model_type].search([
+ ('contract_id', '=', rec.contract_id.id),
+ ('due_date', '>=', rec.due_date),
+ ('due_date', '<=', last_day)
+ ])
+
+ if model_id:
+ model_id.write({'is_push': False})
+ rec.unlink()
\ No newline at end of file
diff --git a/yuthon_property_approval/wizard/action_refuse_wizard_views.xml b/yuthon_property_approval/wizard/action_refuse_wizard_views.xml
new file mode 100644
index 000000000..20aceb636
--- /dev/null
+++ b/yuthon_property_approval/wizard/action_refuse_wizard_views.xml
@@ -0,0 +1,22 @@
+
+
+
+ action.refuse.wizard.form
+ action.refuse.wizard
+
+
+
+
+
\ No newline at end of file
From ac001d444e450413fb1b062818ae7e9bedae9465 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, 19 Dec 2025 10:54:46 +0800
Subject: [PATCH 13/14] =?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
---
.../views/yuthon_hr_employee_views.xml | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
index bac66ee1e..035bb0bdd 100644
--- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
+++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml
@@ -564,6 +564,16 @@
+
+ hr.employee.search
+ hr.employee
+
+
+
+
+
+
+
hr.employee.member
@@ -591,7 +601,6 @@
-
@@ -663,6 +672,7 @@
+
tree,kanban,form,activity,graph,pivot,hierarchy
From 7cff04e0de33e09946c2b9ed143082d70f47fe07 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, 19 Dec 2025 15:24:31 +0800
Subject: [PATCH 14/14] =?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
---
.../{ => header_search_panel}/README.md | 19 +-
.../{ => header_search_panel}/__init__.py | 0
.../{ => header_search_panel}/__manifest__.py | 0
.../override_relaxng.py | 0
.../rng/search_view.rng | 0
.../static/src/legacy/backend_utils.js | 33 +++
.../src/search/control_panel/control_panel.js | 0
.../search/control_panel/control_panel.scss | 0
.../search/control_panel/control_panel.xml | 0
.../boolean_filter/boolean_filter.js | 0
.../boolean_filter/boolean_filter.xml | 0
.../fields_filter/char_filter/char_filter.js | 54 +++++
.../fields_filter/char_filter/char_filter.xml | 15 ++
.../fields_filter/date_filter/date_filter.js | 37 ++-
.../fields_filter/date_filter/date_filter.xml | 37 +++
.../components/fields_filter/fields_filter.js | 15 ++
.../fields_filter/fields_filter.xml | 0
.../many2one_filter/many2one_filter.js | 1 +
.../many2one_filter/many2one_filter.xml | 0
.../selection_filter/selection_filter.js | 0
.../selection_filter/selection_filter.xml | 0
.../standard_field_filter_props.js | 2 +
.../x2many_filter/x2many_filter.js | 0
.../x2many_filter/x2many_filter.xml | 0
.../components/quick_filter/quick_filter.js | 0
.../components/quick_filter/quick_filter.xml | 4 +-
.../quick_filter/quick_filter_label.scss | 0
.../select_date_filter/select_date_filter.js | 0
.../select_date_filter/select_date_filter.xml | 0
.../header_search/header_search_filter.js | 0
.../header_search/header_search_filter.scss | 14 +-
.../header_search/header_search_filter.xml | 0
.../static/src/search/search_arch_parser.js | 14 +-
.../static/src/search/search_model.js | 0
header_search_panel/model_test/__init__.py | 4 +
.../model_test/__manifest__.py | 21 ++
.../model_test/controllers/__init__.py | 3 +
.../model_test/controllers/controllers.py | 21 ++
.../model_test/models/__init__.py | 3 +
.../model_test/models/models.py | 211 ++++++++++++++++++
.../model_test/security/ir.model.access.csv | 3 +
.../model_test/static/src/model_test_list.xml | 17 ++
.../static/src/model_test_list_controller.js | 10 +
.../model_test/views/views.xml | 126 +++++++++++
.../fields_filter/date_filter/date_filter.xml | 30 ---
45 files changed, 636 insertions(+), 58 deletions(-)
rename header_search_panel/{ => header_search_panel}/README.md (79%)
rename header_search_panel/{ => header_search_panel}/__init__.py (100%)
rename header_search_panel/{ => header_search_panel}/__manifest__.py (100%)
rename header_search_panel/{ => header_search_panel}/override_relaxng.py (100%)
rename header_search_panel/{ => header_search_panel}/rng/search_view.rng (100%)
create mode 100644 header_search_panel/header_search_panel/static/src/legacy/backend_utils.js
rename header_search_panel/{ => header_search_panel}/static/src/search/control_panel/control_panel.js (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/control_panel/control_panel.scss (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/control_panel/control_panel.xml (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/boolean_filter/boolean_filter.js (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/boolean_filter/boolean_filter.xml (100%)
create mode 100644 header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/char_filter/char_filter.js
create mode 100644 header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/char_filter/char_filter.xml
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/date_filter/date_filter.js (65%)
create mode 100644 header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.xml
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/fields_filter.js (93%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/fields_filter.xml (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.js (98%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.xml (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/selection_filter/selection_filter.js (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/selection_filter/selection_filter.xml (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/standard_field_filter_props.js (88%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/x2many_filter/x2many_filter.js (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/fields_filter/x2many_filter/x2many_filter.xml (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/quick_filter/quick_filter.js (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/quick_filter/quick_filter.xml (92%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/quick_filter/quick_filter_label.scss (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/select_date_filter/select_date_filter.js (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/components/select_date_filter/select_date_filter.xml (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/header_search_filter.js (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/header_search_filter.scss (96%)
rename header_search_panel/{ => header_search_panel}/static/src/search/header_search/header_search_filter.xml (100%)
rename header_search_panel/{ => header_search_panel}/static/src/search/search_arch_parser.js (96%)
rename header_search_panel/{ => header_search_panel}/static/src/search/search_model.js (100%)
create mode 100644 header_search_panel/model_test/__init__.py
create mode 100644 header_search_panel/model_test/__manifest__.py
create mode 100644 header_search_panel/model_test/controllers/__init__.py
create mode 100644 header_search_panel/model_test/controllers/controllers.py
create mode 100644 header_search_panel/model_test/models/__init__.py
create mode 100644 header_search_panel/model_test/models/models.py
create mode 100644 header_search_panel/model_test/security/ir.model.access.csv
create mode 100644 header_search_panel/model_test/static/src/model_test_list.xml
create mode 100644 header_search_panel/model_test/static/src/model_test_list_controller.js
create mode 100644 header_search_panel/model_test/views/views.xml
delete mode 100644 header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.xml
diff --git a/header_search_panel/README.md b/header_search_panel/header_search_panel/README.md
similarity index 79%
rename from header_search_panel/README.md
rename to header_search_panel/header_search_panel/README.md
index 5339e4749..9e9d7b0bf 100644
--- a/header_search_panel/README.md
+++ b/header_search_panel/header_search_panel/README.md
@@ -6,7 +6,7 @@
- 快捷筛选(quick_filter)
- 自选时间筛选(select_date_filter)(待移植)
-- 字段搜索(field)(待移植)
+- 字段搜索(field)(已移植)
通过这些筛选标签,用户可以更灵活地对列表视图中的数据进行筛选。
@@ -20,9 +20,9 @@
#### 支持的属性:
-| 属性名 | 类型 | 说明 | 是否可选 |
-| ------- | ------ | ---------- | ---- |
-| `class` | String | 自定义 CSS 类名 | ✅ |
+| 属性名 | 类型 | 说明 | 是否可选 |
+| ------- | ------ |-------------------------------------------------------------------| ---- |
+| `class` | String | 自定义 CSS 类名,
可使用class="header-search-inline"使所有筛选在同一行并根据宽度自动换行 | ✅ |
#### 子标签支持:
@@ -56,7 +56,7 @@
| ----------- | ------- | ----------- | ------------ |
| `class` | String | 自定义 CSS 类名 | ✅ |
| `string` | String | 显示的标头名称 | ✅ |
-| `invisible` | Boolean | 是否默认隐藏 | ✅ |
+| `invisible` | Boolean | 是否默认隐藏(废弃) | ✅ |
| `options` | JSON | 扩展参数,支持以下参数: | ✅ |
| | | `radio`: 是否单选 | |
| | | `no_label`: 不显示标题 | |
@@ -77,16 +77,16 @@
---
-### 3. 自选时间筛选 (select_date_filter)
+### 3. 自选时间筛选 (select_date_filter)(废弃)
**标签名:** `select_date_filter`
#### 支持的属性:
| 属性名 | 类型 | 说明 | 是否可选 |
-| ------------------- | ------- | -------------- | ---- |
+| ------------------- | ------- |----------------| ---- |
| `class` | String | 自定义 CSS 类名 | ✅ |
-| `invisible` | Boolean | 是否默认隐藏 | ✅ |
+| `invisible` | Boolean | 是否默认隐藏(废弃) | ✅ |
| `allow_date_fields` | String | 允许筛选的时间字段,逗号分隔 | ✅ |
#### 示例:
@@ -109,6 +109,9 @@
| `string` | String | 显示的标头名称 | ✅ |
| `class` | String | 自定义 CSS | ✅ |
| `invisible` | Boolean | 是否默认隐藏 | ✅ |
+| `options` | JSON | 扩展参数,支持以下参数: | ✅ |
+| | | `radio`: 是否单选 | |
+| | | `no_label`: 不显示标题 | |
#### 示例:
diff --git a/header_search_panel/__init__.py b/header_search_panel/header_search_panel/__init__.py
similarity index 100%
rename from header_search_panel/__init__.py
rename to header_search_panel/header_search_panel/__init__.py
diff --git a/header_search_panel/__manifest__.py b/header_search_panel/header_search_panel/__manifest__.py
similarity index 100%
rename from header_search_panel/__manifest__.py
rename to header_search_panel/header_search_panel/__manifest__.py
diff --git a/header_search_panel/override_relaxng.py b/header_search_panel/header_search_panel/override_relaxng.py
similarity index 100%
rename from header_search_panel/override_relaxng.py
rename to header_search_panel/header_search_panel/override_relaxng.py
diff --git a/header_search_panel/rng/search_view.rng b/header_search_panel/header_search_panel/rng/search_view.rng
similarity index 100%
rename from header_search_panel/rng/search_view.rng
rename to header_search_panel/header_search_panel/rng/search_view.rng
diff --git a/header_search_panel/header_search_panel/static/src/legacy/backend_utils.js b/header_search_panel/header_search_panel/static/src/legacy/backend_utils.js
new file mode 100644
index 000000000..6f77264e2
--- /dev/null
+++ b/header_search_panel/header_search_panel/static/src/legacy/backend_utils.js
@@ -0,0 +1,33 @@
+/** @odoo-module **/
+//
+// import {patch} from "@web/core/utils/patch";
+// import * as backend_utils from "@web/legacy/backend_utils";
+//
+// const originalSearchModelStateToLegacy = backend_utils.searchModelStateToLegacy;
+// const originalGetGlobalState = backend_utils.getGlobalState;
+//
+// patch(backend_utils, "header_search_panel.backend_utils", {
+// searchModelStateToLegacy(state) {
+// // 原始state
+// const originalState = JSON.parse(state);
+// // 获取原始state
+// let legacyState = JSON.parse(originalSearchModelStateToLegacy(state));
+// if (originalState.headerSearchInfo) {
+// legacyState.HeaderSearchInfo = originalState.headerSearchInfo;
+// }
+// return JSON.stringify(legacyState)
+// },
+//
+// getGlobalState(legacyControllerState) {
+// // 原始search model
+// const originalSearchModel = JSON.parse(legacyControllerState.searchModel)
+// let globalState = originalGetGlobalState(legacyControllerState);
+// let searchModel = JSON.parse(globalState?.searchModel || "{}");
+// if (originalSearchModel.HeaderSearchInfo) {
+// searchModel.headerSearchInfo = originalSearchModel.HeaderSearchInfo;
+// globalState.searchModel = JSON.stringify(searchModel)
+// }
+// console.log('headerSearchInfo: getGlobalState')
+// return globalState
+// },
+// })
\ No newline at end of file
diff --git a/header_search_panel/static/src/search/control_panel/control_panel.js b/header_search_panel/header_search_panel/static/src/search/control_panel/control_panel.js
similarity index 100%
rename from header_search_panel/static/src/search/control_panel/control_panel.js
rename to header_search_panel/header_search_panel/static/src/search/control_panel/control_panel.js
diff --git a/header_search_panel/static/src/search/control_panel/control_panel.scss b/header_search_panel/header_search_panel/static/src/search/control_panel/control_panel.scss
similarity index 100%
rename from header_search_panel/static/src/search/control_panel/control_panel.scss
rename to header_search_panel/header_search_panel/static/src/search/control_panel/control_panel.scss
diff --git a/header_search_panel/static/src/search/control_panel/control_panel.xml b/header_search_panel/header_search_panel/static/src/search/control_panel/control_panel.xml
similarity index 100%
rename from header_search_panel/static/src/search/control_panel/control_panel.xml
rename to header_search_panel/header_search_panel/static/src/search/control_panel/control_panel.xml
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/boolean_filter/boolean_filter.js b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/boolean_filter/boolean_filter.js
similarity index 100%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/boolean_filter/boolean_filter.js
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/boolean_filter/boolean_filter.js
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/boolean_filter/boolean_filter.xml b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/boolean_filter/boolean_filter.xml
similarity index 100%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/boolean_filter/boolean_filter.xml
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/boolean_filter/boolean_filter.xml
diff --git a/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/char_filter/char_filter.js b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/char_filter/char_filter.js
new file mode 100644
index 000000000..80cceca3a
--- /dev/null
+++ b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/char_filter/char_filter.js
@@ -0,0 +1,54 @@
+/** @odoo-module **/
+
+import { Component } from "@odoo/owl";
+import { Domain } from "@web/core/domain";
+import { useService } from "@web/core/utils/hooks";
+import { Many2XAutocomplete } from "@web/views/fields/relational_utils";
+import { standardFieldFilterProps } from "../standard_field_filter_props.js"
+
+
+export class CharFilter extends Component {
+ setup() {
+ super.setup();
+ this.rpc = useService("rpc");
+ this.activeValues = this.env.searchModel.headerSearchInfo.FieldsFilter[this.props.id]?.activeValues || undefined;
+ }
+
+ /**
+ * 设置筛选字段的值
+ */
+ setActiveValues(ev) {
+ this.activeValues = ev.target.value;
+ }
+
+ /**
+ * 获取筛选字段的domain
+ */
+ get domain() {
+ return this.activeValues ? [[this.props.name, "ilike", this.activeValues]]: [];
+ }
+
+ /**
+ * 点击清空筛选时触发
+ */
+ resetFilter() {
+ // 清空筛选字段的值
+ this.activeValues = undefined;
+ this.props.fieldOnchange({fieldDomainList: this.domain, activeValues: this.activeValues});
+ }
+
+ getDomain() {
+ return new Domain(this.props.domain).toList({});
+ }
+
+ async onInputChange(ev) {
+ this.setActiveValues(ev);
+ this.props.fieldOnchange({fieldDomainList: this.domain, activeValues: this.activeValues});
+ }
+}
+
+CharFilter.template = "header_search_panel.CharFilter";
+CharFilter.components = {};
+CharFilter.props = {
+ ...standardFieldFilterProps,
+};
diff --git a/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/char_filter/char_filter.xml b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/char_filter/char_filter.xml
new file mode 100644
index 000000000..66f439179
--- /dev/null
+++ b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/char_filter/char_filter.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.js b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.js
similarity index 65%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.js
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.js
index e72c40f44..d27ef8ff0 100644
--- a/header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.js
+++ b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.js
@@ -1,8 +1,9 @@
/** @odoo-module **/
-import {Component} from "@odoo/owl";
-import {Domain} from "@web/core/domain";
-import {standardFieldFilterProps} from "../standard_field_filter_props.js"
+import { Component } from "@odoo/owl";
+import { DateTimeInput } from "@web/core/datetime/datetime_input";
+import { deserializeDate } from "@web/core/l10n/dates";
+import { standardFieldFilterProps } from "../standard_field_filter_props.js"
export class DateFilter extends Component {
setup() {
@@ -13,13 +14,21 @@ export class DateFilter extends Component {
this.endDate = this.env.searchModel.headerSearchInfo.FieldsFilter[this.props.id]?.endDate;
}
+ get dateFrom() {
+ return this.startDate ? deserializeDate(this.startDate): undefined;
+ }
+
+ get dateTo() {
+ return this.endDate ? deserializeDate(this.endDate): undefined;
+ }
+
// 设置筛选字段的值
- setActiveValues(ev) {
- const value = ev.target.value;
- if (ev.target.id === this.props.id + "_start_date") {
+ setActiveValues(dateValue, type) {
+ const value = dateValue ? (this.props.type === "datetime" ? dateValue.toFormat("yyyy-MM-dd HH:mm:ss") : dateValue.toFormat("yyyy-MM-dd")) : undefined;
+ if (type === "startDate") {
this.startDate = value
}
- if (ev.target.id === this.props.id + "_end_date") {
+ if (type === "endDate") {
this.endDate = value
}
}
@@ -41,9 +50,14 @@ export class DateFilter extends Component {
return domain
}
- // 点击日期选择器时触发
- dateOnchange(ev) {
- this.setActiveValues(ev);
+ startDateOnchange (startDate) {
+ this.setActiveValues(startDate, "startDate");
+ this.props.fieldOnchange({fieldDomainList: this.domain, startDate: this.startDate, endDate: this.endDate});
+
+ }
+
+ endDateOnchange (endDate) {
+ this.setActiveValues(endDate, "endDate");
this.props.fieldOnchange({fieldDomainList: this.domain, startDate: this.startDate, endDate: this.endDate});
}
@@ -67,6 +81,9 @@ export class DateFilter extends Component {
}
DateFilter.template = "header_search_panel.DateFilter";
+DateFilter.components = {
+ DateTimeInput,
+};
DateFilter.props = {
...standardFieldFilterProps,
};
diff --git a/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.xml b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.xml
new file mode 100644
index 000000000..bf86c13a4
--- /dev/null
+++ b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/date_filter/date_filter.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/fields_filter.js b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/fields_filter.js
similarity index 93%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/fields_filter.js
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/fields_filter.js
index c70c0878c..0295ec005 100644
--- a/header_search_panel/static/src/search/header_search/components/fields_filter/fields_filter.js
+++ b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/fields_filter.js
@@ -8,6 +8,7 @@ import { BooleanFilter } from "./boolean_filter/boolean_filter";
import { DateFilter } from "./date_filter/date_filter";
import { Many2oneFilter } from "./many2one_filter/many2one_filter";
import { X2ManyFilterFilter } from "./x2many_filter/x2many_filter";
+import { CharFilter } from "./char_filter/char_filter";
const fieldRegistry = registry.category("fields");
@@ -41,6 +42,9 @@ export class FieldsFilter extends Component {
case "one2many":
this.addX2ManyFieldDependencies(fieldInfo)
break;
+ case "char":
+ this.addCharFieldDependencies(fieldInfo)
+ break;
}
return fieldInfo;
}
@@ -65,6 +69,9 @@ export class FieldsFilter extends Component {
case "many2many":
case "one2many":
return X2ManyFilterFilter;
+ case "char":
+ return CharFilter;
+
}
}
@@ -128,6 +135,7 @@ export class FieldsFilter extends Component {
domain: field.fieldDomain || "[]",
fieldString: field.fieldString,
searchLimit: field.fieldOptions?.search_limit || 10,
+ placeholder: field.placeholder,
}
this._addFieldBaseProps(field.props, field);
}
@@ -144,6 +152,13 @@ export class FieldsFilter extends Component {
this._addFieldBaseProps(field.props, field);
}
+ addCharFieldDependencies(field) {
+ field.Component = this._getComponent(field);
+ // 组件props
+ field.props = {};
+ this._addFieldBaseProps(field.props, field);
+ }
+
// 筛选字段的onChange事件,将筛选字段的id和domain传给searchModel
fieldFilterOnchange(fieldsFilterId, fieldsFilterInfo) {
if (fieldsFilterInfo?.fieldDomainList){
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/fields_filter.xml b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/fields_filter.xml
similarity index 100%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/fields_filter.xml
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/fields_filter.xml
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.js b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.js
similarity index 98%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.js
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.js
index 1c80a1a04..4db0404ab 100644
--- a/header_search_panel/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.js
+++ b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.js
@@ -104,6 +104,7 @@ export class Many2oneFilter extends Component {
activeActions: {create: false, createEdit: false, write: false},
fieldString: this.props.fieldString,
searchLimit: this.props.searchLimit,
+ placeholder: this.props.placeholder,
};
}
}
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.xml b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.xml
similarity index 100%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.xml
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/many2one_filter/many2one_filter.xml
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/selection_filter/selection_filter.js b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/selection_filter/selection_filter.js
similarity index 100%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/selection_filter/selection_filter.js
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/selection_filter/selection_filter.js
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/selection_filter/selection_filter.xml b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/selection_filter/selection_filter.xml
similarity index 100%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/selection_filter/selection_filter.xml
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/selection_filter/selection_filter.xml
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/standard_field_filter_props.js b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/standard_field_filter_props.js
similarity index 88%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/standard_field_filter_props.js
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/standard_field_filter_props.js
index 231ebf6b4..2fa7705c2 100644
--- a/header_search_panel/static/src/search/header_search/components/fields_filter/standard_field_filter_props.js
+++ b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/standard_field_filter_props.js
@@ -13,4 +13,6 @@ export const standardFieldFilterProps = {
type: {type: String, required: true},
// 字段变换监听函数
fieldOnchange: { type: Function, required: true },
+ // 提示
+ placeholder: {type: String, optional: true},
};
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/x2many_filter/x2many_filter.js b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/x2many_filter/x2many_filter.js
similarity index 100%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/x2many_filter/x2many_filter.js
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/x2many_filter/x2many_filter.js
diff --git a/header_search_panel/static/src/search/header_search/components/fields_filter/x2many_filter/x2many_filter.xml b/header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/x2many_filter/x2many_filter.xml
similarity index 100%
rename from header_search_panel/static/src/search/header_search/components/fields_filter/x2many_filter/x2many_filter.xml
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/fields_filter/x2many_filter/x2many_filter.xml
diff --git a/header_search_panel/static/src/search/header_search/components/quick_filter/quick_filter.js b/header_search_panel/header_search_panel/static/src/search/header_search/components/quick_filter/quick_filter.js
similarity index 100%
rename from header_search_panel/static/src/search/header_search/components/quick_filter/quick_filter.js
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/quick_filter/quick_filter.js
diff --git a/header_search_panel/static/src/search/header_search/components/quick_filter/quick_filter.xml b/header_search_panel/header_search_panel/static/src/search/header_search/components/quick_filter/quick_filter.xml
similarity index 92%
rename from header_search_panel/static/src/search/header_search/components/quick_filter/quick_filter.xml
rename to header_search_panel/header_search_panel/static/src/search/header_search/components/quick_filter/quick_filter.xml
index 17da74122..7ea0d8bbe 100644
--- a/header_search_panel/static/src/search/header_search/components/quick_filter/quick_filter.xml
+++ b/header_search_panel/header_search_panel/static/src/search/header_search/components/quick_filter/quick_filter.xml
@@ -2,11 +2,11 @@
-
+