优化odoo16工单视图展示问题

This commit is contained in:
gqh
2022-12-12 14:46:54 +08:00
parent 096cd44b9c
commit e0a0b3d411
17 changed files with 228 additions and 196 deletions

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details. # Part of Odoo. See LICENSE file for full copyright and licensing details.
{ {
'name': '机企猫智能工厂 基础模块', 'name': '机企猫智能工厂 基础配置',
'version': '1.0', 'version': '1.0',
'summary': '智能工厂基础模块', 'summary': '智能工厂基础模块',
'sequence': 1, 'sequence': 1,

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details. # Part of Odoo. See LICENSE file for full copyright and licensing details.
{ {
'name': '机企猫智能工厂 接业务平台模块', 'name': '机企猫智能工厂 接业务平台',
'version': '1.0', 'version': '1.0',
'summary': '连接业务平台模块', 'summary': '连接业务平台模块',
'sequence': 1, 'sequence': 1,
@@ -10,7 +10,7 @@
""", """,
'category': 'sf', 'category': 'sf',
'website': 'https://www.sf.cs.jikimo.com', 'website': 'https://www.sf.cs.jikimo.com',
'depends': ['sf_base'], 'depends': ['sf_base', 'sf_sale', 'sf_dlm'],
'data': [ 'data': [
], ],

View File

@@ -8,7 +8,7 @@ from odoo.http import request
class Sf_Bf_Connect(http.Controller): class Sf_Bf_Connect(http.Controller):
@http.route('/api/bfm_process_order/list', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, @http.route('/api/bfm_process_order/list', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*") cors="*")
def get_bfm_process_order_list(self, **kw): def get_bfm_process_order_list(self, **kw):
""" """
@@ -24,7 +24,9 @@ class Sf_Bf_Connect(http.Controller):
ret = json.loads(ret['result']) ret = json.loads(ret['result'])
product_id = request.env.ref('sf_dlm.product_template_sf').sudo() product_id = request.env.ref('sf_dlm.product_template_sf').sudo()
company_id = request.env.ref('base.main_company').sudo() company_id = request.env.ref('base.main_company').sudo()
order_id = request.env['sale.order'].with_user(request.env.ref("base.user_admin")).sale_order_create(ret['delivery_end_date'], company_id) order_id = request.env['sale.order'].with_user(request.env.ref("base.user_admin")).sale_order_create(
company_id, ret['delivery_name'], ret['delivery_telephone'], ret['delivery_address'],
ret['delivery_end_date'])
i = 1 i = 1
for item in ret['bfm_process_order_list']: for item in ret['bfm_process_order_list']:
product = request.env['product.template'].sudo().product_create(product_id, item, order_id, product = request.env['product.template'].sudo().product_create(product_id, item, order_id,

View File

@@ -4,12 +4,14 @@ import datetime
import time import time
import hashlib import hashlib
from odoo import fields, models, api from odoo import fields, models, api
from odoo.http import request, AuthenticationError from odoo.http import request
__author__ = 'jinling.yang' __author__ = 'jinling.yang'
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
class AuthenticationError(Exception):
pass
class Http(models.AbstractModel): class Http(models.AbstractModel):
_inherit = 'ir.http' _inherit = 'ir.http'
@@ -23,6 +25,7 @@ class Http(models.AbstractModel):
# 查询密钥 # 查询密钥
factory_secret = request.env['res.partner'].sudo().search( factory_secret = request.env['res.partner'].sudo().search(
[('sf_token', '=', datas['HTTP_TOKEN'])], limit=1) [('sf_token', '=', datas['HTTP_TOKEN'])], limit=1)
logging.info('factory_secret:%s' % factory_secret)
if not factory_secret: if not factory_secret:
raise AuthenticationError('无效的token') raise AuthenticationError('无效的token')
timestamp_str = int(time.time()) timestamp_str = int(time.time())

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details. # Part of Odoo. See LICENSE file for full copyright and licensing details.
{ {
'name': '机企猫智能工厂 产品模块', 'name': '机企猫智能工厂 产品管理',
'version': '1.0', 'version': '1.0',
'summary': '智能工厂产品模块', 'summary': '智能工厂产品模块',
'sequence': 1, 'sequence': 1,
@@ -12,7 +12,7 @@
'website': 'https://www.sf.jikimo.com', 'website': 'https://www.sf.jikimo.com',
'depends': ['mrp', 'base', 'sf_manufacturing'], 'depends': ['mrp', 'base', 'sf_manufacturing'],
'data': [ 'data': [
# 'data/product_data.xml', 'data/product_data.xml',
'views/product_template_view.xml' 'views/product_template_view.xml'
], ],
'demo': [ 'demo': [

View File

@@ -3,7 +3,7 @@
<data noupdate="1"> <data noupdate="1">
<record id="product_template_sf" model="product.product"> <record id="product_template_sf" model="product.product">
<field name="name">CNC加工产品模板</field> <field name="name">CNC加工产品模板</field>
<field name="categ_id" ref="product.product_category_5"/> <!-- <field name="categ_id" ref="product.product_category_5"/>-->
<field name="invoice_policy">delivery</field> <field name="invoice_policy">delivery</field>
<field name="detailed_type">product</field> <field name="detailed_type">product</field>
<field name="purchase_ok">false</field> <field name="purchase_ok">false</field>

View File

@@ -1,5 +1,6 @@
from odoo import models, fields, api from odoo import models, fields, api
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
import logging
class ResProductTemplate(models.Model): class ResProductTemplate(models.Model):
@@ -9,7 +10,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]', compute='_compute_model_volume', store=True) model_volume = fields.Float('模型体积[m³]')
model_machining_precision = fields.Selection([ model_machining_precision = fields.Selection([
('±0.10mm', '±0.10mm'), ('±0.10mm', '±0.10mm'),
('±0.05mm', '±0.05mm'), ('±0.05mm', '±0.05mm'),
@@ -22,35 +23,38 @@ class ResProductTemplate(models.Model):
model_process_parameters_id = fields.Many2one('sf.processing.technology', string='工艺参数') model_process_parameters_id = fields.Many2one('sf.processing.technology', string='工艺参数')
model_price = fields.Float('模型单价', digits=(16, 3)) model_price = fields.Float('模型单价', digits=(16, 3))
model_remark = fields.Char('模型备注说明') model_remark = fields.Char('模型备注说明')
long = fields.Float('长[mm]', digits=(16, 3)) length = fields.Float('长[mm]', digits=(16, 3))
width = fields.Float('宽[mm]', digits=(16, 3)) width = fields.Float('宽[mm]', digits=(16, 3))
height = fields.Float('高[mm]', digits=(16, 3)) height = fields.Float('高[mm]', digits=(16, 3))
materials_id = fields.Many2one('sf.production.materials', string='材料') materials_id = fields.Many2one('sf.production.materials', string='材料')
materials_type_id = fields.Many2one('sf.materials.model', string='材料型号') materials_type_id = fields.Many2one('sf.materials.model', string='材料型号')
volume = fields.Float(compute='_compute_volume', store=True) # volume = fields.Float(compute='_compute_volume', store=True)
single_manufacturing = fields.Boolean(string="单个制造") single_manufacturing = fields.Boolean(string="单个制造")
@api.depends('long', 'width', 'height') # @api.depends('long', 'width', 'height')
def _compute_volume(self): # def _compute_volume(self):
self.volume = self.long * self.width * self.height # self.volume = self.long * self.width * self.height
@api.depends('model_long', 'model_width', 'model_height') # @api.depends('model_long', 'model_width', 'model_height')
def _compute_model_volume(self): # def _compute_model_volume(self):
self.model_volume = self.model_long * self.model_width * self.model_height # 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()
copy_product_id.product_tmpl_id.active = True copy_product_id.product_tmpl_id.active = True
logging.info('product_create:%s' % item)
vals = { vals = {
'name': '%s-%s' % (order_id.name, i), 'name': '%s-%s' % (order_id.name, i),
'model_long': item['model_long'], 'model_long': item['model_long'],
'model_width': item['model_width'], 'model_width': item['model_width'],
'model_height': item['model_height'], 'model_height': item['model_height'],
'model_volume': item['model_volume'], 'length': item['long'],
'width': item['width'],
'height': item['height'],
'volume': item['long'] * item['width'] * item['height'],
'model_price': item['price'], 'model_price': item['price'],
'model_total_amount': item['total_amount'], 'single_manufacturing': True,
'model_number': item['number'],
'list_price': item['price'], 'list_price': item['price'],
'materials_id': self.env['sf.production.materials'].search( 'materials_id': self.env['sf.production.materials'].search(
[('materials_no', '=', item['texture_code'])]).id, [('materials_no', '=', item['texture_code'])]).id,
@@ -65,6 +69,7 @@ class ResProductTemplate(models.Model):
'barcode': item['barcode'], 'barcode': item['barcode'],
'active': True 'active': True
} }
logging.info('product_create1:%s' % item)
copy_product_id.sudo().write(vals) copy_product_id.sudo().write(vals)
return copy_product_id return copy_product_id
@@ -109,21 +114,16 @@ class ResMrpBom(models.Model):
# 三、胚料的长宽高均要大于模型的长宽高; # 三、胚料的长宽高均要大于模型的长宽高;
# 四、如果匹配成功多个胚料,则选取体积最小的胚料; # 四、如果匹配成功多个胚料,则选取体积最小的胚料;
def bom_create_Line(self, product): def bom_create_Line(self, product):
logging.info('bom_create_Line:%s' % product)
embryo = self.env['product.product'].search( embryo = self.env['product.product'].search(
[('categ_id.is_embryo', '=', True), ('materials_type_id', '=', product.materials_type_id.id), [('categ_id.is_embryo', '=', True), ('materials_type_id', '=', product.materials_type_id.id),
('long', '>', product.long), ('width', '>', product.width), ('length', '>', product.length), ('width', '>', product.width),
('height', '>', product.height) ('height', '>', product.height)
], ],
limit=1, limit=1,
order='volume desc' order='volume desc'
) )
vals = { logging.info('bom_create_Line1:%s' % product)
'bom_id': self.id,
'product_id': embryo.id,
'product_tmpl_id': embryo.product_tmpl_id.id,
'product_qty': 1,
'product_uom_id': 1
}
return self.env['mrp.bom.line'].create(vals) return self.env['mrp.bom.line'].create(vals)

View File

@@ -13,12 +13,12 @@
</field> </field>
<xpath expr="//label[@for='volume']" position="before"> <xpath expr="//label[@for='volume']" position="before">
<label for="long" string="尺寸" <label for="length" string="尺寸"
attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}"/> attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}"/>
<div class="o_address_format" <div class="o_address_format"
attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}"> attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}">
<label for="long" string="长"/> <label for="length" string="长"/>
<field name="long" class="o_address_zip"/> <field name="length" class="o_address_zip"/>
<span>&amp;nbsp;</span> <span>&amp;nbsp;</span>
<label for="width" string="宽"/> <label for="width" string="宽"/>
<field name="width" class="o_address_zip"/> <field name="width" class="o_address_zip"/>
@@ -34,7 +34,7 @@
<field name="model_long" string="长[mm]"/> <field name="model_long" string="长[mm]"/>
<field name="model_width" string="宽[mm]"/> <field name="model_width" string="宽[mm]"/>
<field name="model_height" string="高[mm]"/> <field name="model_height" string="高[mm]"/>
<field name="model_volume" string="体积[mm]"/> <field name="model_volume" string="体积[m³]"/>
<field name="model_type_id" string="模型类型"/> <field name="model_type_id" string="模型类型"/>
<field name="model_processing_panel" placeholder="例如R,U" string="加工面板"/> <field name="model_processing_panel" placeholder="例如R,U" string="加工面板"/>
<field name="model_machining_precision" /> <field name="model_machining_precision" />

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details. # Part of Odoo. See LICENSE file for full copyright and licensing details.
{ {
'name': '机企猫智能工厂 制造模块', 'name': '机企猫智能工厂 制造管理',
'version': '1.0', 'version': '1.0',
'summary': '智能工厂制造模块', 'summary': '智能工厂制造模块',
'sequence': 1, 'sequence': 1,

View File

@@ -51,10 +51,10 @@ class MrpProduction(models.Model):
def action_generate_serial(self): def action_generate_serial(self):
self.ensure_one() self.ensure_one()
self.lot_producing_id = self.env['stock.production.lot'].create({ self.lot_producing_id = self.env['stock.lot'].create({
'product_id': self.product_id.id, 'product_id': self.product_id.id,
'company_id': self.company_id.id, 'company_id': self.company_id.id,
'name': self.env['stock.production.lot']._get_next_serial(self.company_id, self.product_id) or self.env[ 'name': self.env['stock.lot']._get_next_serial(self.company_id, self.product_id) or self.env[
'ir.sequence'].next_by_code('stock.lot.serial'), 'ir.sequence'].next_by_code('stock.lot.serial'),
}) })
if self.move_finished_ids.filtered(lambda m: m.product_id == self.product_id).move_line_ids: if self.move_finished_ids.filtered(lambda m: m.product_id == self.product_id).move_line_ids:

View File

@@ -4,6 +4,7 @@ import math
import requests import requests
import logging import logging
import base64 import base64
# import subprocess
from datetime import datetime from datetime import datetime
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from odoo import api, fields, models, SUPERUSER_ID, _ from odoo import api, fields, models, SUPERUSER_ID, _
@@ -13,7 +14,6 @@ from odoo.exceptions import UserError
from odoo.addons.sf_mrs_connect.models.ftp_operate import FtpController from odoo.addons.sf_mrs_connect.models.ftp_operate import FtpController
class ResMrpWorkOrder(models.Model): class ResMrpWorkOrder(models.Model):
_inherit = 'mrp.workorder' _inherit = 'mrp.workorder'
_order = 'sequence' _order = 'sequence'
@@ -29,6 +29,8 @@ class ResMrpWorkOrder(models.Model):
('后置三元质量检测', '后置三元质量检测'), ('后置三元质量检测', '后置三元质量检测'),
('解除装夹', '解除装夹'), ('解除装夹', '解除装夹'),
], string="工序类型") ], string="工序类型")
cnc_worksheet = fields.Binary(
'工作指令', readonly=True)
material_center_point = fields.Char(string='配料中心点') material_center_point = fields.Char(string='配料中心点')
X1_axis = fields.Float(default=0) X1_axis = fields.Float(default=0)
Y1_axis = fields.Float(default=0) Y1_axis = fields.Float(default=0)
@@ -61,7 +63,8 @@ class ResMrpWorkOrder(models.Model):
Y10_axis = fields.Float(default=0) Y10_axis = fields.Float(default=0)
Z10_axis = fields.Float(default=0) Z10_axis = fields.Float(default=0)
X_deviation_angle = fields.Integer(string="X轴偏差度", default=0) X_deviation_angle = fields.Integer(string="X轴偏差度", default=0)
test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], string="检测结果") test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], default='合格',
string="检测结果")
cnc_ids = fields.One2many("sf.cnc.processing", 'workorder_id', string="CNC加工") cnc_ids = fields.One2many("sf.cnc.processing", 'workorder_id', string="CNC加工")
tray_code = fields.Char(string="托盘") tray_code = fields.Char(string="托盘")
@@ -337,12 +340,12 @@ class CNCprocessing(models.Model):
depth_of_processing_z = fields.Char('加工深度(Z)') depth_of_processing_z = fields.Char('加工深度(Z)')
cutting_tool_extension_length = fields.Char('刀具伸出长度') cutting_tool_extension_length = fields.Char('刀具伸出长度')
cutting_tool_handle_type = fields.Char('刀柄型号') cutting_tool_handle_type = fields.Char('刀柄型号')
estimated_processing_time = fields.Char('预计加工时间') estimated_processing_time = fields.Datetime('预计加工时间')
remark = fields.Text('备注') remark = fields.Text('备注')
workorder_id = fields.Many2one('mrp.workorder', string="工单") workorder_id = fields.Many2one('mrp.workorder', string="工单")
# mrs下发编程单创建CNC加工 # mrs下发编程单创建CNC加工
def CNCprocessing_create(self, obj): def cnc_processing_create(self, obj):
workorder = self.env['mrp.workorder'].search([('production_id.name', '=', obj['manufacturing_order_no']), workorder = self.env['mrp.workorder'].search([('production_id.name', '=', obj['manufacturing_order_no']),
('processing_panel', '=', obj['processing_panel']), ('processing_panel', '=', obj['processing_panel']),
('routing_type', '=', 'CNC加工')]) ('routing_type', '=', 'CNC加工')])
@@ -363,6 +366,7 @@ class CNCprocessing(models.Model):
} }
return self.env['sf.cnc.processing'].create(vals) return self.env['sf.cnc.processing'].create(vals)
# 创建附件(nc文件)
def attachment_create(self, name, data): def attachment_create(self, name, data):
attachment = self.env['ir.attachment'].create({ attachment = self.env['ir.attachment'].create({
'datas': base64.b64encode(data), 'datas': base64.b64encode(data),
@@ -372,6 +376,7 @@ class CNCprocessing(models.Model):
}) })
return attachment return attachment
# 将FTP的nc文件下载到临时目录
def download_file_tmp(self, model_code, processing_panel): def download_file_tmp(self, model_code, processing_panel):
remotepath = os.path.join('/', model_code, 'return', processing_panel) remotepath = os.path.join('/', model_code, 'return', processing_panel)
serverdir = os.path.join('/tmp', model_code, 'return', processing_panel) serverdir = os.path.join('/tmp', model_code, 'return', processing_panel)
@@ -379,6 +384,7 @@ class CNCprocessing(models.Model):
ftp.download_file_tree(remotepath, serverdir) ftp.download_file_tree(remotepath, serverdir)
return serverdir return serverdir
# 将nc文件存到attach的datas里
def write_file(self, nc_file_path, cnc): def write_file(self, nc_file_path, cnc):
if os.path.exists(nc_file_path): if os.path.exists(nc_file_path):
with open(nc_file_path, 'rb') as file: with open(nc_file_path, 'rb') as file:
@@ -389,6 +395,20 @@ class CNCprocessing(models.Model):
else: else:
return False return False
# 将nc文件对应的excel清单转为pdf
# def to_pdf(self, excel_path, pdf_path):
# """
# 需要在linux中下载好libreoffice
# """
# logging.info('pdf_path:%s' % pdf_path)
# logging.info('pdf_path:%s' % excel_path)
# # 注意cmd中的libreoffice要和linux中安装的一致
# cmd = 'soffice --headless --convert-to pdf'.split() + [excel_path] + ['--outdir'] + [pdf_path]
# p = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=1)
# # p.wait(timeout=30) # 停顿30秒等待转化
# # stdout, stderr = p.communicate()
# p.communicate()
class SfWorkOrderBarcodes(models.Model): class SfWorkOrderBarcodes(models.Model):
""" """
@@ -402,4 +422,3 @@ class SfWorkOrderBarcodes(models.Model):
self.tray_code = tray_code.code self.tray_code = tray_code.code
workorder = self.env['mrp.workorder'].browse(self.ids) workorder = self.env['mrp.workorder'].browse(self.ids)
workorder.gettray_auto(barcode) workorder.gettray_auto(barcode)

View File

@@ -181,7 +181,7 @@ class StockRule(models.Model):
class ProductionLot(models.Model): class ProductionLot(models.Model):
_inherit = 'stock.production.lot' _inherit = 'stock.lot'
@api.model @api.model
def generate_lot_names1(self, display_name, first_lot, count): def generate_lot_names1(self, display_name, first_lot, count):
@@ -217,10 +217,10 @@ class ProductionLot(models.Model):
def _get_next_serial(self, company, product): def _get_next_serial(self, company, product):
"""Return the next serial number to be attributed to the product.""" """Return the next serial number to be attributed to the product."""
if product.tracking == "serial": if product.tracking == "serial":
last_serial = self.env['stock.production.lot'].search( last_serial = self.env['stock.lot'].search(
[('company_id', '=', company.id), ('product_id', '=', product.id)], [('company_id', '=', company.id), ('product_id', '=', product.id)],
limit=1, order='id DESC') limit=1, order='id DESC')
if last_serial: if last_serial:
return self.env['stock.production.lot'].generate_lot_names1(product.display_name, last_serial.name, 2)[ return self.env['stock.lot'].generate_lot_names1(product.display_name, last_serial.name, 2)[
1] 1]
return "%s-%03d" % (product.display_name, 1) return "%s-%03d" % (product.display_name, 1)

View File

@@ -41,16 +41,16 @@
</field> </field>
</record> </record>
<!-- <record model="ir.ui.view" id="view_mrp_production_workorder_form_inherit_sf">--> <!-- <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="name">mrp.production.workorder.form.inherit.sf</field>-->
<!-- <field name="model">mrp.workorder</field>--> <!-- <field name="model">mrp.workorder</field>-->
<!-- <field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>--> <!-- <field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>-->
<!-- <field name="arch" type="xml">--> <!-- <field name="arch" type="xml">-->
<!-- <field name="production_id" position="after">--> <!-- <field name="production_id" position="after">-->
<!-- <field name="processing_panel" readonly="1"/>--> <!-- <field name="processing_panel" readonly="1"/>-->
<!-- </field>--> <!-- </field>-->
<!-- </field>--> <!-- </field>-->
<!-- </record>--> <!-- </record>-->
<record id="view_mrp_production_workorder_tray_form_inherit_sf" model="ir.ui.view"> <record id="view_mrp_production_workorder_tray_form_inherit_sf" model="ir.ui.view">
<field name="name">mrp.production.workorder.tray.form.inherit.sf</field> <field name="name">mrp.production.workorder.tray.form.inherit.sf</field>
@@ -71,11 +71,12 @@
<field name="routing_type" invisible="1"/> <field name="routing_type" invisible="1"/>
<field name="processing_panel" readonly="1"/> <field name="processing_panel" readonly="1"/>
<field name="tray_code"/> <field name="tray_code"/>
<div class="col-12 col-lg-6 o_setting_box">
</group>
<div class="col-12 col-lg-6 o_setting_box">
<button type="object" class="oe_highlight" name="gettray" string="绑定托盘" <button type="object" class="oe_highlight" name="gettray" string="绑定托盘"
attrs='{"invisible": [("production_id","=",False)]}'/> attrs='{"invisible": [("production_id","=",False)]}'/>
</div> </div>
</group>
</page> </page>
</xpath> </xpath>
@@ -86,121 +87,107 @@
<field name="processing_panel" readonly="1"/> <field name="processing_panel" readonly="1"/>
</group> </group>
</group> </group>
<group> <div>左面:</div>
<div>左面:</div> <div class="o_address_format">
<label for="X1_axis" string="x"/>
<field name="X1_axis" class="o_form_label"/>
<label for="Y1_axis" string="y"/>
<field name="Y1_axis" class="o_form_label"/>
<label for="Z1_axis" string="z"/>
<field name="Z1_axis" class="o_form_label"/>
<div></div> <div></div>
<div class="o_address_format"> <label for="X2_axis" string="x"/>
<label for="X1_axis" string="x1"/> <field name="X2_axis" class="o_form_label"/>
<field name="X1_axis" class="o_address_zip"/> <label for="Y2_axis" string="y"/>
<span>&amp;nbsp;</span> <field name="Y2_axis" class="o_form_label"/>
<label for="Y1_axis" string="y1"/> <label for="Z2_axis" string="z"/>
<field name="Y1_axis" class="o_address_zip"/> <field name="Z2_axis" class="o_form_label"/>
<span>&amp;nbsp;</span> </div>
<label for="Z1_axis" string="z1"/> <div>前面:</div>
<field name="Z1_axis" class="o_address_zip"/> <div class="o_address_format">
</div> <label for="X3_axis" string="x"/>
<div class="o_address_format"> <field name="X3_axis" class="o_form_label"/>
<label for="X2_axis" string="x2"/> <span>&amp;nbsp;</span>
<field name="X2_axis" class="o_address_zip"/> <label for="Y3_axis" string="y"/>
<span>&amp;nbsp;</span> <field name="Y3_axis" class="o_form_label"/>
<label for="Y2_axis" string="y2"/> <span>&amp;nbsp;</span>
<field name="Y2_axis" class="o_address_zip"/> <label for="Z3_axis" string="z"/>
<span>&amp;nbsp;</span> <field name="Z3_axis" class="o_form_label"/>
<label for="Z2_axis" string="z2"/>
<field name="Z2_axis" class="o_address_zip"/>
</div>
<div>前面:</div>
<div></div> <div></div>
<div class="o_address_format"> <label for="X4_axis" string="x"/>
<label for="X3_axis" string="x1"/> <field name="X4_axis" class="o_form_label"/>
<field name="X3_axis" class="o_address_zip"/> <span>&amp;nbsp;</span>
<span>&amp;nbsp;</span> <label for="Y4_axis" string="y"/>
<label for="Y3_axis" string="y1"/> <field name="Y4_axis" class="o_form_label"/>
<field name="Y3_axis" class="o_address_zip"/> <span>&amp;nbsp;</span>
<span>&amp;nbsp;</span> <label for="Z4_axis" string="z"/>
<label for="Z3_axis" string="z1"/> <field name="Z4_axis" class="o_form_label"/>
<field name="Z3_axis" class="o_address_zip"/> </div>
</div> <div>右面:</div>
<div class="o_address_format"> <div class="o_address_format">
<label for="X4_axis" string="x2"/> <label for="X5_axis" string="x"/>
<field name="X4_axis" class="o_address_zip"/> <field name="X5_axis" class="o_form_label"/>
<span>&amp;nbsp;</span> <span>&amp;nbsp;</span>
<label for="Y4_axis" string="y2"/> <label for="Y5_axis" string="y"/>
<field name="Y4_axis" class="o_address_zip"/> <field name="Y5_axis" class="o_form_label"/>
<span>&amp;nbsp;</span> <span>&amp;nbsp;</span>
<label for="Z4_axis" string="z2"/> <label for="Z5_axis" string="z"/>
<field name="Z4_axis" class="o_address_zip"/> <field name="Z5_axis" class="o_form_label"/>
</div>
<div>右面:</div>
<div></div> <div></div>
<div class="o_address_format"> <label for="X6_axis" string="x"/>
<label for="X5_axis" string="x1"/> <field name="X6_axis" class="o_form_label"/>
<field name="X5_axis" class="o_address_zip"/> <span>&amp;nbsp;</span>
<span>&amp;nbsp;</span> <label for="Y6_axis" string="y"/>
<label for="Y5_axis" string="y1"/> <field name="Y6_axis" class="o_form_label"/>
<field name="Y5_axis" class="o_address_zip"/> <span>&amp;nbsp;</span>
<span>&amp;nbsp;</span> <label for="Z6_axis" string="z"/>
<label for="Z5_axis" string="z1"/> <field name="Z6_axis" class="o_form_label"/>
<field name="Z5_axis" class="o_address_zip"/> </div>
</div> <div>后面:</div>
<div class="o_address_format"> <div class="o_address_format">
<label for="X6_axis" string="x2"/> <label for="X7_axis" string="x"/>
<field name="X6_axis" class="o_address_zip"/> <field name="X7_axis" class="o_form_label"/>
<span>&amp;nbsp;</span> <span>&amp;nbsp;</span>
<label for="Y6_axis" string="y2"/> <label for="Y7_axis" string="y"/>
<field name="Y6_axis" class="o_address_zip"/> <field name="Y7_axis" class="o_form_label"/>
<span>&amp;nbsp;</span> <span>&amp;nbsp;</span>
<label for="Z6_axis" string="z2"/> <label for="Z7_axis" string="z"/>
<field name="Z6_axis" class="o_address_zip"/> <field name="Z7_axis" class="o_form_label"/>
</div>
<div>后面:</div>
<div></div> <div></div>
<div class="o_address_format"> <label for="X8_axis" string="x"/>
<label for="X7_axis" string="x1"/> <field name="X8_axis" class="o_form_label"/>
<field name="X7_axis" class="o_address_zip"/> <span>&amp;nbsp;</span>
<span>&amp;nbsp;</span> <label for="Y8_axis" string="y"/>
<label for="Y7_axis" string="y1"/> <field name="Y8_axis" class="o_form_label"/>
<field name="Y7_axis" class="o_address_zip"/> <span>&amp;nbsp;</span>
<span>&amp;nbsp;</span> <label for="Z8_axis" string="z"/>
<label for="Z7_axis" string="z1"/> <field name="Z8_axis" class="o_form_label"/>
<field name="Z7_axis" class="o_address_zip"/> </div>
</div> <div>上面:</div>
<div class="o_address_format"> <div class="o_address_format">
<label for="X8_axis" string="x2"/> <label for="X9_axis" string="x"/>
<field name="X8_axis" class="o_address_zip"/> <field name="X9_axis" class="o_form_label"/>
<span>&amp;nbsp;</span> <span>&amp;nbsp;</span>
<label for="Y8_axis" string="y2"/> <label for="Y9_axis" string="y"/>
<field name="Y8_axis" class="o_address_zip"/> <field name="Y9_axis" class="o_form_label"/>
<span>&amp;nbsp;</span> <span>&amp;nbsp;</span>
<label for="Z8_axis" string="z2"/> <label for="Z9_axis" string="z"/>
<field name="Z8_axis" class="o_address_zip"/> <field name="Z9_axis" class="o_form_label"/>
</div>
<div>上面:</div>
<div></div> <div></div>
<div class="o_address_format"> <label for="X10_axis" string="x"/>
<label for="X9_axis" string="x1"/> <field name="X10_axis" class="o_form_label"/>
<field name="X9_axis" class="o_address_zip"/> <span>&amp;nbsp;</span>
<span>&amp;nbsp;</span> <label for="Y10_axis" string="y"/>
<label for="Y9_axis" string="y1"/> <field name="Y10_axis" class="o_form_label"/>
<field name="Y9_axis" class="o_address_zip"/> <span>&amp;nbsp;</span>
<span>&amp;nbsp;</span> <label for="Z10_axis" string="z"/>
<label for="Z9_axis" string="z1"/> <field name="Z10_axis" class="o_form_label"/>
<field name="Z9_axis" class="o_address_zip"/> </div>
</div>
<div class="o_address_format"> <div class="col-12 col-lg-6 o_setting_box">
<label for="X10_axis" string="x2"/> <button type="object" class="oe_highlight" name="getcenter" string="计算定位"/>
<field name="X10_axis" class="o_address_zip"/> </div>
<span>&amp;nbsp;</span>
<label for="Y10_axis" string="y2"/>
<field name="Y10_axis" class="o_address_zip"/>
<span>&amp;nbsp;</span>
<label for="Z10_axis" string="z2"/>
<field name="Z10_axis" class="o_address_zip"/>
</div>
<div class="col-12 col-lg-6 o_setting_box">
<button type="object" class="oe_highlight" name="getcenter" string="计算定位"/>
</div>
</group>
<group> <group>
<field name="material_center_point"/> <field name="material_center_point"/>
<field name='X_deviation_angle'/> <field name='X_deviation_angle'/>
@@ -210,39 +197,43 @@
<xpath expr="//page[last()]" position="after"> <xpath expr="//page[last()]" position="after">
<page string="CNC程序" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'> <page string="CNC程序" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
<field name="cnc_ids" widget="one2many"> <group>
<tree> <field name="cnc_ids" widget="one2many" string="工作程序">
<field name="cnc_id"/> <tree>
<field name="sequence_number"/> <field name="sequence_number"/>
<field name="program_name"/> <field name="program_name"/>
<field name="cutting_tool_name"/> <field name="cnc_id" string="文件"/>
<field name="cutting_tool_no"/> <field name="cutting_tool_name"/>
<field name="processing_type"/> <field name="cutting_tool_no"/>
<field name="margin_x_y"/> <field name="processing_type"/>
<field name="margin_z"/> <field name="margin_x_y"/>
<field name="depth_of_processing_z"/> <field name="margin_z"/>
<field name="cutting_tool_extension_length"/> <field name="depth_of_processing_z"/>
<field name="cutting_tool_handle_type"/> <field name="cutting_tool_extension_length"/>
<field name="estimated_processing_time"/> <field name="cutting_tool_handle_type"/>
<field name="remark"/> <field name="estimated_processing_time"/>
</tree> <field name="remark"/>
</field> </tree>
</field>
<field name="cnc_worksheet" string="工作指令" widget="pdf_viewer"/>
</group>
</page> </page>
</xpath> </xpath>
<xpath expr="//page[last()]" position="after"> <xpath expr="//page[last()]" position="after">
<page string="后置三元检测" attrs='{"invisible": [("routing_type","!=","后置三元质量检测")]}'> <page string="后置三元检测" attrs='{"invisible": [("routing_type","!=","后置三元质量检测")]}'>
<group> <group>
<field name="test_results" widget="selection"/> <field name="test_results" widget="selection" />
<div class="col-12 col-lg-6 o_setting_box">
</group>
<div class="col-12 col-lg-6 o_setting_box">
<button type="object" class="oe_highlight" name="recreateManufacturingOrWorkerOrder" <button type="object" class="oe_highlight" name="recreateManufacturingOrWorkerOrder"
string="检测确认"/> string="检测确认"/>
</div> </div>
</group>
</page> </page>
</xpath> </xpath>
<xpath expr="//page[last()]" position="after"> <xpath expr="//page[last()]" position="after">
<page string="解除装夹" attrs='{"invisible": [("routing_type","!=","解除装夹")]}'> <page string="解除装夹" attrs='{"invisible": [("routing_type","!=","解除装夹")]}'>
<group>
<div class="col-12 col-lg-6 o_setting_box"> <div class="col-12 col-lg-6 o_setting_box">
<button type="object" class="oe_highlight" name="unbindtray" string="解除装夹"/> <button type="object" class="oe_highlight" name="unbindtray" string="解除装夹"/>
</div> </div>
@@ -250,7 +241,7 @@
<button type="action" class="oe_highlight" name="sf_manufacturing.label_sf_tray_code1" <button type="action" class="oe_highlight" name="sf_manufacturing.label_sf_tray_code1"
string="打印标签"/> string="打印标签"/>
</div> </div>
</group>
</page> </page>
</xpath> </xpath>
</field> </field>

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details. # Part of Odoo. See LICENSE file for full copyright and licensing details.
{ {
'name': '机企猫智能工厂 接制造资源库模块 ', 'name': '机企猫智能工厂 接制造资源库 ',
'version': '1.0', 'version': '1.0',
'summary': '智能工厂连接制造资源库模块', 'summary': '智能工厂连接制造资源库模块',
'sequence': 1, 'sequence': 1,

View File

@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json import json
import base64
import logging import logging
import os import os
from datetime import date, timedelta from datetime import date, timedelta
@@ -23,12 +24,27 @@ class Sf_Mrs_Connect(http.Controller):
ret = json.loads(datas) ret = json.loads(datas)
ret = json.loads(ret['result']) ret = json.loads(ret['result'])
for obj in ret: for obj in ret:
cnc = request.env['sf.cnc.processing'].with_user(request.env.ref("base.user_admin")).CNCprocessing_create(obj) cnc = request.env['sf.cnc.processing'].with_user(
# 从ftp拉取对应的文件 request.env.ref("base.user_admin")).cnc_processing_create(obj)
# # 从ftp拉取对应的文件
model_code = cnc.workorder_id.product_id.barcode model_code = cnc.workorder_id.product_id.barcode
processing_panel = cnc.workorder_id.processing_panel processing_panel = cnc.workorder_id.processing_panel
server_dir = cnc.with_user(request.env.ref("base.user_admin")).download_file_tmp(model_code, processing_panel) server_dir = cnc.with_user(request.env.ref("base.user_admin")).download_file_tmp(model_code,
processing_panel)
cnc_file_path = os.path.join(server_dir, cnc.program_name + '.NC') cnc_file_path = os.path.join(server_dir, cnc.program_name + '.NC')
cnc.with_user(request.env.ref("base.user_admin")).write_file(cnc_file_path, cnc) cnc.with_user(request.env.ref("base.user_admin")).write_file(cnc_file_path, cnc)
# logging.info('get_cnc_processing_create:%s' % '111111111111111')
# for root, dirs, files in os.walk(server_dir):
# for file in files:
# if os.path.splitext(file)[1] == '.xlsx' or os.path.splitext(file)[1] == ".xls":
# pdf_path = os.path.splitext(file)[1] + '.PDF'
# cnc_pdf_path = request.env['sf.cnc.processing'].with_user(
# request.env.ref("base.user_admin")).to_pdf(os.path.join(root, file), pdf_path)
# if pdf_path != False:
# if not cnc.workorder_id.cnc_worksheet:
# cnc.workorder_id.cnc_worksheet = base64.b64encode(open(cnc_pdf_path, 'rb').read())
# else:
# logging.info('break:%s' % 'break')
# break
except Exception as e: except Exception as e:
logging.info('get_cnc_processing_create error:%s' % e) logging.info('get_cnc_processing_create error:%s' % e)

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details. # Part of Odoo. See LICENSE file for full copyright and licensing details.
{ {
'name': '机企猫智能工厂 销售模块', 'name': '机企猫智能工厂 销售管理',
'version': '1.0', 'version': '1.0',
'summary': '智能工厂销售模块', 'summary': '智能工厂销售模块',
'sequence': 1, 'sequence': 1,
@@ -10,7 +10,7 @@
""", """,
'category': 'sf', 'category': 'sf',
'website': 'https://www.sf.jikimo.com', 'website': 'https://www.sf.jikimo.com',
'depends': ['sale', 'sale_management', 'sf_bf_connect', 'sf_dlm'], 'depends': ['sale', 'sale_management'],
'data': [ 'data': [
'views/sale_order_view.xml' 'views/sale_order_view.xml'
], ],

View File

@@ -1,6 +1,7 @@
from odoo import models, fields from odoo import models, fields
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
import datetime import datetime
import logging
class ReSaleOrder(models.Model): class ReSaleOrder(models.Model):
@@ -20,9 +21,9 @@ class ReSaleOrder(models.Model):
'company_id': company_id.id, 'company_id': company_id.id,
'date_order': now_time, 'date_order': now_time,
'name': self.env['ir.sequence'].next_by_code('sale.order', sequence_date=now_time), 'name': self.env['ir.sequence'].next_by_code('sale.order', sequence_date=now_time),
'partner_id': 8, 'partner_id': 1,
'state': 'sale', 'state': 'sale',
'user_id': 6, 'user_id': 1,
'person_of_delivery': delivery_name, 'person_of_delivery': delivery_name,
'telephone_of_delivery': delivery_telephone, 'telephone_of_delivery': delivery_telephone,
'address_of_delivery': delivery_address, 'address_of_delivery': delivery_address,