优化质量:添加加工质检
This commit is contained in:
@@ -2,3 +2,4 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import models
|
||||
from . import controller
|
||||
|
||||
@@ -13,10 +13,11 @@
|
||||
'author': 'jikimo',
|
||||
'website': 'https://sf.cs.jikimo.com',
|
||||
# 此处依赖sf_manufacturing是因为我要重写其中的一个字段operation_id的string,故需要sf_manufacturing先安装
|
||||
'depends': ['quality_control'],
|
||||
'depends': ['quality_control', 'web_widget_model_viewer', 'sf_manufacturing'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'views/view.xml'
|
||||
'views/view.xml',
|
||||
'views/quality_cnc_test_view.xml'
|
||||
],
|
||||
|
||||
'assets': {
|
||||
|
||||
1
sf_quality/controller/__init__.py
Normal file
1
sf_quality/controller/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import workorder
|
||||
28
sf_quality/controller/workorder.py
Normal file
28
sf_quality/controller/workorder.py
Normal file
@@ -0,0 +1,28 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import json
|
||||
import requests
|
||||
import logging
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
from odoo.addons.sf_manufacturing.controllers.controllers import Manufacturing_Connect
|
||||
from odoo.addons.sf_base.commons.common import Common
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SfQualityConnect(Manufacturing_Connect):
|
||||
|
||||
@http.route('/AutoDeviceApi/AGVDownProduct', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def AGVDownProduct(self, **kw):
|
||||
res = super(SfQualityConnect, self).AGVDownProduct(**kw)
|
||||
res = json.loads(res)
|
||||
if res.get('workorder_ids'):
|
||||
try:
|
||||
_logger.info('已下产线的工单:%s' % res.get('workorder_ids'))
|
||||
for order_id in res['workorder_ids']:
|
||||
request.env['quality.cnc.test'].sudo().create(
|
||||
{'workorder_id': order_id, 'write_uid': False, 'write_date': False})
|
||||
except Exception as e:
|
||||
_logger.info('AGV运送下产线接口:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
@@ -3,3 +3,4 @@
|
||||
|
||||
from . import custom_quality
|
||||
from . import quality
|
||||
from . import quality_cnc_test
|
||||
|
||||
47
sf_quality/models/quality_cnc_test.py
Normal file
47
sf_quality/models/quality_cnc_test.py
Normal file
@@ -0,0 +1,47 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class SfQualityCncTest(models.Model):
|
||||
_name = 'quality.cnc.test'
|
||||
_description = 'CNC加工质检'
|
||||
|
||||
name = fields.Char('单号', default=lambda self: self.env['ir.sequence'].next_by_code('quality.cnc.test'))
|
||||
workorder_id = fields.Many2one('mrp.workorder')
|
||||
production_id = fields.Many2one(related='workorder_id.production_id', string='制造订单')
|
||||
product_id = fields.Many2one(related='workorder_id.product_id', string='产品')
|
||||
model_file = fields.Binary(related='workorder_id.glb_file', string='加工模型')
|
||||
processing_panel = fields.Char(related='workorder_id.processing_panel', string='加工面')
|
||||
equipment_id = fields.Many2one(related='workorder_id.equipment_id', string='加工设备')
|
||||
production_line_id = fields.Many2one(related='workorder_id.production_line_id',
|
||||
string='生产线')
|
||||
part_number = fields.Char(related='workorder_id.part_number', string='成品零件图号')
|
||||
detection_report = fields.Binary(related='workorder_id.detection_report', readonly=True, string='检测报告')
|
||||
state = fields.Selection([
|
||||
('waiting', '待判定'),
|
||||
('done', '已完成')], string='状态', default='waiting')
|
||||
result = fields.Selection([
|
||||
('pass', '合格'),
|
||||
('fail', '不合格')], string='判定结果')
|
||||
number = fields.Integer('数量', default=1)
|
||||
test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], default='合格',
|
||||
string="检测结果")
|
||||
reason = fields.Selection(
|
||||
[("programming", "编程"), ("cutter", "刀具"), ("clamping", "装夹"), ("operate computer", "操机"),
|
||||
("technology", "工艺"), ("customer redrawing", "客户改图")], string="原因")
|
||||
detailed_reason = fields.Text('详细原因')
|
||||
|
||||
def submit_pass(self):
|
||||
self.write({'result': 'pass', 'test_results': '合格', 'state': 'done'})
|
||||
self.workorder_id.write({'test_results': self.test_results})
|
||||
self.workorder_id.button_finish()
|
||||
|
||||
def submit_fail(self):
|
||||
if not self.reason and not self.detailed_reason:
|
||||
raise UserError(_('请填写【检测情况】里的信息'))
|
||||
else:
|
||||
self.write({'result': 'fail', 'test_results': '合格', 'state': 'done'})
|
||||
self.workorder_id.write(
|
||||
{'test_results': self.test_results, 'reason': self.reason, 'detailed_reason': self.detailed_reason})
|
||||
self.workorder_id.button_finish()
|
||||
@@ -67,5 +67,8 @@ access_quality_alert_stage,quality.alert.stage,quality.model_quality_alert_stage
|
||||
access_stock_move_group_quality,stock_move_group_quality,stock.model_stock_move,sf_base.group_quality,1,1,0,0
|
||||
access_stock_move_group_quality_director,stock_move_group_quality_director,stock.model_stock_move,sf_base.group_quality_director,1,1,0,0
|
||||
|
||||
access_quality_cnc_test_group_quality,quality_cnc_test_group_quality,model_quality_cnc_test,sf_base.group_quality,1,1,0,0
|
||||
access_quality_cnc_test_group_quality_director,quality_cnc_test_group_quality_director,model_quality_cnc_test,sf_base.group_quality_director,1,1,0,0
|
||||
|
||||
|
||||
|
||||
|
||||
|
126
sf_quality/views/quality_cnc_test_view.xml
Normal file
126
sf_quality/views/quality_cnc_test_view.xml
Normal file
@@ -0,0 +1,126 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="sequence_quality_cnc_test" model="ir.sequence">
|
||||
<field name="name">加工质检单编码规则</field>
|
||||
<field name="code">quality.cnc.test</field>
|
||||
<field name="prefix">QCT</field>
|
||||
<field name="padding">4</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record id="quality_cnc_test_view_tree" model="ir.ui.view">
|
||||
<field name="name">quality.cnc.test.view.tree</field>
|
||||
<field name="model">quality.cnc.test</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree sample="1">
|
||||
<field name="name"/>
|
||||
<field name="production_id"/>
|
||||
<field name="processing_panel"/>
|
||||
<field name="product_id"/>
|
||||
<field name="part_number"/>
|
||||
<field name="number"/>
|
||||
<field name="state"/>
|
||||
<field name="result"/>
|
||||
<field name="write_uid" widget='many2one_avatar_user' string="判定人"/>
|
||||
<field name="write_date" string="判定时间"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="quality_cnc_test_search">
|
||||
<field name="name">search.quality.cnc.test</field>
|
||||
<field name="model">quality.cnc.test</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="加工质检">
|
||||
<filter name="filter_waiting" string="待判定" domain="[('state', '=', 'waiting')]"/>
|
||||
<separator/>
|
||||
<field name="production_id" string="制造订单"
|
||||
filter_domain="[('production_id', 'ilike', self)]"/>
|
||||
<field name="product_id" string="产品"
|
||||
filter_domain="[('product_id', 'ilike', self)]"/>
|
||||
<searchpanel class="account_root">
|
||||
<field name="state" icon="fa-filter" enable_counters="1"/>
|
||||
<field name="result" icon="fa-filter" enable_counters="1"/>
|
||||
</searchpanel>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_quality_cnc_test" model="ir.actions.act_window">
|
||||
<field name="name">加工质检</field>
|
||||
<field name="res_model">quality.cnc.test</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="context">{ 'search_default_filter_waiting':1}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
请先创建一个加工质检单
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="quality_cnc_test_view_form">
|
||||
<field name="name">quality.cnc.test.form.</field>
|
||||
<field name="model">quality.cnc.test</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<header>
|
||||
<button string="合格" type="object" name="submit_pass"
|
||||
class="oe_highlight" confirm="是否确认提交?"
|
||||
attrs="{'invisible': [('result','!=', False)]}"/>
|
||||
<button string="不合格" type="object" name="submit_fail"
|
||||
class="oe_highlight" confirm="是否确认提交?"
|
||||
attrs="{'invisible': [('result','!=', False)]}"/>
|
||||
<field name="state" widget="statusbar"/>
|
||||
<field name="result" invisible="1"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<h2>
|
||||
<field name="name" readonly="1"/>
|
||||
</h2>
|
||||
<group>
|
||||
<group>
|
||||
<field name="production_id"/>
|
||||
<field name="product_id"/>
|
||||
<field name="production_line_id"/>
|
||||
<field name="equipment_id"/>
|
||||
<field name="model_file" widget="Viewer3D"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="part_number"/>
|
||||
<field name="processing_panel"/>
|
||||
<field name="detection_report"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="检测报告">
|
||||
<field name="detection_report" string="" widget="pdf_viewer"/>
|
||||
</page>
|
||||
<page string="检测情况">
|
||||
<group>
|
||||
<field name="test_results"/>
|
||||
<field name="reason"/>
|
||||
<field name="detailed_reason"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="其他">
|
||||
<group>
|
||||
<field name="write_uid" widget='many2one_avatar_user' string="判定人" readonly="1"/>
|
||||
<field name="write_date" string="判定时间" readonly="1"/>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem
|
||||
id="menu_quality_cnc_test"
|
||||
name="加工质检"
|
||||
action="action_quality_cnc_test"
|
||||
sequence="21"
|
||||
parent="quality_control.menu_quality_control"
|
||||
/>
|
||||
|
||||
</odoo>
|
||||
@@ -34,36 +34,36 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="quality_point_view_form_inherit_sf">
|
||||
<field name="name">quality.point.form.inherit.sf</field>
|
||||
<field name="model">quality.point</field>
|
||||
<field name="inherit_id" ref="quality.quality_point_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<!-- <xpath expr="//sheet//group//group//field[@name='title']" position="replace"> -->
|
||||
<!-- <field name="title" class="custom_required" required="1"/> -->
|
||||
<!-- </xpath> -->
|
||||
<xpath expr="//sheet//group//group//field[@name='title']" position="attributes">
|
||||
<attribute name="class">custom_required</attribute>
|
||||
<attribute name="required">1</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//sheet//group//group//field[@name='picking_type_ids']" position="attributes">
|
||||
<attribute name="class">custom_required</attribute>
|
||||
<attribute name="required">1</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
<!-- <record model="ir.ui.view" id="quality_point_view_form_inherit_sf">-->
|
||||
<!-- <field name="name">quality.point.form.inherit.sf</field>-->
|
||||
<!-- <field name="model">quality.point</field>-->
|
||||
<!-- <field name="inherit_id" ref="quality.quality_point_view_form"/>-->
|
||||
<!-- <field name="arch" type="xml">-->
|
||||
<!--<!– <xpath expr="//sheet//group//group//field[@name='title']" position="replace"> –>-->
|
||||
<!--<!– <field name="title" class="custom_required" required="1"/> –>-->
|
||||
<!--<!– </xpath> –>-->
|
||||
<!-- <xpath expr="//sheet//group//group//field[@name='title']" position="attributes">-->
|
||||
<!-- <attribute name="class">custom_required</attribute>-->
|
||||
<!-- <attribute name="required">1</attribute>-->
|
||||
<!-- </xpath>-->
|
||||
<!-- <xpath expr="//sheet//group//group//field[@name='picking_type_ids']" position="attributes">-->
|
||||
<!-- <attribute name="class">custom_required</attribute>-->
|
||||
<!-- <attribute name="required">1</attribute>-->
|
||||
<!-- </xpath>-->
|
||||
<!-- </field>-->
|
||||
<!-- </record>-->
|
||||
|
||||
<record model="ir.ui.view" id="sf_quality_point_view_form_inherit_quality_control">
|
||||
<field name="name">sf.quality.point.form.inherit.sf</field>
|
||||
<field name="model">quality.point</field>
|
||||
<field name="inherit_id" ref="quality_control.quality_point_view_form_inherit_quality_control"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='measure_on']" position="attributes">
|
||||
<attribute name="class">custom_required</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='measure_frequency_type']" position="attributes">
|
||||
<attribute name="class">custom_required</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
<!-- <record model="ir.ui.view" id="sf_quality_point_view_form_inherit_quality_control">-->
|
||||
<!-- <field name="name">sf.quality.point.form.inherit.sf</field>-->
|
||||
<!-- <field name="model">quality.point</field>-->
|
||||
<!-- <field name="inherit_id" ref="quality_control.quality_point_view_form_inherit_quality_control"/>-->
|
||||
<!-- <field name="arch" type="xml">-->
|
||||
<!-- <xpath expr="//field[@name='measure_on']" position="attributes">-->
|
||||
<!-- <attribute name="class">custom_required</attribute>-->
|
||||
<!-- </xpath>-->
|
||||
<!-- <xpath expr="//field[@name='measure_frequency_type']" position="attributes">-->
|
||||
<!-- <attribute name="class">custom_required</attribute>-->
|
||||
<!-- </xpath>-->
|
||||
<!-- </field>-->
|
||||
<!-- </record>-->
|
||||
</odoo>
|
||||
|
||||
Reference in New Issue
Block a user