Merge branch refs/heads/develop into refs/heads/feature/质量检查弹出框优化

This commit is contained in:
禹翔辉
2025-03-17 13:52:03 +08:00
29 changed files with 1619 additions and 45 deletions

View File

@@ -16,10 +16,15 @@
'depends': ['quality_control', 'web_widget_model_viewer', 'sf_manufacturing','jikimo_attachment_viewer'],
'data': [
'security/ir.model.access.csv',
'data/check_standards.xml',
'data/documents_data.xml',
'data/insepection_report_template.xml',
'data/report_actions.xml',
'views/view.xml',
'views/quality_cnc_test_view.xml',
'views/mrp_workorder.xml',
'views/quality_check_view.xml',
'views/quality_company.xml',
'wizard/check_picking_wizard_view.xml',
],

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="test_type_factory_inspection" model="quality.point.test_type">
<field name="name">出厂检验报告</field>
<field name="technical_name">factory_inspection</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- 创建出厂检验报告文件夹 -->
<record id="documents_purchase_contracts_folder" model="documents.folder">
<field name="name">出厂检验报告</field>
<field name="description">存放出厂检验报告相关文件</field>
<field name="sequence">11</field>
</record>
<!-- 创建出厂检验报告文件夹下的子文件夹-已发布 -->
<record id="documents_purchase_contracts_folder_published" model="documents.folder">
<field name="name">已发布</field>
<field name="parent_folder_id" ref="documents_purchase_contracts_folder"/>
<field name="sequence">1</field>
</record>
<!-- 创建出厂检验报告文件夹下的子文件夹-废弃 -->
<record id="documents_purchase_contracts_folder_canceled" model="documents.folder">
<field name="name">废弃</field>
<field name="parent_folder_id" ref="documents_purchase_contracts_folder"/>
<field name="sequence">2</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- 定义页眉模板 -->
<template id="report_quality_header">
<div class="header">
<div class="pdf-viewer-toolbar" style="display:flex;justify-content:space-between;align-items:center;">
<img t-if="o.company_id.favicon" t-att-src="image_data_uri(o.company_id.favicon)" style="max-height: 70px;" alt="Logo"/>
<div class="text-center">
<h2>出厂检验报告</h2>
</div>
<div class="float-right" style="text-align: right;">
<!-- 使用公开访问URL的二维码 -->
<img t-att-src="'/report/barcode/QR/%s' % o.get_report_url()" style="width:80px;height:80px"/>
<div style="font-size: 20px;">
<strong>报告编号: </strong><span t-field="o.name"/>
</div>
<!-- 添加扫码提示 -->
<div style="font-size: 12px; margin-top: 5px;">
<strong>扫描二维码查看PDF报告</strong>
</div>
</div>
</div>
</div>
</template>
<!-- 定义页脚模板 -->
<template id="report_quality_footer">
<div class="footer">
<div class="row">
<div class="col-6">
<p>售后服务: <span t-field="o.company_id.phone"/></p>
<p>公司名称: <span t-field="o.company_id.name"/></p>
<p>公司网址: <span t-field="o.company_id.website"/></p>
<p>公司邮箱: <span t-field="o.company_id.email"/></p>
</div>
<div class="col-6">
<p>加工工厂: <span t-field="o.company_id.factory_name"/></p>
</div>
</div>
<div class="text-center">
<span><span class="page"/> 页/共 <span class="topage"/></span>
</div>
</div>
</template>
<template id="report_quality_inspection">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="web.basic_layout">
<!-- 调用自定义页眉 -->
<t t-call="sf_quality.report_quality_header"/>
<div class="page">
<!-- <div class="col-6">
<div t-if="o.company_id.favicon" class="float-right">
<img t-att-src="image_data_uri(o.company_id.favicon)" style="max-height: 45px;" alt="Logo"/>
</div>
</div> -->
<!-- </div> -->
<table class="table table-sm o_main_table mt-4" style="border: 1px solid black;">
<tr>
<td style="width: 15%; border: 1px solid black;"><strong>产品名称:</strong></td>
<td style="width: 35%; border: 1px solid black;"><span t-field="o.product_id.name"/></td>
<td style="width: 15%; border: 1px solid black;"><strong>材料:</strong></td>
<td style="width: 35%; border: 1px solid black;"><span t-field="o.material_name"/></td>
</tr>
<tr>
<td style="border: 1px solid black;"><strong>图号:</strong></td>
<td style="border: 1px solid black;"><span t-field="o.part_number"/></td>
<td style="border: 1px solid black;"><strong>日期:</strong></td>
<td style="border: 1px solid black;"><span t-field="o.write_date"/></td>
</tr>
<tr>
<td style="border: 1px solid black;"><strong>总数量:</strong></td>
<td style="border: 1px solid black;"><span t-field="o.total_qty"/></td>
<td style="border: 1px solid black;"><strong>检验数量:</strong></td>
<td style="border: 1px solid black;"><span t-field="o.check_qty"/></td>
</tr>
</table>
<h4 class="text-center mt-4">检验结果</h4>
<div class="" style="position: relative;">
<table class="table table-sm mt-2" style="border: 1px solid black;">
<thead>
<tr>
<th style="border: 1px solid black;" class="text-center" rowspan="2">检测项目<br/>(图示尺寸)</th>
<th style="border: 1px solid black;" t-att-colspan="o.column_nums" class="text-center">测量值</th>
<th style="border: 1px solid black; vertical-align: middle;" class="text-center" rowspan="2">判定</th>
<th style="border: 1px solid black; vertical-align: middle;" class="text-center" rowspan="2">备注</th>
</tr>
<tr>
<!-- <th style="border: 1px solid black;"></th> -->
<th style="border: 1px solid black;" t-if="o.column_nums >= 1" class="text-center">1</th>
<th style="border: 1px solid black;" t-if="o.column_nums >= 2" class="text-center">2</th>
<th style="border: 1px solid black;" t-if="o.column_nums >= 3" class="text-center">3</th>
<th style="border: 1px solid black;" t-if="o.column_nums >= 4" class="text-center">4</th>
<th style="border: 1px solid black;" t-if="o.column_nums >= 5" class="text-center">5</th>
<!-- <th style="border: 1px solid black;"></th>
<th style="border: 1px solid black;"></th> -->
</tr>
</thead>
<tbody>
<tr t-foreach="o.measure_line_ids" t-as="line">
<td style="border: 1px solid black;" class="text-center"><span t-field="line.measure_item"/></td>
<td style="border: 1px solid black;" t-if="o.column_nums >= 1" class="text-center"><span t-field="line.measure_value1"/></td>
<td style="border: 1px solid black;" t-if="o.column_nums >= 2" class="text-center"><span t-field="line.measure_value2"/></td>
<td style="border: 1px solid black;" t-if="o.column_nums >= 3" class="text-center"><span t-field="line.measure_value3"/></td>
<td style="border: 1px solid black;" t-if="o.column_nums >= 4" class="text-center"><span t-field="line.measure_value4"/></td>
<td style="border: 1px solid black;" t-if="o.column_nums >= 5" class="text-center"><span t-field="line.measure_value5"/></td>
<td style="border: 1px solid black;" class="text-center"><span t-field="line.measure_result"/></td>
<td style="border: 1px solid black;" class="text-center"><span t-field="line.remark"/></td>
</tr>
</tbody>
</table>
<img src="/sf_quality/static/img/pass.png" style="width: 200px; height: 200px;position: absolute; bottom: 20px; right: 20%;"/>
</div>
<div class="row mt-4">
<div class="col-12">
<h5>检验结论:
<span t-if="o.report_result == 'OK'" style="margin-left: 20px;">☑ 合格</span>
<span t-else="" style="margin-left: 20px;">□ 合格</span>
<span t-if="o.report_result == 'NG'" style="margin-left: 40px;">☑ 不合格</span>
<span t-else="" style="margin-left: 40px;">□ 不合格</span>
</h5>
</div>
</div>
<div class="row mt-4">
<div class="col-6">
<p><strong>操作员: </strong> <span t-field="o.measure_operator"/></p>
</div>
<div class="col-6">
<p><strong>质检员: </strong> <span t-field="o.quality_manager"/></p>
</div>
</div>
<!-- 添加合格标签 -->
<div class="row mt-5">
<div class="col-12 text-center">
<p>(以下空白)</p>
</div>
</div>
<!-- 调用自定义页脚 -->
<t t-call="sf_quality.report_quality_footer"/>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_report_quality_inspection" model="ir.actions.report">
<field name="name">出厂检验报告</field>
<field name="model">quality.check</field> <!-- 请替换为实际的模型名称 -->
<field name="report_type">qweb-pdf</field>
<field name="report_name">sf_quality.report_quality_inspection</field>
<field name="report_file">sf_quality.report_quality_inspection</field>
<field name="print_report_name">'QC-' + object.name + '.pdf'</field>
<field name="binding_model_id" ref="model_quality_check"/> <!-- 请替换为实际的模型ID引用 -->
<field name="binding_type">report</field>
<field name="attachment">'QC-'+object.name+'-'+str(object.write_date)+'.pdf'</field>
<field name="attachment_use">True</field>
</record>
<!-- 定义HTML预览报告动作 -->
<record id="action_report_quality_inspection_preview" model="ir.actions.report">
<field name="name">预览检验报告</field>
<field name="model">quality.check</field>
<field name="report_type">qweb-html</field>
<field name="report_name">sf_quality.report_quality_inspection</field>
<field name="binding_type">report</field>
</record>
</odoo>

