Merge branch 'feature/修改产品等信息' into develop

# Conflicts:
#	sf_base/models/product_template.py
#	sf_route_workcenter/models/workcenter.py
This commit is contained in:
jinling.yang
2022-11-20 20:11:21 +08:00
14 changed files with 128 additions and 102 deletions

View File

@@ -16,7 +16,6 @@
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'views/mrs_base_view.xml', 'views/mrs_base_view.xml',
'views/mrs_common_view.xml', 'views/mrs_common_view.xml',
'views/mrp_routing_workcenter_view.xml',
"views/menu_view.xml", "views/menu_view.xml",
'views/sale_order_view.xml', 'views/sale_order_view.xml',
'views/product_template_view.xml', 'views/product_template_view.xml',

View File

@@ -6,6 +6,7 @@ class ModelType(models.Model):
_description = '模型类型' _description = '模型类型'
name = fields.Char('名称') name = fields.Char('名称')
embryo_tolerance = fields.Integer('胚料的容余量')
routing_tmpl_ids = fields.One2many('sf.model.type.routing.sort', 'model_type_id', '工序模板') routing_tmpl_ids = fields.One2many('sf.model.type.routing.sort', 'model_type_id', '工序模板')

View File

@@ -1,4 +1,4 @@
from odoo import models, fields,api from odoo import models, fields, api
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
@@ -9,7 +9,7 @@ class ResProductTemplate(models.Model):
model_long = fields.Float('模型长[mm]', digits=(16, 3)) model_long = fields.Float('模型长[mm]', digits=(16, 3))
model_width = fields.Float('模型宽[mm]', digits=(16, 3)) model_width = fields.Float('模型宽[mm]', digits=(16, 3))
model_height = fields.Float('模型高[mm]', digits=(16, 3)) model_height = fields.Float('模型高[mm]', digits=(16, 3))
model_volume = fields.Float('模型体积[mm³]', digits=(16, 3)) model_volume = fields.Float('模型体积[mm³]', digits=(16, 3), compute='_compute_model_volume', store=True)
model_precision = fields.Float('精度要求', digits=(16, 3)) model_precision = fields.Float('精度要求', digits=(16, 3))
model_materials_id = fields.Many2one('mrs.production.materials', string='模型材料') model_materials_id = fields.Many2one('mrs.production.materials', string='模型材料')
model_materials_type_id = fields.Many2one('mrs.materials.model', string='模型材料型号') model_materials_type_id = fields.Many2one('mrs.materials.model', string='模型材料型号')
@@ -22,6 +22,7 @@ class ResProductTemplate(models.Model):
# total_amount = fields.Float('金额', digits=(16, 3), compute='_compute_total_amount') # total_amount = fields.Float('金额', digits=(16, 3), compute='_compute_total_amount')
# model_number = # model_number =
# 胚料的长,宽,高 # 胚料的长,宽,高
embryo_long = fields.Float('胚料长[mm]', digits=(16, 3), onchange='count_embryo_size') embryo_long = fields.Float('胚料长[mm]', digits=(16, 3), onchange='count_embryo_size')
embryo_width = fields.Float('胚料宽[mm]', digits=(16, 3), onchange='count_embryo_size') embryo_width = fields.Float('胚料宽[mm]', digits=(16, 3), onchange='count_embryo_size')
@@ -29,6 +30,12 @@ class ResProductTemplate(models.Model):
embryo_materials_id = fields.Many2one('mrs.production.materials', string='胚料材料') embryo_materials_id = fields.Many2one('mrs.production.materials', string='胚料材料')
embryo_materials_type_id = fields.Many2one('mrs.materials.model', string='胚料材料型号') embryo_materials_type_id = fields.Many2one('mrs.materials.model', string='胚料材料型号')
long = fields.Float('长[mm]', digits=(16, 3), onchange='add_product_size')
width = fields.Float('宽[mm]', digits=(16, 3), onchange='add_product_size')
height = fields.Float('高[mm]', digits=(16, 3), onchange='add_product_size')
materials_id = fields.Many2one('mrs.production.materials', string='材料')
materials_type_id = fields.Many2one('mrs.materials.model', string='材料型号')
volume = fields.Float(compute='_compute_volume', store=True) volume = fields.Float(compute='_compute_volume', store=True)
@@ -36,6 +43,10 @@ class ResProductTemplate(models.Model):
def _compute_volume(self): def _compute_volume(self):
self.volume = self.embryo_long * self.embryo_width * self.embryo_height self.volume = self.embryo_long * self.embryo_width * self.embryo_height
@api.depends('model_long', 'model_width', 'model_height')
def _compute_model_volume(self):
self.model_volume = self.model_long * self.model_width * self.model_height
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品 # 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品
def product_create(self, product_id, item, order_id, order_number, i): def product_create(self, product_id, item, order_id, order_number, i):
copy_product_id = product_id.with_user(self.env.ref("base.user_admin")).copy() copy_product_id = product_id.with_user(self.env.ref("base.user_admin")).copy()
@@ -63,6 +74,7 @@ class ResProductTemplate(models.Model):
copy_product_id.sudo().write(vals) copy_product_id.sudo().write(vals)
return copy_product_id return copy_product_id
# 在产品上增加模型类型和加工的面例如A、B) # 在产品上增加模型类型和加工的面例如A、B)
# 并根据模型类型计算出产品的胚料尺寸; # 并根据模型类型计算出产品的胚料尺寸;
@api.onchange('model_type_id') @api.onchange('model_type_id')
@@ -82,6 +94,25 @@ class ResProductTemplate(models.Model):
# 根据模型类型默认给模型的长高宽加配置的长度;
@api.onchange('model_type_id')
def add_product_size(self):
if not self.model_type_id:
return
model_type = self.env['sf.model.type'].search(
[('id', '=', self.model_type_id.id)])
print(self.model_long)
print(self.model_width)
print(self.model_height)
for item in self:
print(item.model_long)
print(item.model_width)
print(item.model_height)
item.model_long = item.model_long + model_type.embryo_tolerance
item.model_width = item.model_width + model_type.embryo_tolerance
item.model_height = item.model_width + model_type.embryo_tolerance
class ResProductCategory(models.Model): class ResProductCategory(models.Model):
_inherit = "product.category" _inherit = "product.category"
@@ -124,14 +155,3 @@ class ResMrpBom(models.Model):
'product_uom_id': 1 'product_uom_id': 1
} }
return self.env['mrp.bom.line'].create(vals) return self.env['mrp.bom.line'].create(vals)

