Merge branch 'refs/heads/develop' into feature/customer_supply
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
'data/stock_data.xml',
|
||||
'data/empty_racks_data.xml',
|
||||
'data/panel_data.xml',
|
||||
'data/sf_work_individuation_page.xml',
|
||||
'data/agv_scheduling_data.xml',
|
||||
'security/group_security.xml',
|
||||
'security/ir.model.access.csv',
|
||||
|
||||
8
sf_manufacturing/data/sf_work_individuation_page.xml
Normal file
8
sf_manufacturing/data/sf_work_individuation_page.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_1">
|
||||
<field name="code">PTD</field>
|
||||
<field name="name">后置三元检测</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -25,6 +25,8 @@ class ResMrpRoutingWorkcenter(models.Model):
|
||||
bom_id = fields.Many2one('mrp.bom', required=False)
|
||||
surface_technics_id = fields.Many2one('sf.production.process', string="表面工艺")
|
||||
reserved_duration = fields.Float('预留时长', default=30, tracking=True)
|
||||
is_outsource = fields.Boolean('外协', default=False)
|
||||
individuation_page = fields.Many2many('sf.work.individuation.page', string='个性化记录')
|
||||
|
||||
def get_no(self):
|
||||
international_standards = self.search(
|
||||
@@ -101,3 +103,10 @@ class ResMrpRoutingWorkcenter(models.Model):
|
||||
domain = args + [('id', 'not in', route_workcenter_ids)]
|
||||
return self._search(domain, limit=limit, access_rights_uid=name_get_uid)
|
||||
return super()._name_search(name, args, operator, limit, name_get_uid)
|
||||
|
||||
|
||||
class WorkIndividuationPage(models.Model):
|
||||
_name = 'sf.work.individuation.page'
|
||||
|
||||
code = fields.Char('编号')
|
||||
name = fields.Char('名称')
|
||||
|
||||
@@ -186,4 +186,7 @@ access_sf_detection_result_manager,sf_detection_result_manager,model_sf_detectio
|
||||
access_mrp_workorder_batch_replan_wizard_group_plan_dispatch,mrp_workorder_batch_replan_wizard_group_plan_dispatch,model_mrp_workorder_batch_replan_wizard,sf_base.group_plan_dispatch,1,1,1,0
|
||||
|
||||
access_mrp_workorder_group_purchase_director,mrp_workorder,model_mrp_workorder,sf_base.group_purchase_director,1,1,0,0
|
||||
access_mrp_workorder_group_purchase,mrp_workorder,model_mrp_workorder,sf_base.group_purchase,1,1,0,0
|
||||
access_mrp_workorder_group_purchase,mrp_workorder,model_mrp_workorder,sf_base.group_purchase,1,1,0,0
|
||||
|
||||
access_sf_work_individuation_page,sf_work_individuation_page,model_sf_work_individuation_page,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_sf_work_individuation_page_group_plan_dispatch,sf_work_individuation_page_group_plan_dispatch,model_sf_work_individuation_page,sf_base.group_plan_dispatch,1,1,0,0
|
||||
|
@@ -17,6 +17,8 @@
|
||||
<field name="bom_product_template_attribute_value_ids" position="after">
|
||||
<field name="routing_type" required="1"/>
|
||||
<field name="routing_tag" required="1" string="工序标签"/>
|
||||
<field name="is_outsource"/>
|
||||
<field name="individuation_page" widget="many2many_tags" options="{'create': False}"/>
|
||||
<field name="is_repeat"/>
|
||||
<field name="reserved_duration"/>
|
||||
</field>
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
|
||||
<!-- <button name="button_start" type="object" string="开始" class="btn-success" confirm="是否确认开始"-->
|
||||
<!-- attrs="{'invisible': ['|', '|', '|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel','to be detected')), ('is_user_working', '!=', False)]}"/>-->
|
||||
<button name="button_start" type="object" string="开始" class="btn-success" confirm="是否确认开始"
|
||||
<button name="button_start" type="object" string="开始" class="btn-success"
|
||||
attrs="{'invisible': [('state', '!=', 'ready')]}"/>
|
||||
<button name="button_pending" type="object" string="暂停" class="btn-warning"
|
||||
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"/>
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'views/view.xml',
|
||||
'views/quality_cnc_test_view.xml'
|
||||
'views/quality_cnc_test_view.xml',
|
||||
'views/quality_check_view.xml'
|
||||
],
|
||||
|
||||
'assets': {
|
||||
|
||||
@@ -11,3 +11,8 @@ class SfQualityPoint(models.Model):
|
||||
"('product', 'consu')), '|', ('company_id', '=', False), ('company_id', '=', company_id)]", help=
|
||||
"Quality Point will apply to every selected Products.")
|
||||
|
||||
is_inspect = fields.Boolean('需送检', default=False)
|
||||
operation_id = fields.Many2one(
|
||||
'mrp.routing.workcenter', 'Step', check_company=True,
|
||||
domain="[('is_outsource', '=', False),('company_id', 'in', (company_id, False))]")
|
||||
|
||||
|
||||
@@ -10,6 +10,80 @@ from odoo.addons.sf_base.commons.common import Common
|
||||
class QualityCheck(models.Model):
|
||||
_inherit = "quality.check"
|
||||
|
||||
quality_state = fields.Selection([
|
||||
('waiting', '等待'),
|
||||
('none', '待处理'),
|
||||
('pass', '通过的'),
|
||||
('fail', '失败的')], string='状态', tracking=True, store=True,
|
||||
default='none', copy=False, compute='_compute_quality_state')
|
||||
|
||||
processing_panel = fields.Char(related='workorder_id.processing_panel', string='加工面')
|
||||
|
||||
production_line_id = fields.Many2one(related='workorder_id.production_line_id',
|
||||
string='生产线')
|
||||
equipment_id = fields.Many2one(related='workorder_id.equipment_id', string='加工设备')
|
||||
model_file = fields.Binary(related='workorder_id.glb_file', string='加工模型')
|
||||
|
||||
detection_report = fields.Binary(related='workorder_id.detection_report', readonly=True, string='检测报告')
|
||||
test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], string="检测结果",
|
||||
default='合格')
|
||||
reason = fields.Selection(
|
||||
[("programming", "编程"), ("cutter", "刀具"), ("clamping", "装夹"), ("operate computer", "操机"),
|
||||
("technology", "工艺"), ("customer redrawing", "客户改图")], string="原因")
|
||||
detailed_reason = fields.Text('详细原因')
|
||||
machining_drawings = fields.Binary('2D加工图纸', related='workorder_id.machining_drawings')
|
||||
quality_standard = fields.Binary('质检标准', related='workorder_id.quality_standard')
|
||||
|
||||
operation_id = fields.Many2one('mrp.routing.workcenter', '作业', store=True, compute='_compute_operation_id')
|
||||
is_inspect = fields.Boolean('需送检', related='point_id.is_inspect')
|
||||
|
||||
@api.depends('point_id.operation_id')
|
||||
def _compute_operation_id(self):
|
||||
for qc in self:
|
||||
if qc.point_id.operation_id:
|
||||
qc.operation_id = qc.point_id.operation_id.id
|
||||
|
||||
@api.depends('point_id.is_inspect')
|
||||
def _compute_quality_state(self):
|
||||
for qc in self:
|
||||
if qc.point_id.is_inspect and qc.quality_state == 'none':
|
||||
qc.quality_state = 'waiting'
|
||||
elif not qc.point_id.is_inspect and qc.quality_state == 'waiting':
|
||||
qc.quality_state = 'none'
|
||||
|
||||
@api.onchange('test_results')
|
||||
def _onchange_test_results(self):
|
||||
if self.test_results == '合格':
|
||||
self.reason = False
|
||||
self.detailed_reason = False
|
||||
|
||||
def do_pass(self):
|
||||
self.ensure_one()
|
||||
super().do_pass()
|
||||
if self.workorder_id:
|
||||
# 1)将页签“判定结果”的检测结果值同步到【工单_后置三元检测_检测结果】
|
||||
if self.test_results in ['返工', '报废']:
|
||||
raise ValidationError('请重新选择【判定结果】-【检测结果】')
|
||||
if self.workorder_id.state not in ['done']:
|
||||
self.workorder_id.write({'test_results': self.test_results})
|
||||
# 2)将关联的工单状态更新为“已完成”
|
||||
self.workorder_id.button_finish()
|
||||
|
||||
def do_fail(self):
|
||||
self.ensure_one()
|
||||
super().do_fail()
|
||||
if self.workorder_id:
|
||||
# 1)将页签“判定结果”的检测结果值同步到【工单_后置三元检测_检测结果】
|
||||
if not self.test_results:
|
||||
raise ValidationError('请填写【判定结果】里的信息')
|
||||
if self.test_results == '合格':
|
||||
raise ValidationError('请重新选择【判定结果】-【检测结果】')
|
||||
if self.workorder_id.state not in ['done']:
|
||||
self.workorder_id.write(
|
||||
{'test_results': self.test_results, 'reason': self.reason, 'detailed_reason': self.detailed_reason})
|
||||
# 2)将关联的工单状态更新为“已完成”
|
||||
self.workorder_id.button_finish()
|
||||
|
||||
# ==========零件特采接口==========
|
||||
def _register_quality_check(self):
|
||||
config = self.env['res.config.settings'].get_values()
|
||||
@@ -31,10 +105,3 @@ class QualityCheck(models.Model):
|
||||
else:
|
||||
raise ValidationError("零件特采发送失败")
|
||||
|
||||
# def do_fail(self):
|
||||
# self.write({
|
||||
# 'quality_state': 'fail',
|
||||
# 'user_id': self.env.user.id,
|
||||
# 'control_date': datetime.now()})
|
||||
# if self.picking_id and 'WH/MO/' in self.picking_id.origin:
|
||||
# self._register_quality_check()
|
||||
|
||||
71
sf_quality/views/quality_check_view.xml
Normal file
71
sf_quality/views/quality_check_view.xml
Normal file
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="sf_quality_check_view_form" model="ir.ui.view">
|
||||
<field name="name">sf.quality.check.view.form</field>
|
||||
<field name="model">quality.check</field>
|
||||
<field name="inherit_id" ref="quality_control.quality_check_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='alert_ids']" position="after">
|
||||
<field name="production_line_id" attrs="{'invisible': [('production_id', '=', False)]}"/>
|
||||
<field name="equipment_id" attrs="{'invisible': [('production_id', '=', False)]}"/>
|
||||
<field name="model_file" widget="Viewer3D" string="模型" readonly="1" force_save="1"
|
||||
attrs="{'invisible': ['|', ('model_file', '=', False), ('production_id', '=', False)]}"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='partner_id']" position="after">
|
||||
<field name="processing_panel" attrs="{'invisible': [('production_id', '=', False)]}"/>
|
||||
<field name="workorder_id" string="工单号" readonly="1"
|
||||
attrs="{'invisible': [('production_id', '=', False)]}"/>
|
||||
<field name="is_inspect" attrs="{'invisible': [('production_id', '=', False)]}"/>
|
||||
</xpath>
|
||||
<xpath expr="//page[@name='notes']" position="before">
|
||||
<page string="检测报告" attrs="{'invisible': [('production_id', '=', False)]}">
|
||||
<field name="detection_report" string="" widget="pdf_viewer"/>
|
||||
</page>
|
||||
<page string="判定结果" attrs="{'invisible': [('production_id', '=', False)]}">
|
||||
<group attrs="{'readonly': [('quality_state','in', ['pass', 'fail'])]}">
|
||||
<field name="test_results"/>
|
||||
<field name="reason"
|
||||
attrs="{'required': [('test_results','in', ['返工','报废'])],'invisible': [('test_results','in', ['合格',False])]}"/>
|
||||
<field name="detailed_reason"
|
||||
attrs="{'required': [('reason','!=', False)],'invisible': [('test_results','in', ['合格',False])]}"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="2D图纸" attrs="{'invisible': [('production_id', '=', False)]}">
|
||||
<field name="machining_drawings" string="" widget="adaptive_viewer"/>
|
||||
</page>
|
||||
<page string="客户质量标准" attrs="{'invisible': [('production_id', '=', False)]}">
|
||||
<field name="quality_standard" string="" widget="adaptive_viewer"/>
|
||||
</page>
|
||||
<page string="其他"
|
||||
attrs="{'invisible': ['|', ('quality_state', 'not in', ['pass', 'fail']), ('production_id', '=', False)]}">
|
||||
<group>
|
||||
<field name="write_uid" widget='many2one_avatar_user' string="判定人" readonly="1"/>
|
||||
<field name="write_date" string="判定时间" readonly="1"/>
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_quality_check_view_tree" model="ir.ui.view">
|
||||
<field name="name">sf.quality.check.view.tree</field>
|
||||
<field name="model">quality.check</field>
|
||||
<field name="inherit_id" ref="quality_control.quality_check_view_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//tree//field[@name='name']" position="after">
|
||||
<field name="operation_id" invisible="1"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_quality_check_view_search" model="ir.ui.view">
|
||||
<field name="name">sf.quality.check.view.search</field>
|
||||
<field name="model">quality.check</field>
|
||||
<field name="inherit_id" ref="quality_control.quality_check_view_search"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='quality_state']" position="after">
|
||||
<field name="operation_id" icon="fa-filter" enable_counters="1"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -57,6 +57,10 @@
|
||||
<attribute name="class">custom_required</attribute>
|
||||
<attribute name="required">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//sheet//group//group[1]//field[@name='operation_id']" position="after">
|
||||
<field name="is_inspect" attrs="{'invisible': [('is_workorder_step', '=', False)]}"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user