This commit is contained in:
gqh
2023-01-09 23:04:53 +08:00
parent d0497aa043
commit 311c7c723a
52 changed files with 1572 additions and 331 deletions

View File

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

View File

@@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'sf_machine_connect',
'version': '1.0',
'summary': '智能工厂机床连接模块',
'sequence': 10,
'description': """
这是一个模块
====================
""",
'category': 'Tools',
'depends': ['sf_base', 'sf_manufacturing', 'barcodes', ],
'data': [
# 定义权限组放在最上面
# 权限组
"security/ir.model.access.csv",
'views/compensation.xml',
'views/ftp_button.xml',
'views/SfWorkOrderBarcodes.xml',
'views/WorkCenterBarcodes.xml',
'views/Stock_picking_Barcodes.xml',
'views/machine_monitor.xml',
],
'installable': True,
'application': True,
# 'auto_install': False,
'license': 'LGPL-3',
}

View File

@@ -0,0 +1,3 @@
from . import ftp_client
from . import ftp_operate
from . import py2opcua

View File

@@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
# ----------------------------------------------------------
# Models for Simulation
# ----------------------------------------------------------
class Simulation(models.Model):
_name = 'simulation'
_description = 'SIMULATION'
name = fields.Char('Name', size=50, readonly=True)
place_value = fields.Boolean(String="位值")
place_value_random = fields.Boolean(String="位值随机")
place_value_ai = fields.Boolean(String="位值自增")
place_value_list = fields.Boolean(String="位值列表")
unsigned_integer_8_DO = fields.Integer(Sting="无符号8位整数D0")
unsigned_integer_8_D1 = fields.Integer(Sting="无符号8位整数D1")
unsigned_integer_8_random = fields.Integer(Sting="无符号8位整数随机")
unsigned_integer_8_ai = fields.Integer(Sting="无符号8位整数自增")
unsigned_integer_8_list = fields.Integer(Sting="无符号8位整数列表")
integer_8 = fields.Integer(String="有符号8位整数")
integer_8_random = fields.Integer(String="有符号8位整数随机")
integer_8_ai = fields.Integer(String="有符号8位整数自增")
integer_8_ad = fields.Integer(String="有符号8位整数自减")
integer_16 = fields.Integer(String="有符号16位整数")
integer_16_random = fields.Integer(String="有符号16位整数随机")
integer_16_list = fields.Integer(String="有符号16位整数列表")
# ----------------------------------------------------------
# Models for Mitsubishi
# ----------------------------------------------------------
class MitsuCnc(models.Model):
_name = 'mitsu.cnc'
_description = 'Mitsubishi CNC'
name = fields.Char('Name', size=50, readonly=True)
status = fields.Boolean(string="状态")

View File

