Merge branch 'feature/绑定托盘功能' into develop

This commit is contained in:
gqh
2022-11-03 15:10:07 +08:00
11 changed files with 509 additions and 12 deletions

View File

@@ -247,3 +247,20 @@ class CuttingToolType(models.Model):
brand_id = fields.Many2one('mrs.machine.brand', string='品牌')
remark = fields.Text('备注')
active = fields.Boolean('有效', default=True)
class CNCprocessing(models.Model):
_name = 'cnc.processing'
_description = "CNC加工"
FNo = fields.Char(string="序号")
FPGName = fields.Char(string="程序名")
FKnifeName = fields.Char(string="刀具名称")
FDNo = fields.Char(string="刀号")
FWorkType = fields.Char(string="加工类型")
FXY = fields.Char(string="余量_X/Y")
FZ = fields.Char(string="余量_Z")
FJGSD = fields.Char(string="加工深度(Z)")
FSCCD = fields.Char(string="刀具伸出长度")
FDJSpec = fields.Char(string="刀柄型号")
FJGDate = fields.Char(string="预计加工时间")
FComment = fields.Char(string="备注")

View File

@@ -72,9 +72,9 @@ class Tray(models.Model):
_name = 'sf.tray'
_description = '托盘'
code = fields.Char('编码')
code = fields.Char('编码',copy=False)
name = fields.Char('名称')
state = fields.Selection(
[("空闲", "空闲"), ("占用", "占用"), ("报损", "报损")],
default=" ", string="状态")
default="空闲", string="状态")
active = fields.Boolean('有效', default=True)

View File

@@ -13,6 +13,7 @@ access_mrs_production_materials,mrs_production_materials,model_mrs_production_ma
access_mrs_materials_model,mrs_materials_model,model_mrs_materials_model,base.group_user,1,1,1,1
access_mrs_processing_technology,mrs_processing_technology,model_mrs_processing_technology,base.group_user,1,1,1,1
access_sf_tray,sf_tray,model_sf_tray,base.group_user,1,1,1,1
access_cnc_processing,cnc_processing,model_cnc_processing,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
13 access_mrs_processing_technology mrs_processing_technology model_mrs_processing_technology base.group_user 1 1 1 1
14 access_sf_tray sf_tray model_sf_tray base.group_user 1 1 1 1
15 access_cnc_processing cnc_processing model_cnc_processing base.group_user 1 1 1 1
16
17
18
19

View File

@@ -281,14 +281,18 @@
<field name="name">sf.tray.search</field>
<field name="model">sf.tray</field>
<field name="arch" type="xml">
<search string="托盘">
<field name="name" string="名称" filter_domain="[('name','ilike',self)]"/>
<field name="code" string="编码" filter_domain="[('code','ilike',self)]"/>
<!-- <field name="state" string="状态" filter_domain="[('state','ilike',self)]"/>-->
</search>
<group string="分组">
<filter name="state" string="状态" domain="[]" context="{'group_by': 'state'}"/>
</group>
<!-- <group>-->
<search string="托盘">
<field name="name" string="名称" filter_domain="[('name','like',self)]"/>
<field name="code" string="编码" filter_domain="[('code','like',self)]"/>
</search>
<group string="分组">
<filter name="state" string="状态" domain="[]" context="{'group_by': 'state'}"/>
</group>
<!-- </group>-->
</field>
</record>
@@ -308,11 +312,11 @@
<field name="name">sf.tray.form</field>
<field name="model">sf.tray</field>
<field name="arch" type="xml">
<header><field name = 'state' widget="radio" options="{'horizontal': True}"/></header>
<form string="托盘">
<group string="基本信息">
<group string="基本信息" name="group1">
<group>
<field name="code" required="1"/>
<field name="state" required="1"/>
</group>
<group>
<field name="name" required="1"/>

View File

@@ -0,0 +1,3 @@
# -*-coding:utf-8-*-
from . import models
from . import report

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': '机企猫藏智能工厂 工序',
'version': '1.0',
'summary': '智能工厂工作中心工序',
'sequence': 1,
'description': """
在本模块,同步资源库
""",
'category': 'YZ',
'website': 'https://www.sf.cs.jikimo.com',
'depends': ['mrp', 'sf_base','hr_holidays'],
'data': [
'views/sf_tray_view.xml',
'views/sf_workorder.xml',
'report/sf_tray_report.xml'
],
'demo': [
],
'qweb': [
],
'installable': True,
'application': False,
'auto_install': False,
}

View File

@@ -0,0 +1,2 @@
# -*-coding:utf-8-*-
from . import workcenter

View File

