1.工单,工件配送新增sns及给部分字段添加tracking(跟踪)及优化页面
2.优化agv:部分字段不可编辑
This commit is contained in:
@@ -27,7 +27,7 @@ class MrpWorkcenter(models.Model):
|
|||||||
|
|
||||||
class MrpProductionWorkcenterLine(models.Model):
|
class MrpProductionWorkcenterLine(models.Model):
|
||||||
_name = 'mrp.workorder'
|
_name = 'mrp.workorder'
|
||||||
_inherit = ['mrp.workorder', 'barcodes.barcode_events_mixin']
|
_inherit = ['mrp.workorder', 'barcodes.barcode_events_mixin', 'mail.thread', 'mail.activity.mixin']
|
||||||
|
|
||||||
quality_point_ids = fields.Many2many('quality.point', compute='_compute_quality_point_ids', store=True)
|
quality_point_ids = fields.Many2many('quality.point', compute='_compute_quality_point_ids', store=True)
|
||||||
quality_point_count = fields.Integer('Steps', compute='_compute_quality_point_count')
|
quality_point_count = fields.Integer('Steps', compute='_compute_quality_point_count')
|
||||||
@@ -47,14 +47,17 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
|
|
||||||
is_last_lot = fields.Boolean('Is Last lot', compute='_compute_is_last_lot')
|
is_last_lot = fields.Boolean('Is Last lot', compute='_compute_is_last_lot')
|
||||||
is_first_started_wo = fields.Boolean('Is The first Work Order', compute='_compute_is_last_unfinished_wo')
|
is_first_started_wo = fields.Boolean('Is The first Work Order', compute='_compute_is_last_unfinished_wo')
|
||||||
is_last_unfinished_wo = fields.Boolean('Is Last Work Order To Process', compute='_compute_is_last_unfinished_wo', store=False)
|
is_last_unfinished_wo = fields.Boolean('Is Last Work Order To Process', compute='_compute_is_last_unfinished_wo',
|
||||||
|
store=False)
|
||||||
lot_id = fields.Many2one(related='current_quality_check_id.lot_id', readonly=False)
|
lot_id = fields.Many2one(related='current_quality_check_id.lot_id', readonly=False)
|
||||||
move_id = fields.Many2one(related='current_quality_check_id.move_id', readonly=False)
|
move_id = fields.Many2one(related='current_quality_check_id.move_id', readonly=False)
|
||||||
move_line_id = fields.Many2one(related='current_quality_check_id.move_line_id', readonly=False)
|
move_line_id = fields.Many2one(related='current_quality_check_id.move_line_id', readonly=False)
|
||||||
move_line_ids = fields.One2many(related='move_id.move_line_ids')
|
move_line_ids = fields.One2many(related='move_id.move_line_ids')
|
||||||
quality_state = fields.Selection(related='current_quality_check_id.quality_state', string="Quality State", readonly=False)
|
quality_state = fields.Selection(related='current_quality_check_id.quality_state', string="Quality State",
|
||||||
|
readonly=False)
|
||||||
qty_done = fields.Float(related='current_quality_check_id.qty_done', readonly=False)
|
qty_done = fields.Float(related='current_quality_check_id.qty_done', readonly=False)
|
||||||
test_type_id = fields.Many2one('quality.point.test_type', 'Test Type', related='current_quality_check_id.test_type_id')
|
test_type_id = fields.Many2one('quality.point.test_type', 'Test Type',
|
||||||
|
related='current_quality_check_id.test_type_id')
|
||||||
test_type = fields.Char(related='test_type_id.technical_name')
|
test_type = fields.Char(related='test_type_id.technical_name')
|
||||||
user_id = fields.Many2one(related='current_quality_check_id.user_id', readonly=False)
|
user_id = fields.Many2one(related='current_quality_check_id.user_id', readonly=False)
|
||||||
worksheet_page = fields.Integer('Worksheet page')
|
worksheet_page = fields.Integer('Worksheet page')
|
||||||
@@ -65,7 +68,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
def _compute_quality_point_ids(self):
|
def _compute_quality_point_ids(self):
|
||||||
for workorder in self:
|
for workorder in self:
|
||||||
quality_points = workorder.operation_id.quality_point_ids
|
quality_points = workorder.operation_id.quality_point_ids
|
||||||
quality_points = quality_points.filtered(lambda qp: not qp.product_ids or workorder.production_id.product_id in qp.product_ids)
|
quality_points = quality_points.filtered(
|
||||||
|
lambda qp: not qp.product_ids or workorder.production_id.product_id in qp.product_ids)
|
||||||
workorder.quality_point_ids = quality_points
|
workorder.quality_point_ids = quality_points
|
||||||
|
|
||||||
@api.depends('operation_id')
|
@api.depends('operation_id')
|
||||||
@@ -91,7 +95,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
@api.depends('check_ids')
|
@api.depends('check_ids')
|
||||||
def _compute_finished_product_check_ids(self):
|
def _compute_finished_product_check_ids(self):
|
||||||
for wo in self:
|
for wo in self:
|
||||||
wo.finished_product_check_ids = wo.check_ids.filtered(lambda c: c.finished_product_sequence == wo.qty_produced)
|
wo.finished_product_check_ids = wo.check_ids.filtered(
|
||||||
|
lambda c: c.finished_product_sequence == wo.qty_produced)
|
||||||
|
|
||||||
def write(self, values):
|
def write(self, values):
|
||||||
res = super().write(values)
|
res = super().write(values)
|
||||||
@@ -138,7 +143,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
self.finished_lot_id = self.env['stock.lot'].create({
|
self.finished_lot_id = self.env['stock.lot'].create({
|
||||||
'product_id': self.product_id.id,
|
'product_id': self.product_id.id,
|
||||||
'company_id': self.company_id.id,
|
'company_id': self.company_id.id,
|
||||||
'name': self.env['stock.lot']._get_next_serial(self.company_id, self.product_id) or self.env['ir.sequence'].next_by_code('stock.lot.serial'),
|
'name': self.env['stock.lot']._get_next_serial(self.company_id, self.product_id) or self.env[
|
||||||
|
'ir.sequence'].next_by_code('stock.lot.serial'),
|
||||||
})
|
})
|
||||||
|
|
||||||
def _create_subsequent_checks(self):
|
def _create_subsequent_checks(self):
|
||||||
@@ -152,7 +158,7 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
"""
|
"""
|
||||||
# Create another quality check if necessary
|
# Create another quality check if necessary
|
||||||
next_check = self.current_quality_check_id.next_check_id
|
next_check = self.current_quality_check_id.next_check_id
|
||||||
if next_check.component_id != self.current_quality_check_id.product_id or\
|
if next_check.component_id != self.current_quality_check_id.product_id or \
|
||||||
next_check.point_id != self.current_quality_check_id.point_id:
|
next_check.point_id != self.current_quality_check_id.point_id:
|
||||||
# TODO: manage reservation here
|
# TODO: manage reservation here
|
||||||
|
|
||||||
@@ -279,7 +285,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
if self.current_quality_check_id:
|
if self.current_quality_check_id:
|
||||||
team = self.current_quality_check_id.team_id
|
team = self.current_quality_check_id.team_id
|
||||||
else:
|
else:
|
||||||
team = self.env['quality.alert.team'].search(['|', ('company_id', '=', self.company_id.id), ('company_id', '=', False)], limit=1)
|
team = self.env['quality.alert.team'].search(
|
||||||
|
['|', ('company_id', '=', self.company_id.id), ('company_id', '=', False)], limit=1)
|
||||||
return {
|
return {
|
||||||
'type': 'ir.actions.act_window',
|
'type': 'ir.actions.act_window',
|
||||||
'res_model': 'quality.check',
|
'res_model': 'quality.check',
|
||||||
@@ -320,7 +327,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
production = wo.production_id
|
production = wo.production_id
|
||||||
|
|
||||||
move_raw_ids = wo.move_raw_ids.filtered(lambda m: m.state not in ('done', 'cancel'))
|
move_raw_ids = wo.move_raw_ids.filtered(lambda m: m.state not in ('done', 'cancel'))
|
||||||
move_finished_ids = wo.move_finished_ids.filtered(lambda m: m.state not in ('done', 'cancel') and m.product_id != wo.production_id.product_id)
|
move_finished_ids = wo.move_finished_ids.filtered(
|
||||||
|
lambda m: m.state not in ('done', 'cancel') and m.product_id != wo.production_id.product_id)
|
||||||
previous_check = self.env['quality.check']
|
previous_check = self.env['quality.check']
|
||||||
for point in wo.quality_point_ids:
|
for point in wo.quality_point_ids:
|
||||||
# Check if we need a quality control for this point
|
# Check if we need a quality control for this point
|
||||||
@@ -342,11 +350,13 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
if point.test_type == 'register_byproducts':
|
if point.test_type == 'register_byproducts':
|
||||||
moves = move_finished_ids.filtered(lambda m: m.product_id == point.component_id)
|
moves = move_finished_ids.filtered(lambda m: m.product_id == point.component_id)
|
||||||
if not moves:
|
if not moves:
|
||||||
moves = production.move_finished_ids.filtered(lambda m: not m.operation_id and m.product_id == point.component_id)
|
moves = production.move_finished_ids.filtered(
|
||||||
|
lambda m: not m.operation_id and m.product_id == point.component_id)
|
||||||
elif point.test_type == 'register_consumed_materials':
|
elif point.test_type == 'register_consumed_materials':
|
||||||
moves = move_raw_ids.filtered(lambda m: m.product_id == point.component_id)
|
moves = move_raw_ids.filtered(lambda m: m.product_id == point.component_id)
|
||||||
if not moves:
|
if not moves:
|
||||||
moves = production.move_raw_ids.filtered(lambda m: not m.operation_id and m.product_id == point.component_id)
|
moves = production.move_raw_ids.filtered(
|
||||||
|
lambda m: not m.operation_id and m.product_id == point.component_id)
|
||||||
else:
|
else:
|
||||||
check = self.env['quality.check'].create(values)
|
check = self.env['quality.check'].create(values)
|
||||||
previous_check.next_check_id = check
|
previous_check.next_check_id = check
|
||||||
@@ -363,8 +373,10 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
processed_move |= moves
|
processed_move |= moves
|
||||||
|
|
||||||
# Generate quality checks associated with unreferenced components
|
# Generate quality checks associated with unreferenced components
|
||||||
moves_without_check = ((move_raw_ids | move_finished_ids) - processed_move).filtered(lambda move: (move.has_tracking != 'none' and not move.raw_material_production_id.use_auto_consume_components_lots) or move.operation_id)
|
moves_without_check = ((move_raw_ids | move_finished_ids) - processed_move).filtered(lambda move: (
|
||||||
quality_team_id = self.env['quality.alert.team'].search(['|', ('company_id', '=', wo.company_id.id), ('company_id', '=', False)], limit=1).id
|
move.has_tracking != 'none' and not move.raw_material_production_id.use_auto_consume_components_lots) or move.operation_id)
|
||||||
|
quality_team_id = self.env['quality.alert.team'].search(
|
||||||
|
['|', ('company_id', '=', wo.company_id.id), ('company_id', '=', False)], limit=1).id
|
||||||
for move in moves_without_check:
|
for move in moves_without_check:
|
||||||
values = {
|
values = {
|
||||||
'production_id': production.id,
|
'production_id': production.id,
|
||||||
@@ -412,7 +424,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
|
|
||||||
backorder = False
|
backorder = False
|
||||||
# Trigger the backorder process if we produce less than expected
|
# Trigger the backorder process if we produce less than expected
|
||||||
if float_compare(self.qty_producing, self.qty_remaining, precision_rounding=self.product_uom_id.rounding) == -1 and self.is_first_started_wo:
|
if float_compare(self.qty_producing, self.qty_remaining,
|
||||||
|
precision_rounding=self.product_uom_id.rounding) == -1 and self.is_first_started_wo:
|
||||||
backorder = self.production_id._split_productions()[1:]
|
backorder = self.production_id._split_productions()[1:]
|
||||||
for workorder in backorder.workorder_ids:
|
for workorder in backorder.workorder_ids:
|
||||||
if workorder.product_tracking == 'serial':
|
if workorder.product_tracking == 'serial':
|
||||||
@@ -423,7 +436,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
else:
|
else:
|
||||||
if self.operation_id:
|
if self.operation_id:
|
||||||
backorder = (self.production_id.procurement_group_id.mrp_production_ids - self.production_id).filtered(
|
backorder = (self.production_id.procurement_group_id.mrp_production_ids - self.production_id).filtered(
|
||||||
lambda p: p.workorder_ids.filtered(lambda wo: wo.operation_id == self.operation_id).state not in ('cancel', 'done')
|
lambda p: p.workorder_ids.filtered(lambda wo: wo.operation_id == self.operation_id).state not in (
|
||||||
|
'cancel', 'done')
|
||||||
)[:1]
|
)[:1]
|
||||||
else:
|
else:
|
||||||
index = list(self.production_id.workorder_ids).index(self)
|
index = list(self.production_id.workorder_ids).index(self)
|
||||||
@@ -442,7 +456,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
wo.current_quality_check_id._update_component_quantity()
|
wo.current_quality_check_id._update_component_quantity()
|
||||||
if not self.env.context.get('no_start_next'):
|
if not self.env.context.get('no_start_next'):
|
||||||
if self.operation_id:
|
if self.operation_id:
|
||||||
return backorder.workorder_ids.filtered(lambda wo: wo.operation_id == self.operation_id).open_tablet_view()
|
return backorder.workorder_ids.filtered(
|
||||||
|
lambda wo: wo.operation_id == self.operation_id).open_tablet_view()
|
||||||
else:
|
else:
|
||||||
index = list(self.production_id.workorder_ids).index(self)
|
index = list(self.production_id.workorder_ids).index(self)
|
||||||
return backorder.workorder_ids[index].open_tablet_view()
|
return backorder.workorder_ids[index].open_tablet_view()
|
||||||
@@ -466,7 +481,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
|
|
||||||
def open_tablet_view(self):
|
def open_tablet_view(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
if not self.is_user_working and self.working_state != 'blocked' and self.state in ('ready', 'waiting', 'progress', 'pending'):
|
if not self.is_user_working and self.working_state != 'blocked' and self.state in (
|
||||||
|
'ready', 'waiting', 'progress', 'pending'):
|
||||||
self.button_start()
|
self.button_start()
|
||||||
action = self.env["ir.actions.actions"]._for_xml_id("mrp_workorder.tablet_client_action")
|
action = self.env["ir.actions.actions"]._for_xml_id("mrp_workorder.tablet_client_action")
|
||||||
action['target'] = 'fullscreen'
|
action['target'] = 'fullscreen'
|
||||||
@@ -521,7 +537,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
data = {
|
data = {
|
||||||
'mrp.workorder': self.read(self._get_fields_for_tablet(), load=False)[0],
|
'mrp.workorder': self.read(self._get_fields_for_tablet(), load=False)[0],
|
||||||
'quality.check': self.check_ids._get_fields_for_tablet(sorted_check_list),
|
'quality.check': self.check_ids._get_fields_for_tablet(sorted_check_list),
|
||||||
'operation': self.operation_id.read(self.operation_id._get_fields_for_tablet())[0] if self.operation_id else {},
|
'operation': self.operation_id.read(self.operation_id._get_fields_for_tablet())[
|
||||||
|
0] if self.operation_id else {},
|
||||||
'working_state': self.workcenter_id.working_state,
|
'working_state': self.workcenter_id.working_state,
|
||||||
'views': {
|
'views': {
|
||||||
'workorder': self.env.ref('mrp_workorder.mrp_workorder_view_form_tablet').id,
|
'workorder': self.env.ref('mrp_workorder.mrp_workorder_view_form_tablet').id,
|
||||||
@@ -553,7 +570,8 @@ class MrpProductionWorkcenterLine(models.Model):
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
'duration': self.duration,
|
'duration': self.duration,
|
||||||
'position': bisect_left(last30op, self.duration), # which position regarded other workorders ranked by duration
|
'position': bisect_left(last30op, self.duration),
|
||||||
|
# which position regarded other workorders ranked by duration
|
||||||
'quality_score': score,
|
'quality_score': score,
|
||||||
'show_rainbow': show_rainbow,
|
'show_rainbow': show_rainbow,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,13 @@
|
|||||||
</field>
|
</field>
|
||||||
</page>
|
</page>
|
||||||
</page>
|
</page>
|
||||||
|
<xpath expr="//sheet" position="after">
|
||||||
|
<div class="oe_chatter">
|
||||||
|
<field name="message_follower_ids"/>
|
||||||
|
<field name="activity_ids"/>
|
||||||
|
<field name="message_ids" options="{'post_refresh': 'recipients'}"/>
|
||||||
|
</div>
|
||||||
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
import requests
|
import requests
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
from odoo import fields, models
|
from odoo import fields, models, api
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
class AgvSetting(models.Model):
|
class AgvSetting(models.Model):
|
||||||
@@ -59,11 +60,17 @@ class AgvTaskRoute(models.Model):
|
|||||||
('F01', '搬运'), ], string='任务类型', default="F01")
|
('F01', '搬运'), ], string='任务类型', default="F01")
|
||||||
route_type = fields.Selection([
|
route_type = fields.Selection([
|
||||||
('上产线', '上产线'), ('下产线', '下产线'), ('运送空料架', '运送空料架')], string='类型')
|
('上产线', '上产线'), ('下产线', '下产线'), ('运送空料架', '运送空料架')], string='类型')
|
||||||
start_site_id = fields.Many2one('sf.agv.site', '起点接驳站位置编号')
|
start_site_id = fields.Many2one('sf.agv.site', '起点接驳站')
|
||||||
end_site_id = fields.Many2one('sf.agv.site', '终点接驳站位置编号')
|
end_site_id = fields.Many2one('sf.agv.site', '终点接驳站')
|
||||||
destination_production_line_id = fields.Many2one('sf.production.line', '目的生产线')
|
destination_production_line_id = fields.Many2one('sf.production.line', '目的生产线')
|
||||||
active = fields.Boolean('有效', default=True)
|
active = fields.Boolean('有效', default=True)
|
||||||
|
|
||||||
|
@api.constrains('end_site_id')
|
||||||
|
def _check_end_site_id(self):
|
||||||
|
if self.end_site_id:
|
||||||
|
if self.end_site_id == self.start_site_id:
|
||||||
|
raise UserError("您选择的终点接驳站与起点接驳站重复,请重新选择")
|
||||||
|
|
||||||
|
|
||||||
class Center_controlInterfaceLog(models.Model):
|
class Center_controlInterfaceLog(models.Model):
|
||||||
_name = 'center_control.interface.log'
|
_name = 'center_control.interface.log'
|
||||||
|
|||||||
@@ -53,13 +53,13 @@ class MrpProduction(models.Model):
|
|||||||
active = fields.Boolean(string='已归档', default=True)
|
active = fields.Boolean(string='已归档', default=True)
|
||||||
programming_no = fields.Char('编程单号')
|
programming_no = fields.Char('编程单号')
|
||||||
work_state = fields.Char('业务状态')
|
work_state = fields.Char('业务状态')
|
||||||
programming_state = fields.Char('编程状态')
|
programming_state = fields.Char('编程状态', tracking=True)
|
||||||
glb_file = fields.Binary("glb模型文件")
|
glb_file = fields.Binary("glb模型文件")
|
||||||
production_line_id = fields.Many2one('sf.production.line', string='生产线')
|
production_line_id = fields.Many2one('sf.production.line', string='生产线', tracking=True)
|
||||||
plan_start_processing_time = fields.Datetime('计划开始加工时间')
|
plan_start_processing_time = fields.Datetime('计划开始加工时间')
|
||||||
production_line_state = fields.Selection(
|
production_line_state = fields.Selection(
|
||||||
[('待上产线', '待上产线'), ('已上产线', '已上产线'), ('已下产线', '已下产线')],
|
[('待上产线', '待上产线'), ('已上产线', '已上产线'), ('已下产线', '已下产线')],
|
||||||
string='上/下产线', default='待上产线')
|
string='上/下产线', default='待上产线', tracking=True)
|
||||||
# 工序状态
|
# 工序状态
|
||||||
# Todo 研究下用法
|
# Todo 研究下用法
|
||||||
process_state = fields.Selection([
|
process_state = fields.Selection([
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
Z10_axis = fields.Float(default=0)
|
Z10_axis = fields.Float(default=0)
|
||||||
X_deviation_angle = fields.Integer(string="X轴偏差度", default=0)
|
X_deviation_angle = fields.Integer(string="X轴偏差度", default=0)
|
||||||
test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], default='合格',
|
test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], default='合格',
|
||||||
string="检测结果")
|
string="检测结果", tracking=True)
|
||||||
cnc_ids = fields.One2many("sf.cnc.processing", 'workorder_id', string="CNC加工程序")
|
cnc_ids = fields.One2many("sf.cnc.processing", 'workorder_id', string="CNC加工程序")
|
||||||
cmm_ids = fields.One2many("sf.cmm.program", 'workorder_id', string="CMM程序")
|
cmm_ids = fields.One2many("sf.cmm.program", 'workorder_id', string="CMM程序")
|
||||||
tray_code = fields.Char(string="托盘编码")
|
tray_code = fields.Char(string="托盘编码")
|
||||||
@@ -133,7 +133,7 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
return action
|
return action
|
||||||
|
|
||||||
supplier_id = fields.Many2one('res.partner', string='外协供应商')
|
supplier_id = fields.Many2one('res.partner', string='外协供应商')
|
||||||
equipment_id = fields.Many2one('maintenance.equipment', string='加工设备')
|
equipment_id = fields.Many2one('maintenance.equipment', string='加工设备', tracking=True)
|
||||||
is_ok = fields.Boolean(string='是否合格')
|
is_ok = fields.Boolean(string='是否合格')
|
||||||
# 加工人
|
# 加工人
|
||||||
processing_user_id = fields.Many2one('res.users', string='加工人')
|
processing_user_id = fields.Many2one('res.users', string='加工人')
|
||||||
@@ -195,15 +195,15 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
rfid_code_old = fields.Char('RFID码(已解除)')
|
rfid_code_old = fields.Char('RFID码(已解除)')
|
||||||
|
|
||||||
production_line_id = fields.Many2one('sf.production.line', related='production_id.production_line_id',
|
production_line_id = fields.Many2one('sf.production.line', related='production_id.production_line_id',
|
||||||
string='生产线', store=True)
|
string='生产线', store=True, tracking=True)
|
||||||
production_line_state = fields.Selection(related='production_id.production_line_state',
|
production_line_state = fields.Selection(related='production_id.production_line_state',
|
||||||
string='上/下产线', store=True)
|
string='上/下产线', store=True, tracking=True)
|
||||||
detection_report = fields.Binary('检测报告', readonly=True)
|
detection_report = fields.Binary('检测报告', readonly=True)
|
||||||
is_remanufacture = fields.Boolean(string='重新生成制造订单', default=False)
|
is_remanufacture = fields.Boolean(string='重新生成制造订单', default=False)
|
||||||
is_fetchcnc = fields.Boolean(string='重新获取NC程序', default=False)
|
is_fetchcnc = fields.Boolean(string='重新获取NC程序', default=False)
|
||||||
reason = fields.Selection(
|
reason = fields.Selection(
|
||||||
[("programming", "编程"), ("clamping", "返工"), ("cutter", "刀具"), ("operate computer", "操机"),
|
[("programming", "编程"), ("clamping", "返工"), ("cutter", "刀具"), ("operate computer", "操机"),
|
||||||
("technology", "工艺"), ("customer redrawing", "客户改图"), ("other", "其他"), ], string="原因")
|
("technology", "工艺"), ("customer redrawing", "客户改图"), ("other", "其他"), ], string="原因", tracking=True)
|
||||||
detailed_reason = fields.Text('详细原因')
|
detailed_reason = fields.Text('详细原因')
|
||||||
|
|
||||||
@api.onchange('rfid_code')
|
@api.onchange('rfid_code')
|
||||||
@@ -1346,19 +1346,33 @@ class WorkPieceDelivery(models.Model):
|
|||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def create(self, vals):
|
def create(self, vals):
|
||||||
if vals.get('name', '/') == '/' or vals.get('name', '/') is False:
|
if vals['route_id'] and vals.get('type') is None:
|
||||||
vals['name'] = self.env['ir.sequence'].next_by_code('sf.workpiece.delivery') or '/'
|
|
||||||
else:
|
|
||||||
vals['type'] = '运送空料架'
|
vals['type'] = '运送空料架'
|
||||||
|
else:
|
||||||
|
if vals.get('name', '/') == '/' or vals.get('name', '/') is False:
|
||||||
|
vals['name'] = self.env['ir.sequence'].next_by_code('sf.workpiece.delivery') or '/'
|
||||||
obj = super(WorkPieceDelivery, self).create(vals)
|
obj = super(WorkPieceDelivery, self).create(vals)
|
||||||
|
if obj.type == '运送空料架':
|
||||||
|
if obj.name is False:
|
||||||
|
obj.name = "运送空料架路线:%s-%s" % (
|
||||||
|
obj.feeder_station_start_id.name, obj.feeder_station_destination_id.name)
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
@api.constrains('name')
|
@api.constrains('route_id')
|
||||||
def _check_name(self):
|
def _check_route_id(self):
|
||||||
if self.type == '运送空料架':
|
if self.type == '运送空料架':
|
||||||
wd = self.sudo().search([('name', '=', self.name), ('id', '!=', self.id)])
|
if self.route_id and self.name is False:
|
||||||
if wd:
|
route = self.sudo().search(
|
||||||
raise UserError("该名称已存在")
|
[('route_id', '=', self.route_id.id), ('id', '!=', self.id), ('name', 'ilike', '运送空料架路线')])
|
||||||
|
if route:
|
||||||
|
raise UserError("该任务路线已存在,请重新选择")
|
||||||
|
|
||||||
|
# @api.constrains('name')
|
||||||
|
# def _check_name(self):
|
||||||
|
# if self.type == '运送空料架':
|
||||||
|
# wd = self.sudo().search([('name', '=', self.name), ('id', '!=', self.id)])
|
||||||
|
# if wd:
|
||||||
|
# raise UserError("该名称已存在")
|
||||||
|
|
||||||
def action_delivery_history(self):
|
def action_delivery_history(self):
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import os
|
|||||||
from odoo import models, fields, api, _
|
from odoo import models, fields, api, _
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
from odoo.modules import get_resource_path
|
from odoo.modules import get_resource_path
|
||||||
# from OCC.Extend.DataExchange import read_step_file
|
from OCC.Extend.DataExchange import read_step_file
|
||||||
# from OCC.Extend.DataExchange import write_stl_file
|
from OCC.Extend.DataExchange import write_stl_file
|
||||||
|
|
||||||
|
|
||||||
class ResProductMo(models.Model):
|
class ResProductMo(models.Model):
|
||||||
|
|||||||
@@ -7,9 +7,9 @@
|
|||||||
<field name="model">sf.agv.site</field>
|
<field name="model">sf.agv.site</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree editable="bottom">
|
<tree editable="bottom">
|
||||||
<field name="name" required="1"/>
|
<field name="name" required="1" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
<field name="owning_region" required="1"/>
|
<field name="owning_region" required="1" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
<field name="state" required="1"/>
|
<field name="state" required="1" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
<field name="divide_the_work" required="1"/>
|
<field name="divide_the_work" required="1"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
@@ -34,12 +34,14 @@
|
|||||||
<field name="model">sf.agv.task.route</field>
|
<field name="model">sf.agv.task.route</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree editable="bottom">
|
<tree editable="bottom">
|
||||||
<field name="name" required="1"/>
|
<field name="name" required="1" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
<field name="type" readonly="1" string="任务类型"/>
|
<field name="type" readonly="1" string="任务类型"/>
|
||||||
<field name="route_type" string="类型" required="1"/>
|
<field name="route_type" string="类型" required="1" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
<field name="start_site_id" required="1" options="{'no_create': True}" string="起点接驳站"/>
|
<field name="start_site_id" required="1" options="{'no_create': True}" string="起点接驳站"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
<field name="end_site_id" required="1" options="{'no_create': True}" string="终点接驳站"/>
|
<field name="end_site_id" required="1" options="{'no_create': True}" string="终点接驳站"/>
|
||||||
<field name="destination_production_line_id" required="1" options="{'no_create': True}"/>
|
<field name="destination_production_line_id" required="1" options="{'no_create': True}"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -73,7 +75,8 @@
|
|||||||
<field name="model">center_control.interface.log</field>
|
<field name="model">center_control.interface.log</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<search string="Logs">
|
<search string="Logs">
|
||||||
<field name="name"/>
|
<field name="name" filter_domain="[('name','ilike', self)]"/>
|
||||||
|
<field name="content" filter_domain="[('content','ilike', self)]"/>
|
||||||
<group expand="0" string="分组">
|
<group expand="0" string="分组">
|
||||||
<field name="interface_call_date"/>
|
<field name="interface_call_date"/>
|
||||||
</group>
|
</group>
|
||||||
|
|||||||
@@ -683,9 +683,9 @@
|
|||||||
<field name="model">sf.workpiece.delivery</field>
|
<field name="model">sf.workpiece.delivery</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<search string="工件配送">
|
<search string="工件配送">
|
||||||
<filter name="status" string="待下发" domain="[('status', 'in', ['待下发','待配送'])]"/>
|
<filter name="filter_to_be_issued" string="待下发" domain="[('status', 'in', ['待下发'])]"/>
|
||||||
<filter name="status" string="待配送" domain="[('status', 'in', ['待下发','待配送'])]"/>
|
<filter name="filter_waiting_delivery" string="待配送" domain="[('status', 'in', ['待配送'])]"/>
|
||||||
<filter name="status" string="已配送" domain="[('status', 'in', ['待下发','待配送'])]"/>
|
<filter name="filter_delivered" string="已配送" domain="[('status', 'in', ['已配送'])]"/>
|
||||||
<field name="rfid_code"/>
|
<field name="rfid_code"/>
|
||||||
<field name="production_id"/>
|
<field name="production_id"/>
|
||||||
<field name="feeder_station_start_id"/>
|
<field name="feeder_station_start_id"/>
|
||||||
@@ -695,9 +695,6 @@
|
|||||||
<field name="task_completion_time"/>
|
<field name="task_completion_time"/>
|
||||||
<field name="delivery_duration"/>
|
<field name="delivery_duration"/>
|
||||||
<field name="status"/>
|
<field name="status"/>
|
||||||
<group expand="0" string="Group By">
|
|
||||||
<filter string="状态" name="status" domain="[]" context="{'group_by': 'status'}"/>
|
|
||||||
</group>
|
|
||||||
<searchpanel>
|
<searchpanel>
|
||||||
<field name="production_line_id" icon="fa-building" enable_counters="1"/>
|
<field name="production_line_id" icon="fa-building" enable_counters="1"/>
|
||||||
<field name="status" icon="fa-building" enable_counters="1"/>
|
<field name="status" icon="fa-building" enable_counters="1"/>
|
||||||
@@ -710,7 +707,9 @@
|
|||||||
<field name="name">工件配送</field>
|
<field name="name">工件配送</field>
|
||||||
<field name="res_model">sf.workpiece.delivery</field>
|
<field name="res_model">sf.workpiece.delivery</field>
|
||||||
<field name="search_view_id" ref="sf_workpiece_delivery_search"/>
|
<field name="search_view_id" ref="sf_workpiece_delivery_search"/>
|
||||||
<field name="context">{'search_default_on_up':1}</field>
|
<field name="context">{'search_default_filter_to_be_issued': 1,
|
||||||
|
'search_default_filter_waiting_delivery': 1}
|
||||||
|
</field>
|
||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
<field name="domain">
|
<field name="domain">
|
||||||
[('type','in',['上产线','下产线']),('workorder_state','=','done'),('is_manual_work','=',false)]
|
[('type','in',['上产线','下产线']),('workorder_state','=','done'),('is_manual_work','=',false)]
|
||||||
@@ -724,23 +723,39 @@
|
|||||||
<field name="model">sf.workpiece.delivery</field>
|
<field name="model">sf.workpiece.delivery</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="工件配送" editable="bottom" class="center" delete="0" create="1">
|
<tree string="工件配送" editable="bottom" class="center" delete="0" create="1">
|
||||||
<header>
|
<!-- <header>-->
|
||||||
<button name="button_delivery" type="object" string="配送" class="oe_highlight"/>
|
<!-- <button name="button_delivery" type="object" string="配送" class="oe_highlight"/>-->
|
||||||
</header>
|
<!-- </header>-->
|
||||||
<field name="name" string="路线名称" attrs="{'readonly': [('id', '!=', False)]}"
|
<!-- <field name="name" string="路线名称" attrs="{'readonly': [('id', '!=', False)]}"-->
|
||||||
placeholder="例如:运送空料架路线:G01-A01" required="1" force_save="1"/>
|
<!-- placeholder="例如:运送空料架路线:G01-A01" required="1" force_save="1"/>-->
|
||||||
<field name="route_id" options="{'no_create': True}" required="1"
|
<field name="route_id" options="{'no_create': True}" required="1"
|
||||||
attrs="{'readonly': [('id', '!=', False)]}" domain="[('route_type', '=', '运送空料架')]"
|
attrs="{'readonly': [('id', '!=', False)]}" domain="[('route_type', '=', '运送空料架')]"
|
||||||
force_save="1"/>
|
force_save="1"/>
|
||||||
<field name="feeder_station_start_id" readonly="1" force_save="1"/>
|
<field name="feeder_station_start_id" readonly="1" force_save="1"/>
|
||||||
<!-- <field name="type" readonly="1"/>-->
|
<!-- <field name="type" readonly="1"/>-->
|
||||||
<field name="feeder_station_destination_id" readonly="1" force_save="1"/>
|
<field name="feeder_station_destination_id" readonly="1" force_save="1"/>
|
||||||
|
<button name="button_delivery" type="object" string="配送" class="oe_highlight"/>
|
||||||
<button name="action_delivery_history" type="object" class="btn btn-link text-info" icon="fa-history"
|
<button name="action_delivery_history" type="object" class="btn btn-link text-info" icon="fa-history"
|
||||||
string="历史"/>
|
string="历史"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- <record id="sf_workpiece_delivery_empty_racks_kanban" model="ir.ui.view">-->
|
||||||
|
<!-- <field name="name">sf.workpiece.delivery.view.kanban</field>-->
|
||||||
|
<!-- <field name="model">sf.workpiece.delivery</field>-->
|
||||||
|
<!-- <field name="arch" type="xml">-->
|
||||||
|
<!-- <kanban>-->
|
||||||
|
<!-- <field name="route_id"/>-->
|
||||||
|
<!-- <field name="feeder_station_start_id"/>-->
|
||||||
|
<!-- <field name="feeder_station_destination_id"/>-->
|
||||||
|
<!--<!– <button name="button_delivery" type="object" string="配送" class="oe_highlight"/>–>-->
|
||||||
|
<!--<!– <button name="action_delivery_history" type="object" class="btn btn-link text-info" icon="fa-history"–>-->
|
||||||
|
<!--<!– string="历史"/>–>-->
|
||||||
|
<!-- </kanban>-->
|
||||||
|
<!-- </field>-->
|
||||||
|
<!-- </record>-->
|
||||||
|
|
||||||
<record id="sf_workpiece_delivery_empty_racks_tree" model="ir.ui.view">
|
<record id="sf_workpiece_delivery_empty_racks_tree" model="ir.ui.view">
|
||||||
<field name="name">空料架配送</field>
|
<field name="name">空料架配送</field>
|
||||||
<field name="model">sf.workpiece.delivery</field>
|
<field name="model">sf.workpiece.delivery</field>
|
||||||
@@ -763,6 +778,7 @@
|
|||||||
<field name="model">sf.workpiece.delivery</field>
|
<field name="model">sf.workpiece.delivery</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<search string="运送空料架">
|
<search string="运送空料架">
|
||||||
|
<filter name="filter_active" string="已归档" domain="[('active', '=', False)]"/>
|
||||||
<field name="route_id"/>
|
<field name="route_id"/>
|
||||||
<field name="feeder_station_start_id"/>
|
<field name="feeder_station_start_id"/>
|
||||||
<field name="feeder_station_destination_id"/>
|
<field name="feeder_station_destination_id"/>
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ from datetime import datetime
|
|||||||
import requests
|
import requests
|
||||||
from odoo import http
|
from odoo import http
|
||||||
from odoo.http import request
|
from odoo.http import request
|
||||||
# from OCC.Extend.DataExchange import read_step_file
|
from OCC.Extend.DataExchange import read_step_file
|
||||||
# from OCC.Extend.DataExchange import write_stl_file
|
from OCC.Extend.DataExchange import write_stl_file
|
||||||
from odoo import models, fields, api
|
from odoo import models, fields, api
|
||||||
from odoo.modules import get_resource_path
|
from odoo.modules import get_resource_path
|
||||||
from odoo.exceptions import ValidationError, UserError
|
from odoo.exceptions import ValidationError, UserError
|
||||||
@@ -19,6 +19,7 @@ from . import parser_and_calculate_work_time as pc
|
|||||||
|
|
||||||
class QuickEasyOrder(models.Model):
|
class QuickEasyOrder(models.Model):
|
||||||
_name = 'quick.easy.order'
|
_name = 'quick.easy.order'
|
||||||
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||||
_description = '简易下单'
|
_description = '简易下单'
|
||||||
_order = 'id desc'
|
_order = 'id desc'
|
||||||
|
|
||||||
@@ -35,13 +36,14 @@ class QuickEasyOrder(models.Model):
|
|||||||
('0.03', '±0.03mm'),
|
('0.03', '±0.03mm'),
|
||||||
('0.02', '±0.02mm'),
|
('0.02', '±0.02mm'),
|
||||||
('0.01', '±0.01mm')], string='加工精度', default='0.10')
|
('0.01', '±0.01mm')], string='加工精度', default='0.10')
|
||||||
material_id = fields.Many2one('sf.production.materials', '材料')
|
material_id = fields.Many2one('sf.production.materials', '材料', tracking=True)
|
||||||
material_model_id = fields.Many2one('sf.materials.model', '型号')
|
material_model_id = fields.Many2one('sf.materials.model', '型号', tracking=True)
|
||||||
# process_id = fields.Many2one('sf.production.process', string='表面工艺')
|
# process_id = fields.Many2one('sf.production.process', string='表面工艺')
|
||||||
parameter_ids = fields.Many2many('sf.production.process.parameter', 'process_item_order_rel', string='可选参数')
|
parameter_ids = fields.Many2many('sf.production.process.parameter', 'process_item_order_rel', string='可选参数',
|
||||||
quantity = fields.Integer('数量', default=1)
|
tracking=True)
|
||||||
unit_price = fields.Float('单价')
|
quantity = fields.Integer('数量', default=1, tracking=True)
|
||||||
price = fields.Float('总价')
|
unit_price = fields.Float('单价', tracking=True)
|
||||||
|
price = fields.Float('总价', tracking=True)
|
||||||
model_file = fields.Binary('glb模型文件')
|
model_file = fields.Binary('glb模型文件')
|
||||||
upload_model_file = fields.Many2many('ir.attachment', 'upload_qf_model_file_attachment_ref', string='上传模型文件')
|
upload_model_file = fields.Many2many('ir.attachment', 'upload_qf_model_file_attachment_ref', string='上传模型文件')
|
||||||
delivery_time = fields.Date('交货日期')
|
delivery_time = fields.Date('交货日期')
|
||||||
@@ -49,10 +51,10 @@ class QuickEasyOrder(models.Model):
|
|||||||
state = fields.Selection([('草稿', '草稿'), ('待派单', '待派单'),
|
state = fields.Selection([('草稿', '草稿'), ('待派单', '待派单'),
|
||||||
('待接单', '待接单'), ('加工中', '加工中'),
|
('待接单', '待接单'), ('加工中', '加工中'),
|
||||||
('物流中', '物流中'), ('已交付', '已交付')], string='订单状态', default='草稿',
|
('物流中', '物流中'), ('已交付', '已交付')], string='订单状态', default='草稿',
|
||||||
readonly=True)
|
readonly=True, tracking=True)
|
||||||
model_color_state = fields.Selection([
|
model_color_state = fields.Selection([
|
||||||
('success', '成功'),
|
('success', '成功'),
|
||||||
('fail', '失败')], string='模型上色状态')
|
('fail', '失败')], string='模型上色状态', tracking=True)
|
||||||
processing_time = fields.Integer('加工时长(min)')
|
processing_time = fields.Integer('加工时长(min)')
|
||||||
sale_order_id = fields.Many2one('sale.order', '销售订单号')
|
sale_order_id = fields.Many2one('sale.order', '销售订单号')
|
||||||
|
|
||||||
@@ -94,8 +96,7 @@ class QuickEasyOrder(models.Model):
|
|||||||
obj.state = '待接单'
|
obj.state = '待接单'
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
def model_analyze(self, model_attachment):
|
||||||
def model_analyze(self,model_attachment):
|
|
||||||
"""
|
"""
|
||||||
step模型解析,上传模型时转为web可显示的格式
|
step模型解析,上传模型时转为web可显示的格式
|
||||||
:return:
|
:return:
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import os
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from stl import mesh
|
from stl import mesh
|
||||||
# from OCC.Core.GProp import GProp_GProps
|
# from OCC.Core.GProp import GProp_GProps
|
||||||
# from OCC.Extend.DataExchange import read_step_file
|
from OCC.Extend.DataExchange import read_step_file
|
||||||
# from OCC.Extend.DataExchange import write_stl_file
|
from OCC.Extend.DataExchange import write_stl_file
|
||||||
from odoo.addons.sf_base.commons.common import Common
|
from odoo.addons.sf_base.commons.common import Common
|
||||||
from odoo import models, fields, api
|
from odoo import models, fields, api
|
||||||
from odoo.modules import get_resource_path
|
from odoo.modules import get_resource_path
|
||||||
@@ -16,6 +16,7 @@ from odoo.exceptions import ValidationError, UserError
|
|||||||
|
|
||||||
class QuickEasyOrder(models.Model):
|
class QuickEasyOrder(models.Model):
|
||||||
_name = 'quick.easy.order'
|
_name = 'quick.easy.order'
|
||||||
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||||
_description = '简易下单'
|
_description = '简易下单'
|
||||||
_order = 'id desc'
|
_order = 'id desc'
|
||||||
|
|
||||||
@@ -32,13 +33,15 @@ class QuickEasyOrder(models.Model):
|
|||||||
('0.03', '±0.03mm'),
|
('0.03', '±0.03mm'),
|
||||||
('0.02', '±0.02mm'),
|
('0.02', '±0.02mm'),
|
||||||
('0.01', '±0.01mm')], string='加工精度', default='0.10')
|
('0.01', '±0.01mm')], string='加工精度', default='0.10')
|
||||||
material_id = fields.Many2one('sf.production.materials', '材料')
|
material_id = fields.Many2one('sf.production.materials', '材料', tracking=True)
|
||||||
material_model_id = fields.Many2one('sf.materials.model', '型号', domain="[('materials_id', '=', material_id)]")
|
material_model_id = fields.Many2one('sf.materials.model', '型号', domain="[('materials_id', '=', material_id)]",
|
||||||
|
tracking=True)
|
||||||
# process_id = fields.Many2one('sf.production.process', string='表面工艺')
|
# process_id = fields.Many2one('sf.production.process', string='表面工艺')
|
||||||
parameter_ids = fields.Many2many('sf.production.process.parameter', 'process_item_order_rel', string='可选参数')
|
parameter_ids = fields.Many2many('sf.production.process.parameter', 'process_item_order_rel', string='可选参数',
|
||||||
quantity = fields.Integer('数量', default=1)
|
tracking=True)
|
||||||
unit_price = fields.Float('单价')
|
quantity = fields.Integer('数量', default=1, tracking=True)
|
||||||
price = fields.Float('总价')
|
unit_price = fields.Float('单价', tracking=True)
|
||||||
|
price = fields.Float('总价', tracking=True)
|
||||||
model_file = fields.Binary('glb模型文件')
|
model_file = fields.Binary('glb模型文件')
|
||||||
upload_model_file = fields.Many2many('ir.attachment', 'upload_qf_model_file_attachment_ref', string='上传模型文件')
|
upload_model_file = fields.Many2many('ir.attachment', 'upload_qf_model_file_attachment_ref', string='上传模型文件')
|
||||||
delivery_time = fields.Date('交货日期')
|
delivery_time = fields.Date('交货日期')
|
||||||
@@ -46,10 +49,10 @@ class QuickEasyOrder(models.Model):
|
|||||||
state = fields.Selection([('草稿', '草稿'), ('待派单', '待派单'),
|
state = fields.Selection([('草稿', '草稿'), ('待派单', '待派单'),
|
||||||
('待接单', '待接单'), ('加工中', '加工中'),
|
('待接单', '待接单'), ('加工中', '加工中'),
|
||||||
('物流中', '物流中'), ('已交付', '已交付')], string='订单状态', default='草稿',
|
('物流中', '物流中'), ('已交付', '已交付')], string='订单状态', default='草稿',
|
||||||
readonly=True)
|
readonly=True, tracking=True)
|
||||||
model_color_state = fields.Selection([
|
model_color_state = fields.Selection([
|
||||||
('success', '成功'),
|
('success', '成功'),
|
||||||
('fail', '失败')], string='模型上色状态')
|
('fail', '失败')], string='模型上色状态', tracking=True)
|
||||||
processing_time = fields.Integer('加工时长(min)')
|
processing_time = fields.Integer('加工时长(min)')
|
||||||
sale_order_id = fields.Many2one('sale.order', '销售订单号')
|
sale_order_id = fields.Many2one('sale.order', '销售订单号')
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,11 @@
|
|||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</sheet>
|
</sheet>
|
||||||
|
<div class="oe_chatter">
|
||||||
|
<field name="message_follower_ids"/>
|
||||||
|
<field name="activity_ids"/>
|
||||||
|
<field name="message_ids" options="{'post_refresh': 'recipients'}"/>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|||||||
Reference in New Issue
Block a user