Commit 6ad52cab by 夏超

[add] 新增前期玖姿机械模块

parent dd28d5f9
# -*- coding: utf-8 -*-
from . import models
# -*- coding: utf-8 -*-
{
'name': '融科-玖姿机械',
'version': '14.0',
'category': 'mes',
'depends': ['roke_mes_purchase','roke_mes_sale','roke_mes_documents'],
'author': 'www.rokedata.com',
'website': 'http://www.rokedata.com',
'description': """
玖姿机械
""",
'data': [
'datas/config_parameter_data.xml',
'datas/cron_data.xml',
'security/ir.model.access.csv',
'views/inherit_roke_mes_stock_picking_views.xml',
'views/inherit_roke_production_task.xml',
'views/button_js.xml',
'views/iniherit_work_order_view.xml',
'views/roke_work_log_views.xml',
'views/iniherit_work_center_view.xml'
],
'qweb': [
],
'application': False,
'installable': True,
}
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="fscut_app_app_id" model="ir.config_parameter">
<field name="key">fscut.app_id</field>
<field name="value">op191458064d64e10d</field>
</record>
<record id="fscut_app_secret" model="ir.config_parameter">
<field name="key">fscut.app_secret</field>
<field name="value">64a9af1225e0e10ad20d532d8037a211ea679345313969fe8f277fa78f85e92d</field>
</record>
</data>
</odoo>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="ir_cron_sync_user_devices" model="ir.cron">
<field name="name">获取机床列表</field>
<field name="model_id" ref="model_roke_work_center"/>
<field name="state">code</field>
<field name="code">model.get_user_devices()</field>
<field name="interval_number">1</field>
<field name="interval_type">months</field>
<field name="numbercall">-1</field>
<field name="doall" eval="True"/>
<field name="active" eval="False" />
</record>
<record id="ir_cron_sync_work_logs" model="ir.cron">
<field name="name">获取机床加工记录</field>
<field name="model_id" ref="model_roke_work_center"/>
<field name="state">code</field>
<field name="code">
# 默认取当前时间前十分钟的加工记录。
# 如果需要取其它时间的价格记录,请入参开始/结束时间(格式“年-月-日 时:分:秒”);
# 如果需求取当前时间的前20分钟的加工记录,那么入参时间间隔time_interval(单位分钟)。
# 比如:model.get_work_logs(start_time="2024-01-01 0:00:00", end_time="2024-01-01 8:00:00") 或 model.get_work_logs(time_interval=20)
model.get_work_logs()
</field>
<field name="interval_number">10</field>
<field name="interval_type">minutes</field>
<field name="numbercall">-1</field>
<field name="doall" eval="True"/>
<field name="active" eval="False" />
</record>
</data>
</odoo>
\ No newline at end of file
from . import inherit_roke_work_order
from . import inherit_production_task
from . import inherit_workcenter
from . import work_log
# import requests
#
# import re
#
#
# def process_url(web_base_url):
# # 替换 http:// 或 https://
# web_base_url = re.sub(r'^https?://', '', web_base_url)
# # 删除斜杠 /
# web_base_url = web_base_url.replace("/", "")
# return web_base_url
#
# # Uncaught (in promise) TypeError: self.keepRun is not a function
# # 测试
# web_base_url = "https://example.com/"
# processed_url = process_url(web_base_url)
#
#
# def upload_file(url, file_path, processed_url):
# try:
# files = {'file': open(file_path, 'rb')}
# print({'file': open(file_path, 'rb')})
# data = {'filePath': processed_url}
# response = requests.post(url, files=files, data=data)
# if response.status_code == 200:
# return response.json()
# else:
# return None
# except requests.exceptions.RequestException as e:
# return e
#
#
# file_path = r"C:\Users\zhangsan\Desktop\改BL320200-70S底盖(2).SLDPRT"
#
# data = upload_file(url, file_path, processed_url)
# if data:
# print("获取到的数据:", data)
# else:
# print("获取数据失败。")
# import json
# import requests
#
# url = "http://123.129.207.22:8088/cad/uploadFileUrl"
# dict_ = {
# 'ossId': "1772107631008669698",
# 'url': "http://121.37.69.162:9000/roke/localhost:8022/2024/03/25/274c6b3c80e34b059563874f5600ac20.DXF"
# }
#
# json_ = json.dumps(dict_, ensure_ascii=False)
# datas = requests.post(url, data=json_)
# content = json.loads(datas.content)
# print(content)
# dataaaa = content["data"]
# print(dataaaa)
# -*- coding: utf-8 -*-
"""
Description:
Versions:
Created by www.rokedata.com<HuChuanwei>
"""
import hashlib
import json
import time
class OpenApiHeader:
def __init__(self, app_id, timestamp, app_sign):
self.appID = app_id
self.timestamp = timestamp
self.appSign = app_sign
def to_json(self):
data = {
"app-id": self.appID,
"time-stamp": str(self.timestamp),
"app-sign": self.appSign
}
return json.dumps(data)
def to_dict(self):
return {
"app-id": self.appID,
"time-stamp": self.timestamp,
"app-sign": self.appSign
}
class OpenApiHeaderHelper:
def __init__(self, app_id, app_secret):
self.app_id = app_id
self.app_secret = app_secret
def gen_json(self):
openApiHeader = self._do_gen_header()
return openApiHeader.to_json()
def gen_map(self):
openApiHeader = self._do_gen_header()
return openApiHeader.to_dict()
def _do_gen_header(self):
timestamp = int(time.time() * 1000)
appSign = self._do_md5_hash(self.app_id + self.app_secret + str(timestamp))
return OpenApiHeader(self.app_id, timestamp, appSign)
@staticmethod
def _do_md5_hash(content):
hash_object = hashlib.md5(content.encode())
return hash_object.hexdigest()
\ No newline at end of file
# -*- coding: utf-8 -*-
import http.client
import mimetypes
from codecs import encode
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class InheritProductionTask(models.Model):
_inherit = "roke.production.task"
file_ids = fields.Many2many("ir.attachment", "roke_production_task_ir_attachment", "pro_id", "att_id")
taskName = fields.Char(string="任务名称")
UploadMsg = fields.Char(string="上传状态")
TaskUUID = fields.Char(string="任务UUID")
def upload_task(self):
"""
上传任务 TODO 任务数量取计划数还是计划数-完成数?上传一次后还能再上传不?多个加工文件时,上传第一个还是最后一个?
:return:
"""
self.ensure_one()
if not self.work_center_id:
raise ValidationError("未指派工作中心,禁止上传")
if not self.work_center_id.card_id:
raise ValidationError("当前工作中心无控制卡信息,无法上传")
if not self.file_ids:
raise ValidationError("当前任务无加工文件,无法上传")
if not self.taskName:
raise ValidationError("必须填写任务名称")
attachment = self.file_ids[:1]
self.work_center_id.upload_task(self, attachment)
def write(self, vals):
res = super(InheritProductionTask, self).write(vals)
if vals.get('file_ids'):
files = []
for i in self.file_ids:
a = self.env['documents.document'].create({
'attachment_id': i.id,
'folder_id': 2})
files.append(a.id)
self.document_ids = [(4, a.id)]
return res
from odoo import models, fields, api, _
class InheritWorkOrder(models.Model):
_inherit = "roke.work.order"
document_ids = fields.Many2many(related="task_id.document_ids", string="作业指导")
task_file_ids = fields.Many2many(related="task_id.file_ids")
# -*- coding: utf-8 -*-
"""
Description:
激光切割机加工记录
Versions:
Created by www.rokedata.com<HuChuanwei>
"""
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class RokeWorkLog(models.Model):
_name = "roke.work.log"
_description = "加工记录"
_order = "id desc"
_rec_name = "materialName"
work_center_id = fields.Many2one("roke.work.center", string="工作中心", index=True)
fileName = fields.Char(string="图纸文件路径")
portionId = fields.Char(string="排版唯一标识", index=True)
startTime = fields.Char(string="加工开始时间")
endTime = fields.Char(string="加工结束时间")
timeTaken = fields.Integer(string="实际切割用时")
tmEstimate = fields.Float(string="预计用时")
curveLength = fields.Float(string="切割长度")
moveLength = fields.Float(string="空移长度")
pierceCount = fields.Integer(string="穿孔数")
endState = fields.Selection([("0", "已完成"), ("-1", "正在加工"), ("1", "暂停"), ("2", "停止"), ("4", "未知")], string="加工状态")
material = fields.Char(string="材质", index=True)
materialName = fields.Char(string="工艺文件名", index=True)
portionName = fields.Char(string="排版名称", index=True)
thickness = fields.Integer(string="厚度(mm)")
plateSize = fields.Char(string="排版尺寸", index=True)
selected = fields.Boolean(string="是否为选中加工")
boundSize = fields.Char(string="图形边框尺寸")
syncTime = fields.Datetime(string="数据同步时间")
partAmount = fields.Integer(string="零件数量")
workUuid = fields.Char(string="加工记录标识", index=True)
taskUuid = fields.Char(string="任务标识")
part_ids = fields.One2many("roke.work.log.part", "log_id", string="零件信息")
class RokeWorkLogPart(models.Model):
_name = "roke.work.log.part"
_description = "加工记录配件"
log_id = fields.Many2one("roke.work.log", string="加工记录", required=True, ondelete="cascade")
partId = fields.Char(string="零件唯一标识")
name = fields.Char(string="零件名称")
amount = fields.Integer(string="单种零件完成数")
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_roke_work_log_user,roke_work_log_user,model_roke_work_log,base.group_user,1,0,0,0
access_roke_work_log_part_user,roke_work_log_part_user,model_roke_work_log_part,base.group_user,1,0,0,0
access_roke_work_log_system,roke_work_log_system,model_roke_work_log,base.group_system,1,1,1,1
access_roke_work_log_part_system,roke_work_log_part_system,model_roke_work_log_part,base.group_system,1,1,1,1
odoo.define('jzjx_project.button', function (require) {
"use strict";
const FormController = require('web.FormController');
const session = require('web.session');
const framework = require('web.framework');
FormController.include({
events: _.extend({}, FormController.prototype.events, {
'click .test_open': '_onClickDocumentsUpload',
}),
_onClickDocumentsUpload(ev) {
console.log(ev);
console.log("===================")
ev.preventDefault();
const context = this.model.get(this.handle, { raw: true }).getContext();
this._uploadFilesHandler(true)(ev);
console.log(ev)
},
_uploadFilesHandler(multiple) {
const EXTRAL_WHITELIST_EXTENSIONS = ['dwg', 'dxf', 'step', 'sldprt', 'sldasm'];
// console.log(ev)
// console.log("=====================================")
return (ev) => {
const recordId = ev.data ? ev.data.id : undefined;
const $uploadInput = this.hiddenUploadInputFile
? this.hiddenUploadInputFile.off('change')
: (this.hiddenUploadInputFile = $('<input>', { type: 'file', name: 'files[]', class: 'o_hidden' }).appendTo(this.$el));
$uploadInput.attr('multiple', multiple ? true : null);
const cleanup = $.prototype.remove.bind($uploadInput);
$uploadInput.on('change', async changeEv => {
// START
/**
* 区分文件类型,以存放到不同的服务器
*/
let extra_files = [];
let odoo_files = [];
for (const file of changeEv.target.files) {
let split_temp = file.name.split('.');
if (split_temp.length > 1) {
var file_extension = split_temp.pop();
} else {
var file_extension = '';
}
if (EXTRAL_WHITELIST_EXTENSIONS.includes(file_extension.toLowerCase())) {
extra_files.push(file);
} else {
odoo_files.push(file);
}
}
if (extra_files.length > 0){
// console.log("extra_files", extra_files)
await this._uploadFiles2Minio(extra_files);
}
// await this._uploadFiles(odoo_files, { recordId }).finally(cleanup);
// END
// await this._uploadFiles(changeEv.target.files, { recordId }).finally(cleanup);
changeEv.target.value = null; // 上传完成后 情况 input 值,下次上传同样的文件 就仍然可以出发 change 事件
});
this._promptFileInput($uploadInput);
};
},
async _uploadFiles2Minio(files) {
let self = this;
framework.blockUI();
await self.keepRun(3, files, self._uploadToMinIoHandler.bind(self))
framework.unblockUI();
await self.reload();
},
keepRun(limit, list, workFn) {
return new Promise(resolve => {
let running = 0,
temList = list.slice(),
next = function (item) {
workFn(item).then(result => {
if (result) {
running--;
if (running !== 0 || temList.length !== 0) {
launcher();
} else {
resolve("complete");
}
}
}).catch(err => {
running--;
});
},
launcher = function () {
while (running < limit && temList.length) {
let item = temList.shift();
next(item);
running++;
}
};
launcher();
});
},
_promptFileInput($uploadInput) {
$uploadInput.click();
},
_uploadToMinIoHandler(file) {
let self = this;
return new Promise((resolve, reject) => {
self._onUploadToMinIoHandler(file).then(function (result) {
if (result.code === 200) {
result.data.fname = file.name;
resolve(result.data);
} else {
reject(result.data);
}
});
});
},
_onUploadToMinIoHandler: async function (file) {
/**
* 文档直传MinIO
* */
let self = this;
let web_base_url = session['web.base.url'];
const formdata = new FormData();
formdata.append('file', file);
formdata.append('filePath', web_base_url.replace(/^https?:\/\//, '').replace("/", ""));
return new Promise((resolve, reject) => {
$.ajax({
type: "POST",
enctype: 'multipart/form-data',
url: "http://123.129.207.22:8088/resource/oss/unauthorized/upload",
data: formdata,
processData: false,
contentType: false,
cache: false,
timeout: 600000,
success: async function (result) {
if (result.code === 200) {
const { data } = result;
// console.log("data", data)
await self._saveExtraFileLink(file.name, data.ossId, data.url);
await self._uploadFileUrl(data.ossId, data.url);
resolve(result);
} else {
console.log("result", result)
self.do_notify("上传失败", `${file.name} 上传失败\n${result.msg}`, false);
reject(result);
}
},
error: function (e) {
console.log("onload error", e)
let reject_data = { code: 1, msg: "error", data: e };
self.do_notify("上传失败", `${file.name} 上传失败\n${e}`, false);
reject(reject_data);
}
});
});
},
async _saveExtraFileLink(fname, unikey, flink) {
/**
* 保存文件地址到ODOO
* */
// let folder_id = this.searchModel.get('selectedFolderId');
// console.log("fname, unikey, flink", fname, unikey, flink);
var data_dict = { name: fname, url: flink, folder_id: 2, unikey: unikey, type: 'url' }
const record = this.model.localData[this.handle]
console.log(record)
console.log(record.data.id)
var res_id = record.data.id
await this._rpc({
model: 'roke.production.task',
method: 'write_documents',
args: [,data_dict, res_id],
// kwargs: { context: session.user_context },
});
},
_uploadFileUrl: function (unikey, flink) {
/**
* 上传文件地址,以保存ocf地址
* */
return new Promise((resolve, reject) => {
$.ajax({
url: "http://123.129.207.22:8088/cad/uploadFileUrl",
type: "POST",
dataType: "json",
contentType: 'application/json',
data: JSON.stringify({
"ossId": unikey,
"url": flink
}),
success: function (data) {
console.log("success", data);
resolve(data);
},
error: function (data) {
console.log("ERROR ", data);
reject(data);
}
});
});
},
})
});
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<template id="roke_jz_jx_templates" inherit_id="web.assets_backend" name="roke_jz_jx">
<xpath expr="script[last()]" position="after">
<!-- <script type="text/javascript" src="/roke_pub_wx_notice/static/src/js/sync_wx_btn.js"/>-->
<script type="text/javascript" src="/jzjx_project/static/src/js/button.js"/>
</xpath>
</template>
</odoo>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="inherit_view_roke_mes_purchase_receiving_form" model="ir.ui.view">
<field name="name">inherit.roke.mes.stock.picking.form</field>
<field name="model">roke.mes.stock.picking</field>
<field name="inherit_id" ref="roke_mes_purchase.view_roke_mes_purchase_receiving_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="replace">
<field name="partner_id" options="{'no_create': True}"
attrs="{'readonly':[('state', '!=', '草稿')]}"
domain="[('supplier', '=', True)]"/>
</xpath>
</field>
</record>
<record id="inherit_view_roke_mes_general_in_form" model="ir.ui.view">
<field name="name">inherit.roke.mes.stock.picking.form</field>
<field name="model">roke.mes.stock.picking</field>
<field name="inherit_id" ref="roke_mes_stock.view_roke_mes_general_in_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="replace">
<field name="partner_id" options="{'no_create': True}"
attrs="{'readonly':[('state', '!=', '草稿')]}"
domain="[('supplier', '=', True)]"/>
</xpath>
</field>
</record>
<record id="inherit_view_roke_mes_sale_deliver_form" model="ir.ui.view">
<field name="name">inherit.roke.mes.stock.picking</field>
<field name="model">roke.mes.stock.picking</field>
<field name="inherit_id" ref="roke_mes_sale.view_roke_mes_sale_deliver_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="replace">
<field name="partner_id" options="{'no_create': True}"
attrs="{'readonly':[('state', '!=', '草稿')]}"
domain="[('customer', '=', True)]"/>
</xpath>
</field>
</record>
<record id="inherit_view_roke_mes_general_out_form" model="ir.ui.view">
<field name="name">inherit.roke.mes.stock.picking</field>
<field name="model">roke.mes.stock.picking</field>
<field name="inherit_id" ref="roke_mes_stock.view_roke_mes_general_out_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="replace">
<field name="partner_id" options="{'no_create': True}"
attrs="{'readonly':[('state', '!=', '草稿')]}"
domain="[('customer', '=', True)]"/>
</xpath>
</field>
</record>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="inherit_view_roke_production_task_form" model="ir.ui.view">
<field name="name">inherit.roke.production.form.view</field>
<field name="model">roke.production.task</field>
<field name="inherit_id" ref="roke_mes_production.view_roke_production_task_form"/>
<field name="arch" type="xml">
<xpath expr="//page/group[@name='attachment']" position="after">
<field name="file_ids" widget="many2many_pic_preview" string="上传作业指导"/>
</xpath>
<xpath expr="//field[@name='sum_unqualified_qty']" position="after">
<field name="taskName"/>
</xpath>
<xpath expr="//field[@name='pass_rate']" position="after">
<field name="UploadMsg" readonly="1"/>
</xpath>
<xpath expr="//header" position="inside">
<button name="upload_task" type="object" string="上传任务" class="btn btn-primary"
attrs="{'invisible': [('UploadMsg', '=', 'OK')]}"/>
</xpath>
</field>
</record>
</odoo>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="jzjx_inherit_work_center_kanban_view" model="ir.ui.view">
<field name="name">jzjx.inherit.roke.work.center.kanban.view</field>
<field name="model">roke.work.center</field>
<field name="inherit_id" ref="roke_mes_production.roke_work_center_kanban_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='work_center_wo']" position="replace">
<div id="jzjx_work_center_state" class="row" style="display:flex;justify-content: center;align-items: center;font-size: 30px;">
<p style="color:#dee2e6;"><field name="deviceState"/></p>
</div>
</xpath>
<xpath expr="//div[@id='work_center_empty']" position="replace">
<div/>
</xpath>
</field>
</record>
<record id="jzjx_inherit_base_work_center_form_view" model="ir.ui.view">
<field name="name">jzjx.inherit.base.roke.work.center.form.view</field>
<field name="model">roke.work.center</field>
<field name="inherit_id" ref="roke_mes_base.view_roke_work_center_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='type_id']" position="after">
<field name="filename" readonly="1"/>
</xpath>
<xpath expr="//notebook" position="inside">
<page string="机床切割系统状态">
<group col="8">
<field name="axisX" readonly="1"/>
<field name="axisY" readonly="1"/>
<field name="axisZ" readonly="1"/>
<field name="workTimeStr" readonly="1"/>
<field name="workSpeed" readonly="1"/>
<field name="cutPercent" readonly="1"/>
<field name="laserPower" readonly="1"/>
<field name="pwmFreq" readonly="1"/>
<field name="gasType" readonly="1"/>
<field name="gasPressure" readonly="1"/>
<field name="pwmRatio" readonly="1"/>
<field name="targetHeight" readonly="1"/>
<field name="diodeCurrent" readonly="1"/>
</group>
</page>
</xpath>
</field>
</record>
<record id="jzjx_inherit_wc_work_center_form_view" model="ir.ui.view">
<field name="name">jzjx.inherit.wc.work.center.form.view</field>
<field name="model">roke.work.center</field>
<field name="inherit_id" ref="roke_mes_work_center.view_roke_production_wc_inherit_work_center_form_view"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='stock_location_id']" position="after">
<field name="portionId" readonly="1"/>
</xpath>
</field>
</record>
<!--TODO 模块没依赖roke_mes_workshop_inspect-->
<record id="jzjx_inherit_inspect_work_center_form_view" model="ir.ui.view">
<field name="name">jzjx.inherit.inspect.roke.work.center.form.view</field>
<field name="model">roke.work.center</field>
<field name="inherit_id" ref="roke_mes_workshop_inspect.view_roke_wi_inherit_work_center_form_view"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='before_inspect_scheme_id']" position="after">
<field name="startTime" readonly="1"/>
</xpath>
</field>
</record>
</odoo>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="inherit_view_roke_work_order_form" model="ir.ui.view">
<field name="name">inherit.roke.work.order.form.view</field>
<field name="model">roke.work.order</field>
<field name="inherit_id" ref="roke_mes_production.view_roke_work_order_form"/>
<field name="arch" type="xml">
<!-- <xpath expr="//page/group[@name='attachment']" position="before">-->
<xpath expr="//page/group[@name='attachment']" position="after">
<field name="task_file_ids" widget="many2many_pic_preview"/>
</xpath>
</field>
</record>
</odoo>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--切割机加工记录-->
<!--search-->
<record id="view_roke_work_log_search" model="ir.ui.view">
<field name="name">roke.work.log.search</field>
<field name="model">roke.work.log</field>
<field name="arch" type="xml">
<search string="切割机加工记录">
<field name="work_center_id"/>
<field name="portionId"/>
<field name="material"/>
<field name="materialName"/>
<field name="portionName"/>
<field name="plateSize"/>
<field name="workUuid"/>
<filter name="endState_0" string="已完成" domain="[('endState', '=', '0')]"/>
<filter name="endState_-1" string="正在加工" domain="[('endState', '=', '-1')]"/>
<filter name="endState_1" string="暂停" domain="[('endState', '=', '1')]"/>
<filter name="endState_2" string="停止" domain="[('endState', '=', '2')]"/>
<separator/>
<filter name="filter_startTime" date="startTime" default_period="this_month"/>
<filter name="filter_endTime" date="endTime" default_period="this_month"/>
<filter name="filter_syncTime" date="syncTime" default_period="this_month"/>
<group expand="0" string="Group By">
<filter string="材质" name="group_material" context="{'group_by': 'material'}"/>
<filter string="加工状态" name="group_endState" context="{'group_by': 'endState'}"/>
</group>
</search>
</field>
</record>
<!--tree-->
<record id="view_roke_work_log_tree" model="ir.ui.view">
<field name="name">roke.work.log.tree</field>
<field name="model">roke.work.log</field>
<field name="priority">1000</field><!--数越大优先级越小-->
<field name="arch" type="xml">
<tree string="切割机加工记录" create="false" edit="false" delete="false" duplicate="false">
<field name="work_center_id" optional="show"/>
<field name="fileName" optional="show"/>
<field name="portionId" optional="show"/>
<field name="startTime" optional="show"/>
<field name="endTime" optional="show"/>
<field name="timeTaken" optional="show"/>
<field name="endState" optional="show"/>
<field name="tmEstimate" optional="hide"/>
<field name="curveLength" optional="hide"/>
<field name="moveLength" optional="hide"/>
<field name="pierceCount" optional="hide"/>
<field name="material" optional="show"/>
<field name="materialName" optional="show"/>
<field name="portionName" optional="show"/>
<field name="thickness" optional="show"/>
<field name="plateSize" optional="hide"/>
<field name="selected" optional="hide"/>
<field name="boundSize" optional="hide"/>
<field name="syncTime" optional="hide"/>
<field name="partAmount" optional="show"/>
<field name="workUuid" optional="hide"/>
<field name="taskUuid" optional="hide"/>
</tree>
</field>
</record>
<!--form-->
<record id="view_roke_work_log_form" model="ir.ui.view">
<field name="name">roke.work.log.form</field>
<field name="model">roke.work.log</field>
<field name="arch" type="xml">
<form string="切割机加工记录" create="false" edit="false" delete="false" duplicate="false">
<header>
<field name="endState" widget="statusbar"/>
</header>
<group id="g1" col="4">
<group>
<field name="work_center_id" optional="show"/>
<field name="fileName" optional="show"/>
<field name="portionId" optional="show"/>
<field name="startTime" optional="show"/>
<field name="endTime" optional="show"/>
</group>
<group>
<field name="timeTaken" optional="show"/>
<field name="tmEstimate" optional="hide"/>
<field name="curveLength" optional="hide"/>
<field name="moveLength" optional="hide"/>
<field name="pierceCount" optional="hide"/>
</group>
<group>
<field name="material" optional="show"/>
<field name="materialName" optional="show"/>
<field name="portionName" optional="show"/>
<field name="thickness" optional="show"/>
</group>
<group>
<field name="selected" optional="hide"/>
<field name="boundSize" optional="hide"/>
<field name="syncTime" optional="hide"/>
<field name="workUuid" optional="hide"/>
</group>
</group>
<notebook>
<page string="零件信息">
<field name="part_ids">
<tree>
<field name="log_id" invisible="1"/>
<field name="partId"/>
<field name="name"/>
<field name="amount"/>
</tree>
<form>
<group>
<group>
<field name="log_id"/>
<field name="partId"/>
</group>
<group>
<field name="name"/>
<field name="amount"/>
</group>
</group>
</form>
</field>
</page>
</notebook>
</form>
</field>
</record>
<!--action-->
<record id="view_roke_work_log_action" model="ir.actions.act_window">
<field name="name">切割机加工记录</field>
<field name="res_model">roke.work.log</field>
<field name="view_mode">tree,form</field>
<field name="type">ir.actions.act_window</field>
<field name="domain">[]</field>
<field name="context">{'create': False, 'edit': False, 'delete': False}</field>
</record>
<menuitem id="roke_work_log_menu" name="切割机加工记录" parent="roke_mes_production.roke_production_report_menu"
action="view_roke_work_log_action" sequence="100"/>
</odoo>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment