diff --git a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js index 3b0799cc..5845dbae 100644 --- a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js +++ b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js @@ -31,7 +31,7 @@ export class MyCustomWidget extends Many2ManyCheckboxesField { } } -MyCustomWidget.template = "sf_plan.MyCustomWidget" +MyCustomWidget.template = "jikimo_frontend.MyCustomWidget" // MyCustomWidget.supportedTypes = ['many2many']; registry.category("fields").add("custom_many2many_checkboxes", MyCustomWidget); diff --git a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml index dedcfb11..bebae03b 100644 --- a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml +++ b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml @@ -1,7 +1,7 @@ - +
diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index fd014941..5a4e2ec4 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -203,6 +203,7 @@ class StockRule(models.Model): productions = self.env['sf.production.plan'].with_user(SUPERUSER_ID).sudo().with_company(company_id). \ create({ 'name': production.name, + 'order_deadline': sale_order.deadline_of_delivery, 'production_id': production.id, 'date_planned_start': production.date_planned_start, 'origin': production.origin, diff --git a/sf_manufacturing/models/tool_other_features.py b/sf_manufacturing/models/tool_other_features.py index ddad9da8..03a954f9 100644 --- a/sf_manufacturing/models/tool_other_features.py +++ b/sf_manufacturing/models/tool_other_features.py @@ -8,6 +8,37 @@ class SuitableMachiningMethod(models.Model): name = fields.Char('名称') image = fields.Image('图片') + @api.model + def name_search(self, name='', args=None, operator='ilike', limit=100): + # 调用父类的name_search方法,获取原始的结果列表 + res = super().name_search(name, args, operator, limit) + # 定义一个空字典用来存储id和name的映射关系 + name_dict = {} + # 遍历结果列表,将id和name存入字典中 + for item in res: + id = item[0] + name = item[1] + name_dict[id] = name + # 根据id列表搜索符合条件的记录 + records = self.browse(name_dict.keys()) + # 定义一个新的结果列表用来存储修改后的结果 + new_res = [] + # 遍历每条记录 + for record in records: + # 获取记录的id,name和image属性 + id = record.id + name = name_dict[id] + image = record.image + # 如果image不为空,将其转换为data URI scheme + if image: + data_uri = f"data:image/png;base64,{image.decode('utf-8')}" + else: + data_uri = "" + # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result + new_res.append([id, name, data_uri]) + # 返回新的结果列表 + return new_res + class BladeTipCharacteristics(models.Model): _name = 'sf.blade.tip.characteristics' @@ -16,6 +47,37 @@ class BladeTipCharacteristics(models.Model): name = fields.Char('名称') image = fields.Image('图片') + @api.model + def name_search(self, name='', args=None, operator='ilike', limit=100): + # 调用父类的name_search方法,获取原始的结果列表 + res = super().name_search(name, args, operator, limit) + # 定义一个空字典用来存储id和name的映射关系 + name_dict = {} + # 遍历结果列表,将id和name存入字典中 + for item in res: + id = item[0] + name = item[1] + name_dict[id] = name + # 根据id列表搜索符合条件的记录 + records = self.browse(name_dict.keys()) + # 定义一个新的结果列表用来存储修改后的结果 + new_res = [] + # 遍历每条记录 + for record in records: + # 获取记录的id,name和image属性 + id = record.id + name = name_dict[id] + image = record.image + # 如果image不为空,将其转换为data URI scheme + if image: + data_uri = f"data:image/png;base64,{image.decode('utf-8')}" + else: + data_uri = "" + # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result + new_res.append([id, name, data_uri]) + # 返回新的结果列表 + return new_res + class HandleType(models.Model): _name = 'sf.handle.type' @@ -24,6 +86,37 @@ class HandleType(models.Model): name = fields.Char('名称') image = fields.Image('图片') + @api.model + def name_search(self, name='', args=None, operator='ilike', limit=100): + # 调用父类的name_search方法,获取原始的结果列表 + res = super().name_search(name, args, operator, limit) + # 定义一个空字典用来存储id和name的映射关系 + name_dict = {} + # 遍历结果列表,将id和name存入字典中 + for item in res: + id = item[0] + name = item[1] + name_dict[id] = name + # 根据id列表搜索符合条件的记录 + records = self.browse(name_dict.keys()) + # 定义一个新的结果列表用来存储修改后的结果 + new_res = [] + # 遍历每条记录 + for record in records: + # 获取记录的id,name和image属性 + id = record.id + name = name_dict[id] + image = record.image + # 如果image不为空,将其转换为data URI scheme + if image: + data_uri = f"data:image/png;base64,{image.decode('utf-8')}" + else: + data_uri = "" + # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result + new_res.append([id, name, data_uri]) + # 返回新的结果列表 + return new_res + class CuttingDirection(models.Model): _name = 'sf.cutting.direction' @@ -32,6 +125,37 @@ class CuttingDirection(models.Model): name = fields.Char('名称') image = fields.Image('图片') + @api.model + def name_search(self, name='', args=None, operator='ilike', limit=100): + # 调用父类的name_search方法,获取原始的结果列表 + res = super().name_search(name, args, operator, limit) + # 定义一个空字典用来存储id和name的映射关系 + name_dict = {} + # 遍历结果列表,将id和name存入字典中 + for item in res: + id = item[0] + name = item[1] + name_dict[id] = name + # 根据id列表搜索符合条件的记录 + records = self.browse(name_dict.keys()) + # 定义一个新的结果列表用来存储修改后的结果 + new_res = [] + # 遍历每条记录 + for record in records: + # 获取记录的id,name和image属性 + id = record.id + name = name_dict[id] + image = record.image + # 如果image不为空,将其转换为data URI scheme + if image: + data_uri = f"data:image/png;base64,{image.decode('utf-8')}" + else: + data_uri = "" + # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result + new_res.append([id, name, data_uri]) + # 返回新的结果列表 + return new_res + class SuitableCoolant(models.Model): _name = 'sf.suitable.coolant' @@ -40,6 +164,37 @@ class SuitableCoolant(models.Model): name = fields.Char('名称') image = fields.Image('图片') + @api.model + def name_search(self, name='', args=None, operator='ilike', limit=100): + # 调用父类的name_search方法,获取原始的结果列表 + res = super().name_search(name, args, operator, limit) + # 定义一个空字典用来存储id和name的映射关系 + name_dict = {} + # 遍历结果列表,将id和name存入字典中 + for item in res: + id = item[0] + name = item[1] + name_dict[id] = name + # 根据id列表搜索符合条件的记录 + records = self.browse(name_dict.keys()) + # 定义一个新的结果列表用来存储修改后的结果 + new_res = [] + # 遍历每条记录 + for record in records: + # 获取记录的id,name和image属性 + id = record.id + name = name_dict[id] + image = record.image + # 如果image不为空,将其转换为data URI scheme + if image: + data_uri = f"data:image/png;base64,{image.decode('utf-8')}" + else: + data_uri = "" + # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result + new_res.append([id, name, data_uri]) + # 返回新的结果列表 + return new_res + class CuttingSpeed(models.Model): _name = 'sf.cutting.speed' diff --git a/sf_manufacturing/views/tool_other_features_view.xml b/sf_manufacturing/views/tool_other_features_view.xml index 3af6d0e8..952f7bc8 100644 --- a/sf_manufacturing/views/tool_other_features_view.xml +++ b/sf_manufacturing/views/tool_other_features_view.xml @@ -12,11 +12,26 @@ + + 适合加工方式 + sf.suitable.machining.method + +
+ + + + + + +
+
+
+ 适合加工方式 ir.actions.act_window sf.suitable.machining.method - tree + tree,form @@ -32,11 +47,26 @@ + + 刀尖特征 + sf.blade.tip.characteristics + +
+ + + + + + +
+
+
+ 刀尖特征 ir.actions.act_window sf.blade.tip.characteristics - tree + tree,form @@ -52,11 +82,26 @@ + + 柄部类型 + sf.handle.type + +
+ + + + + + +
+
+
+ 柄部类型 ir.actions.act_window sf.handle.type - tree + tree,form @@ -72,11 +117,26 @@ + + 走刀方向 + sf.cutting.direction + +
+ + + + + + +
+
+
+ 走刀方向 ir.actions.act_window sf.cutting.direction - tree + tree,form @@ -92,11 +152,24 @@ + + 适合冷却液 + sf.suitable.coolant + +
+ + + + +
+
+
+ 适合冷却液 ir.actions.act_window sf.suitable.coolant - tree + tree,form diff --git a/sf_plan/models/custom_plan.py b/sf_plan/models/custom_plan.py index c30afe93..15af211a 100644 --- a/sf_plan/models/custom_plan.py +++ b/sf_plan/models/custom_plan.py @@ -12,25 +12,46 @@ class sf_production_plan(models.Model): # _inherit = 'mrp.production' _description = 'sf_production_plan' - name = fields.Char(string='名称') + state = fields.Selection([ + ('draft', '待排程'), + ('done', '已排程'), + ('processing', '已加工'), + ('finished', '已完成') + ], string='工单状态', tracking=True) + name = fields.Char(string='工单编号') # selected = fields.Boolean(default=False) + # order_number = fields.Char(string='订单号') + order_deadline = fields.Datetime(string='订单交期') production_id = fields.Many2one('mrp.production', '关联制造订单') product_qty = fields.Float(string='数量', digits='Product Unit of Measure', required=True, default=0.0) + production_line_id = fields.Many2one('sf.production.line', string='生产线') date_planned_start = fields.Datetime(string='计划开始时间', required=True, index=True, copy=False, default=fields.Datetime.now) date_planned_finished = fields.Datetime(string='计划结束时间') - state = fields.Selection([ - ('draft', '未排程'), ('done', '已排程')], string='状态', copy=False, index=True, readonly=True, - store=True) + # 排程设置selection(倒排,顺排,默认倒排) + schedule_setting = fields.Selection([ + ('reverse', '倒排'), ('positive', '顺排')], string='排程设置', default='reverse') product_id = fields.Many2one('product.product', '关联产品') - origin = fields.Char(string='来源') + origin = fields.Char(string='订单号') + # 加工时长 + process_time = fields.Float(string='加工时长', digits=(16, 2)) + # 实际加工时长、实际开始时间、实际结束时间 + actual_process_time = fields.Float(string='实际加工时长', digits=(16, 2)) + actual_start_time = fields.Datetime(string='实际开始时间') + actual_end_time = fields.Datetime(string='实际结束时间') + shift = fields.Char(string='班次') + # 序号、坯料编号、坯料名称、材质、数量、长度、宽度、厚度、直径、计划开始时间、计划结束时间、状态(已产出与待产出)、操作、创建人、创建时间、客户名称、订单号、行号、长度、宽度、厚度、直径、交货数量、交货日期 # sequence = fields.Integer(string='序号', required=True, copy=False, readonly=True, index=True, # default=lambda self: self.env['ir.sequence'].sudo().next_by_code('sf.pl.plan')) sequence = fields.Integer(string='序号', copy=False, readonly=True, index=True) current_operation_name = fields.Char(string='当前工序名称', size=64, default='生产计划') - production_line_id = fields.Many2one('sf.production.line', string='生产线') + + + + + # state = fields.Selection([ # ('未排程', '未排程'), ('已排程', '已排程')], string='State', copy=False, index=True, readonly=True, diff --git a/sf_plan/views/view.xml b/sf_plan/views/view.xml index 1f35b088..7878fa5f 100644 --- a/sf_plan/views/view.xml +++ b/sf_plan/views/view.xml @@ -9,11 +9,15 @@ + + + + - +
- + + + + + + + + - + @@ -115,8 +127,11 @@ color="production_line_id" decoration-success="state == 'done'" progress_bar="name" - form_view_id="sf_production_plan_form"> - + form_view_id="sf_production_plan_form" + default_scale="year" + scales="day,week,month,year" + precision="{'day': 'hour:quarter', 'week': 'day:half', 'month': 'day', 'year': 'month:quarter'}"> +