View File

@@ -264,5 +264,5 @@ class CNCprocessing(models.Model):
FJGSD = fields.Char(string="加工深度(Z)") FJGSD = fields.Char(string="加工深度(Z)")
FSCCD = fields.Char(string="刀具伸出长度") FSCCD = fields.Char(string="刀具伸出长度")
FDJSpec = fields.Char(string="刀柄型号") FDJSpec = fields.Char(string="刀柄型号")
FJGDate = fields.Char(string="预计加工时间") FJGDate = fields.Datetime(string="预计加工时间")
FComment = fields.Char(string="备注") FComment = fields.Char(string="备注")

View File

@@ -1,67 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
#-----------------作业-------------------
<record model="ir.ui.view" id="view_mrp_routing_workcenter_form_inherit_sf">
<field name="name">mrp.routing.workcenter.form.inherit.sf</field>
<field name="model">mrp.routing.workcenter</field>
<field name="inherit_id" ref="mrp.mrp_routing_workcenter_form_view"/>
<field name="arch" type="xml">
<field name="workcenter_id" position="replace">
<field name="workcenter_ids" widget="many2many_tags" string="工作中心" required="0"/>
</field>
<field name="bom_product_template_attribute_value_ids" position="after">
<field name="routing_type" required="1"/>
<field name="is_repeat"/>
</field>
</field>
</record>
#-----------------工单-------------------
<record model="ir.ui.view" id="view_mrp_production_workorder_form_inherit_sf">
<field name="name">mrp.production.workorder.form.inherit.sf</field>
<field name="model">mrp.workorder</field>
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
<field name="arch" type="xml">
<field name="production_id" position="after">
<field name="processing_panel" readonly="1"/>
</field>
</field>
</record>
<!-- <record model="ir.ui.view" id="view_mrp_production_workorder_tree_inherit_sf">-->
<!-- <field name="name">mrp.production.workorder.tree.inherit.sf</field>-->
<!-- <field name="model">mrp.workorder</field>-->
<!-- <field name="inherit_id" ref="mrp.mrp_production_workorder_tree_view"/>-->
<!-- <field name="arch" type="xml">-->
<!-- <field name="workcenter_id" position="replace">-->
<!-- <filter name="workcenter_ids" string="工作中心" />-->
<!-- </field>-->
<!-- </field>-->
<!-- </record>-->
<!-- <record model="ir.ui.view" id="view_mrp_production_workorder_filter_inherit_sf">-->
<!-- <field name="name">mrp.production.workorder.filter.inherit.sf</field>-->
<!-- <field name="model">mrp.workorder</field>-->
<!-- <field name="inherit_id" ref="mrp.view_mrp_production_workorder_form_view_filter"/>-->
<!-- <field name="arch" type="xml">-->
<!-- <xpath expr="//filter[@name='work_center']" position="replace">-->
<!-- <filter name="work_center" string="工作中心" context="{'group_by': 'workcenter_ids'}"/>-->
<!-- </xpath>-->
<!-- </field>-->
<!-- </record>-->
#-----------------制造订单里的工单-------------------
<record model="ir.ui.view" id="view_mrp_production_workorder_tree_editable_inherit_sf">
<field name="name">mrp.production.workorder.tree.editable.inherit.sf</field>
<field name="model">mrp.workorder</field>
<field name="inherit_id" ref="mrp.mrp_production_workorder_tree_editable_view"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="processing_panel"/>
</field>
</field>
</record>
</data>
</odoo>