@@ -0,0 +1,207 @@
# -*- coding: utf-8 -*-
# Part of SmartGo. See LICENSE file for full copyright and licensing details.
import base64
import logging
import math
import qrcode
from io import BytesIO
from odoo import api, fields, models
import barcode
from barcode.writer import ImageWriter
from pystrich.code128 import Code128Encoder
from odoo.exceptions import UserError
_logger = logging.getLogger(__name__)
class CNCprocessing(models.Model):
_inherit = 'cnc.processing'
_description = "CNC加工"
workorder_id = fields.Many2one('mrp.workorder' ,string="工单")
class Tray(models.Model):
_inherit = 'sf.tray'
_description = '托盘'
qr_image = fields.Binary(string="托盘二维码", compute='compute_qr_image')
production_id = fields.Many2one('mrp.production', string='制造订单',
related='workorder_id.production_id'
)
workorder_id = fields.Many2one('mrp.workorder', string="工单"
)
@api.onchange('production_id')
def updateTrayState(self):
if self.workorder_id != False:
self.state = '占用'
else:
self.state = '空闲'
def unclamp(self):
self.workorder_id = False
self.production_id = False
self.state = '空闲'
@api.depends('code')
def compute_qr_image(self):
for item in self:
if not item.code:
item.qr_image = False
continue
# 根据code动态生成二维码图片
# qr = qrcode.QRCode(
# version=1,
# error_correction=qrcode.constants.ERROR_CORRECT_L,
# box_size=10,
# border=4,
# )
# qr.add_data(item.code)
# qr.make(fit=True)
# img = qr.make_image()
# 生成条形码文件
# bar = barcode.get("ean13", "123456789102", writer=ImageWriter())
# a = bar.get_fullcode()
# b = bar.save('occ')
# 生成条形码图片
partner_encoder = Code128Encoder(item.code)
# 转换bytes流
temp = BytesIO()
partner_encoder.save(temp)
# img.save(temp, format='PNG')
qr_image = base64.b64encode(temp.getvalue())
item.qr_image = qr_image
'''
工单绑定托盘信息
'''
class MrpWorkOrder(models.Model):
_inherit = 'mrp.workorder'
_description = '工单'
tray_id = fields.Many2one('sf.tray', string="托盘")
tray_code = fields.Char(
string='托盘编码',
related='tray_id.code')
tray_state = fields.Selection(
string='托盘状态',
related='tray_id.state')
# def get_tray_info(self):
# @api.onchange('X_axis', 'Y_axis', 'Z_axis')
# def get_center_point(self):
# return 'X:%s,Y:%s,Z:%s' % (self.X_axis, self.Y_axis, self.Z_axis)
# 加工面
surface = fields.Selection([("前面", "前面"), ("后面", "后面"), ("左面", "左面"), ("右面", "右面"),
("上面", "上面")], required=True, default="顶面", string="加工面")
material_center_point = fields.Char(string='配料中心点')
X1_axis = fields.Float(string='Lx1', default=0)
Y1_axis = fields.Float(string='Ly1', default=0)
Z1_axis = fields.Float(string='Lz1', default=0)
X2_axis = fields.Float(string='Lx2', default=0)
Y2_axis = fields.Float(string='Ly2', default=0)
Z2_axis = fields.Float(string='Lz2', default=0)
X3_axis = fields.Float(string='Fx3', default=0)
Y3_axis = fields.Float(string='Fy3', default=0)
Z3_axis = fields.Float(string='Fz3', default=0)
X4_axis = fields.Float(string='Fx4', default=0)
Y4_axis = fields.Float(string='Fy4', default=0)
Z4_axis = fields.Float(string='Fz4', default=0)
X5_axis = fields.Float(string='Rx5', default=0)
Y5_axis = fields.Float(string='Ry5', default=0)
Z5_axis = fields.Float(string='Rz5', default=0)
X6_axis = fields.Float(string='Rx6', default=0)
Y6_axis = fields.Float(string='Ry6', default=0)
Z6_axis = fields.Float(string='Rz6', default=0)
X7_axis = fields.Float(string='Bx7', default=0)
Y7_axis = fields.Float(string='By7', default=0)
Z7_axis = fields.Float(string='Bz7', default=0)
X8_axis = fields.Float(string='Bx8', default=0)
Y8_axis = fields.Float(string='By8', default=0)
Z8_axis = fields.Float(string='Bz8', default=0)
X9_axis = fields.Float(string='Uz9', default=0)
Y9_axis = fields.Float(string='Uz9', default=0)
Z9_axis = fields.Float(string='Uz9', default=0)
X10_axis = fields.Float(string='Uz10', default=0)
Y10_axis = fields.Float(string='Uz10', default=0)
Z10_axis = fields.Float(string='Uz10', default=0)
# 扫码绑定托盘方法
def gettray(self):
return ""
# 计算配料中心点和与x轴倾斜度方法
def getcenter(self):
x1 = self.X1_axis
x2 = self.X2_axis
x3 = self.X3_axis
x4 = self.X4_axis
x5 = self.X5_axis
x6 = self.X6_axis
x7 = self.X7_axis
x8 = self.X8_axis
y1 = self.Y1_axis
y2 = self.Y2_axis
y3 = self.Y3_axis
y4 = self.Y4_axis
y5 = self.Y5_axis
y6 = self.Y6_axis
y7 = self.Y7_axis
y8 = self.Y8_axis
z1 = self.Z9_axis
x0 = ((x3 - x4) * (x2 * y1 - x1 * y2) - (x1 - x2) * (x4 * y3 - x3 * y4)) / (
(x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4))
y0 = ((y3 - y4) * (y2 * x1 - y1 * x2) - (y1 - y2) * (y4 * x3 - y3 * x4)) / (
(y3 - y4) * (x1 - x2) - (y1 - y2) * (x3 - x4))
x1 = ((x7 - x8) * (x6 * y5 - x5 * y7) - (x5 - x6) * (x8 * y7 - x7 * y8)) / (
(x7 - x8) * (y5 - y6) - (x5 - x6) * (y7 - y8));
y1 = ((y7 - y8) * (y6 * x5 - y5 * x7) - (y5 - y6) * (y8 * x7 - y7 * x8)) / (
(y7 - y8) * (x5 - x6) - (y5 - y6) * (x7 - x8))
x = (x0 + x1) / 2
y = (y0 + y1) / 2
z = z1 / 2
jd = math.atan2((x7 - x8), (y7 - y8))
jdz = jd * 180 / math.pi
print("(%s,%s)" % (x, y))
self.material_center_point = ("(%s,%s,%s)" % (x, y, z))
self.X_deviation_angle = jdz
X_deviation_angle = fields.Integer(string="X轴偏差度", default=0)
test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], string="检测结果")
cnc_ids = fields.One2many("cnc.processing",'workorder_id', string="CNC加工")
# @api.depends('tray_id')
# def updateTrayState(self):
#
# for item in self:
# if item.tray_code == False:
# continue
# trayInfo = self.env['sf.tray'].sudo.search([('code', '=', item.tray_code)])
# if trayInfo:
# trayInfo.update(
# {
# 'production_id': item.production_id,
# 'state': "占用",
# }
# )
'''
制造订单绑定托盘信息
'''
class MrpProduction(models.Model):
_inherit = 'mrp.production'
_description = "制造订单"
tray_ids = fields.One2many('sf.tray', 'production_id', string="托盘")

