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>
"""
import base64
import io
import json
import time
import datetime
import requests
import logging
from . import generator
from odoo import models, fields, api, _
_logger = logging.getLogger(__name__)
class InheritWorkCenter(models.Model):
_inherit = "roke.work.center"
app_name = fields.Char(string="切割软件名称")
app_ver = fields.Char(string="切割软件版本")
card_id = fields.Char(string="控制卡ID")
# 机床加工中的任务
filename = fields.Char(string="加工文件")
portionId = fields.Char(string="排版ID")
startTime = fields.Datetime(string="开始时间")
# 机床状态
deviceState = fields.Selection([
("OFFLINE", "离线"),
("WORKING", "加工中"),
("ALARMING", "报警中"),
("IDLE", "空闲"),
("UNKNOWN", "未知"),
("CLOSE", "关闭切割软件"),
("PAUSE", "暂停加工"),
("STOP", "停止加工")
], string="机床状态")
# 机床切割系统状态
axisX = fields.Float(string="X轴")
axisY = fields.Float(string="Y轴")
axisZ = fields.Integer(string="Z轴")
workTime = fields.Float(string="加工时长")
workTimeStr = fields.Char(string="加工时长")
workSpeed = fields.Integer(string="加工速度")
cutPercent = fields.Float(string="加工进度(%)")
laserPower = fields.Integer(string="激光器功率")
pwmFreq = fields.Integer(string="Pwm频率(Hz)")
gasType = fields.Char(string="气体类型")
gasPressure = fields.Integer(string="切割气压")
pwmRatio = fields.Integer(string="Pwm占空比(%)")
targetHeight = fields.Integer(string="跟随高度(设定值)")
diodeCurrent = fields.Integer(string="峰值功率(%)")
taskName = fields.Char(string="任务名称")
def _request_work_logs(self, card_id, headers, start_time, end_time, time_interval, page_number=0, page_size=50, total=None):
"""
请求加工记录接口
:return:
"""
if not start_time or not end_time:
end_datetime = fields.Datetime.now() + datetime.timedelta(hours=8)
start_datetime = end_datetime - datetime.timedelta(minutes=time_interval)
start_time = start_datetime.strftime("%Y-%m-%d %H:%M:%S")
end_time = end_datetime.strftime("%Y-%m-%d %H:%M:%S")
url = "https://mcs-gateway.fscut.com/api/statistics/work_logs/v2"
payload = json.dumps({
"cardId": card_id,
"startTime": start_time,
"endTime": end_time,
"pageNumber": page_number,
"pageSize": page_size,
"timeDesc": False
})
response = requests.request("POST", url, headers=headers, data=payload)
response_dict = json.loads(response.text)
if response_dict.get("status") != 0:
_logger.error("获取机床加工记录错误:")
_logger.error(response_dict)
return []
response_data = response_dict.get("data")
result = response_data.get("list")
if not total:
total = response_data.get("meta").get("total")
if (page_number + 1) * page_size < total:
time.sleep(1)
result += self._request_work_logs(
card_id,
headers,
start_time,
end_time,
time_interval,
page_number=page_number + 1,
page_size=page_size,
total=total
)
return result
def _get_request_headers(self):
"""
获取请求头
:return:
"""
app_id = self.env["ir.config_parameter"].get_param("fscut.app_id")
app_secret = self.env["ir.config_parameter"].get_param("fscut.app_secret")
helper = generator.OpenApiHeaderHelper(app_id, app_secret)
map_header = helper.gen_map()
return {
"Content-Type": "application/json",
"app-id": map_header.get("app-id"),
"time-stamp": str(map_header.get("time-stamp")),
"app-sign": map_header.get("app-sign")
}
def _get_work_log_vals(self, work_log, work_center_id, write=False):
"""
创建加加工记录
:return:
"""
vals = work_log.copy()
vals.pop("parts")
parts = work_log.get("parts", [])
part_vals = [] if not write else [(6, 0, [])]
for part in parts:
part_vals.append((0, 0, part))
vals.update({
"endState": str(work_log.get("endState")),
"part_ids": part_vals,
"work_center_id": work_center_id
})
return vals
def get_work_logs(self, start_time=None, end_time=None, time_interval=10):
"""
获取机床加工记录
:return:
"""
if not self:
records = self.search([("card_id", "!=", False)])
else:
records = self.filtered(lambda w: w.cardId)
WorkLog = self.sudo().env["roke.work.log"]
headers = self._get_request_headers()
for record in records:
work_logs = self._request_work_logs(record.card_id, headers, start_time, end_time, time_interval)
for work_log in work_logs:
workUuid = work_log.get("workUuid")
work_log_rec = WorkLog.search([("workUuid", "=", workUuid), ("work_center_id", "=", record.id)])
if work_log_rec:
work_log_rec.write(self._get_work_log_vals(work_log, record.id, write=True))
else:
WorkLog.create(self._get_work_log_vals(work_log, record.id))
time.sleep(1)
def _request_user_devices(self, headers):
"""
请求车床列表接口
:return:
"""
url = "https://mcs-gateway.fscut.com/api/user_devices"
payload = json.dumps({})
response = requests.request("POST", url, headers=headers, data=payload)
response_dict = json.loads(response.text)
result = response_dict.get("data")
return result
def _get_cardIdDevices(self, headers, cardIdDevices):
"""
单独执行时获取请求头和请求设备
:return:
"""
if not cardIdDevices:
cardIdDevices = {}
existing_devices = self.search([("card_id", "!=", False)])
for existing_device in existing_devices:
cardIdDevices[existing_device.id] = existing_device
if not headers:
headers = self._get_request_headers()
return headers, cardIdDevices
def get_devices_state(self, headers=None, cardIdDevices=None):
"""
获取设备状态
:return:
"""
headers, cardIdDevices = self._get_cardIdDevices(headers, cardIdDevices)
card_ids = list(cardIdDevices.keys())
url = "https://mcs-gateway.fscut.com/api/user_devices/current_state"
payload = json.dumps({"cardIds": card_ids})
response = requests.request("POST", url, headers=headers, data=payload)
response_dict = json.loads(response.text)
if response_dict.get("status") != 0:
_logger.error("获取设备状态异常")
_logger.error(response_dict)
return
result = response_dict.get("data")
for device_state in result:
cardId = device_state.get("cardId")
deviceState = device_state.get("deviceState")
cardIdDevices.get(cardId).write({"deviceState": deviceState})
time.sleep(1)
def get_cut_system_state(self, headers=None, cardIdDevices=None):
"""
获取机床切割系统的实时状态
:return:
"""
headers, cardIdDevices = self._get_cardIdDevices(headers, cardIdDevices)
for cardId, device in cardIdDevices.items():
url = "https://mcs-gateway.fscut.com/api/user_devices/cut_system_state"
payload = json.dumps({"cardId": cardId})
response = requests.request("POST", url, headers=headers, data=payload)
response_dict = json.loads(response.text)
if response_dict.get("status") != 0:
_logger.error("获取机床切割系统的实时状态异常")
_logger.error(response_dict)
time.sleep(1)
continue
result = response_dict.get("data")
device.write(result)
time.sleep(1)
def get_current_work(self, headers=None, cardIdDevices=None):
"""
获取机床加工中的任务
:return:
"""
headers, cardIdDevices = self._get_cardIdDevices(headers, cardIdDevices)
for cardId, device in cardIdDevices.items():
url = "https://mcs-gateway.fscut.com/api/user_devices/current_work"
payload = json.dumps({"cardId": cardId})
response = requests.request("POST", url, headers=headers, data=payload)
response_dict = json.loads(response.text)
if response_dict.get("status") != 0:
_logger.error("获取机床加工中的任务异常")
_logger.error(response_dict)
time.sleep(1)
continue
result = response_dict.get("data")
if result.get("startTime"): # 修改开始时间
result.update({
"startTime": datetime.datetime.strptime(result.get("startTime"), "%Y-%m-%d %H:%M:%S") - datetime.timedelta(hours=8)
})
device.write(result)
time.sleep(1)
def get_user_devices(self):
"""
获取车床列表
:return:
"""
headers = self._get_request_headers()
user_devices = self._request_user_devices(headers)
existing_devices = self.search([("card_id", "!=", False)])
cardIdDevices = {}
for existing_device in existing_devices:
cardIdDevices[existing_device.card_id] = existing_device
for user_device in user_devices:
cardId = user_device.get("cardId")
if cardId in cardIdDevices:
continue
new_device = self.create({
"code": cardId,
"name": user_device.get("nickname"),
"app_name": user_device.get("appName"),
"app_ver": user_device.get("appVer"),
"card_id": cardId
})
cardIdDevices[new_device.card_id] = new_device
self.flush()
_logger.info("获取机床列表完毕")
# 获取机床状态
self.get_devices_state(headers=headers, cardIdDevices=cardIdDevices)
self.flush()
_logger.info("获取机床状态完毕")
# 获取机床切割系统的实时状态
self.get_cut_system_state(headers=headers, cardIdDevices=cardIdDevices)
self.flush()
_logger.info("获取机床切割系统的实时状态完毕")
# 获取机床加工中的任务
self.get_current_work(headers=headers, cardIdDevices=cardIdDevices)
self.flush()
_logger.info("获取机床加工中的任务完毕")
def upload_task(self, task, attachment):
"""
上传任务
:return:
"""
headers = self._get_request_headers()
headers.pop("Content-Type")
url = "https://mcs-gateway.fscut.com/upload/api/device_tasks/upload/cut"
payload = {
"cardId": task.work_center_id.card_id,
"taskName": task.taskName,
"taskAmount": 1
}
binary_data = base64.b64decode(attachment.datas)
file_like_object = io.BytesIO(binary_data)
filename = attachment.name
files = [('file', (filename, file_like_object, 'application/octet-stream'))]
try:
response = requests.request("POST", url, headers=headers, data=payload, files=files)
response_dict = json.loads(response.text)
UploadMsg = response_dict.get("msg")
TaskUUID = response_dict.get("data") or ""
_logger.info(f"任务上传成功:{task.taskName}")
except Exception as e:
UploadMsg = e
TaskUUID = ""
_logger.error("上传任务失败")
_logger.error(e)
task.write({"UploadMsg": UploadMsg, "TaskUUID": TaskUUID})
# -*- 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