@@ -0,0 +1,153 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import base64
import psycopg2
import os
import logging
from zeep.exceptions import ValidationError
from odoo import http
from ftplib import FTP
from odoo.http import request
from odoo import api, fields, models
from odoo.addons.sf_machine_connect.models import py2opcua, ftp_operate
# from .ftp_operate import FtpController
# from .py2opcua import Py2opcua
_logger = logging.getLogger(__name__)
# ----------------------------------------------------------
# Models for client
# ----------------------------------------------------------
class FtpButton(models.Model):
_inherit = 'sf.cnc.processing'
def pri(self):
print('11111111111111111')
s = self.cnc_id
s1 = self.cnc_id._filestore()
print(s1)
v = self.cnc_id.display_name
a = self.cnc_id.datas
print(v)
print(a)
ftp_operate.FtpController.prin(self)
def up(self):
# self.env['mrp.workorder'].check_compensation_before_up()
ftp = ftp_operate.FtpController()
# ftp.delAllfile('C://Users//马广威//Desktop//ftp')
a = self.cnc_id
print(a.display_name)
_logger.info(a.display_name)
datas = base64.standard_b64decode(a.datas)
# file_path = '{}\{}\{}'.format(a._filestore(), a.store_fname.split('/'[0]), a.display_name)
# 此方法不走ftp直接文件写入暂不确定能否写入ftp服务器但可以转成ftp方法只是要把文件暂存到本地再上传
# file_path_local = '{}\{}'.format('C://Users//马广威//Desktop//ftp', a.display_name)
file_path_local = '{}/{}'.format('/nc2machine', a.display_name)
file_path_remote = '{}\{}'.format('//(192,168,2,141)//DS', a.display_name)
with open(file_path_local, mode='wb+') as file:
file.write(datas)
# file = open(file_path_local, 'wb+')
# file.write(datas)
# file.close()
# 存在本地的文件下发到机床
ftp.upload_file(remotepath=file_path_remote, localpath=file_path_local)
class FtpClient(models.Model):
_name = "ftp.client"
_description = 'Ftp Client'
name = fields.Char('Name', size=50, readonly=True)
description = fields.Char(size=50)
mobile = fields.Char(size=50)
def up(self):
ftp = ftp_operate.FtpController()
# FtpController.__init__(self, host="127.0.0.1", port=2121, username="admin", password="123456")
ftp.upload_file(remotepath='/(192,168,199,2)/DS/02-222.NC', localpath='D:/ftp/up/02-222.NC')
# def delete(self):
# ftp = FtpController()
# ftp.del_file()
#
# def _compute_ip_url(self):
# for box in self:
# if not box.ip:
# box.ip_url = False
# else:
# url = 'https://%s' if box.get_base_url()[:5] == 'https' else 'http://%s:8069'
# box.ip_url = url % box.ip
#
# def _compute_device_count(self):
# for box in self:
# box.device_count = len(box.device_ids)
class Machine_ftp(models.Model):
# _name = 'data.collection'
_inherit = 'sf.machine_tool'
timestamp = fields.Datetime('时间戳', readonly=True)
signed = fields.Integer('刷新间隔', readonly=True)
status = fields.Boolean('在线状态', readonly=True)
tool_num = fields.Integer('当前刀具', readonly=True)
program = fields.Char('当前程序', readonly=True)
class WorkCenterBarcode(models.Model):
"""
扫码托盘码可查到制造订单,由制造订单查工单
"""
_inherit = "mrp.workorder"
compensation_value_x = fields.Float(string='X轴补偿值')
compensation_value_y = fields.Float(string='Y轴补偿值')
def compensation(self):
'''
将节点与其值放入字典,字典作为参数传入
:return:
'''
temp_dict = {}
temp_dict['ns=1;s=Project_Default.Group1.Mitsubishi_NC.hongbianliang520'] = self.compensation_value_x
temp_dict['ns=1;s=Project_Default.Group1.Mitsubishi_NC.hongbianliang521'] = self.compensation_value_y
print("测试补偿能够执行")
temp = py2opcua.Py2opcua()
_logger.info(temp)
temp.connect()
temp.write(temp_dict)
temp.disconnect()
def check_compensation_before_up(self):
temp_value = self.env['mrp.workorder'].getcenter()
_logger.info("====================================================================================")
_logger.info(temp_value)
if temp_value[0] == 0 or temp_value[1] != 0:
temp_dict = {}
# temp_dict['ns=1;s=Project_Default.Group1.Mitsubishi_NC.hongbianliang520'] = temp_value[0]
temp_dict['ns=1;s=Project_Default.Group1.Mitsubishi_NC.hongbianliang520'] = 111
temp_dict['ns=1;s=Project_Default.Group1.Mitsubishi_NC.hongbianliang521'] = 111
# temp_dict['ns=1;s=Project_Default.Group1.Mitsubishi_NC.hongbianliang521'] = temp_value[1]
print("测试补偿能够执行")
temp = py2opcua.Py2opcua()
_logger.info(temp)
temp.connect()
temp.write(temp_dict)
temp.disconnect()
def test(self, barcode):
# 托盘对象
tray = self.env('sf.tray').search("code", "=", barcode)
product = tray.product_id

View File