View File

@@ -0,0 +1,50 @@
<odoo>
<data>
<record id="sf_tray1" model="report.paperformat">
<field name="name">Dymo Label Sheet</field>
<field name="default" eval="True"/>
<field name="format">custom</field>
<field name="page_height">100</field>
<field name="page_width">60</field>
<field name="orientation">Landscape</field>
<field name="margin_top">0</field>
<field name="margin_bottom">0</field>
<field name="margin_left">0</field>
<field name="margin_right">0</field>
<field name="disable_shrinking" eval="True"/>
<field name="dpi">96</field>
</record>
<record id="label_sf_tray_code" model="ir.actions.report">
<field name="name">打印条形码</field>
<field name="model">sf.tray</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">sf_route_workcenter.sf_tray_template</field>
<field name="report_file">sf_route_workcenter.sf_tray_template</field>
<field name="binding_model_id" ref="model_sf_tray"/>
<field name="binding_type">report</field>
<field name="paperformat_id" ref="sf_route_workcenter.sf_tray1"/>
</record>
<template id="sf_tray_template">
<t t-call="web.html_container">
<t t-call="web.external_layout">
<t t-foreach="docs" t-as="o">
<div class="page">
<div t-field="o.code"
t-options="{'widget': 'barcode', 'width': 600, 'height': 100, 'img_style': 'width:350px;height:60px'}"/>
<div t-field="o.code" style="text-align: center"/>
</div>
</t>
</t>
</t>
</template>
</data>
</odoo>

View File