View File

@@ -531,12 +531,16 @@
<form string="模型类型"> <form string="模型类型">
<group> <group>
<field name="name" required="1"/> <field name="name" required="1"/>
<field name="embryo_tolerance" required="1"/>
</group> </group>
<group> <group>
<field name='routing_tmpl_ids'> <field name='routing_tmpl_ids'>
<tree editable='bottom'> <tree editable='bottom'>
<field name="sequence" widget="handle"/> <field name="sequence" widget="handle" string="序号"/>
<field name="route_workcenter_id" string="工序"/> <field name="route_workcenter_id" string="工序"/>
<field name="routing_type" string="类型"/>
<field name="is_repeat" string="重复"/>
<field name="workcenter_ids" string="工作中心" widget="many2many_tags" />
</tree> </tree>
</field> </field>
</group> </group>

View File

@@ -10,9 +10,10 @@
""", """,
'category': '', 'category': '',
'website': 'https://www.sf.jikimo.com', 'website': 'https://www.sf.jikimo.com',
'depends': ['mrp'], 'depends': ['mrp', 'sf_base', 'sf_route_workcenter'],
'data': [ 'data': [
'views/sf_production.xml', 'views/sf_production.xml',
'views/mrp_routing_workcenter_view.xml'

View File

@@ -1,3 +1,4 @@
from . import sf_production from . import sf_production
from . import mrp_workorder from . import mrp_workorder

View File

@@ -10,7 +10,7 @@
""", """,
'category': 'YZ', 'category': 'YZ',
'website': 'https://www.sf.cs.jikimo.com', 'website': 'https://www.sf.cs.jikimo.com',
'depends': [], 'depends': ['sf_base'],
'data': [ 'data': [
# 'views/sale_process_order_view.xml' # 'views/sale_process_order_view.xml'
], ],

View File

@@ -0,0 +1 @@
from . import controllers

View File

@@ -1 +1,27 @@
from . import controllers # -*- coding: utf-8 -*-
import json
import logging
from datetime import date, timedelta
from odoo import http
from odoo.http import request
class Sf_Mrs_Connect(http.Controller):
@http.route('/api/cnc_processing/create', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
cors="*")
def get_cnc_processing_create(self, **kw):
"""
获取mrs下发的编程单
:param kw:
:return:
"""
logging.info('get_cnc_processing_create:%s' % kw)
try:
datas = request.httprequest.data
ret = json.loads(datas)
ret = json.loads(ret['result'])
for obj in ret:
request.env['cnc.processing'].with_user(request.env.ref("base.user_admin")).CNCprocessing_create(obj)
except Exception as e:
logging.info('get_cnc_processing_create error:%s' % e)

View File

@@ -10,7 +10,7 @@
""", """,
'category': 'YZ', 'category': 'YZ',
'website': 'https://www.sf.cs.jikimo.com', 'website': 'https://www.sf.cs.jikimo.com',
'depends': ['mrp', 'sf_base', 'hr_holidays', 'maintenance'], 'depends': ['mrp', 'sf_base', 'hr_holidays', 'maintenance', 'sf_manufacturing_orders'],
'data': [ 'data': [
'views/sf_tray_view.xml', 'views/sf_tray_view.xml',
'views/sf_workorder.xml', 'views/sf_workorder.xml',

View File

@@ -15,6 +15,8 @@ from odoo.addons.resource.models.resource import Intervals
class MrpWorkcenter(models.Model): class MrpWorkcenter(models.Model):
_inherit = "mrp.workcenter" _inherit = "mrp.workcenter"
machine_tool_id = fields.Many2one('mrs.machine_tool', '机床')
equipment_ids = fields.One2many( equipment_ids = fields.One2many(
'maintenance.equipment', 'workcenter_id', string="Maintenance Equipment", 'maintenance.equipment', 'workcenter_id', string="Maintenance Equipment",
check_company=True) check_company=True)

View File

@@ -3,13 +3,16 @@
import base64 import base64
import logging import logging
import math import math
import json
import requests
from io import BytesIO from io import BytesIO
from odoo import api, fields, models, SUPERUSER_ID, _ from odoo import api, fields, models, SUPERUSER_ID, _
from pystrich.code128 import Code128Encoder from pystrich.code128 import Code128Encoder
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
from datetime import datetime, timedelta from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from odoo.addons.sf_base.commons.common import Common
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@@ -19,6 +22,26 @@ class CNCprocessing(models.Model):
workorder_id = fields.Many2one('mrp.workorder', string="工单") workorder_id = fields.Many2one('mrp.workorder', string="工单")
# mrs下发编程单创建CNC加工
def CNCprocessing_create(self, obj):
workorder = self.env['mrp.workorder'].search([('production_id', '=', obj['manufacturing_order_no']),
('processing_panel', '=', obj['processing_panel']),
('routing_type', '=', 'CNC加工')])
self.env['cnc.processing'].create({
'workorder_id': workorder.id,
'FNo': obj['sequence_number'],
'FPGName': obj['program_name'],
'FKnifeName': obj['cutting_tool_name'],
'FDNo': obj['cutting_tool_no'],
'FWorkType': obj['processing_type'],
'FXY': obj['margin_x_y'],
'FZ': obj['margin_z'],
'FJGSD': obj['depth_of_processing_z'],
'FSCCD': obj['cutting_tool_extension_length'],
'FDJSpec': obj['cutting_tool_handle_type'],
# 'FJGDate': obj['']
})
class Tray(models.Model): class Tray(models.Model):
_inherit = 'sf.tray' _inherit = 'sf.tray'
@@ -83,11 +106,6 @@ class MrpWorkOrder(models.Model):
_inherit = 'mrp.workorder' _inherit = 'mrp.workorder'
_description = '工单' _description = '工单'
def button_start(self): def button_start(self):
if self.state == 'waiting': if self.state == 'waiting':
self.ensure_one() self.ensure_one()
@@ -133,7 +151,9 @@ class MrpWorkOrder(models.Model):
if self.date_planned_finished and self.date_planned_finished < start_date: if self.date_planned_finished and self.date_planned_finished < start_date:
vals['date_planned_finished'] = start_date vals['date_planned_finished'] = start_date
return self.write(vals) return self.write(vals)
else:raise ValidationError(_('请先完成上一步工单')) else:
raise ValidationError(_('请先完成上一步工单'))
# def get_tray_info(self): # def get_tray_info(self):
# @api.onchange('X_axis', 'Y_axis', 'Z_axis') # @api.onchange('X_axis', 'Y_axis', 'Z_axis')
# def get_center_point(self): # def get_center_point(self):
@@ -290,8 +310,31 @@ class MrpWorkOrder(models.Model):
else: else:
return True return True
# cnc程序获取
def fetchCNC(self): def fetchCNC(self):
return "" res = [{'model_code': self.product_id.barcode, 'production_no': self.production_id.name,
'machine_tool_code': self.workcenter_id.machine_tool_id.code,
'material_code': self.env['mrs.production.materials'].search(
[('id', '=', self.product_id.materials_id.id)]).materials_no,
'material_type_code': self.env['mrs.materials.model'].search(
[('id', '=', self.product_id.materials_type_id.id)]).materials_no,
'embryo_long': self.product_id.bom_ids.bom_line_ids.product_id.long,
'embryo_height': self.product_id.bom_ids.bom_line_ids.product_id.height,
'embryo_width': self.product_id.bom_ids.bom_line_ids.product_id.width
# 'factory_code': self.env.user.company_id.partner_id.
}]
configsettings = self.env['res.config.settings'].get_values()
config_header = Common.get_headers(self, configsettings['token'], configsettings['mrs_secret_key'])
url = '/api/intelligent_programming/create'
config_url = configsettings['mrs_url'] + url
res_str = json.dumps(res)
ret = requests.post(config_url, json={"result": res_str}, data=None, headers=config_header)
ret = ret.json()
result = json.loads(ret['result'])
if result['status'] == 1:
return self.write({'state': 'progress'})
def json_workorder_str1(self, k, production, route): def json_workorder_str1(self, k, production, route):
workorders_values_str = [0, '', { workorders_values_str = [0, '', {
'product_uom_id': production.product_uom_id.id, 'product_uom_id': production.product_uom_id.id,
@@ -340,14 +383,13 @@ class MrpProduction(models.Model):
'user_id': production.user_id.id} 'user_id': production.user_id.id}
return production_values_str return production_values_str
def _reset_work_order_sequence1(self,k): def _reset_work_order_sequence1(self, k):
for rec in self: for rec in self:
current_sequence = 1 current_sequence = 1
for work in rec.workorder_ids: for work in rec.workorder_ids:
work.sequence = current_sequence work.sequence = current_sequence
current_sequence += 1 current_sequence += 1
def _create_workorder1(self, k): def _create_workorder1(self, k):
for production in self: for production in self:
if not production.bom_id or not production.product_id: if not production.bom_id or not production.product_id:
@@ -389,11 +431,10 @@ class MrpProduction(models.Model):
i += 1 i += 1
for route in routingworkcenter: for route in routingworkcenter:
if route.routing_type == '后置三元质量检测': if route.routing_type == '后置三元质量检测':
workorders_values.append( workorders_values.append(
self.env['mrp.workorder'].json_workorder_str1(k, production, route) self.env['mrp.workorder'].json_workorder_str1(k, production, route)
) )
if route.routing_type == 'CNC加工': if route.routing_type == 'CNC加工':
workorders_values.append( workorders_values.append(
self.env['mrp.workorder'].json_workorder_str1(k, production, route)) self.env['mrp.workorder'].json_workorder_str1(k, production, route))
@@ -406,6 +447,3 @@ class MrpProduction(models.Model):
res = self._create_workorder1(k) res = self._create_workorder1(k)
self._reset_work_order_sequence1(k) self._reset_work_order_sequence1(k)
return res return res