@@ -0,0 +1,118 @@
# -*- coding: utf-8 -*-
import os
from ftplib import FTP
class FTP_P(FTP):
def dirs(self, *args):
'''List a directory in long form.
By default list current directory to stdout.
Optional last argument is callback function; all
non-empty arguments before it are concatenated to the
LIST command. (This *should* only be used for a pathname.)'''
cmd = 'LIST'
templist = []
tempdic = {}
func = None
if args[-1:] and type(args[-1]) != type(''):
args, func = args[:-1], args[-1]
for arg in args:
if arg:
cmd = cmd + (' ' + arg)
self.retrlines(cmd, templist.append)
# print(templist)
# 处理返回结果,只需要目录名称
r_files = [file.split(" ")[-1] for file in templist]
tempdic['name'] = [file for file in r_files if file != "." and file != ".."]
# 去除. ..
return tempdic
# return [file for file in r_files if file != "." and file != ".."]
# FTP接口类
class FtpController():
'''
这是ftp接口类在类初始化的时候就连接了ftp服务器能否成功连接有反馈。
类中定义了两个接口:上传接口和删除接口
'''
# 三菱机床连接
def __init__(self, host="192.168.2.158", port=8080, username="MITSUBISHI", password="CNC"):
self.host = host
self.port = port
self.username = username
self.password = password
ftp = FTP_P()
# self.ftp.set_debuglevel(2) #打开调试级别2显示详细信息
ftp.set_pasv(0) #0主动模式 1 #被动模式
try:
ftp.connect(self.host, self.port)
ftp.login(self.username, self.password)
print("连接成功")
self.ftp = ftp
except:
print("连接失败")
# 试验接口
def prin(self):
print("这是试验接口")
# 试验ftp服务器连接
# def connect(self, host="127.0.0.1", port=2121, username="admin", password="123456"):
# ftp = FTP_P()
# try:
# ftp.connect(host, port)
# ftp.login(username, password)
# print("连接成功")
# ftp1 = ftp
# return ftp1
# except:
# print("连接失败")
# 三菱代码下发
def upload_file(self, remotepath='/(192,168,199,2)/DS/Z4.5.NC', localpath='D:/ftp/up/Z4.5.NC'):
'''
第一个是要上传到ftp服务器路径下的文件第二个是本地要上传的的路径文件
:param remotepath: 上传和下载都需要设置工作目录,注意只能使用文件名,不能有路径中的冒号
:param localpath:
:return:
'''
bufsize = 1024
fp = open(localpath, 'rb')
self.ftp.storbinary('STOR ' + remotepath, fp, bufsize)
fp.close()
# return "上传成功"
def delAllfile(self, ftppath):
dir_res = []
try:
print(ftppath)
try:
self.ftp.cwd(ftppath)
except Exception as e:
print("进入ftp目录失败" + str(e))
self.ftp.dir('.', dir_res.append) # 对当前目录进行dir(),将结果放入列表
print(dir_res)
# for i in dir_res:
# if i.startswith("d"):
# dirName = i.split(" ")[-1]
# print("开始删除" + dirName + "文件夹")
# delAllfile(ftp, ftp.pwd() + "/" + dirName)
# ftp.cwd('..')
# print(ftppath + "/" + dirName)
# ftp.rmd(ftppath + '/' + dirName)
# else:
# filelist = ftp.getfiles(ftppath)
# for f in filelist:
# print("删除FTP目录" + ftppath + "下存在文件:" + f)
# ftp.delete(f)
except Exception as e:
raise e
# 删除远端ftp文件
# 出现550 not found file是路径不对
# def del_file(self, delpath='./YIN.NC'):
def del_file(self, delpath='/(192,168,199,2)/DS/Z4.5.NC'):
self.ftp.delete(delpath) # 删除远程文件

View File

@@ -0,0 +1,32 @@
from opcua import ua, Client
class Py2opcua:
def __init__(self, url='opc.tcp://192.168.2.99:4840'):
self.client = Client(url)
def connect(self):
try:
# 连接客户端
self.client.connect()
print("opcua服务器连接成功可以写入")
return self.client
except:
print("opcua服务器连接失败请检查")
def write(self, temp_dict):
temp_dict = temp_dict
temp_list = list(temp_dict.items())
for i in range(len(temp_list)):
# 寻找节点上的变量
var = self.client.get_node(temp_list[i][0])
# var.set_value(ua.Variant(1.234, ua.VariantType.Float))
# 通过set_value写值
var.set_value(ua.Variant(temp_list[i][1], ua.VariantType.Double))
print("%s 已写入" % var.get_value())
def disconnect(self):
# 断开连接
self.client.disconnect()

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="iot_box_comp_rule" model="ir.rule">
<field name="name">IoT Box multi company rule</field>
<field name="model_id" ref="model_iot_box"/>
<field eval="True" name="global"/>
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
</record>
<record id="iot_device_comp_rule" model="ir.rule">
<field name="name">IoT Device multi company rule</field>
<field name="model_id" ref="model_iot_device"/>
<field eval="True" name="global"/>
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_ftp_client,ftp.client,model_ftp_client,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_ftp_client ftp.client model_ftp_client base.group_user 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

@@ -0,0 +1,30 @@
.o_int_colorpicker {
.o_color_pill {
display: inline-block;
height: 25px;
width: 25px;
margin: 4px;
border-radius: 25px;
position: relative;
@for $size from 1 through length($o-colors) {
&.o_color_#{$size - 1} {
background-color: nth($o-colors, $size);
&:not(.readonly):hover {
transform: scale(1.2);
transition: 0.3s;
cursor: pointer;
}
&.active:after{
content: "\f00c";
display: inline-block;
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit;
color: #fff;
position: absolute;
padding: 4px;
font-size: 16px;
}
}
}
}
}