@@ -0,0 +1,29 @@
<odoo>
<data>
<record id="sf_tray_form_inherit" model="ir.ui.view">
<field name="name">托盘条形码生成</field>
<field name="model">sf.tray</field>
<field name="inherit_id" ref="sf_base.sf_tray_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='group1']" position="after">
<notebook>
<page string="生成条形码">
<field name='qr_image' widget="image"/>
<group>
<field name='production_id' readonly="1"
attrs='{"invisible": [("production_id","=",False)]}'/>
<field name="workorder_id"/>
</group>
<div class="col-12 col-lg-6 o_setting_box">
<button type="object" class="oe_highlight" name="unclamp" string="解除装夹"
attrs='{"invisible": [("state","=","空闲")]}'/>
</div>
</page>
</notebook>
</xpath>
</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,158 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="sf_install_the_tray_workorder_form_view" model="ir.ui.view">
<field name="name">装夹工序工单</field>
<field name="model">mrp.workorder</field>
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
<field name="arch" type="xml">
<xpath expr="//page[last()]" position="after">
<page string="装夹托盘">
<group>
<field name="surface" widget="radio"/>
<div class="col-12 col-lg-6 o_setting_box">
<button type="object" class="oe_highlight" name="gettray" string="扫描托盘"
/>
</div>
</group>
</page>
</xpath>
<xpath expr="//page[last()]" position="after">
<page string="三元前置检测定位参数">
<group>
<group>
<field name="surface" widget="radio"/>
</group>
</group>
<group>
<div class="o_address_city">
<label for="X1_axis" string="Lx1"/>
<field name='X1_axis' class="o_address_city"/>
<label for="Y1_axis" string="Ly1"/>
<field name='Y1_axis' class="o_address_city"/>
<label for="Z1_axis" string="Lz1"/>
<field name='Z1_axis' class="o_address_city"/>
</div>
<div class="o_address_city">
<label for="X2_axis" string="Lx2"/>
<field name='X2_axis' class="o_address_city"/>
<label for="Y2_axis" string="Ly2"/>
<field name='Y2_axis' class="o_address_city"/>
<label for="Z2_axis" string="Lz2"/>
<field name='Z2_axis' class="o_address_city"/>
</div>
<div class="o_address_city">
<label for="X3_axis" string="Fx3"/>
<field name='X3_axis' class="o_address_city"/>
<label for="Y3_axis" string="Fy3"/>
<field name='Y3_axis' class="o_address_city"/>
<label for="Z3_axis" string="Fz3"/>
<field name='Z3_axis' class="o_address_city"/>
</div>
<div class="o_address_city">
<label for="X4_axis" string="Fx4"/>
<field name='X4_axis' class="o_address_city"/>
<label for="Y4_axis" string="Fy4"/>
<field name='Y4_axis' class="o_address_city"/>
<label for="Z4_axis" string="Fz4"/>
<field name='Z4_axis' class="o_address_city"/>
</div>
<div class="o_address_city">
<label for="X5_axis" string="Rx5"/>
<field name='X5_axis' class="o_address_city"/>
<label for="Y5_axis" string="Ry5"/>
<field name='Y5_axis' class="o_address_city"/>
<label for="Z5_axis" string="Rz5"/>
<field name='Z5_axis' class="o_address_city"/>
</div>
<div class="o_address_city">
<label for="X6_axis" string="Rx6"/>
<field name='X6_axis' class="o_address_city"/>
<label for="Y6_axis" string="Ry6"/>
<field name='Y6_axis' class="o_address_city"/>
<label for="Z6_axis" string="Rz6"/>
<field name='Z6_axis' class="o_address_city"/>
</div>
<div class="o_address_city">
<label for="X7_axis" string="Bx7"/>
<field name='X7_axis' class="o_address_city"/>
<label for="Y7_axis" string="By7"/>
<field name='Y7_axis' class="o_address_city"/>
<label for="Z7_axis" string="Bz7"/>
<field name='Z7_axis' class="o_address_city"/>
</div>
<div class="o_address_city">
<label for="X8_axis" string="Bx8"/>
<field name='X8_axis' class="o_address_city"/>
<label for="Y8_axis" string="By8"/>
<field name='Y8_axis' class="o_address_city"/>
<label for="Z8_axis" string="Bz8"/>
<field name='Z8_axis' class="o_address_city"/>
</div>
<div class="o_address_city">
<label for="X9_axis" string="Ux9"/>
<field name='X9_axis' class="o_address_city"/>
<label for="Y9_axis" string="Uy9"/>
<field name='Y9_axis' class="o_address_city"/>
<label for="Z9_axis" string="Uz9"/>
<field name='Z9_axis' class="o_address_city"/>
</div>
<div class="o_address_city">
<label for="X10_axis" string="Ux10"/>
<field name='X10_axis' class="o_address_city"/>
<label for="Y10_axis" string="Uy10"/>
<field name='Y10_axis' class="o_address_city"/>
<label for="Z10_axis" string="Uz10"/>
<field name='Z10_axis' class="o_address_city"/>
</div>
<div class="col-12 col-lg-6 o_setting_box">
<button type="object" class="oe_highlight" name="getcenter" string="中心定位"
/>
</div>
</group>
<group>
<field name="material_center_point"/>
<field name='X_deviation_angle'/>
</group>
</page>
</xpath>
<xpath expr="//page[last()]" position="after">
<page string="CNC加工">
<group>
<field name="cnc_ids" widget="one2many"/>
</group>
</page>
</xpath>
<xpath expr="//page[last()]" position="after">
<page string="后置三元检测">
<group>
<field name="test_results" widget="radio"/>
</group>
</page>
</xpath>
</field>
</record>
</data>
</odoo>