View File

@@ -6,3 +6,4 @@ from . import quality
from . import quality_cnc_test
from . import mrp_workorder
from . import stock
from . import quality_company

View File

@@ -1,9 +1,10 @@
# -*- coding: utf-8 -*-
from odoo import models, fields
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class SfQualityPoint(models.Model):
_inherit = 'quality.point'
_rec_name = 'title'
product_ids = fields.Many2many(
'product.product', string='适用产品',
@@ -15,4 +16,14 @@ class SfQualityPoint(models.Model):
operation_id = fields.Many2one(
'mrp.routing.workcenter', 'Step', check_company=True,
domain="[('is_outsource', '=', False),('company_id', 'in', (company_id, False))]")
@api.onchange('test_type_id')
def _onchange_test_type_id(self):
"""
如果类型选择了出厂检验报告检查measure_on的值是否为product如果为product则类型的值不变如果
不是,则提示错误
"""
if self.test_type_id.name == '出厂检验报告':
if self.measure_on != 'product':
raise ValidationError('出厂检验报告的测量对象必须为产品')

View File

@@ -0,0 +1,8 @@
from odoo import models, fields
# 为公司增加字段
class Company(models.Model):
_inherit = 'res.company'
factory_name = fields.Char('加工工厂')

View File

@@ -6,6 +6,16 @@ class StockPicking(models.Model):
def button_validate(self):
res = super(StockPicking, self).button_validate()
"""
出厂检验报告上传
"""
out_quality_check = self.env['quality.check'].search(
[('picking_id', '=', self.id), ('test_type_id.name', '=', '出厂检验报告')])
if not out_quality_check.is_factory_report_uploaded:
if out_quality_check and self.state == 'assigned':
out_quality_check.upload_factory_report()
"""
调拨单若关联了质量检查单,验证调拨单时,应校验是否有不合格品,若存在,应弹窗提示:
“警告存在不合格产品XXXX n 件、YYYYY m件继续调拨请点“确认”否则请取消

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -37,11 +37,11 @@
</group>
</group>
</page>
<page string="2D图纸" attrs="{'invisible': [('production_id', '=', False)]}">
<field name="machining_drawings" string="" widget="adaptive_viewer"/>
<page string="2D加工图纸" attrs="{'invisible': [('categ_type', 'not in', ['成品', '坯料'])]}">
<field name='machining_drawings' widget="adaptive_viewer"/>
</page>
<page string="客户质量标准" attrs="{'invisible': [('production_id', '=', False)]}">
<field name="quality_standard" string="" widget="adaptive_viewer"/>
<page string="质检标准" attrs="{'invisible': [('categ_type', 'not in', ['成品', '坯料'])]}">
<field name='quality_standard' widget="adaptive_viewer"/>
</page>
<page string="其他"
attrs="{'invisible': ['|',('quality_state', 'not in', ['pass', 'fail']), ('production_id', '=', False)]}">
@@ -52,6 +52,7 @@
</page>
</xpath>
<xpath expr="//header//button[@name='do_pass'][1]" position="attributes">
<attribute name="attrs">{'invisible': [('is_out_check', '=', True)]}</attribute>
<attribute name="string">合格</attribute>
</xpath>
<xpath expr="//header//button[@name='do_pass'][2]" position="attributes">
@@ -59,12 +60,32 @@
<attribute name="string">合格</attribute>
</xpath>
<xpath expr="//header//button[@name='do_fail'][1]" position="attributes">
<attribute name="attrs">{'invisible': [('is_out_check', '=', True)]}</attribute>
<attribute name="string">不合格</attribute>
</xpath>
<xpath expr="//header//button[@name='do_fail'][2]" position="attributes">
<attribute name="attrs">{'invisible': ['|',('quality_state', '!=', 'pass'),('work_state','in', ('done', 'rework'))]}</attribute>
<attribute name="string">不合格</attribute>
</xpath>
<xpath expr="//header" position="inside">
<field name="is_out_check" invisible="1"/>
<field name="publish_status" invisible="1"/>
<button name="%(sf_quality.action_report_quality_inspection_preview)d"
string="预览"
type="action"
class="oe_highlight" attrs="{'invisible': [('is_out_check', '=', False)]}"/>
<!-- --><!-- 如果还需要打印按钮 -->
<!-- <button name="%(sf_quality.action_report_quality_inspection)d" -->
<!-- string="打印报告" -->
<!-- type="action"/> -->
<!-- <button name="do_preview" string="预览" type="object" class="btn-primary" attrs="{'invisible': [('is_out_check', '=', False)]}"/> -->
<button name="do_publish" string="发布" type="object" class="btn-primary" attrs="{'invisible': ['|', ('is_out_check', '=', False), ('publish_status', '!=', 'draft')]}"/>
<!-- <button name="get_report_url" string="ceshi" type="object" class="btn-primary"/> -->
<!-- <button name="upload_factory_report" string="upload_factory_report" type="object" class="btn-primary"/> -->
<button name="do_cancel_publish" string="取消发布" type="object" class="btn-primary" attrs="{'invisible': ['|',('is_out_check', '=', False), ('publish_status', '!=', 'published')]}"/>
<button name="do_re_publish" string="重新发布" type="object" class="btn-primary" attrs="{'invisible': ['|', ('is_out_check', '=', False), ('publish_status', '!=', 'canceled')]}"/>
</xpath>
</field>
</record>

View File

@@ -0,0 +1,13 @@
<odoo>
<record id="sf_quality_company_view" model="ir.ui.view">
<field name="name">sf.quality.company.view</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="after">
<field name="factory_name"/>
</xpath>
</field>
</record>
</odoo>