View File

@@ -0,0 +1,5 @@
.o_button_iot {
min-width: 120px;
min-height: 40px;
margin-left: 50px;
}

View File

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<templates xml:space="preserve">
<t t-name="sf_machine_connect.Barcode_Scan_template" t-inherit="web.Legacy.ControlPanel" t-inherit-mode="extension" owl="1">
<xpath expr="//div[hasclass('o_cp_pager')]" position="inside">
<button
style="float:left"
t-on-click="onBarcodeScanned"
type="button"
class="btn ms-3 o_barcode"
tabindex="-1"
draggable="false"
aria-label="Scan barcode"
title="Scan barcode"
data-tooltip="Scan barcode"
>扫码</button>
</xpath>
</t>
<!-- <t t-name="web.Many2OneField.CreateConfirmationDialog" owl="1">-->
<!-- <Dialog title="title" size="'md'">-->
<!-- <div>-->
<!-- Create <strong t-esc="props.value"/> as a new <t t-esc="props.name"/>?-->
<!-- </div>-->
<!-- <t t-set-slot="footer">-->
<!-- <button class="btn btn-primary" t-on-click="onCreate">Create</button>-->
<!-- <button class="btn" t-on-click="() => props.close()">Discard</button>-->
<!-- </t>-->
<!-- </Dialog>-->
<!-- </t>-->
<!-- <t t-name="web.Many2OneField" owl="1">-->
<!-- <t t-if="props.readonly">-->
<!-- <t t-if="!props.canOpen">-->
<!-- <span>-->
<!-- <span t-esc="displayName" />-->
<!-- <t t-foreach="extraLines" t-as="extraLine" t-key="extraLine_index">-->
<!-- <br />-->
<!-- <span t-esc="extraLine" />-->
<!-- </t>-->
<!-- </span>-->
<!-- </t>-->
<!-- <t t-else="">-->
<!-- <a-->
<!-- t-if="props.value"-->
<!-- class="o_form_uri"-->
<!-- t-att-href="props.value ? `#id=${props.value[0]}&amp;model=${relation}` : '#'"-->
<!-- t-on-click.prevent="onClick"-->
<!-- >-->
<!-- <span t-esc="displayName" />-->
<!-- <t t-foreach="extraLines" t-as="extraLine" t-key="extraLine_index">-->
<!-- <br />-->
<!-- <span t-esc="extraLine" />-->
<!-- </t>-->
<!-- </a>-->
<!-- </t>-->
<!-- </t>-->
<!-- <t t-else="">-->
<!-- <div class="o_field_many2one_selection">-->
<!-- <Many2XAutocomplete t-props="Many2XAutocompleteProps"/>-->
<!-- <t t-if="hasExternalButton">-->
<!-- <button-->
<!-- type="button"-->
<!-- class="btn btn-secondary fa o_external_button"-->
<!-- t-att-class="props.openTarget === 'current' ? 'fa-arrow-right' : 'fa-external-link'"-->
<!-- tabindex="-1"-->
<!-- draggable="false"-->
<!-- aria-label="Internal link"-->
<!-- data-tooltip="Internal link"-->
<!-- t-on-click="onExternalBtnClick"-->
<!-- />-->
<!-- </t>-->
<!-- <button-->
<!-- t-if="hasBarcodeButton"-->
<!-- t-on-click="onBarcodeBtnClick"-->
<!-- type="button"-->
<!-- class="btn ms-3 o_barcode"-->
<!-- tabindex="-1"-->
<!-- draggable="false"-->
<!-- aria-label="Scan barcode"-->
<!-- title="Scan barcode"-->
<!-- data-tooltip="Scan barcode"-->
<!-- />-->
<!-- </div>-->
<!-- <div class="o_field_many2one_extra">-->
<!-- <t t-foreach="extraLines" t-as="extraLine" t-key="extraLine_index">-->
<!-- <br t-if="!extraLine_first" />-->
<!-- <span t-esc="extraLine" />-->
<!-- </t>-->
<!-- </div>-->
<!-- </t>-->
<!-- </t>-->
</templates>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="owl_demo.PartnerOrderSummary2" owl="1">
<div class="row" style="padding-top: 20px;">
<p>
显示累加字符串aaaaaabbb
</p>
</div>
</t>
</templates>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="owl_demo.MyComponent1" owl="1">
<div class="container">
<div class="jumbotron">
<h1>欢迎登陆页面!</h1>
<p>这是一个超大屏幕Jumbotron的实例。</p>
<p><a class="btn btn-primary btn-lg" role="button">
学习更多</a>
</p>
</div>
</div>
<!-- <div class="bg-info text-center p-2">-->
<!-- <i class="fa fa-arrow-left p-1 left"-->
<!-- style="cursor: pointer;"-->
<!-- t-on-click="onPrevious"> </i>-->
<!-- <b t-esc="messageList[Math.abs(-->
<!-- state.currentIndex%4)]"/>-->
<!-- <i class="fa fa-arrow-right p-1 right"-->
<!-- style="cursor: pointer;"-->
<!-- t-on-click="onNext"> </i>-->
<!-- <i class="fa fa-close p-1 float-right"-->
<!-- style="cursor: pointer;"-->
<!-- t-on-click="onRemove"> </i>-->
<!-- </div>-->
</t>
</templates>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates>
</templates>

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="sf_machine_connect.PartnerOrderSummary2" owl="1">
<!-- <div class="row" style="padding-top: 20px;">-->
<div style="padding-top: 20px;">
<button
t-on-click="onBarcodeBtnClick"
type="button"
class="btn ms-3 o_barcode"
tabindex="-1"
draggable="false"
aria-label="Scan barcode"
title="Scan barcode"
data-tooltip="Scan barcode"
>扫码</button>
<!-- <div class="o_barcode_mobile_container">-->
<!-- <a role="button" class="btn btn-primary o_mobile_barcode">-->
<!-- <i class="fa fa-camera fa-2x o_barcode_mobile_camera"/>-->
<!-- Tap to scan-->
<!-- </a>-->
<!--&lt;!&ndash; <img src="/barcodes/static/img/barcode.png" alt="Barcode"/>&ndash;&gt;-->
<!-- <span class="o_barcode_laser"/>-->
<!-- </div>-->
</div>
</t>
</templates>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="mobile_barcode_template">
<div class="o_barcode_mobile_container">
<a role="button" class="btn btn-primary o_mobile_barcode">
<i class="fa fa-camera fa-2x o_barcode_mobile_camera"/>
Tap to scan
</a>
<img src="/barcodes/static/img/barcode.png" alt="Barcode"/>
<span class="o_barcode_laser"/>
</div>
</t>
</templates>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<templates>
<div t-name="iot.scan_progress_template">
<h4>Range(s) to scan</h4>
<ul class="scan_ranges list-group mb-2"/>
<div class="input-group mb-4">
<input type="text" name="add_scan_range_ip" class="add_scan_range_ip form-control" placeholder="Scan another range, e.g.: 10.1.1.*"/>
<a role="button" class="add_scan_range btn btn-primary" tabindex="-1">Add</a>
</div>
<div class="mb-4">
<h4 class="scan_network"></h4>
<h4 class="iot_box_found"></h4>
<ul class="found_devices list-group"/>
</div>
</div>
</templates>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="web.Many2OneField" owl="1">
<button
t-on-click="onBarcodeBtnClick"
type="button"
class="btn ms-3 o_barcode"
tabindex="-1"
draggable="false"
aria-label="Scan barcode"
title="Scan barcode"
data-tooltip="Scan barcode"
/>
</t>
</templates>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" >
<t t-extend="stock_barcode_lines_template">
<t t-jquery="div[class='o_barcode_line list-group-item d-flex flex-row flex-nowrap']"
t-operation="append">
<div class="o_barcode_pic position-relative text-center mt-2 mb-1">
<i class="fa fa-5x mx-auto fa-exclamation-triangle text-white d-none"/>
<img class="o_barcode_icon" src="/stock_barcode/static/img/barcode.svg" alt="Barcode" height="40px"/>
<!-- <t t-if='widget.mobileMethods.scanBarcode'> -->
<div class="o_stock_mobile_barcode"/> <!-- Used to open the device scanner -->
<span> Tap to scan</span>
<!-- </t> -->
</div>
</t>
</t>
</templates>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0"?>
<odoo>
<record id="view_order_form_scan_barcode" model="ir.ui.view">
<field name="name">sale.order.form.scan.barcode</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<field name="partner_id" position="after">
<!-- invisible="1" -->
<field name="_barcode_scanned" widget="barcode_handler"/>
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0"?>
<odoo>
<record id="sf_install_the_tray_workorder_form_view__scan_barcode" model="ir.ui.view">
<field name="name">sf.install.the.tray.workorder.form.scan.barcode</field>
<field name="model">mrp.workorder</field>
<field name="inherit_id" ref="sf_manufacturing.view_mrp_production_workorder_tray_form_inherit_sf"/>
<field name="arch" type="xml">
<xpath expr="//page//field[@name='tray_code']" position="before">
<!-- invisible="1" -->
<field name="_barcode_scanned" widget="barcode_handler"/>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0"?>
<odoo>
<record id="stock_picking_form_vieww_scan_barcode_search" model="ir.ui.view">
<field name="name">stock.picking.search</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_internal_search"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="before">
<!-- <field name="tray_code" filter_domain="[('production_id.tray_ids.code','=',self)]"/>-->
<field name="origin"/>
</xpath>
<!-- <xpath expr="//search//group//filter[@name='product']" position="before">-->
<!-- <filter string="Tray code" name="traycode" domain="[]" context="{'group_by': 'tray_code'}"/>-->
<!-- </xpath>-->
</field>
</record>
</odoo>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<odoo>
<record id="workcenter_form_vieww_scan_barcode_search" model="ir.ui.view">
<field name="name">work.order.search</field>
<!-- <field name="model">mrp.workcenter</field>-->
<field name="model">mrp.workorder</field>
<field name="inherit_id" ref="mrp.view_mrp_production_work_order_search"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='production_id']" position="before">
<!-- <field name="name" filter_domain="['|', '|', ('明确的字段内容', 'ilike', self), ('shortdesc', 'ilike', self), ('name', 'ilike', self)]" string="Theme"/>-->
<field name="tray_code" filter_domain="[('production_id.tray_ids.code','=',self)]"/>
<!-- <field name="production_id"/>-->
</xpath>
<!-- <xpath expr="//search//group//filter[@name='product']" position="before">-->
<!-- <filter string="Tray code" name="traycode" domain="[]" context="{'group_by': 'tray_code'}"/>-->
<!-- </xpath>-->
</field>
</record>
</odoo>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0"?>
<odoo>
<record id="compensation_view" model="ir.ui.view">
<field name="name">compensation</field>
<field name="model">mrp.workorder</field>
<field name="inherit_id" ref="sf_manufacturing.view_mrp_production_workorder_tray_form_inherit_sf"/>
<field name="arch" type="xml">
<xpath expr="//page//field[@name='cnc_ids']" position="before">
<group>
<field name="compensation_value_x"/>
<field name="compensation_value_y"/>
</group>
<div>
<button string="一键补偿" name="compensation" type="object" confirm="是否确认下发补偿" class="btn-primary"/>
</div>
</xpath>
<!-- attrs='{"invisible": [("routing_type","!=","CNC加工")]}'-->
</field>
</record>
</odoo>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="flush">
&lt;!DOCTYPE html&gt;
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<title>World Map</title>
<script type="text/javascript">
$(function () {
setInterval(function () {
$("#map").load(location.href + " #map>*", "");//注意后面DIV的ID前面的空格跟 id 后的>*,很重要!
}, 1000);//8秒自动刷新
})
</script>
</head>
<body>
</body>
</html>
</template>
</odoo>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="sf_install_the_tray_workorder_form_view_inherit" model="ir.ui.view">
<field name="name">sale.order.inherit</field>
<field name="model">mrp.workorder</field>
<!-- <field name="model">cnc.processing</field>-->
<field name="inherit_id" ref="sf_manufacturing.view_mrp_production_workorder_tray_form_inherit_sf"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='remark']" position="after">
<button string="测试按钮" name="pri" type="object" class="btn-primary"/>
<button string="下发按钮" name="up" type="object" confirm="是否确认下发此程序" class="btn-primary"/>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_tree_mrs_machine_tool_inherited" model="ir.ui.view">
<field name="name">sf_base_extension</field>
<field name="model">sf.machine_tool</field>
<field name="inherit_id" ref="sf_base.sf_machine_tool_form"/>
<!-- <field name="inherit_id" ref="sf_base.form_mrs_machine_tool_type"/>-->
<field eval="20" name="priority"/>
<field name="arch" type="xml">
<!-- <xpath expr="//field[@name='knife_type']" position="before">-->
<xpath expr="//form//notebook//page[1]" position="inside">
<!-- <xpath expr="//page[@name='other']" position="before">-->
<!-- <page string="监控页面">-->
<group string="监控">
<field name="timestamp"/>
<field name="signed"/>
<field name="status"/>
<!-- <field name="tool_num"/>-->
<field name="program"/>
</group>
<!-- </page>-->
</xpath>
</field>
</record>
</odoo>
<!--&lt;!&ndash;继承了本模块的视图&ndash;&gt;-->
<!--<?xml version="1.0" encoding="utf-8"?>-->
<!--<odoo>-->
<!-- <record id="view_tree_mrs_machine_tool_inherited" model="ir.ui.view">-->
<!-- <field name="name">sf_base_extension</field>-->
<!-- <field name="model">ftp.client</field>-->
<!-- <field name="inherit_id" ref="ftp_form"/>-->
<!-- <field eval="20" name="priority"/>-->
<!-- <field name="arch" type="xml">-->
<!-- <xpath expr="//field[@name='name']" position="before">-->
<!-- <field name="count_books"/>-->
<!-- </xpath>-->
<!-- </field>-->
<!-- </record>-->
<!--</odoo>-->

