diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py
index f187d506..92736757 100644
--- a/sf_manufacturing/models/mrp_workorder.py
+++ b/sf_manufacturing/models/mrp_workorder.py
@@ -19,7 +19,6 @@ from odoo.addons.sf_mrs_connect.models.ftp_operate import FtpController
class ResMrpWorkOrder(models.Model):
_inherit = 'mrp.workorder'
- _order = 'sequence asc'
_description = '工单'
product_tmpl_name = fields.Char('坯料产品名称', related='production_bom_id.bom_line_ids.product_id.name')
@@ -1750,6 +1749,35 @@ class ResMrpWorkOrder(models.Model):
self.check_ids.filtered(lambda ch: ch.is_inspect is True and ch.quality_state == 'waiting').write(
{'quality_state': 'none'})
+ @api.model
+ def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
+ aggregate_field = 'create_date:max'
+ if aggregate_field not in fields:
+ fields.append(aggregate_field)
+ res = super(ResMrpWorkOrder, self).read_group(
+ domain, fields, groupby, offset=offset, limit=limit, orderby=orderby, lazy=lazy
+ )
+ sorted_res = sorted(
+ res,
+ key=lambda x: self.parse_datetime(x.get('create_date', '')),
+ reverse=True
+ )
+ return sorted_res
+
+ def parse_datetime(self, value):
+ """将字符串转换为 datetime 对象,处理空值和无效格式"""
+ if not value:
+ return datetime.min # 返回最小日期时间,确保排序稳定
+ try:
+ # 假设 value 是字符串(如 "2023-10-01 12:00:00")
+ return datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
+ except (TypeError, ValueError):
+ # 如果已经是 datetime 对象,直接返回
+ if isinstance(value, datetime):
+ return value
+ # 其他无效格式返回最小日期时间
+ return datetime.min
+
class CNCprocessing(models.Model):
_name = 'sf.cnc.processing'
diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py
index 2bf1ea35..ed9adec8 100644
--- a/sf_manufacturing/models/stock.py
+++ b/sf_manufacturing/models/stock.py
@@ -755,6 +755,23 @@ class StockPicking(models.Model):
if move_id.product_id.tracking in ['serial', 'lot'] and not move_id.move_line_nosuggest_ids:
move_id.action_show_details()
+ @api.model
+ def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
+ aggregate_field = 'create_date:max'
+ if aggregate_field not in fields:
+ fields.append(aggregate_field)
+ res = super(StockPicking, self).read_group(
+ domain, fields, groupby, offset=offset, limit=limit, orderby=orderby, lazy=lazy
+ )
+ sorted_res = sorted(
+ res,
+ key=lambda x: self.env['mrp.workorder'].sudo().parse_datetime(x.get('create_date', '')),
+ reverse=True
+ )
+ return sorted_res
+
+
+
class ReStockMove(models.Model):
_inherit = 'stock.move'
diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml
index 020c2691..9a9db4ac 100644
--- a/sf_manufacturing/views/mrp_production_addional_change.xml
+++ b/sf_manufacturing/views/mrp_production_addional_change.xml
@@ -455,7 +455,7 @@
- sequence
+ create_date desc
delivery_warning == 'warning'
delivery_warning == 'overdue'
diff --git a/sf_manufacturing/views/stock_picking_view.xml b/sf_manufacturing/views/stock_picking_view.xml
index f5b1941b..cc3c1585 100644
--- a/sf_manufacturing/views/stock_picking_view.xml
+++ b/sf_manufacturing/views/stock_picking_view.xml
@@ -50,6 +50,9 @@
+
+ create_date desc
+
diff --git a/sf_sale/views/purchase_order_view.xml b/sf_sale/views/purchase_order_view.xml
index 6624c7fa..946e3d97 100644
--- a/sf_sale/views/purchase_order_view.xml
+++ b/sf_sale/views/purchase_order_view.xml
@@ -298,6 +298,10 @@
purchase_order_list_name
+
+
+ date_approve desc
+
diff --git a/sf_sale/views/sale_team.xml b/sf_sale/views/sale_team.xml
index 3c75f70e..b3062f03 100644
--- a/sf_sale/views/sale_team.xml
+++ b/sf_sale/views/sale_team.xml
@@ -14,16 +14,14 @@
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml
index fd05b4ef..b0259249 100644
--- a/sf_tool_management/views/tool_base_views.xml
+++ b/sf_tool_management/views/tool_base_views.xml
@@ -432,7 +432,7 @@
功能刀具组装
sf.functional.tool.assembly
-
+