View File

@@ -0,0 +1,25 @@
<record id="view_purchase_order_barcode_inherit_form" model="ir.ui.view">
<field name="name">purchase.order.form</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="priority" eval="8"/>
<field name="arch" type="xml">
<form position="inside">
<field name="_barcode_scanned" widget="purchaseorder_barcode_handler"/>
</form>
<xpath expr="//field[@name='order_line']/tree" position="inside">
<field name="product_barcode" invisible="1"/>
</xpath>
<xpath expr="//field[@name='order_line']/kanban" position="inside">
<field name="product_barcode" invisible="1"/>
</xpath>
<xpath expr="//field[@name='order_line']//field[@name='product_qty']" position="attributes">
<attribute name="options">{'barcode_events': True}</attribute>
<attribute name="widget">field_float_scannable</attribute>
</xpath>
<xpath expr="//button[@name='button_confirm']" position="attributes">
<attribute name="barcode_trigger">validate</attribute>
</xpath>
</field>
</record>

View File

@@ -0,0 +1,176 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Menus -->
<menuitem
id="ftp_menu_root"
name="sf2machine"
web_icon="iot,static/description/icon.png"
groups="base.group_system"
/>
IoT Boxes
<record model="ir.ui.view" id="data_list">
<field name="model">ftp.client</field>
<field name="arch" type="xml">
<!-- <div id="map">-->
<tree string="目标">
<field name="name"/>
<field name="mobile"/>
<field name="description"/>
</tree>
<!-- </div>-->
</field>
</record>
<record model="ir.ui.view" id="barcode_list">
<field name="model">mrp.production</field>
<field name="arch" type="xml">
<!-- <div id="map">-->
<tree string="目标">
<field name="_barcode_scanned" widget="barcode_handler"/>
<field name="aa"/>
</tree>
<!-- </div>-->
</field>
</record>
<record model="ir.ui.view" id="ftp_form">
<field name="model">ftp.client</field>
<field name="arch" type="xml">
<form string="数据采集">
<group string="基本信息">
<group>
<field name="name"/>
<field name="mobile"/>
<field name="description"/>
<field name="_barcode_scanned" widget="barcode_handler"/>
<!-- <button string="测试按钮" name="pri" type="object"/>-->
<button string="下发程序" name="up" type="object" data-hotkey="enter"/>
<button string="扫码" name="on_barcode_scanned" type="object"/>
<!-- <button string="删除程序" name="delete" type="object"/>-->
<templates xml:space="preserve">
<t t-name="web.Many2OneField" owl="1">
<button t-on-click="onBarcodeBtnClick"
type="button"
class="btn ms-3 o_barcode"
tabindex="-1"
draggable="false"
aria-label="Scan barcode"
title="Scan barcode"
data-tooltip="Scan barcode"
>saomiao</button>
</t>
</templates>
</group>
</group>
</form>
</field>
</record>
<record model="ir.ui.view" id="barcode_form">
<field name="model">mrp.production</field>
<field name="arch" type="xml">
<form string="扫码">
<group string="基本信息">
<field name="_barcode_scanned" widget="barcode_handler"/>
<field name="aa"/>
</group>
</form>
</field>
</record>
<record id="ftp_action" model="ir.actions.act_window">
<field name="name">数据采集</field>
<field name="res_model">ftp.client</field>
<field name="view_mode">list,form,kanban</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
这是我们的数据采集与程序管理页面!
</p>
</field>
</record>
<record id="barcode_action" model="ir.actions.act_window">
<field name="name">扫码</field>
<field name="res_model">mrp.production</field>
<field name="view_mode">list,form,kanban</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
这是我们的扫码页面!
</p>
</field>
</record>
<menuitem
id="ftp_data_menu_action"
name="数据采集"
action="ftp_action"
parent="ftp_menu_root"
sequence="1"/>
<menuitem
id="ftp_cnc_data_menu_action"
name="CNC"
action="ftp_action"
parent="ftp_data_menu_action"
sequence="1"/>
<!-- <menuitem-->
<!-- id="ftp_mit_cnc_data_menu_action"-->
<!-- name="三菱CNC"-->
<!-- action="ftp_action"-->
<!-- parent="ftp_cnc_data_menu_action"-->
<!-- sequence="1"/>-->
<!-- <menuitem-->
<!-- id="ftp_sim_cnc_data_menu_action"-->
<!-- name="西门子CNC"-->
<!-- action="ftp_action"-->
<!-- parent="ftp_cnc_data_menu_action"-->
<!-- sequence="1"/>-->
<!-- <menuitem-->
<!-- id="ftp_fan_cnc_data_menu_action"-->
<!-- name="发那科CNC"-->
<!-- action="ftp_action"-->
<!-- parent="ftp_cnc_data_menu_action"-->
<!-- sequence="1"/>-->
<menuitem
id="ftp_plc_data_menu_action"
name="PLC"
action="ftp_action"
parent="ftp_data_menu_action"
sequence="3"/>
<menuitem
id="ftp_instrument_data_menu_action"
name="仪器仪表"
action="ftp_action"
parent="ftp_data_menu_action"
sequence="9"/>
<menuitem
id="ftp_procedure_menu_action"
name="程序管理"
action="barcode_action"
parent="ftp_menu_root"
sequence="2"/>
<menuitem
id="ftp_up_menu_action"
name="本地代码"
action="ftp_action"
parent="ftp_procedure_menu_action"
sequence="2"/>
<menuitem
id="ftp_down_menu_action"
name="机床代码"
action="ftp_action"
parent="ftp_procedure_menu_action"
sequence="6"/>
</odoo>

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="sale_order_form_inherit" model="ir.ui.view">
<field name="name">sale.order.form.inherit</field>
<field name="model">sf.machine_tool</field>
<field name="inherit_id" ref="sf_base.sf_machine_tool_form"/>
<field name="arch" type="xml">
<xpath expr="//form//notebook//page[1]" position="inside">
<group string="监控">
<field name="timestamp"/>
<field name="signed"/>
<field name="signed16"/>
<field name="pulse2"/>
<field name="tool_num"/>
<field name="program"/>
</group>
<!-- </page>-->
<div class="o_partner_order_summary" colspan="2"/>
</xpath>
<!-- <field name="payment_term_id" position="after">-->
<!-- <field name="create_date" widget="show_units" options="{'units':'UTC'}"/>-->
<!-- -->
<!-- </field>-->
</field>
</record>
</odoo>
<!--<?xml version="1.0" encoding="utf-8"?>-->
<!--<odoo>-->
<!-- <record id="sale_order_form_inherit" model="ir.ui.view">-->
<!-- <field name="name">sale.order.form.inherit</field>-->
<!-- <field name="model">sale.order</field>-->
<!-- <field name="inherit_id" ref="sale.view_order_form"/>-->
<!-- <field name="arch" type="xml">-->
<!-- <field name="payment_term_id" position="after">-->
<!-- <field name="create_date" widget="show_units" options="{'units':'UTC'}"/>-->
<!-- <div class="o_partner_order_summary" colspan="2"/>-->
<!-- </field>-->
<!-- </field>-->
<!-- </record>-->
<!--</odoo>-->

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="sf_install_the_tray_workorder_form_view_inherit" model="ir.ui.view">
<field name="name">sale.order.form.inherit</field>
<field name="model">mrp.workorder</field>
<field name="inherit_id" ref="sf_manufacturing.view_mrp_production_workorder_tray_form_inherit_sf"/>
<field name="arch" type="xml">
<field name="tray_code" position="before">
<!-- <field name="create_date" widget="show_units" options="{'units':'UTC'}"/>-->
<div class="o_partner_order_summary" colspan="2"/>
<!-- <field name="aa"/>-->
</field>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="mrp_workcenter_view_kanban_inherit_workorder_inherit" model="ir.ui.view">
<field name="name">mrp.workcenter.view.kanban.inherit.mrpworkorder</field>
<field name="model">mrp.workcenter</field>
<!-- <field name="model">cnc.processing</field>-->
<field name="inherit_id" ref="mrp.mrp_workcenter_kanban"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_work_order']" position="after">
<!-- <field name="aaaa"/>-->
<button string="扫码查询" name="search_order" type="object" class="btn-primary"/>
</xpath>
</field>
</record>
</odoo>