Compare commits
3 Commits
feature/优化
...
feature/产品
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7e6be7925 | ||
|
|
fbf86a69e3 | ||
|
|
f3ec784383 |
@@ -10,9 +10,9 @@
|
||||
""",
|
||||
'category': 'sf',
|
||||
'website': 'https://www.sf.jikimo.com',
|
||||
'depends': ['web', 'purchase', 'base_setup'],
|
||||
'depends': ['web', 'purchase'],
|
||||
'data': [
|
||||
'views/bye_odoo.xml',
|
||||
|
||||
],
|
||||
'demo': [
|
||||
],
|
||||
@@ -23,8 +23,6 @@
|
||||
'web.assets_backend': [
|
||||
'jikimo_frontend/static/src/fields/custom_many2many_checkboxes/*',
|
||||
'jikimo_frontend/static/src/fields/Many2OneRadioField/*',
|
||||
# 移除odoo相关标识
|
||||
'jikimo_frontend/static/src/bye_odoo/*',
|
||||
'jikimo_frontend/static/src/scss/custom_style.scss',
|
||||
# 'jikimo_frontend/static/src/views/list_nums/list_nbCols.js',
|
||||
'jikimo_frontend/static/src/views/list_nums/list_nums.xml',
|
||||
@@ -38,7 +36,7 @@
|
||||
# 'jikimo_frontend/static/src/list/custom_import.js',
|
||||
# 'jikimo_frontend/static/src/list/custom_width.js',
|
||||
'jikimo_frontend/static/src/views/list_nums/extent_purchase.xml',
|
||||
'jikimo_frontend/static/src/css/list_border_styles.css',
|
||||
# 'jikimo_frontend/static/src/css/list_border_styles.css',
|
||||
|
||||
],
|
||||
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="partner_demo_company" model="res.partner">
|
||||
<field name="name">JKM</field>
|
||||
<field name="street">B-25</field>
|
||||
<field name="city">USA</field>
|
||||
<!-- Use the correct reference or actual ID for the country -->
|
||||
<field name="country_id" ref="base.bd"/>
|
||||
<field name="zip">1229</field>
|
||||
<field name="phone">+8801-712901764</field>
|
||||
<field name="email">info@kolpolok.com</field>
|
||||
<field name="website">www.kolpoloktechnologies.com</field>
|
||||
</record>
|
||||
|
||||
<record id="demo_company" model="res.company">
|
||||
<field name="name">Custom</field>
|
||||
<field name="logo" type="base64" file="kolpolok_custom_title_and_favicon/static/src/img/favicon.ico"/>
|
||||
<field name="favicon" type="base64" file="kolpolok_custom_title_and_favicon/static/src/img/favicon.ico"/>
|
||||
<field name="partner_id" ref="partner_demo_company"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,16 +0,0 @@
|
||||
/** @odoo-module **/
|
||||
import { UserMenu } from "@web/webclient/user_menu/user_menu";
|
||||
import { patch } from "@web/core/utils/patch";
|
||||
import { registry } from "@web/core/registry";
|
||||
const userMenuRegistry = registry.category("user_menuitems");
|
||||
|
||||
|
||||
patch(UserMenu.prototype, "legion_hide_odoo.UserMenu", {
|
||||
setup() {
|
||||
this._super.apply(this, arguments);
|
||||
userMenuRegistry.remove("documentation");
|
||||
userMenuRegistry.remove("support");
|
||||
userMenuRegistry.remove("odoo_account");
|
||||
},
|
||||
|
||||
});
|
||||
@@ -1,11 +0,0 @@
|
||||
/** @odoo-module **/
|
||||
|
||||
import { WebClient } from "@web/webclient/webclient";
|
||||
import { patch } from "web.utils";
|
||||
|
||||
patch(WebClient.prototype, "kolpolok_custom_title_and_favicon.WebClient", {
|
||||
setup() {
|
||||
this._super();
|
||||
this.title.setParts({ zopenerp: "JIKIMO" });
|
||||
},
|
||||
});
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.9 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -4,207 +4,59 @@ import {patch} from '@web/core/utils/patch';
|
||||
// import { Dialog } from "@web/core/dialog/dialog";
|
||||
import {_t} from "@web/core/l10n/translation";
|
||||
import {FormStatusIndicator} from "@web/views/form/form_status_indicator/form_status_indicator";
|
||||
import {ListRenderer} from "@web/views/list/list_renderer";
|
||||
|
||||
import {Field} from "@web/views/fields/field";
|
||||
|
||||
var Dialog = require('web.Dialog');
|
||||
// var {patch} = require("web.utils") 这句话也行
|
||||
const filedRequiredList = {
|
||||
// 设备大模块
|
||||
'control_system_id': { multiple: false, noLabel: false },
|
||||
'workbench_L': { multiple: true, noLabel: false },
|
||||
'number_of_axles': { multiple: true, noLabel: false },
|
||||
'x_axis': { multiple: true, noLabel: false },
|
||||
'number_of_knife_library': { multiple: false, noLabel: false },
|
||||
'brand_id': { multiple: false, noLabel: false },
|
||||
'type_id': { multiple: false, noLabel: false },
|
||||
'taper_type_id': { multiple: false, noLabel: false },
|
||||
'eq_maintenance_id': { multiple: false, noLabel: false },
|
||||
'overhaul_id': { multiple: false, noLabel: false },
|
||||
'overhaul_period': { multiple: false, noLabel: false },
|
||||
'maintenance_equipment_category_id': { multiple: false, noLabel: false },
|
||||
'maintenance_type': { multiple: false, noLabel: false },
|
||||
|
||||
// 销售大模块
|
||||
'partner_id': { multiple: false, noLabel: false },
|
||||
'validity_date': { multiple: false, noLabel: false },
|
||||
'vat': { multiple: false, noLabel: false },
|
||||
'phone': { multiple: false, noLabel: false },
|
||||
'mobile': { multiple: false, noLabel: false },
|
||||
'email': { multiple: false, noLabel: false },
|
||||
'category_id': { multiple: false, noLabel: false },
|
||||
'radio_field_1_person': { multiple: false, noLabel: true },
|
||||
|
||||
// 采购大模块
|
||||
'date_order': { multiple: false, noLabel: false },
|
||||
'picking_type_id': { multiple: false, noLabel: false },
|
||||
|
||||
// 制造大模块
|
||||
'production_line_id': { multiple: false, noLabel: false },
|
||||
'date_approve': { multiple: false, noLabel: false },
|
||||
'date_planned_start': { multiple: false, noLabel: false },
|
||||
'date_planned_finished': { multiple: false, noLabel: false },
|
||||
}
|
||||
const tableRequiredList = [
|
||||
'product_template_id', 'product_uom_qty', 'price_unit','product_id','product_qty',
|
||||
'name', 'fault_type', 'maintenance_standards', 'Period'
|
||||
]
|
||||
|
||||
patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
|
||||
// 你可以重写或者添加一些方法和属性
|
||||
async _onDiscardChanges() {
|
||||
// var self = this;
|
||||
Dialog.confirm(this, _t("Are you sure you want to discard changes?"), {
|
||||
title: _t("Discard Changes"),
|
||||
// 你可以重写或者添加一些方法和属性
|
||||
async _onDiscardChanges() {
|
||||
// var self = this;
|
||||
Dialog.confirm(this, _t("Are you sure you want to discard changes?"), {
|
||||
title: _t("Discard Changes"),
|
||||
|
||||
// confirm_callback: function () {
|
||||
// self.model.discardChanges(self.handle);
|
||||
// },
|
||||
});
|
||||
},
|
||||
// confirm_callback: function () {
|
||||
// self.model.discardChanges(self.handle);
|
||||
// },
|
||||
});
|
||||
},
|
||||
|
||||
async discard() {
|
||||
// if (window.confirm("Are you sure you want to discard changes?")) {
|
||||
// await this.props.discard();
|
||||
// }
|
||||
// const result = await this._confirmDiscardChange();
|
||||
await this._confirmDiscardChange();
|
||||
await this.props.discard();
|
||||
},
|
||||
async discard() {
|
||||
// if (window.confirm("Are you sure you want to discard changes?")) {
|
||||
// await this.props.discard();
|
||||
// }
|
||||
// const result = await this._confirmDiscardChange();
|
||||
await this._confirmDiscardChange();
|
||||
await this.props.discard();
|
||||
},
|
||||
|
||||
_confirmDiscardChange() {
|
||||
var self = this;
|
||||
var def = new Promise(function (resolve, reject) {
|
||||
var message = _t("请确认是否要舍弃之前的更改?");
|
||||
var dialog = Dialog.confirm(self, message, {
|
||||
title: _t("Warning"),
|
||||
confirm_callback: resolve.bind(self, true),
|
||||
cancel_callback: reject,
|
||||
});
|
||||
dialog.on('closed', self, reject);
|
||||
});
|
||||
return def;
|
||||
},
|
||||
_confirmDiscardChange(){
|
||||
var self = this;
|
||||
var def = new Promise(function (resolve, reject) {
|
||||
var message = _t("请确认是否要舍弃之前的更改?");
|
||||
var dialog = Dialog.confirm(self, message, {
|
||||
title: _t("Warning"),
|
||||
confirm_callback: resolve.bind(self, true),
|
||||
cancel_callback: reject,
|
||||
});
|
||||
dialog.on('closed', self, reject);
|
||||
});
|
||||
return def;
|
||||
},
|
||||
|
||||
}
|
||||
}
|
||||
);
|
||||
patch(Field.prototype, 'jikimo_frontend.Field', {
|
||||
setup() {
|
||||
owl.onMounted(this.setRequired);
|
||||
return this._super(...arguments);
|
||||
},
|
||||
setRequired() {
|
||||
const id = this.props.id
|
||||
const isRequired = filedRequiredList[id]
|
||||
if(id == 'number_of_axles') {
|
||||
console.log(isRequired)
|
||||
}
|
||||
if(isRequired) {
|
||||
let dom;
|
||||
dom = $(`label[for=${id}]`)
|
||||
if(isRequired.multiple && dom.length > 1) {
|
||||
dom = dom.eq(-1)
|
||||
dom = dom.parent().parent().next().find('label')
|
||||
}
|
||||
if(isRequired.noLabel) {
|
||||
dom = dom.parent().parent()
|
||||
}
|
||||
let t = dom.html()
|
||||
t = '<i class="c* r" style="color: red;margin-left: -4px">*</i>' + t
|
||||
dom.html(t)
|
||||
}
|
||||
}
|
||||
})
|
||||
patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
|
||||
setup(){
|
||||
owl.onMounted(() => {
|
||||
this.activeElement = this.uiService.activeElement;
|
||||
this.setRequired()
|
||||
})
|
||||
return this._super(...arguments);
|
||||
},
|
||||
setRequired() {
|
||||
this.allColumns.forEach(_ => {
|
||||
if( tableRequiredList.indexOf(_.name) >= 0 ) {
|
||||
const dom = $(`th[data-name=${_.name}]`)
|
||||
dom.addClass('addRequired')
|
||||
}
|
||||
})
|
||||
try {
|
||||
const dom = this.tableRef.el
|
||||
if(dom ) {
|
||||
const tfoot = $(dom).children('tfoot')
|
||||
const tbooy = $(dom).children('tbody')
|
||||
if(tfoot.length) {
|
||||
const tfoot_tr = tfoot.children().eq(0)
|
||||
const tbody_tr = tbooy.children().eq(0)
|
||||
if(tfoot_tr.children().length < tbody_tr.children().length) {
|
||||
tfoot_tr.prepend('<td class="prepend">')
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
$(function () {
|
||||
$(function (){
|
||||
document.addEventListener('click', function () {
|
||||
const dom = $('.o_form_status_indicator_buttons ')
|
||||
if (dom) {
|
||||
if(dom) {
|
||||
const dom1 = dom.children().eq(0)
|
||||
const dom2 = dom.children().eq(1)
|
||||
if (!dom1.text()) {
|
||||
if(!dom1.text()) {
|
||||
dom1.append('保存')
|
||||
dom2.append('取消')
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
function customRequired() {
|
||||
let timer = null
|
||||
let timer_count = 0
|
||||
clearInterval(timer)
|
||||
timer = setInterval(() => {
|
||||
timer_count++
|
||||
const dom = $('.custom_required')
|
||||
let tableDom = $('.table_custom_required')
|
||||
if (tableDom.length) {
|
||||
tableDom = tableDom.eq(0).parents('tr').children('.table_custom_required')
|
||||
tableDom.each(function () {
|
||||
const i = $(this).index()
|
||||
const requiredDom = $(this).parents('table').find('thead').find('th').eq(i).find('span').eq(0)
|
||||
const t = requiredDom.text().replace('*', '')
|
||||
requiredDom.html('<i style="color: red;margin-left: -4px">*</i>' + t)
|
||||
})
|
||||
clearInterval(timer)
|
||||
}
|
||||
if (dom.length) {
|
||||
dom.each(function () {
|
||||
const requiredDom = $(this).parent().prev().find('label')
|
||||
let t = requiredDom.html()
|
||||
if (t && t.indexOf('c*') < 0) {
|
||||
t = '<i class="c*" style="color: red;margin-left: -4px">*</i>' + t
|
||||
}
|
||||
requiredDom.html(t)
|
||||
})
|
||||
clearInterval(timer)
|
||||
}
|
||||
if (timer_count == 20) {
|
||||
clearInterval(timer)
|
||||
}
|
||||
}, 500)
|
||||
}
|
||||
|
||||
var currentUrl = location.href
|
||||
const listenerUrl = setInterval(() => {
|
||||
const isChange = currentUrl != location.href
|
||||
if (isChange) {
|
||||
currentUrl = location.href
|
||||
customRequired()
|
||||
}
|
||||
}, 500)
|
||||
customRequired()
|
||||
})
|
||||
|
||||
@@ -3,15 +3,6 @@
|
||||
import { registry } from "@web/core/registry";
|
||||
import { url } from "@web/core/utils/urls";
|
||||
import { ImageField, imageCacheKey } from '@web/views/fields/image/image_field';
|
||||
import { isBinarySize } from "@web/core/utils/binary";
|
||||
export const fileTypeMagicWordMap = {
|
||||
"/": "jpg",
|
||||
R: "gif",
|
||||
i: "png",
|
||||
P: "svg+xml",
|
||||
};
|
||||
|
||||
const placeholder = "/web/static/img/placeholder.png";
|
||||
|
||||
export class CustomImageField extends ImageField {
|
||||
setup() {
|
||||
@@ -22,7 +13,7 @@ export class CustomImageField extends ImageField {
|
||||
getUrl(previewFieldName) {
|
||||
console.log('8888888888886666666666666666666')
|
||||
if (this.state.isValid && this.props.value) {
|
||||
if (isBinarySize(this.props.value) || this.props.value.length < 50) {
|
||||
if (1) {
|
||||
if (!this.rawCacheKey) {
|
||||
this.rawCacheKey = this.props.record.data.__last_update;
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ div:has(.o_required_modifier) > label::before {
|
||||
color: red !important;
|
||||
padding: 0 4px !important;
|
||||
vertical-align: top !important;
|
||||
font-size: unset !important;
|
||||
font-size: 1.5rem !important;
|
||||
}
|
||||
|
||||
.my-image div {
|
||||
@@ -325,7 +325,7 @@ div[class="o_content o_component_with_search_panel"] .show_state span {
|
||||
|
||||
div:has(.o_required_modifier) > label::before {
|
||||
position: absolute;
|
||||
left: 24px;
|
||||
left: -3px;
|
||||
}
|
||||
|
||||
//.o_form_view .o_form_label {
|
||||
@@ -449,46 +449,4 @@ div:has(.o_required_modifier) > label::before {
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// 更改表格底部按钮样式
|
||||
.o_list_renderer .o_field_x2many_list_row_add a,.treeHeaderBtn,.o_x2m_control_panel .o_cp_buttons .btn{
|
||||
display: inline-block;
|
||||
margin: 5px 0;
|
||||
font-size: 14px;
|
||||
color: #71639e;
|
||||
border: 1px solid #71639e;
|
||||
padding: 0.2rem 0.6rem;
|
||||
font-size: 1.08333333rem;
|
||||
border-radius: 0.25rem;
|
||||
transition: all .3s;
|
||||
}
|
||||
.o_list_renderer .o_field_x2many_list_row_add a:hover,.treeHeaderBtn:hover,.o_x2m_control_panel .o_cp_buttons .btn:hover{
|
||||
background: #71639e;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
// 修改时间输入框宽度
|
||||
.o_datepicker_input.o_input.datetimepicker-input {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
|
||||
.o_form_view .o_form_editable .o_row > .o_field_widget, .o_form_view .o_form_editable .o_row > .o_field_widget.o_field_float_time {
|
||||
width: auto !important;
|
||||
flex: unset;
|
||||
}
|
||||
.addRequired {
|
||||
padding-left: calc(0.3rem + 2px)!important;
|
||||
}
|
||||
.addRequired:before {
|
||||
content: '*';
|
||||
color: red;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
.o_list_renderer .o_list_table tfoot .o_list_number {
|
||||
text-align: left;
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<!-- 修改页面头部图标及文字 -->
|
||||
<template id="favicon_icon" inherit_id="web.layout" name="Web layout">
|
||||
<!-- change the title with reliance partner -->
|
||||
<xpath expr="//head//title" position="before">
|
||||
<title t-esc="'JIKIMO'"/>
|
||||
</xpath>
|
||||
<!-- change the default favicon icon with -->
|
||||
<xpath expr="//head//link[@rel='shortcut icon']" position="replace">
|
||||
<link type="image/x-icon" rel="shortcut icon" href="/jikimo_frontend/static/src/img/jikimo-logo.ico"/>
|
||||
</xpath>
|
||||
</template>
|
||||
|
||||
<!-- hide 登录页面 powerd by odoo 及管理数据库 -->
|
||||
<template id="login_page_layout" inherit_id="web.login_layout" name="Login Page Layout">
|
||||
<xpath expr="//div[@class='card-body']//div[last()]" position="replace"></xpath>
|
||||
</template>
|
||||
|
||||
<!-- 隐藏odoo版本信息 -->
|
||||
<record id="jikimo_res_config_settings_view_form" model="ir.ui.view">
|
||||
<field name="name">jikimo.res.config.settings.view.form.inherit.base.setup</field>
|
||||
<field name="model">res.config.settings</field>
|
||||
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@id='about']" position="replace">
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -263,8 +263,6 @@ class QualityCheck(models.Model):
|
||||
picture = fields.Binary('Picture', attachment=True)
|
||||
additional_note = fields.Text(
|
||||
'Additional Note', help="Additional remarks concerning this check.")
|
||||
report_result = fields.Char('检测结果', readonly=True)
|
||||
report_pdf = fields.Binary('检测报告', readonly=True)
|
||||
|
||||
def _compute_alert_count(self):
|
||||
alert_data = self.env['quality.alert'].read_group([('check_id', 'in', self.ids)], ['check_id'], ['check_id'])
|
||||
@@ -410,5 +408,3 @@ class QualityAlert(models.Model):
|
||||
domain = [('team_ids', '=', False)]
|
||||
stage_ids = stages._search(domain, order=order, access_rights_uid=SUPERUSER_ID)
|
||||
return stages.browse(stage_ids)
|
||||
|
||||
|
||||
|
||||
@@ -9,10 +9,8 @@ access_quality_point_user,quality.point,quality.model_quality_point,quality.grou
|
||||
access_quality_point_test_type_user,quality.point.test_type,quality.model_quality_point_test_type,quality.group_quality_user,1,0,0,0
|
||||
access_quality_check_stock_user,quality.check,quality.model_quality_check,stock.group_stock_user,1,1,1,0
|
||||
access_stock_lot_user,stock.lot,stock.model_stock_lot,quality.group_quality_user,1,0,0,0
|
||||
|
||||
access_stock_pack_user,stock.move.line,stock.model_stock_move_line,quality.group_quality_user,1,0,0,0
|
||||
access_stock_picking_group_quality_user,stock_picking_group_quality_user,stock.model_stock_picking,quality.group_quality_user,1,0,0,0
|
||||
|
||||
access_stock_picking,stock.move.line,stock.model_stock_picking,quality.group_quality_user,1,0,0,0
|
||||
access_quality_alert_team_manager,quality.alert.team,quality.model_quality_alert_team,quality.group_quality_manager,1,1,1,1
|
||||
access_quality_check_manager,quality.check,quality.model_quality_check,quality.group_quality_manager,1,1,1,1
|
||||
access_quality_alert_manager,quality.alert,quality.model_quality_alert,quality.group_quality_manager,1,1,1,1
|
||||
|
||||
|
@@ -32,9 +32,7 @@
|
||||
<field name="tag_ids"/>
|
||||
</div>
|
||||
<div>
|
||||
<strong>
|
||||
<field name="product_tmpl_id"/>
|
||||
</strong>
|
||||
<strong><field name="product_tmpl_id"/></strong>
|
||||
</div>
|
||||
<div>
|
||||
<field name="display_name"/>
|
||||
@@ -67,28 +65,20 @@
|
||||
<field name="company_id" invisible="1"/>
|
||||
<field name="product_id" invisible="1"/>
|
||||
<div class="oe_button_box">
|
||||
<button name="action_see_check" type="object" attrs="{'invisible': [('check_id', '=', False)]}"
|
||||
class="oe_stat_button" icon="fa-check-square-o">
|
||||
<button name="action_see_check" type="object" attrs="{'invisible': [('check_id', '=', False)]}" class="oe_stat_button" icon="fa-check-square-o">
|
||||
<div class="o_field_widget o_stat_info">
|
||||
<span class="o_stat_value">
|
||||
<field name="check_id" readonly="1"/>
|
||||
</span>
|
||||
<span class="o_stat_value"><field name="check_id" readonly="1"/></span>
|
||||
<span class="o_stat_text">Quality Check</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
<div class="oe_title">
|
||||
<h1>
|
||||
<field name="name" readonly="1"/>
|
||||
</h1>
|
||||
</div>
|
||||
<div class="oe_title"><h1><field name="name" readonly="1"/></h1></div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="title"/>
|
||||
<field name="product_tmpl_id"/>
|
||||
<field name="product_id" groups="product.group_product_variant"/>
|
||||
<field name="lot_id" context="{'default_product_id': product_id}"
|
||||
groups="stock.group_production_lot"/>
|
||||
<field name="lot_id" context="{'default_product_id': product_id}" groups="stock.group_production_lot"/>
|
||||
<field name="picking_id"/>
|
||||
</group>
|
||||
<group>
|
||||
@@ -154,25 +144,25 @@
|
||||
</record>
|
||||
|
||||
<record id="quality_alert_view_pivot" model="ir.ui.view">
|
||||
<field name="name">quality.alert.view.pivot</field>
|
||||
<field name="model">quality.alert</field>
|
||||
<field name="arch" type="xml">
|
||||
<pivot string="Quality Alert Analysis" sample="1">
|
||||
<field name="stage_id" type="col"/>
|
||||
<field name="team_id" type="row"/>
|
||||
</pivot>
|
||||
</field>
|
||||
<field name="name">quality.alert.view.pivot</field>
|
||||
<field name="model">quality.alert</field>
|
||||
<field name="arch" type="xml">
|
||||
<pivot string="Quality Alert Analysis" sample="1">
|
||||
<field name="stage_id" type="col"/>
|
||||
<field name="team_id" type="row"/>
|
||||
</pivot>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="quality_alert_view_graph" model="ir.ui.view">
|
||||
<field name="name">quality.alert.view.graph</field>
|
||||
<field name="model">quality.alert</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Quality Alert Analysis" sample="1">
|
||||
<field name="reason_id"/>
|
||||
<field name="stage_id"/>
|
||||
</graph>
|
||||
</field>
|
||||
<field name="name">quality.alert.view.graph</field>
|
||||
<field name="model">quality.alert</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Quality Alert Analysis" sample="1">
|
||||
<field name="reason_id"/>
|
||||
<field name="stage_id"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="quality_alert_view_calendar" model="ir.ui.view">
|
||||
@@ -196,8 +186,7 @@
|
||||
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
|
||||
<field name="domain">[('team_id', '=', active_id)]</field>
|
||||
<field name="context">{'default_team_id': active_id,
|
||||
'search_default_team_id': [active_id]}
|
||||
</field>
|
||||
'search_default_team_id': [active_id]}</field>
|
||||
</record>
|
||||
|
||||
<record id="quality_alert_action_check" model="ir.actions.act_window">
|
||||
@@ -206,7 +195,7 @@
|
||||
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create a new quality alert
|
||||
Create a new quality alert
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
@@ -223,35 +212,24 @@
|
||||
</record>
|
||||
|
||||
<!-- QUALITY.CHECK -->
|
||||
<record id="quality_check_view_form" model="ir.ui.view">
|
||||
<record id="quality_check_view_form" model="ir.ui.view">
|
||||
<field name="name">quality.check.view.form</field>
|
||||
<field name="model">quality.check</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<header>
|
||||
<button name="do_pass" type="object" class="btn-primary"
|
||||
attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Pass" data-hotkey="q"/>
|
||||
<button name="do_pass" type="object" attrs="{'invisible': [('quality_state', '!=', 'fail')]}"
|
||||
groups="quality.group_quality_manager" string="Pass" data-hotkey="q"/>
|
||||
<button name="do_fail" type="object" class="btn-primary"
|
||||
attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Fail" data-hotkey="w"/>
|
||||
<button name="do_fail" type="object" attrs="{'invisible': [('quality_state', '!=', 'pass')]}"
|
||||
groups="quality.group_quality_manager" string="Fail" data-hotkey="w"/>
|
||||
<button name="do_measure" type="object"
|
||||
attrs="{'invisible': ['|', ('test_type', '!=', 'measure'), ('quality_state', '!=', 'none')]}"
|
||||
string="Measure" data-hotkey="v"/>
|
||||
<button name="do_alert" type="object"
|
||||
attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'pass')]}"
|
||||
string="Create Alert" data-hotkey="g"/>
|
||||
<button name="do_alert" type="object" class="btn-primary"
|
||||
attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'fail')]}"
|
||||
string="Create Alert" data-hotkey="g"/>
|
||||
<button name="do_pass" type="object" class="btn-primary" attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Pass" data-hotkey="q"/>
|
||||
<button name="do_pass" type="object" attrs="{'invisible': [('quality_state', '!=', 'fail')]}" groups="quality.group_quality_manager" string="Pass" data-hotkey="q"/>
|
||||
<button name="do_fail" type="object" class="btn-primary" attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Fail" data-hotkey="w"/>
|
||||
<button name="do_fail" type="object" attrs="{'invisible': [('quality_state', '!=', 'pass')]}" groups="quality.group_quality_manager" string="Fail" data-hotkey="w"/>
|
||||
<button name="do_measure" type="object" attrs="{'invisible': ['|', ('test_type', '!=', 'measure'), ('quality_state', '!=', 'none')]}" string="Measure" data-hotkey="v"/>
|
||||
<button name="do_alert" type="object" attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'pass')]}" string="Create Alert" data-hotkey="g"/>
|
||||
<button name="do_alert" type="object" class="btn-primary" attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'fail')]}" string="Create Alert" data-hotkey="g"/>
|
||||
<field name="quality_state" widget="statusbar"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="action_see_alerts" icon="fa-bell" type="object" class="oe_stat_button"
|
||||
attrs="{'invisible': [('alert_count', '=', 0)]}">
|
||||
<button name="action_see_alerts" icon="fa-bell" type="object" class="oe_stat_button" attrs="{'invisible': [('alert_count', '=', 0)]}">
|
||||
<field name="alert_count" string="Alerts" widget="statinfo"/>
|
||||
</button>
|
||||
</div>
|
||||
@@ -264,27 +242,21 @@
|
||||
<field name="move_line_id" invisible="1"/>
|
||||
<field name="product_tracking" invisible="1"/>
|
||||
<field name="is_lot_tested_fractionally" invisible="1"/>
|
||||
<field name="lot_name"
|
||||
attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', False), '|', ('measure_on', '!=', 'move_line'), ('move_line_id', '=', False)]}"/>
|
||||
<field name="lot_id"
|
||||
attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', True), ('measure_on', '!=', 'move_line')]}"/>
|
||||
<field name="lot_name" attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', False), '|', ('measure_on', '!=', 'move_line'), ('move_line_id', '=', False)]}"/>
|
||||
<field name="lot_id" attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', True), ('measure_on', '!=', 'move_line')]}"/>
|
||||
<label for="qty_line" attrs="{'invisible': [('move_line_id', '=', False)]}"/>
|
||||
<div class="o_row" attrs="{'invisible': [('move_line_id', '=', False)]}">
|
||||
<field name="qty_line"/>
|
||||
<field name="qty_line"/>
|
||||
<field name="uom_id"/>
|
||||
</div>
|
||||
<label for="qty_to_test"
|
||||
attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
|
||||
<div class="o_row"
|
||||
attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
|
||||
<field name="qty_to_test"/>
|
||||
<label for="qty_to_test" attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
|
||||
<div class="o_row" attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
|
||||
<field name="qty_to_test"/>
|
||||
<field name="uom_id"/>
|
||||
</div>
|
||||
<label for="qty_tested"
|
||||
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
|
||||
<div class="o_row"
|
||||
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
|
||||
<field name="qty_tested" attrs="{'readonly': [('quality_state', '!=', 'none')]}"/>
|
||||
<label for="qty_tested" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
|
||||
<div class="o_row" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
|
||||
<field name="qty_tested" attrs="{'readonly': [('quality_state', '!=', 'none')]}"/>
|
||||
<field name="uom_id"/>
|
||||
</div>
|
||||
<field name="test_type" invisible="1"/>
|
||||
@@ -292,32 +264,26 @@
|
||||
<field name="alert_ids" invisible="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="picking_id"
|
||||
attrs="{'invisible': [('quality_state', 'in', ('pass', 'fail')), ('picking_id', '=', False)]}"/>
|
||||
<field name="picking_id" attrs="{'invisible': [('quality_state', 'in', ('pass', 'fail')), ('picking_id', '=', False)]}"/>
|
||||
<field name="point_id"/>
|
||||
<field string="Type" name="test_type_id" options="{'no_open': True, 'no_create': True}"
|
||||
attrs="{'readonly': [('point_id', '!=', False)]}"/>
|
||||
<field string="Type" name="test_type_id" options="{'no_open': True, 'no_create': True}" attrs="{'readonly': [('point_id', '!=', False)]}"/>
|
||||
<field name="control_date" invisible="1"/>
|
||||
<field name="team_id"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="user_id" string="Control Person" invisible="1"/>
|
||||
<field name="partner_id" string="Partner"
|
||||
attrs="{'invisible': [('partner_id', '=', False)]}"/>
|
||||
<field name="partner_id" string="Partner" attrs="{'invisible': [('partner_id', '=', False)]}"/>
|
||||
</group>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('test_type', '!=', 'picture')]}">
|
||||
<field name="picture" widget="image"/>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Notes" name="notes">
|
||||
<group>
|
||||
<field name="report_result"/>
|
||||
<field name="report_pdf" widget="pdf_viewer"/>
|
||||
<field string="Instructions" name="note"/>
|
||||
<field string="Notes" name="additional_note"/>
|
||||
|
||||
</group>
|
||||
</page>
|
||||
<notebook>
|
||||
<page string="Notes" name="notes">
|
||||
<group>
|
||||
<field string="Instructions" name="note"/>
|
||||
<field string="Notes" name="additional_note"/>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
@@ -345,30 +311,18 @@
|
||||
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<strong>
|
||||
<span>
|
||||
<t t-esc="record.name.value"/>
|
||||
</span>
|
||||
</strong>
|
||||
<strong><span><t t-esc="record.name.value"/></span></strong>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<strong>
|
||||
<span t-attf-class="float-end text-end badge #{['none'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-secondary' : ['fail'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-danger' : ['done'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-primary' : 'text-bg-success'}">
|
||||
<t t-esc="record.quality_state.value"/>
|
||||
</span>
|
||||
</strong>
|
||||
<strong><span t-attf-class="float-end text-end badge #{['none'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-secondary' : ['fail'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-danger' : ['done'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-primary' : 'text-bg-success'}"><t t-esc="record.quality_state.value"/></span></strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row text-muted">
|
||||
<div class="col-8">
|
||||
<span>
|
||||
<t t-esc="record.product_id.value"/>
|
||||
</span>
|
||||
<span><t t-esc="record.product_id.value"/></span>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<span>
|
||||
<t t-esc="record.lot_id.value"/>
|
||||
</span>
|
||||
<span><t t-esc="record.lot_id.value"/></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oe_kanban_bottom_right float-end">
|
||||
@@ -396,8 +350,7 @@
|
||||
<field name="user_id" string="Checked By" optional="show" widget='many2one_avatar_user'/>
|
||||
<field name="point_id" optional="hide"/>
|
||||
<field name="team_id" optional="show"/>
|
||||
<field name="quality_state" optional="show" widget='badge' decoration-success="quality_state == 'pass'"
|
||||
decoration-info="quality_state == 'none'" decoration-danger="quality_state == 'fail'"/>
|
||||
<field name="quality_state" optional="show" widget='badge' decoration-success="quality_state == 'pass'" decoration-info="quality_state == 'none'" decoration-danger="quality_state == 'fail'"/>
|
||||
<field name="company_id" groups="base.main_company"/>
|
||||
</tree>
|
||||
</field>
|
||||
@@ -415,14 +368,14 @@
|
||||
</record>
|
||||
|
||||
<record id="quality_check_view_pivot" model="ir.ui.view">
|
||||
<field name="name">quality.check.view.pivot</field>
|
||||
<field name="model">quality.check</field>
|
||||
<field name="arch" type="xml">
|
||||
<pivot string="Quality Check Analysis" sample="1">
|
||||
<field name="control_date" type="col" interval="day"/>
|
||||
<field name="product_id" type="row"/>
|
||||
</pivot>
|
||||
</field>
|
||||
<field name="name">quality.check.view.pivot</field>
|
||||
<field name="model">quality.check</field>
|
||||
<field name="arch" type="xml">
|
||||
<pivot string="Quality Check Analysis" sample="1">
|
||||
<field name="control_date" type="col" interval="day"/>
|
||||
<field name="product_id" type="row"/>
|
||||
</pivot>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="quality_check_view_search" model="ir.ui.view">
|
||||
@@ -430,8 +383,7 @@
|
||||
<field name="model">quality.check</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<field name="product_id" string="Product"
|
||||
filter_domain="['|', ('product_id', 'ilike', self), ('lot_id', 'ilike', self)]"/>
|
||||
<field name="product_id" string="Product" filter_domain="['|', ('product_id', 'ilike', self), ('lot_id', 'ilike', self)]"/>
|
||||
<field name="picking_id"/>
|
||||
<field name="lot_id"/>
|
||||
<field name="team_id"/>
|
||||
@@ -474,11 +426,10 @@
|
||||
</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
No quality check found
|
||||
</p>
|
||||
<p>
|
||||
Define Quality Control Points in order to automatically generate
|
||||
quality checks at the right logistic operation: transfers, manufacturing orders.
|
||||
No quality check found
|
||||
</p><p>
|
||||
Define Quality Control Points in order to automatically generate
|
||||
quality checks at the right logistic operation: transfers, manufacturing orders.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
@@ -507,11 +458,10 @@
|
||||
<field name="view_mode">tree,kanban,form,pivot,graph</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
No quality check found
|
||||
</p>
|
||||
<p>
|
||||
Define Quality Control Points in order to automatically generate
|
||||
quality checks at the right logistic operation: transfers, manufacturing orders.
|
||||
No quality check found
|
||||
</p><p>
|
||||
Define Quality Control Points in order to automatically generate
|
||||
quality checks at the right logistic operation: transfers, manufacturing orders.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
@@ -535,25 +485,17 @@
|
||||
<field name="inherit_id" ref="stock.product_template_form_view_procurement_button"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="after">
|
||||
<button name="action_see_quality_control_points" type="object" class="oe_stat_button" icon="fa-list"
|
||||
attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}"
|
||||
groups="quality.group_quality_user">
|
||||
<button name="action_see_quality_control_points" type="object" class="oe_stat_button" icon="fa-list" attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}" groups="quality.group_quality_user">
|
||||
<field string="Quality Points" name="quality_control_point_qty" widget="statinfo"/>
|
||||
</button>
|
||||
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check"
|
||||
attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']), ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}"
|
||||
groups="quality.group_quality_user">
|
||||
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check" attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']), ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}" groups="quality.group_quality_user">
|
||||
<div class="o_field_widget o_stat_info mr4">
|
||||
<span class="o_stat_text">Pass:</span>
|
||||
<span class="o_stat_text">Fail:</span>
|
||||
</div>
|
||||
<div class="o_field_widget o_stat_info">
|
||||
<span class="o_stat_value">
|
||||
<field name="quality_pass_qty"/>
|
||||
</span>
|
||||
<span class="o_stat_value">
|
||||
<field name="quality_fail_qty"/>
|
||||
</span>
|
||||
<span class="o_stat_value"><field name="quality_pass_qty"/></span>
|
||||
<span class="o_stat_value"><field name="quality_fail_qty"/></span>
|
||||
</div>
|
||||
</button>
|
||||
</xpath>
|
||||
@@ -567,25 +509,17 @@
|
||||
<field name="inherit_id" ref="stock.product_form_view_procurement_button"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="after">
|
||||
<button name="action_see_quality_control_points" type="object" icon="fa-list" class="oe_stat_button"
|
||||
attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}"
|
||||
groups="quality.group_quality_user">
|
||||
<button name="action_see_quality_control_points" type="object" icon="fa-list" class="oe_stat_button" attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}" groups="quality.group_quality_user">
|
||||
<field string="Quality Points" name="quality_control_point_qty" widget="statinfo"/>
|
||||
</button>
|
||||
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check"
|
||||
groups="quality.group_quality_user"
|
||||
attrs="{'invisible':[ ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}">
|
||||
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check" groups="quality.group_quality_user" attrs="{'invisible':[ ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}" >
|
||||
<div class="o_field_widget o_stat_info mr4">
|
||||
<span class="o_stat_text">Pass:</span>
|
||||
<span class="o_stat_text">Fail:</span>
|
||||
</div>
|
||||
<div class="o_field_widget o_stat_info">
|
||||
<span class="o_stat_value">
|
||||
<field name="quality_pass_qty"/>
|
||||
</span>
|
||||
<span class="o_stat_value">
|
||||
<field name="quality_fail_qty"/>
|
||||
</span>
|
||||
<span class="o_stat_value"><field name="quality_pass_qty"/></span>
|
||||
<span class="o_stat_value"><field name="quality_fail_qty"/></span>
|
||||
</div>
|
||||
</button>
|
||||
</xpath>
|
||||
@@ -599,8 +533,8 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='button_box']" position="inside">
|
||||
<button name="%(quality_check_action_production_lot)d" type="action"
|
||||
attrs="{'invisible': [('quality_check_qty', '=', 0)]}"
|
||||
icon="fa-check" class="oe_stat_button" groups="quality.group_quality_user">
|
||||
attrs="{'invisible': [('quality_check_qty', '=', 0)]}"
|
||||
icon="fa-check" class="oe_stat_button" groups="quality.group_quality_user">
|
||||
<field string="Quality Checks" name="quality_check_qty" widget="statinfo"/>
|
||||
</button>
|
||||
</xpath>
|
||||
@@ -623,36 +557,24 @@
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="#{kanban_color(record.color.raw_value)}">
|
||||
<span class="oe_kanban_color_help"
|
||||
t-attf-title="In #{kanban_getcolorname(record.color.raw_value)}" role="img"
|
||||
t-attf-aria-label="In #{kanban_getcolorname(record.color.raw_value)}"/>
|
||||
<span class="oe_kanban_color_help" t-attf-title="In #{kanban_getcolorname(record.color.raw_value)}" role="img" t-attf-aria-label="In #{kanban_getcolorname(record.color.raw_value)}"/>
|
||||
<div t-attf-class="o_kanban_card_header">
|
||||
<div class="o_kanban_card_header_title">
|
||||
<div class="o_primary">
|
||||
<field name="name"/>
|
||||
</div>
|
||||
<div class="o_primary"><field name="name"/></div>
|
||||
<div t-if="record.alias_name.value and record.alias_domain.value">
|
||||
<small><i class="fa fa-envelope-o" role="img" aria-label="Domain alias"
|
||||
title="Domain alias"></i>&nbsp;
|
||||
<field name="alias_id"/>
|
||||
</small>
|
||||
<small><i class="fa fa-envelope-o" role="img" aria-label="Domain alias" title="Domain alias"></i>&nbsp; <field name="alias_id"/></small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container o_kanban_card_content">
|
||||
<div class="row">
|
||||
<div class="col-6 o_kanban_primary_left">
|
||||
<button class="btn btn-primary" name="%(quality_alert_action_team)d"
|
||||
type="action">
|
||||
<span>
|
||||
<field name="alert_count"/>
|
||||
Quality Alerts
|
||||
</span>
|
||||
<button class="btn btn-primary" name="%(quality_alert_action_team)d" type="action">
|
||||
<span><field name="alert_count"/> Quality Alerts</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="col-6 o_kanban_primary_right">
|
||||
<a class="oe_kanban_stock_picking_type_list"
|
||||
name="%(quality_check_action_team)d" type="action">
|
||||
<a class="oe_kanban_stock_picking_type_list" name="%(quality_check_action_team)d" type="action">
|
||||
<field name="check_count"/>
|
||||
Checks In Progress
|
||||
</a>
|
||||
@@ -663,14 +585,11 @@
|
||||
<div t-if="widget.editable" role="menuitem">
|
||||
<a class="dropdown-item ps-0" type="edit">Configuration</a>
|
||||
</div>
|
||||
<div t-if="widget.editable" role="menuitem" aria-haspopup="true"
|
||||
class="o_no_padding_kanban_colorpicker">
|
||||
<div t-if="widget.editable" role="menuitem" aria-haspopup="true" class="o_no_padding_kanban_colorpicker">
|
||||
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
|
||||
</div>
|
||||
</div>
|
||||
<a class="o_kanban_manage_toggle_button o_left" href="#">
|
||||
<i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/>
|
||||
</a>
|
||||
<a class="o_kanban_manage_toggle_button o_left" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
@@ -696,14 +615,13 @@
|
||||
<label for="alias_name" string="Email Alias"/>
|
||||
<div name="alias_def">
|
||||
<field name="alias_id" class="oe_read_only oe_inline"
|
||||
string="Email Alias" required="0"/>
|
||||
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;">
|
||||
<field name="alias_name" class="oe_inline"/>@
|
||||
<field name="alias_domain" class="oe_inline" readonly="1"/>
|
||||
string="Email Alias" required="0"/>
|
||||
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;" >
|
||||
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
|
||||
</div>
|
||||
</div>
|
||||
<field name="alias_contact" class="oe_inline" groups="base.group_no_one"
|
||||
string="Accept Emails From"/>
|
||||
string="Accept Emails From"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
@@ -740,9 +658,7 @@
|
||||
<div t-attf-class="oe_kanban_content oe_kanban_global_click">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<strong>
|
||||
<field name="name"/>
|
||||
</strong>
|
||||
<strong><field name="name"/></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -756,15 +672,14 @@
|
||||
<field name="name">Quality Overview</field>
|
||||
<field name="res_model">quality.alert.team</field>
|
||||
<field name="view_mode">kanban,form</field>
|
||||
<field name="view_id" ref="quality_alert_team_dashboard_view_kanban"/>
|
||||
<field name="view_id" ref="quality_alert_team_dashboard_view_kanban" />
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_empty_folder">
|
||||
</p><p>
|
||||
Quality Teams group the different quality alerts/checks
|
||||
according to the roles (teams) that need them.
|
||||
</p>
|
||||
<p>
|
||||
Quality Teams group the different quality alerts/checks
|
||||
according to the roles (teams) that need them.
|
||||
</p>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="quality_alert_team_action_config" model="ir.actions.act_window">
|
||||
@@ -801,9 +716,9 @@
|
||||
<field name="res_model">quality.tag</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Add a new tag
|
||||
</p>
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Add a new tag
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -832,9 +747,7 @@
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="oe_kanban_global_click">
|
||||
<div>
|
||||
<strong>
|
||||
<field name="name"/>
|
||||
</strong>
|
||||
<strong><field name="name"/></strong>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
@@ -850,9 +763,8 @@
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create a new quality alert stage
|
||||
</p>
|
||||
<p>
|
||||
Quality Alert stages define the different steps a quality alert should go through.
|
||||
</p><p>
|
||||
Quality Alert stages define the different steps a quality alert should go through.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
@@ -904,19 +816,9 @@
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
|
||||
<div>
|
||||
<strong>
|
||||
<t t-esc="record.name.value"/>
|
||||
</strong>
|
||||
</div>
|
||||
<div>
|
||||
<strong>Products :</strong>
|
||||
<t t-esc="record.product_ids.value"/>
|
||||
</div>
|
||||
<div>
|
||||
<strong>Operations :</strong>
|
||||
<t t-esc="record.picking_type_ids.value"/>
|
||||
</div>
|
||||
<div><strong><t t-esc="record.name.value"/></strong></div>
|
||||
<div><strong>Products :</strong> <t t-esc="record.product_ids.value"/></div>
|
||||
<div><strong>Operations :</strong> <t t-esc="record.picking_type_ids.value"/></div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
@@ -934,54 +836,39 @@
|
||||
<field string="Quality Checks" name="check_count" widget="statinfo"/>
|
||||
</button>
|
||||
<button name="action_see_spc_control" type="object" class="oe_stat_button"
|
||||
attrs="{'invisible': ['|', ('check_count', '=', 0), ('test_type', '!=', 'measure')]}">
|
||||
<span class="fa fa-2x" data-icon="∑" style="padding-left: 10px;" role="img"
|
||||
aria-label="Statistics" title="Statistics"/>
|
||||
attrs="{'invisible': ['|', ('check_count', '=', 0), ('test_type', '!=', 'measure')]}">
|
||||
<span class="fa fa-2x" data-icon="∑" style="padding-left: 10px;" role="img" aria-label="Statistics" title="Statistics"/>
|
||||
<div class="o_field_widget o_stat_info mr4">
|
||||
<span class="o_stat_text">AVG:</span>
|
||||
<span class="o_stat_text">STD:</span>
|
||||
</div>
|
||||
<div class="o_field_widget o_stat_info">
|
||||
<span class="o_stat_value">
|
||||
<field name="average"/>
|
||||
</span>
|
||||
<span class="o_stat_value">
|
||||
<field name="standard_deviation"/>
|
||||
</span>
|
||||
<span class="o_stat_value"><field name="average"/></span>
|
||||
<span class="o_stat_value"><field name="standard_deviation"/></span>
|
||||
</div>
|
||||
</button>
|
||||
</xpath>
|
||||
<xpath expr="//page[@name='instructions']" position="after">
|
||||
<page string="Message If Failure" name="message_if_failure"
|
||||
attrs="{'invisible': [('test_type', 'in', ['picture', 'instructions', 'register_consumed_materials', 'print_label'])]}">
|
||||
attrs="{'invisible': [('test_type', 'in', ['picture', 'instructions', 'register_consumed_materials', 'print_label'])]}">
|
||||
<field name="failure_message"/>
|
||||
</page>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='test_type']" position="before">
|
||||
<field name="measure_on"/>
|
||||
<field name="measure_frequency_type" string="Control Frequency"/>
|
||||
<label for="measure_frequency_value" string=""
|
||||
attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}"/>
|
||||
<label for="measure_frequency_value" string="" attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}"/>
|
||||
<div class="o_row" attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">
|
||||
<span attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">Every</span>
|
||||
<field name="measure_frequency_value" nolabel="1"
|
||||
attrs="{'invisible': [('measure_frequency_type', '!=', 'random')]}"/>
|
||||
<label for="measure_frequency_value" string="% of Operations"
|
||||
attrs="{'invisible': ['|', ('measure_on', '=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
|
||||
<label for="measure_frequency_value" string="% of Transfers"
|
||||
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
|
||||
<field name="measure_frequency_unit_value" string="Frequency" nolabel="1"
|
||||
attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')]}"/>
|
||||
<field name="measure_frequency_unit"
|
||||
attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')], 'required': [('measure_frequency_type', '=', 'periodical')]}"/>
|
||||
<span attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">Every </span>
|
||||
<field name="measure_frequency_value" nolabel="1" attrs="{'invisible': [('measure_frequency_type', '!=', 'random')]}"/>
|
||||
<label for="measure_frequency_value" string="% of Operations" attrs="{'invisible': ['|', ('measure_on', '=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
|
||||
<label for="measure_frequency_value" string="% of Transfers" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
|
||||
<field name="measure_frequency_unit_value" string="Frequency" nolabel="1" attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')]}"/>
|
||||
<field name="measure_frequency_unit" attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')], 'required': [('measure_frequency_type', '=', 'periodical')]}"/>
|
||||
</div>
|
||||
<field name="is_lot_tested_fractionally" attrs="{'invisible': [('measure_on', '!=', 'move_line')]}"
|
||||
string="Partial Transfer Test"/>
|
||||
<label for="testing_percentage_within_lot"
|
||||
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}"
|
||||
string="Percentage"/>
|
||||
<div class="o_row"
|
||||
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}">
|
||||
<field name="is_lot_tested_fractionally" attrs="{'invisible': [('measure_on', '!=', 'move_line')]}" string="Partial Transfer Test"/>
|
||||
<label for="testing_percentage_within_lot" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}" string="Percentage"/>
|
||||
<div class="o_row" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}">
|
||||
<field name="testing_percentage_within_lot" nolabel="1"/>
|
||||
<label for="testing_percentage_within_lot" string="%"/>
|
||||
</div>
|
||||
@@ -990,15 +877,12 @@
|
||||
<label for="norm" attrs="{'invisible': [('test_type', '!=', 'measure')]}"/>
|
||||
<div class="o_row" attrs="{'invisible': [('test_type', '!=', 'measure')]}">
|
||||
<field name="norm" attrs="{'required': [('test_type', '=', 'measure')]}"/>
|
||||
<field name="norm_unit" string="Unit of Measure"
|
||||
attrs="{'required': [('test_type', '=', 'measure')]}"/>
|
||||
<field name="norm_unit" string="Unit of Measure" attrs="{'required': [('test_type', '=', 'measure')]}"/>
|
||||
</div>
|
||||
<label for="tolerance_min" string="Tolerance" attrs="{'invisible': [('test_type', '!=', 'measure')]}"/>
|
||||
<div attrs="{'invisible': [('test_type', '!=', 'measure')]}" class="o_row">
|
||||
<span>from</span>
|
||||
<field name="tolerance_min"/>
|
||||
<span>to</span>
|
||||
<field name="tolerance_max"/>
|
||||
<span>from </span> <field name="tolerance_min"/>
|
||||
<span>to </span> <field name="tolerance_max"/>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
@@ -1011,96 +895,95 @@
|
||||
<field name="search_view_id" ref="quality_point_view_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
No quality control point found
|
||||
</p>
|
||||
<p>
|
||||
Quality control points define the quality checks which should be
|
||||
performed at each operation, for your different products.
|
||||
No quality control point found
|
||||
</p><p>
|
||||
Quality control points define the quality checks which should be
|
||||
performed at each operation, for your different products.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Menu structure-->
|
||||
<menuitem
|
||||
id="menu_quality_root"
|
||||
name="Quality"
|
||||
web_icon="quality_control,static/description/icon.svg"
|
||||
sequence="150"
|
||||
groups="quality.group_quality_user"/>
|
||||
id="menu_quality_root"
|
||||
name="Quality"
|
||||
web_icon="quality_control,static/description/icon.svg"
|
||||
sequence="150"
|
||||
groups="quality.group_quality_user"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_quality_dashboard"
|
||||
name="Overview"
|
||||
action="quality_alert_team_action"
|
||||
parent="menu_quality_root"
|
||||
sequence="5"/>
|
||||
id="menu_quality_dashboard"
|
||||
name="Overview"
|
||||
action="quality_alert_team_action"
|
||||
parent="menu_quality_root"
|
||||
sequence="5"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_quality_control"
|
||||
name="Quality Control"
|
||||
parent="menu_quality_root"
|
||||
sequence="15"/>
|
||||
id="menu_quality_control"
|
||||
name="Quality Control"
|
||||
parent="menu_quality_root"
|
||||
sequence="15"/>
|
||||
<menuitem
|
||||
id="menu_quality_control_points"
|
||||
name="Control Points"
|
||||
parent="menu_quality_control"
|
||||
action="quality_point_action"
|
||||
groups="quality.group_quality_manager"
|
||||
sequence="17"/>
|
||||
id="menu_quality_control_points"
|
||||
name="Control Points"
|
||||
parent="menu_quality_control"
|
||||
action="quality_point_action"
|
||||
groups="quality.group_quality_manager"
|
||||
sequence="17"/>
|
||||
<menuitem
|
||||
id="menu_quality_checks"
|
||||
name="Quality Checks"
|
||||
action="quality_check_action_main"
|
||||
parent="menu_quality_control"
|
||||
sequence="18"/>
|
||||
id="menu_quality_checks"
|
||||
name="Quality Checks"
|
||||
action="quality_check_action_main"
|
||||
parent="menu_quality_control"
|
||||
sequence="18"/>
|
||||
<menuitem
|
||||
id="menu_quality_alert"
|
||||
name="Quality Alerts"
|
||||
action="quality_alert_action_check"
|
||||
parent="menu_quality_control"
|
||||
sequence="20"/>
|
||||
id="menu_quality_alert"
|
||||
name="Quality Alerts"
|
||||
action="quality_alert_action_check"
|
||||
parent="menu_quality_control"
|
||||
sequence="20"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_quality_configuration"
|
||||
name="Configuration"
|
||||
groups="quality.group_quality_manager"
|
||||
parent="menu_quality_root"
|
||||
sequence="25"/>
|
||||
id="menu_quality_configuration"
|
||||
name="Configuration"
|
||||
groups="quality.group_quality_manager"
|
||||
parent="menu_quality_root"
|
||||
sequence="25"/>
|
||||
<menuitem
|
||||
id="menu_quality_config_alert_team"
|
||||
name="Quality Teams"
|
||||
action="quality_alert_team_action_config"
|
||||
parent="menu_quality_configuration"
|
||||
sequence="5"/>
|
||||
id="menu_quality_config_alert_team"
|
||||
name="Quality Teams"
|
||||
action="quality_alert_team_action_config"
|
||||
parent="menu_quality_configuration"
|
||||
sequence="5"/>
|
||||
<menuitem
|
||||
id="menu_quality_config_alert_stage"
|
||||
name="Quality Alert Stages"
|
||||
action="quality_alert_stage_action"
|
||||
parent="menu_quality_configuration"
|
||||
groups="base.group_no_one"
|
||||
sequence="15"/>
|
||||
id="menu_quality_config_alert_stage"
|
||||
name="Quality Alert Stages"
|
||||
action="quality_alert_stage_action"
|
||||
parent="menu_quality_configuration"
|
||||
groups="base.group_no_one"
|
||||
sequence="15"/>
|
||||
<menuitem
|
||||
id="menu_config_quality_tags"
|
||||
name="Quality Tags"
|
||||
groups="base.group_no_one"
|
||||
action="quality_tag_action"
|
||||
parent="menu_quality_configuration"
|
||||
sequence="25"/>
|
||||
id="menu_config_quality_tags"
|
||||
name="Quality Tags"
|
||||
groups="base.group_no_one"
|
||||
action="quality_tag_action"
|
||||
parent="menu_quality_configuration"
|
||||
sequence="25"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_quality_reporting"
|
||||
name="Reporting"
|
||||
groups="quality.group_quality_manager"
|
||||
parent="menu_quality_root"
|
||||
sequence="20"/>
|
||||
id="menu_quality_reporting"
|
||||
name="Reporting"
|
||||
groups="quality.group_quality_manager"
|
||||
parent="menu_quality_root"
|
||||
sequence="20"/>
|
||||
<menuitem
|
||||
id="menu_quality_alert_report"
|
||||
action="quality_alert_action_report"
|
||||
parent="menu_quality_reporting"
|
||||
sequence="6"/>
|
||||
id="menu_quality_alert_report"
|
||||
action="quality_alert_action_report"
|
||||
parent="menu_quality_reporting"
|
||||
sequence="6"/>
|
||||
<menuitem
|
||||
id="menu_quality_check_report"
|
||||
action="quality_check_action_report"
|
||||
parent="menu_quality_reporting"
|
||||
sequence="5"/>
|
||||
id="menu_quality_check_report"
|
||||
action="quality_check_action_report"
|
||||
parent="menu_quality_reporting"
|
||||
sequence="5"/>
|
||||
</odoo>
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
'views/tool_menu.xml',
|
||||
'views/menu_fixture_view.xml',
|
||||
'views/change_base_view.xml',
|
||||
'views/Printer.xml',
|
||||
|
||||
],
|
||||
'demo': [
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class Printer(models.Model):
|
||||
_name = 'printer'
|
||||
_description = 'Printer'
|
||||
|
||||
name = fields.Char(string='名称', required=True)
|
||||
ip_address = fields.Char(string='IP 地址', required=True)
|
||||
port = fields.Integer(string='端口', default=9100)
|
||||
|
||||
|
||||
class TableStyle(models.Model):
|
||||
_name = 'table.style'
|
||||
_description = '标签样式'
|
||||
|
||||
name = fields.Char(string='名称', required=True)
|
||||
# todo
|
||||
|
||||
|
||||
class PrinterConfiguration(models.Model):
|
||||
_name = 'printer.configuration'
|
||||
_description = 'Printer Configuration'
|
||||
|
||||
name = fields.Char(string='名称', required=True)
|
||||
printer_id = fields.Many2one('printer', string='打印机')
|
||||
model = fields.Many2one('ir.model', string='模型名称')
|
||||
# # 其他相关字段...
|
||||
@@ -1,2 +1 @@
|
||||
from . import common
|
||||
from . import Printer
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import time, datetime
|
||||
import time
|
||||
import hashlib
|
||||
from odoo import models
|
||||
import socket
|
||||
|
||||
|
||||
class Common(models.Model):
|
||||
_name = 'sf.sync.common'
|
||||
@@ -29,66 +29,3 @@ class Common(models.Model):
|
||||
d = dt + datetime.timedelta(hours=8)
|
||||
nTime = d.strftime("%Y-%m-%d %H:%M:%S")
|
||||
return nTime
|
||||
|
||||
|
||||
class PrintingUtils(models.AbstractModel):
|
||||
_name = 'printing.utils'
|
||||
_description = 'Utility class for printing functionalities'
|
||||
|
||||
def generate_zpl_code(self, code):
|
||||
# 实现生成ZPL代码的逻辑
|
||||
# 初始化ZPL代码字符串
|
||||
zpl_code = "^XA\n"
|
||||
zpl_code += "^CW1,E:SIMSUN.TTF^FS\n"
|
||||
zpl_code += "^CI28\n"
|
||||
|
||||
# 设置二维码位置
|
||||
zpl_code += "^FO50,50\n" # 调整二维码位置,使其与资产编号在同一行
|
||||
zpl_code += f"^BQN,2,6^FDLM,B0093{code}^FS\n"
|
||||
|
||||
# 设置资产编号文本位置
|
||||
zpl_code += "^FO300,60\n" # 资产编号文本的位置,与二维码在同一行
|
||||
zpl_code += "^A1N,45,45^FD编码名称: ^FS\n"
|
||||
|
||||
# 设置{code}文本位置
|
||||
# 假设{code}文本需要位于资产编号和二维码下方,中间位置
|
||||
# 设置{code}文本位置并启用自动换行
|
||||
zpl_code += "^FO300,120\n" # {code}文本的起始位置
|
||||
zpl_code += "^FB400,4,0,L,0\n" # 定义一个宽度为500点的文本框,最多4行,左对齐
|
||||
zpl_code += f"^A1N,40,40^FD{code}^FS\n"
|
||||
|
||||
# 在{code}文本框周围绘制线框
|
||||
# 假设线框的外部尺寸为宽度500点,高度200点
|
||||
# zpl_code += "^FO300,110^GB500,200,2^FS\n" # 绘制线框,边框粗细为2点
|
||||
|
||||
zpl_code += "^PQ1,0,1,Y\n"
|
||||
zpl_code += "^XZ\n"
|
||||
return zpl_code
|
||||
|
||||
def send_to_printer(self, host, port, zpl_code):
|
||||
|
||||
# 实现发送ZPL代码到打印机的逻辑
|
||||
# 将ZPL代码转换为字节串
|
||||
print('zpl_code', zpl_code)
|
||||
zpl_bytes = zpl_code.encode('utf-8')
|
||||
print(zpl_bytes)
|
||||
|
||||
# 创建socket对象
|
||||
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
try:
|
||||
mysocket.connect((host, port)) # 连接到打印机
|
||||
mysocket.send(zpl_bytes) # 发送ZPL代码
|
||||
print("ZPL code sent to printer successfully.")
|
||||
except Exception as e:
|
||||
print(f"Error with the connection: {e}")
|
||||
finally:
|
||||
mysocket.close() # 关闭连接
|
||||
|
||||
def print_qr_code(self, lot_name, host, port):
|
||||
# 实现打印二维码的逻辑
|
||||
# 这里需要传入 lot_name 参数,因为我们不能直接访问 self.lot_id.name
|
||||
zpl_code = self.generate_zpl_code(lot_name)
|
||||
# 发送ZPL代码到打印机
|
||||
# host = "192.168.50.110" # 可以作为参数传入,或者在此配置
|
||||
# port = 9100 # 可以作为参数传入,或者在此配置
|
||||
self.send_to_printer(host, port, zpl_code)
|
||||
|
||||
@@ -8,7 +8,7 @@ from odoo.http import request
|
||||
|
||||
class Manufacturing_Connect(http.Controller):
|
||||
|
||||
@http.route('/AutoDeviceApi/MachineToolGroup', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
@http.route('/AutoDeviceApi/MaintenanceToolGroups', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def get_maintenance_tool_groups_Info(self, **kw):
|
||||
"""
|
||||
@@ -20,7 +20,7 @@ class Manufacturing_Connect(http.Controller):
|
||||
try:
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
# ret = json.loads(ret['result'])
|
||||
ret = json.loads(ret['result'])
|
||||
logging.info('DeviceId:%s' % ret)
|
||||
tool_groups = request.env['sf.tool.groups'].sudo().search([])
|
||||
|
||||
|
||||
@@ -106,7 +106,6 @@ class MachineTool(models.Model):
|
||||
lead_screw = fields.Char('丝杆')
|
||||
workbench_L = fields.Char('工作台长度(mm)')
|
||||
workbench_W = fields.Char('工作台宽度(mm)')
|
||||
workbench_H = fields.Char('工作台高度(mm)')
|
||||
guide_rail = fields.Char('导轨')
|
||||
machine_tool_L = fields.Char('机床长度(mm)')
|
||||
machine_tool_W = fields.Char('机床宽度(mm)')
|
||||
@@ -194,7 +193,6 @@ class MachineTool(models.Model):
|
||||
item.lead_screw = item.type_id.lead_screw
|
||||
item.workbench_L = item.type_id.workbench_L
|
||||
item.workbench_W = item.type_id.workbench_W
|
||||
item.workbench_H = item.type_id.workbench_H
|
||||
item.guide_rail = item.type_id.guide_rail
|
||||
item.machine_tool_L = item.type_id.machine_tool_L
|
||||
item.machine_tool_W = item.type_id.machine_tool_W
|
||||
@@ -282,7 +280,6 @@ class MachineToolType(models.Model):
|
||||
workpiece_load = fields.Char('工件最大负载(kg)')
|
||||
workbench_L = fields.Char('工作台长度(mm)')
|
||||
workbench_W = fields.Char('工作台宽度(mm)')
|
||||
workbench_H = fields.Char('工作台高度(mm)')
|
||||
machine_tool_L = fields.Char('机床长度(mm)')
|
||||
machine_tool_W = fields.Char('机床宽度(mm)')
|
||||
machine_tool_H = fields.Char('机床高度(mm)')
|
||||
@@ -298,9 +295,8 @@ class MachineToolType(models.Model):
|
||||
x_axis = fields.Integer('X轴')
|
||||
y_axis = fields.Integer('Y轴')
|
||||
z_axis = fields.Integer('Z轴')
|
||||
a_axis = fields.Char('a轴')
|
||||
b_axis = fields.Char('B轴')
|
||||
c_axis = fields.Char('C轴')
|
||||
b_axis = fields.Integer('B轴')
|
||||
c_axis = fields.Integer('C轴')
|
||||
remark = fields.Char('备注')
|
||||
control_system_id = fields.Many2one('sf.machine.control_system',
|
||||
string="控制系统")
|
||||
@@ -313,7 +309,7 @@ class MachineToolType(models.Model):
|
||||
default="", string="轴数")
|
||||
|
||||
# 1212新增字段
|
||||
|
||||
a_axis = fields.Integer('a轴')
|
||||
function_type = fields.Selection(
|
||||
[("ZXJGZX", "钻铣加工中心"), ("CXJGZX", "车削加工中心"), ("FHJGZX", "复合加工中心")],
|
||||
default="", string="功能类型")
|
||||
@@ -339,23 +335,23 @@ class MachineToolType(models.Model):
|
||||
straight_cutting_feed_rate = fields.Char('直线切削进给速度(mm/min)')
|
||||
rotary_cutting_feed_rate = fields.Char('回转切削进给速度(mm/min)')
|
||||
|
||||
X_precision = fields.Char('X轴定位精度(mm)')
|
||||
X_precision_repeat = fields.Char('X轴重复定位精度(mm)')
|
||||
Y_precision = fields.Char('Y轴定位精度(mm)')
|
||||
Y_precision_repeat = fields.Char('Y轴重复定位精度(mm)')
|
||||
Z_precision = fields.Char('Z轴定位精度(mm)')
|
||||
Z_precision_repeat = fields.Char('Z轴重复定位精度(mm)')
|
||||
a_precision = fields.Char('a轴定位精度(mm)')
|
||||
a_precision_repeat = fields.Char('a轴重复定位精度(mm)')
|
||||
b_precision = fields.Char('b轴定位精度(mm)')
|
||||
b_precision_repeat = fields.Char('b轴重复定位精度(mm)')
|
||||
c_precision = fields.Char('c轴定位精度(mm)')
|
||||
c_precision_repeat = fields.Char('c轴重复定位精度(mm)')
|
||||
X_precision = fields.Float('X轴定位精度(mm)', digits=(12, 3))
|
||||
X_precision_repeat = fields.Float('X轴重复定位精度(mm)', digits=(12, 3))
|
||||
Y_precision = fields.Float('Y轴定位精度(mm)', digits=(12, 3))
|
||||
Y_precision_repeat = fields.Float('Y轴重复定位精度(mm)', digits=(12, 3))
|
||||
Z_precision = fields.Float('Z轴定位精度(mm)', digits=(12, 3))
|
||||
Z_precision_repeat = fields.Float('Z轴重复定位精度(mm)', digits=(12, 3))
|
||||
a_precision = fields.Float('a轴定位精度(mm)', digits=(12, 3))
|
||||
a_precision_repeat = fields.Float('a轴重复定位精度(mm)', digits=(12, 3))
|
||||
b_precision = fields.Float('b轴定位精度(mm)', digits=(12, 3))
|
||||
b_precision_repeat = fields.Float('b轴重复定位精度(mm)', digits=(12, 3))
|
||||
c_precision = fields.Float('c轴定位精度(mm)', digits=(12, 3))
|
||||
c_precision_repeat = fields.Float('c轴重复定位精度(mm)', digits=(12, 3))
|
||||
|
||||
tool_full_diameter_max = fields.Float('刀具满刀最大直径(mm)')
|
||||
tool_perimeter_diameter_max = fields.Float('刀具邻空刀最大直径(mm)')
|
||||
T_tool_time = fields.Float('T-T换刀时间(s)', digits=(12, 1))
|
||||
C_tool_time = fields.Float('C-C换刀时间(s)', digits=(12, 1))
|
||||
T_tool_time = fields.Integer('T-T换刀时间(s)')
|
||||
C_tool_time = fields.Integer('C-C换刀时间(s)')
|
||||
|
||||
jg_image_id = fields.Many2many('maintenance.equipment.image', 'jg_equipment_id', string='加工能力',
|
||||
domain="[('type', '=', '加工能力')]")
|
||||
|
||||
@@ -67,220 +67,186 @@ class BasicParametersFixture(models.Model):
|
||||
mounting_hole_depth = fields.Float('安装孔深度(mm)', digits=(16, 2))
|
||||
centering_diameter = fields.Float('定心直径(mm)', digits=(16, 2))
|
||||
|
||||
code = fields.Char('编码')
|
||||
active = fields.Boolean('有效', default=True)
|
||||
|
||||
def _get_basic_parameters_list(self, fixture_materials_data, fixture_materials_name):
|
||||
if fixture_materials_name == '零点卡盘':
|
||||
return self._json_zero_chuck_param(fixture_materials_data)
|
||||
elif fixture_materials_name == '零点托盘':
|
||||
return self._json_zero_tray_param(fixture_materials_data)
|
||||
elif fixture_materials_name == '气动夹具':
|
||||
return self._json_pneumatic_fixture_param(fixture_materials_data)
|
||||
elif fixture_materials_name == '虎钳夹具':
|
||||
return self._json_jaw_vice_fixture_param(fixture_materials_data)
|
||||
elif fixture_materials_name == '磁吸夹具':
|
||||
return self._json_magnet_fixture_param(fixture_materials_data)
|
||||
elif fixture_materials_name == '转接板(锁板)夹具':
|
||||
return self._json_adapter_board_fixture_param(fixture_materials_data)
|
||||
elif fixture_materials_name == '三爪卡盘':
|
||||
return self._json_scroll_chuck_param(fixture_materials_data)
|
||||
return {}
|
||||
|
||||
def _json_zero_chuck_param(self, obj):
|
||||
"""零点卡盘:将data数据转换成list数据"""
|
||||
return {'code': obj['code'],
|
||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'diameter': obj['diameter'],
|
||||
'weight': obj['weight'],
|
||||
'orientation_dish_diameter': obj['orientation_dish_diameter'],
|
||||
'clamping_diameter': obj['clamping_diameter'],
|
||||
'clamping_num': obj['clamping_num'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
|
||||
'boolean_transposing_hole': obj['boolean_transposing_hole'],
|
||||
'unlocking_method': obj['unlocking_method'],
|
||||
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'rigidity': obj['rigidity'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'machine_tool_type_id': self.env['sf.machine_tool.type'].sudo().search(
|
||||
[('code', '=', obj['machine_tool_type_id']), ('active', '=', True)]).id,
|
||||
'active': obj['active']}
|
||||
zero_chuck_param_str = (0, '', {
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'diameter': obj['diameter'],
|
||||
'weight': obj['weight'],
|
||||
'orientation_dish_diameter': obj['orientation_dish_diameter'],
|
||||
'clamping_diameter': obj['clamping_diameter'],
|
||||
'clamping_num': obj['clamping_num'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
|
||||
'boolean_transposing_hole': obj['boolean_transposing_hole'],
|
||||
'unlocking_method': obj['unlocking_method'],
|
||||
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'rigidity': obj['rigidity'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'machine_tool_type_id': self.env['sf.machine_tool.type'].sudo().search(
|
||||
[('code', '=', obj['machine_tool_type_id']), ('active', '=', True)]).id,
|
||||
})
|
||||
return zero_chuck_param_str
|
||||
|
||||
def _json_zero_tray_param(self, obj):
|
||||
"""零点托盘:将data数据转换成list数据"""
|
||||
return {'code': obj['code'],
|
||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'diameter': obj['diameter'],
|
||||
'weight': obj['weight'],
|
||||
'clamping_diameter': obj['clamping_diameter'],
|
||||
'connector_diameter': obj['connector_diameter'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
|
||||
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
|
||||
'way_to_install': obj['way_to_install'],
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'active': obj['active']}
|
||||
zero_tray_param_str = (0, '', {
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'diameter': obj['diameter'],
|
||||
'weight': obj['weight'],
|
||||
'clamping_diameter': obj['clamping_diameter'],
|
||||
'connector_diameter': obj['connector_diameter'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
|
||||
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
|
||||
'way_to_install': obj['way_to_install'],
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
})
|
||||
return zero_tray_param_str
|
||||
|
||||
def _json_pneumatic_fixture_param(self, obj):
|
||||
"""气动夹具:将data数据转换成list数据"""
|
||||
return {'code': obj['code'],
|
||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'weight': obj['weight'],
|
||||
'gripper_length_min': obj['gripper_length_min'],
|
||||
'gripper_width_min': obj['gripper_width_min'],
|
||||
'gripper_height_min': obj['gripper_height_min'],
|
||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
||||
'gripper_length_max': obj['gripper_length_max'],
|
||||
'gripper_width_max': obj['gripper_width_max'],
|
||||
'gripper_height_max': obj['gripper_height_max'],
|
||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'rated_air_pressure': obj['rated_air_pressure'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
'active': obj['active']}
|
||||
pneumatic_fixture_param_str = (0, '', {
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'weight': obj['weight'],
|
||||
'gripper_length_min': obj['gripper_length_min'],
|
||||
'gripper_width_min': obj['gripper_width_min'],
|
||||
'gripper_height_min': obj['gripper_height_min'],
|
||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
||||
'gripper_length_max': obj['gripper_length_max'],
|
||||
'gripper_width_max': obj['gripper_width_max'],
|
||||
'gripper_height_max': obj['gripper_height_max'],
|
||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'rated_air_pressure': obj['rated_air_pressure'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
})
|
||||
return pneumatic_fixture_param_str
|
||||
|
||||
def _json_jaw_vice_fixture_param(self, obj):
|
||||
"""虎钳夹具:将data数据转换成list数据"""
|
||||
return {'code': obj['code'],
|
||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'weight': obj['weight'],
|
||||
'gripper_length_min': obj['gripper_length_min'],
|
||||
'gripper_width_min': obj['gripper_width_min'],
|
||||
'gripper_height_min': obj['gripper_height_min'],
|
||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
||||
'gripper_length_max': obj['gripper_length_max'],
|
||||
'gripper_width_max': obj['gripper_width_max'],
|
||||
'gripper_height_max': obj['gripper_height_max'],
|
||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'transverse_groove': obj['transverse_groove'],
|
||||
'longitudinal_fitting_groove': obj['longitudinal_fitting_groove'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
'active': obj['active']}
|
||||
jaw_vice_fixture_param_str = (0, '', {
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'weight': obj['weight'],
|
||||
'gripper_length_min': obj['gripper_length_min'],
|
||||
'gripper_width_min': obj['gripper_width_min'],
|
||||
'gripper_height_min': obj['gripper_height_min'],
|
||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
||||
'gripper_length_max': obj['gripper_length_max'],
|
||||
'gripper_width_max': obj['gripper_width_max'],
|
||||
'gripper_height_max': obj['gripper_height_max'],
|
||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'transverse_groove': obj['transverse_groove'],
|
||||
'longitudinal_fitting_groove': obj['longitudinal_fitting_groove'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
})
|
||||
return jaw_vice_fixture_param_str
|
||||
|
||||
def _json_magnet_fixture_param(self, obj):
|
||||
"""磁吸夹具:将data数据转换成list数据"""
|
||||
return {'code': obj['code'],
|
||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'height_tolerance_value': obj['height_tolerance_value'],
|
||||
'weight': obj['weight'],
|
||||
'gripper_length_min': obj['gripper_length_min'],
|
||||
'gripper_width_min': obj['gripper_width_min'],
|
||||
'gripper_height_min': obj['gripper_height_min'],
|
||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
||||
'gripper_length_max': obj['gripper_length_max'],
|
||||
'gripper_width_max': obj['gripper_width_max'],
|
||||
'gripper_height_max': obj['gripper_height_max'],
|
||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
||||
'rated_adsorption_force': obj['rated_adsorption_force'],
|
||||
'magnetic_field_height': obj['magnetic_field_height'],
|
||||
'magnetic_pole_plate_grinding_allowance': obj['magnetic_pole_plate_grinding_allowance'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
'active': obj['active']}
|
||||
magnet_fixture_param_str = (0, '', {
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'height_tolerance_value': obj['height_tolerance_value'],
|
||||
'weight': obj['weight'],
|
||||
'gripper_length_min': obj['gripper_length_min'],
|
||||
'gripper_width_min': obj['gripper_width_min'],
|
||||
'gripper_height_min': obj['gripper_height_min'],
|
||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
||||
'gripper_length_max': obj['gripper_length_max'],
|
||||
'gripper_width_max': obj['gripper_width_max'],
|
||||
'gripper_height_max': obj['gripper_height_max'],
|
||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
||||
'rated_adsorption_force': obj['rated_adsorption_force'],
|
||||
'magnetic_field_height': obj['magnetic_field_height'],
|
||||
'magnetic_pole_plate_grinding_allowance': obj['magnetic_pole_plate_grinding_allowance'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
})
|
||||
return magnet_fixture_param_str
|
||||
|
||||
def _json_adapter_board_fixture_param(self, obj):
|
||||
"""转接板(锁板)夹具:将data数据转换成list数据"""
|
||||
return {'code': obj['code'],
|
||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'weight': obj['weight'],
|
||||
'gripper_length_min': obj['gripper_length_min'],
|
||||
'gripper_width_min': obj['gripper_width_min'],
|
||||
'gripper_height_min': obj['gripper_height_min'],
|
||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
||||
'gripper_length_max': obj['gripper_length_max'],
|
||||
'gripper_width_max': obj['gripper_width_max'],
|
||||
'gripper_height_max': obj['gripper_height_max'],
|
||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'screw_size': obj['screw_size'],
|
||||
'via_hole_diameter': obj['via_hole_diameter'],
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
'active': obj['active']}
|
||||
adapter_board_fixture_param_str = (0, '', {
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'weight': obj['weight'],
|
||||
'gripper_length_min': obj['gripper_length_min'],
|
||||
'gripper_width_min': obj['gripper_width_min'],
|
||||
'gripper_height_min': obj['gripper_height_min'],
|
||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
||||
'gripper_length_max': obj['gripper_length_max'],
|
||||
'gripper_width_max': obj['gripper_width_max'],
|
||||
'gripper_height_max': obj['gripper_height_max'],
|
||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'screw_size': obj['screw_size'],
|
||||
'via_hole_diameter': obj['via_hole_diameter'],
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
})
|
||||
return adapter_board_fixture_param_str
|
||||
|
||||
def _json_scroll_chuck_param(self, obj):
|
||||
"""转接板(锁板)夹具:将data数据转换成list数据"""
|
||||
return {'code': obj['code'],
|
||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'diameter': obj['diameter'],
|
||||
'weight': obj['weight'],
|
||||
'gripper_length_min': obj['gripper_length_min'],
|
||||
'gripper_width_min': obj['gripper_width_min'],
|
||||
'gripper_height_min': obj['gripper_height_min'],
|
||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
||||
'gripper_length_max': obj['gripper_length_max'],
|
||||
'gripper_width_max': obj['gripper_width_max'],
|
||||
'gripper_height_max': obj['gripper_height_max'],
|
||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'mounting_hole_depth': obj['mounting_hole_depth'],
|
||||
'centering_diameter': obj['centering_diameter'],
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
'active': obj['active']}
|
||||
scroll_chuck_param_str = (0, '', {
|
||||
'name': obj['name'],
|
||||
'length': obj['length'],
|
||||
'width': obj['width'],
|
||||
'height': obj['height'],
|
||||
'diameter': obj['diameter'],
|
||||
'weight': obj['weight'],
|
||||
'gripper_length_min': obj['gripper_length_min'],
|
||||
'gripper_width_min': obj['gripper_width_min'],
|
||||
'gripper_height_min': obj['gripper_height_min'],
|
||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
||||
'gripper_length_max': obj['gripper_length_max'],
|
||||
'gripper_width_max': obj['gripper_width_max'],
|
||||
'gripper_height_max': obj['gripper_height_max'],
|
||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
||||
'chucking_power_max': obj['chucking_power_max'],
|
||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
||||
'rigidity': obj['rigidity'],
|
||||
'mounting_hole_depth': obj['mounting_hole_depth'],
|
||||
'centering_diameter': obj['centering_diameter'],
|
||||
'type_of_drive': obj['type_of_drive'],
|
||||
})
|
||||
return scroll_chuck_param_str
|
||||
|
||||
@@ -61,10 +61,10 @@ class MrsMaterialModel(models.Model):
|
||||
supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商')
|
||||
active = fields.Boolean('有效', default=True)
|
||||
|
||||
@api.onchange('gain_way')
|
||||
@api.constrains('supplier_ids')
|
||||
def _check_gain_way(self):
|
||||
if not self.gain_way:
|
||||
raise UserError("请选择获取方式")
|
||||
raise UserError("请输入获取方式")
|
||||
if self.gain_way in ['外协', '采购']:
|
||||
if not self.supplier_ids:
|
||||
raise UserError("请添加供应商")
|
||||
@@ -90,7 +90,7 @@ class MrsProductionProcess(models.Model):
|
||||
code = fields.Char("编码")
|
||||
name = fields.Char('名称')
|
||||
remark = fields.Text("备注")
|
||||
# processing_order_ids = fields.One2many('sf.processing.order', 'production_process_id', string='工序')
|
||||
processing_order_ids = fields.One2many('sf.processing.order', 'production_process_id', string='工序')
|
||||
partner_process_ids = fields.Many2many('res.partner', 'process_ids', '加工工厂')
|
||||
active = fields.Boolean('有效', default=True)
|
||||
parameter_ids = fields.One2many('sf.production.process.parameter', 'process_id', string='可选参数')
|
||||
@@ -98,25 +98,25 @@ class MrsProductionProcess(models.Model):
|
||||
# workcenter_ids = fields.Many2many('mrp.workcenter', 'rel_workcenter_process', required=True)
|
||||
|
||||
|
||||
# class MrsProcessingTechnology(models.Model):
|
||||
# _name = 'sf.processing.technology'
|
||||
# _description = '加工工艺'
|
||||
#
|
||||
# name = fields.Char('名称', index=True)
|
||||
# remark = fields.Text('备注', index=True)
|
||||
# code = fields.Char("编码")
|
||||
# processing_order_ids = fields.Many2many('sf.processing.order', 'sf_associated_processes',
|
||||
# index=True, string='工序')
|
||||
# active = fields.Boolean('有效', default=True)
|
||||
class MrsProcessingTechnology(models.Model):
|
||||
_name = 'sf.processing.technology'
|
||||
_description = '加工工艺'
|
||||
|
||||
name = fields.Char('名称', index=True)
|
||||
remark = fields.Text('备注', index=True)
|
||||
code = fields.Char("编码")
|
||||
processing_order_ids = fields.Many2many('sf.processing.order', 'sf_associated_processes',
|
||||
index=True, string='工序')
|
||||
active = fields.Boolean('有效', default=True)
|
||||
|
||||
|
||||
# class MrsProcessingOrder(models.Model):
|
||||
# _name = 'sf.processing.order'
|
||||
# _description = '工序'
|
||||
# sequence = fields.Integer('Sequence')
|
||||
# processing_technology_ids = fields.Many2many('sf.processing.technology', 'sf_associated_processes',
|
||||
# index=True, string='加工工艺')
|
||||
# production_process_id = fields.Many2one('sf.production.process', string="表面工艺")
|
||||
class MrsProcessingOrder(models.Model):
|
||||
_name = 'sf.processing.order'
|
||||
_description = '工序'
|
||||
sequence = fields.Integer('Sequence')
|
||||
processing_technology_ids = fields.Many2many('sf.processing.technology', 'sf_associated_processes',
|
||||
index=True, string='加工工艺')
|
||||
production_process_id = fields.Many2one('sf.production.process', string="表面工艺")
|
||||
|
||||
|
||||
class SupplierSort(models.Model):
|
||||
|
||||
@@ -26,10 +26,10 @@ class FixtureModel(models.Model):
|
||||
_name = 'sf.fixture.model'
|
||||
_description = "夹具型号"
|
||||
|
||||
name = fields.Char(string="名称", size=50)
|
||||
fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料")
|
||||
name = fields.Char(string="名称", size=50, required=True)
|
||||
fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料", required=True)
|
||||
fixture_material_type = fields.Char(string="夹具物料类型", related='fixture_material_id.name')
|
||||
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型")
|
||||
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型", required=True)
|
||||
brand_id = fields.Many2one('sf.machine.brand', string="品牌")
|
||||
model_file = fields.Binary(string="图片")
|
||||
status = fields.Boolean('状态')
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from datetime import date
|
||||
import json
|
||||
import requests
|
||||
from odoo import fields, models, api
|
||||
from odoo.exceptions import UserError
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo.addons.sf_base.commons.common import Common
|
||||
|
||||
|
||||
class CuttingToolMaterial(models.Model):
|
||||
@@ -111,24 +113,6 @@ class CuttingToolModel(models.Model):
|
||||
feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(整体式刀具)')
|
||||
feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(刀片)')
|
||||
material_model_id = fields.Many2one('sf.materials.model', '材料型号')
|
||||
|
||||
@api.onchange('cutting_tool_material_id')
|
||||
def _get_code(self):
|
||||
if self.is_cloud is False:
|
||||
today = date.today().strftime("%Y%m%d")
|
||||
today_code = 'T-DJWL-%s-%s' % (self.cutting_tool_material_id.code, today)
|
||||
cutting_tool_model = self.search(
|
||||
[('code', 'ilike', today_code), ('is_cloud', '=', False),
|
||||
('active', 'in', [True, False])],
|
||||
limit=1,
|
||||
order="id desc")
|
||||
if not cutting_tool_model:
|
||||
num = "%03d" % 1
|
||||
else:
|
||||
m = int(today_code[-3:]) + 1
|
||||
num = "%03d" % m
|
||||
self.code = "%s%s" % (today_code, num)
|
||||
|
||||
# 适用夹头型号可以多选
|
||||
# chuck_ids = fields.Many2many(
|
||||
# 'sf.cutting_tool.standard.library',
|
||||
@@ -205,9 +189,9 @@ class MaintenanceStandardImage(models.Model):
|
||||
('压紧方式', '压紧方式'), ('刀片形状', '刀片形状'), ('冷却方式', '冷却方式')],
|
||||
string='特征')
|
||||
equipment_id = fields.Many2many('maintenance.equipment', 'image_id', string='设备')
|
||||
equipment_lq_id = fields.Many2many('maintenance.equipment', 'image_lq_id', string='设备能力特征')
|
||||
equipment_lq_id = fields.Many2many('maintenance.equipment', 'image_lq_id', string='设备')
|
||||
jg_equipment_id = fields.Many2many('sf.machine_tool.type', 'jg_image_id', string='机床型号')
|
||||
lq_equipment_id = fields.Many2many('sf.machine_tool.type', 'lq_image_id', string='机床型号能力特征')
|
||||
lq_equipment_id = fields.Many2many('sf.machine_tool.type', 'lq_image_id', string='机床型号')
|
||||
|
||||
def _get_ids(self, name_arr):
|
||||
ability_feature_ids = []
|
||||
@@ -270,34 +254,31 @@ class ToolGroups(models.Model):
|
||||
equipment_ids = fields.Many2many('maintenance.equipment', 'ref_maintenance_equipment', string='机台号')
|
||||
remark = fields.Char('备注', size=50)
|
||||
|
||||
active = fields.Boolean(string='已归档', default=True)
|
||||
|
||||
# ==========机床刀具组接口==========
|
||||
# def _register_tool_groups(self, obj):
|
||||
# # create_url = '/AutoDeviceApi/MachineToolGroup'
|
||||
# sf_sync_config = self.env['res.config.settings'].get_values()
|
||||
# token = sf_sync_config['token']
|
||||
# sf_secret_key = sf_sync_config['sf_secret_key']
|
||||
# headers = Common.get_headers(obj, token, sf_secret_key)
|
||||
# strurl = "https://x24467i973.zicp.fun/AutoDeviceApi/MachineToolGroup"
|
||||
# device_id = ''
|
||||
# name = None
|
||||
# if obj:
|
||||
# for equipment_id in obj.equipment_ids:
|
||||
# device_id = '%s,%s' % (device_id, equipment_id.name)
|
||||
# name = obj.name
|
||||
# val = {
|
||||
# 'DeviceId': device_id,
|
||||
# 'GroupName': name,
|
||||
# }
|
||||
# kw = json.dumps(val, ensure_ascii=False)
|
||||
# r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
|
||||
# print(r)
|
||||
# ret = r.json()
|
||||
# if r == 200:
|
||||
# return "机床刀具组发送成功"
|
||||
# else:
|
||||
# raise ValidationError("机床刀具组发送失败")
|
||||
def _register_tool_groups(self, obj):
|
||||
create_url = '/AutoDeviceApi/MaintenanceToolGroups'
|
||||
sf_sync_config = self.env['res.config.settings'].get_values()
|
||||
token = sf_sync_config['token']
|
||||
sf_secret_key = sf_sync_config['sf_secret_key']
|
||||
headers = Common.get_headers(obj, token, sf_secret_key)
|
||||
strurl = sf_sync_config['sf_url'] + create_url
|
||||
device_id = ''
|
||||
name = None
|
||||
if obj:
|
||||
for equipment_id in obj.equipment_ids:
|
||||
device_id = '%s,%s' % (device_id, equipment_id.name)
|
||||
name = obj.name
|
||||
val = {
|
||||
'DeviceId': device_id,
|
||||
'GroupName': name,
|
||||
}
|
||||
kw = json.dumps(val, ensure_ascii=False)
|
||||
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
|
||||
ret = r.json()
|
||||
if r == 200:
|
||||
return "机床刀具组发送成功"
|
||||
else:
|
||||
raise ValidationError("机床刀具组发送失败")
|
||||
|
||||
# def write(self, vals):
|
||||
# obj = super().write(vals)
|
||||
@@ -309,41 +290,3 @@ class ToolGroups(models.Model):
|
||||
# records = super(ToolGroups, self).create(vals_list)
|
||||
# self._register_tool_groups(records)
|
||||
# return records
|
||||
|
||||
|
||||
class ToolInventory(models.Model):
|
||||
_name = 'sf.tool.inventory'
|
||||
_description = '功能刀具清单'
|
||||
|
||||
name = fields.Char('功能刀具名称', required=True)
|
||||
type = fields.Char('类型')
|
||||
functional_cutting_tool_model_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
|
||||
prefix = fields.Char('前缀')
|
||||
postfix = fields.Char('后缀')
|
||||
diameter = fields.Float('直径(mm)')
|
||||
angle = fields.Float('R角(mm)')
|
||||
tool_length = fields.Float('刀具总长(mm)')
|
||||
blade_length = fields.Float('避空长/刃长(mm)')
|
||||
knife_head_name = fields.Char('刀头名称')
|
||||
cutter_number = fields.Char('刀号')
|
||||
blade_number = fields.Integer('刃数(个)')
|
||||
extension = fields.Float('伸出长度(mm)')
|
||||
work_material = fields.Selection([('钢', '钢'), ('铝', '铝')], string='加工材料')
|
||||
life_span = fields.Float('寿命(h)')
|
||||
|
||||
tool_groups_id = fields.Many2one('sf.tool.groups', string='刀具组')
|
||||
|
||||
active = fields.Boolean('已归档', default=True)
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
# 名称重复校验
|
||||
name_list = []
|
||||
for val in vals_list:
|
||||
tool_inventory = self.search([('name', '=', val['name'])])
|
||||
if tool_inventory:
|
||||
name_list.append(val['name'])
|
||||
if name_list:
|
||||
raise UserError("功能刀具名称%s已存在,请重新输入" % name_list)
|
||||
records = super(ToolInventory, self).create(vals_list)
|
||||
return records
|
||||
|
||||
@@ -10,7 +10,6 @@ class ToolMaterialsBasicParameters(models.Model):
|
||||
standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具标准库')
|
||||
cutting_tool_type = fields.Char(related='standard_library_id.cutting_tool_type', string='刀具物料类型',
|
||||
store=True)
|
||||
is_cloud = fields.Boolean(related='standard_library_id.is_cloud', string='云端数据')
|
||||
|
||||
# 整体式刀具参数
|
||||
total_length = fields.Float('总长度(mm)')
|
||||
@@ -22,7 +21,7 @@ class ToolMaterialsBasicParameters(models.Model):
|
||||
handle_diameter = fields.Float('柄部直径(mm)')
|
||||
handle_length = fields.Float('柄部长度(mm)')
|
||||
blade_tip_diameter = fields.Integer('刀尖直径(mm)')
|
||||
blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角度)', size=20)
|
||||
blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20)
|
||||
blade_tip_taper = fields.Integer('刀尖锥度(°)')
|
||||
blade_diameter = fields.Float('刃部直径(mm)')
|
||||
blade_length = fields.Float('刃部长度(mm)')
|
||||
@@ -38,7 +37,7 @@ class ToolMaterialsBasicParameters(models.Model):
|
||||
cutting_blade_length = fields.Float('切削刃长(mm)')
|
||||
relief_angle = fields.Integer('后角(°)')
|
||||
blade_tip_circular_arc_radius = fields.Char('刀尖圆弧半径(mm)', size=20)
|
||||
inscribed_circle_diameter = fields.Float('内接圆直径IC/D(mm)')
|
||||
inscribed_circle_diameter = fields.Float('内接圆直径(mm)')
|
||||
install_aperture_diameter = fields.Float('安装孔直径(mm)')
|
||||
chip_breaker_groove = fields.Selection([('无', '无'), ('单面', '单面'), ('双面', '双面')],
|
||||
string='有无断屑槽')
|
||||
@@ -171,6 +170,8 @@ class FeedPerTooth(models.Model):
|
||||
feed_per_tooth = fields.Char('每齿走刀量 (mm/z)', size=20)
|
||||
active = fields.Boolean(string='有效', default=True)
|
||||
|
||||
|
||||
|
||||
# @api.depends('product_template_id')
|
||||
# def _compute_product_template_id(self):
|
||||
# if self.product_template_id is not None:
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
<record id="group_plan_dispatch" model="res.groups">
|
||||
<field name="name">计划调度岗</field>
|
||||
<field name="category_id" ref="module_category_plan"/>
|
||||
<!-- <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> -->
|
||||
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="group_plan_director" model="res.groups">
|
||||
|
||||
@@ -9,25 +9,19 @@ access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,b
|
||||
access_sf_machine_brand_tags_admin,sf_machine_brand_tags_admin,model_sf_machine_brand_tags,base.group_system,1,1,1,0
|
||||
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,base.group_user,1,1,1,0
|
||||
access_sf_machine_control_system_admin,sf_machine_control_system_admin,model_sf_machine_control_system,base.group_system,1,1,1,0
|
||||
access_sf_production_process_group_sale_director,sf_production_process_group_sale_director,model_sf_production_process,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_production_process_group_sale_salemanager,sf_production_process_group_sale_salemanager,model_sf_production_process,sf_base.group_sale_salemanager,1,0,0,0
|
||||
|
||||
access_sf_processing_order,sf_processing_order,model_sf_processing_order,base.group_user,1,1,1,0
|
||||
access_sf_processing_order_admin,sf_processing_order_admin,model_sf_processing_order,base.group_system,1,1,1,0
|
||||
access_sf_production_process,sf_production_process,model_sf_production_process,base.group_user,1,1,1,0
|
||||
access_sf_production_process_admin,sf_production_process_admin,model_sf_production_process,base.group_system,1,1,1,0
|
||||
access_sf_production_materials,sf_production_materials,model_sf_production_materials,base.group_user,1,1,1,0
|
||||
access_sf_production_materials_group_sale_director,sf_production_materials_group_sale_director,model_sf_production_materials,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_production_materials_group_sale_salemanager,sf_production_materials_group_sale_salemanager,model_sf_production_materials,sf_base.group_sale_salemanager,1,0,0,0
|
||||
|
||||
access_sf_production_materials_admin,sf_production_materials_admin,model_sf_production_materials,base.group_system,1,1,1,0
|
||||
access_sf_materials_model,sf_materials_model,model_sf_materials_model,base.group_user,1,1,1,0
|
||||
access_sf_materials_model_admin,sf_materials_model_admin,model_sf_materials_model,base.group_system,1,1,1,0
|
||||
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,base.group_user,1,1,1,0
|
||||
access_sf_processing_technology_admin,sf_processing_technology_admin,model_sf_processing_technology,base.group_system,1,1,1,0
|
||||
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,0
|
||||
access_sf_supplier_sort_admin,sf_supplier_sort_admin,model_sf_supplier_sort,base.group_system,1,1,1,0
|
||||
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,0
|
||||
access_sf_production_process_parameter_group_sale_director,sf_production_process_parameter_group_sale_director,model_sf_production_process_parameter,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_production_process_parameter_group_sale_salemanager,sf_production_process_parameter_group_sale_salemanager,model_sf_production_process_parameter,sf_base.group_sale_salemanager,1,0,0,0
|
||||
|
||||
|
||||
access_sf_production_process_parameter_group_plan_director,sf_production_process_parameter_group_plan_director,model_sf_production_process_parameter,sf_base.group_plan_director,1,0,0,0
|
||||
access_sf_production_process_parameter_group_purchase_director,sf_production_process_parameter_group_purchase_director,model_sf_production_process_parameter,sf_base.group_purchase_director,1,0,0,0
|
||||
access_sf_production_process_parameter_group_sale_director,sf_production_process_parameter_group_sale_director,model_sf_production_process_parameter,sf_base.group_sale_director,1,0,0,0
|
||||
@@ -43,6 +37,7 @@ access_sf_cutting_tool_type_admin,sf_cutting_tool_type_admin,model_sf_cutting_to
|
||||
access_sf_cutting_tool_type_group_purchase_director,sf_cutting_tool_type_group_purchase_director,model_sf_cutting_tool_type,sf_base.group_purchase_director,1,1,0,0
|
||||
access_sf_cutting_tool_type_group_sale_director,sf_cutting_tool_type_group_sale_director,model_sf_cutting_tool_type,sf_base.group_sale_director,1,1,0,0
|
||||
access_sf_cutting_tool_type_group_plan_director,sf_cutting_tool_type_group_plan_director,model_sf_cutting_tool_type,sf_base.group_plan_director,1,1,0,0
|
||||
|
||||
access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,base.group_user,1,1,1,0
|
||||
access_sf_functional_cutting_tool_admin,sf_functional_cutting_tool_admin,model_sf_functional_cutting_tool,base.group_system,1,1,1,0
|
||||
access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,base.group_user,1,1,1,0
|
||||
@@ -65,12 +60,6 @@ access_sf_international_standards,sf_international_standards,model_sf_internatio
|
||||
access_sf_international_standards_admin,sf_international_standards_admin,model_sf_international_standards,base.group_system,1,1,1,0
|
||||
access_material_apply,material_apply,model_material_apply,base.group_user,1,1,1,0
|
||||
access_material_apply_admin,material_apply_admin,model_material_apply,base.group_system,1,1,1,0
|
||||
access_material_apply_group_purchase_director,material_apply_group_purchase_director,model_material_apply,sf_base.group_purchase_director,1,0,0,0
|
||||
access_material_apply_group_sale_director,material_apply_group_sale_director,model_material_apply,sf_base.group_sale_director,1,0,0,0
|
||||
access_material_apply_group_plan_director,material_apply_group_plan_director,model_material_apply,sf_base.group_plan_director,1,0,0,0
|
||||
access_material_apply_group_purchase_director,material_apply_group_purchase_director,model_material_apply,sf_base.group_purchase_director,1,0,0,0
|
||||
access_material_apply_group_sale_salemanager,material_apply_group_sale_salemanager,model_material_apply,sf_base.group_sale_salemanager,1,0,0,0
|
||||
|
||||
access_sf_cutting_tool_standard_library,sf_cutting_tool_standard_library,model_sf_cutting_tool_standard_library,base.group_user,1,1,1,0
|
||||
access_sf_cutting_tool_standard_library_admin,sf_cutting_tool_standard_library_admin,model_sf_cutting_tool_standard_library,base.group_system,1,1,1,0
|
||||
access_sf_tool_materials_basic_parameters,sf_tool_materials_basic_parameters,model_sf_tool_materials_basic_parameters,base.group_user,1,1,1,0
|
||||
@@ -79,17 +68,10 @@ access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,
|
||||
access_sf_cutting_speed_admin,sf_cutting_speed_admin,model_sf_cutting_speed,base.group_system,1,1,1,0
|
||||
access_sf_cutting_speed_group_purchase_director,sf_cutting_speed_group_purchase_director,model_sf_cutting_speed,sf_base.group_purchase_director,1,1,1,0
|
||||
access_sf_cutting_speed_group_sale_director,sf_cutting_speed_group_sale_director,model_sf_cutting_speed,sf_base.group_sale_director,1,1,1,0
|
||||
access_sf_cutting_speed_group_plan_dispatch,sf_cutting_speed_group_plan_dispatch,model_sf_cutting_speed,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_sf_cutting_speed_group_plan_director,sf_cutting_speed_group_plan_director,model_sf_cutting_speed,sf_base.group_plan_director,1,1,1,0
|
||||
access_sf_cutting_speed_group_quality_director,sf_cutting_speed_group_quality_director,model_sf_cutting_speed,sf_base.group_quality_director,1,1,1,0
|
||||
access_sf_cutting_speed_group_quality,sf_cutting_speed_group_quality,model_sf_cutting_speed,sf_base.group_quality,1,1,1,0
|
||||
access_sf_feed_per_tooth_group_purchase_director,sf_feed_per_tooth_group_purchase_director,model_sf_feed_per_tooth,sf_base.group_purchase_director,1,1,0,0
|
||||
access_sf_feed_per_tooth_group_sale_director,sf_feed_per_tooth_group_sale_director,model_sf_feed_per_tooth,sf_base.group_sale_director,1,1,0,0
|
||||
access_sf_feed_per_tooth_group_plan_dispatch,sf_feed_per_tooth_group_plan_dispatch,model_sf_feed_per_tooth,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_sf_feed_per_tooth_group_plan_director,sf_feed_per_tooth_group_plan_director,model_sf_feed_per_tooth,sf_base.group_plan_director,1,1,0,0
|
||||
access_sf_feed_per_tooth_group_sale_salemanager,sf_feed_per_tooth_group_sale_salemanager,model_sf_feed_per_tooth,sf_base.group_sale_salemanager,1,0,0,0
|
||||
access_sf_feed_per_tooth_group_quality,sf_feed_per_tooth_group_quality,model_sf_feed_per_tooth,sf_base.group_quality,1,1,1,0
|
||||
access_sf_feed_per_tooth_group_quality_director,sf_feed_per_tooth_group_quality_director,model_sf_feed_per_tooth,sf_base.group_quality_director,1,1,1,0
|
||||
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,0
|
||||
access_sf_feed_per_tooth_admin,sf_feed_per_tooth_admin,model_sf_feed_per_tooth,base.group_system,1,1,1,0
|
||||
access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,base.group_user,1,1,1,1
|
||||
@@ -104,19 +86,17 @@ access_sf_machine_brand_group_purchase_director,sf_machine_brand_group_purchase_
|
||||
access_sf_machine_brand_group_sale_director,sf_machine_brand_group_sale_director,model_sf_machine_brand,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,base.group_user,1,1,1,1
|
||||
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_processing_order,sf_processing_order,model_sf_processing_order,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_production_process,sf_production_process,model_sf_production_process,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_production_materials,sf_production_materials,model_sf_production_materials,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_production_materials_group_plan_director,sf_production_materials_group_plan_director,model_sf_production_materials,sf_base.group_plan_director,1,1,0,0
|
||||
access_sf_production_materials_group_purchase_director,sf_production_materials_group_purchase_director,model_sf_production_materials,sf_base.group_purchase_director,1,1,0,0
|
||||
access_sf_production_materials_group_sale_director,sf_production_materials_group_sale_director,model_sf_production_materials,sf_base.group_sale_director,1,1,0,0
|
||||
access_sf_materials_model,sf_materials_model,model_sf_materials_model,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_materials_model_group_sale_salemanager,sf_materials_model_group_sale_salemanager,model_sf_materials_model,sf_base.group_sale_salemanager,1,0,0,0
|
||||
access_sf_materials_model_group_sale_director,sf_materials_model_group_sale_director,model_sf_materials_model,sf_base.group_sale_director,1,0,0,0
|
||||
|
||||
|
||||
access_sf_materials_model_group_plan_director,sf_materials_model_group_plan_director,model_sf_materials_model,sf_base.group_plan_director,1,0,0,0
|
||||
access_sf_materials_model_group_purchase_director,sf_materials_model_group_purchase_director,model_sf_materials_model,sf_base.group_purchase_director,1,0,0,0
|
||||
access_sf_materials_model_group_sale_director,sf_materials_model_group_sale_director,model_sf_materials_model,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
@@ -136,45 +116,57 @@ access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,s
|
||||
access_sf_sync_common,sf_sync_common,model_sf_sync_common,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_international_standards,sf_international_standards,model_sf_international_standards,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_material_apply,material_apply,model_material_apply,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
|
||||
access_sf_cutting_tool_standard_library_group_sf_mrp_user,sf_cutting_tool_standard_library_group_sf_mrp_user,model_sf_cutting_tool_standard_library,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_cutting_tool_standard_library_group_purchase_director,sf_cutting_tool_standard_library_group_purchase_director,model_sf_cutting_tool_standard_library,sf_base.group_purchase_director,1,0,1,0
|
||||
access_sf_cutting_tool_standard_library_group_plan_director,sf_cutting_tool_standard_library_group_plan_director,model_sf_cutting_tool_standard_library,sf_base.group_plan_director,1,0,1,0
|
||||
access_sf_cutting_tool_standard_library_group_sale_director,sf_cutting_tool_standard_library_group_sale_director,model_sf_cutting_tool_standard_library,sf_base.group_sale_director,1,0,1,0
|
||||
|
||||
access_sf_tool_groups,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_tool_materials_basic_parameters_group_sale_director,sf_tool_materials_basic_parameters_group_sale_director,model_sf_tool_materials_basic_parameters,sf_base.group_sale_director,1,0,1,0
|
||||
access_sf_tool_materials_basic_parameters_group_plan_director,sf_tool_materials_basic_parameters_group_plan_director,model_sf_tool_materials_basic_parameters,sf_base.group_plan_director,1,0,1,0
|
||||
access_sf_tool_materials_basic_parameters_group_purchase_director,sf_tool_materials_basic_parameters_group_purchase_director,model_sf_tool_materials_basic_parameters,sf_base.group_purchase_director,1,0,1,0
|
||||
|
||||
access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_cutting_speed_group_purchase,sf_cutting_speed_group_purchase,model_sf_cutting_speed,sf_base.group_purchase,1,0,0,0
|
||||
access_sf_cutting_speed_group_sale_salemanager,sf_cutting_speed_group_sale_salemanager,model_sf_cutting_speed,sf_base.group_sale_salemanager,1,0,0,0
|
||||
|
||||
|
||||
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_feed_per_tooth_group_purchase,sf_feed_per_tooth_group_purchase,model_sf_feed_per_tooth,sf_base.group_purchase,1,0,0,0
|
||||
access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_ramping_angle_group_purchase,sf_ramping_angle_group_purchase,model_sf_ramping_angle,sf_base.group_purchase,1,0,0,0
|
||||
access_sf_cutting_width_depth,sf_cutting_width_depth,model_sf_cutting_width_depth,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_cutting_width_depth_group_purchase,sf_cutting_width_depth_group_purchase,model_sf_cutting_width_depth,sf_base.group_purchase,1,0,0,0
|
||||
|
||||
access_maintenance_equipment_image,maintenance_equipment_image,model_maintenance_equipment_image,base.group_user,1,1,1,1
|
||||
access_purchase_order_group_purchase,access_purchase_order_group_purchase,purchase.model_purchase_order,sf_base.group_purchase,1,1,1,0
|
||||
access_purchase_order_group_purchase_director,access_purchase_order_group_purchase_director,purchase.model_purchase_order,sf_base.group_purchase_director,1,1,1,0
|
||||
access_purchase_order_line_group_purchase,access_purchase_order_line_group_purchase,purchase.model_purchase_order_line,sf_base.group_purchase,1,1,1,0
|
||||
access_purchase_order_line_group_purchase_director,access_purchase_order_line_group_purchase_director,purchase.model_purchase_order_line,sf_base.group_purchase_director,1,1,1,0
|
||||
access_spindle_taper_type,spindle_taper_type,model_spindle_taper_type,base.group_user,1,1,1,1
|
||||
|
||||
access_sf_tool_groups_group_plan_dispatch,sf_tool_groups,model_sf_tool_groups,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_sf_tool_groups_group_plan_director,sf_tool_groups,model_sf_tool_groups,sf_base.group_plan_director,1,1,1,0
|
||||
access_sf_tool_groups_group_sf_tool_user,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_tool_user,1,1,1,1
|
||||
|
||||
|
||||
|
||||
access_purchase_order,purchase.order,purchase.model_purchase_order,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_res_partner,res.partner,base.model_res_partner,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_purchase_order_line,purchase.order.line,purchase.model_purchase_order_line,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_account_move_line,account.move.line,account.model_account_move_line,sf_base.group_plan_dispatch,1,0,0,0
|
||||
|
||||
access_sf_machine_tool_type_group_plan_dispatch,sf.machine_tool.type,model_sf_machine_tool_type,sf_base.group_plan_dispatch,1,0,0,0
|
||||
|
||||
access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_processing_order,sf_processing_order,model_sf_processing_order,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_production_process,sf_production_process,model_sf_production_process,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_production_materials,sf_production_materials,model_sf_production_materials,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_materials_model,sf_materials_model,model_sf_materials_model,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
@@ -187,43 +179,10 @@ access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,sf_base
|
||||
access_sf_fixture_materials_basic_parameters,sf_fixture_materials_basic_parameters,model_sf_fixture_materials_basic_parameters,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
access_mrp_production_group_sale_salemanager,mrp_production_group_sale_salemanager,mrp.model_mrp_production,sf_base.group_sale_salemanager,1,0,0,0
|
||||
access_mrp_production_group_sale_director,mrp_production_group_sale_director,mrp.model_mrp_production,sf_base.group_sale_director,1,0,0,0
|
||||
|
||||
|
||||
access_material_apply_group_plan_dispatch,material_apply,model_material_apply,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_sf_machine_brand_tags_group_plan_dispatch,sf_machine_brand_tags,model_sf_machine_brand_tags,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_ir_actions_act_window_group_plan_dispatch,ir.actions.act_window,base.model_ir_actions_act_window,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_ir_actions_act_window_view_group_plan_dispatch,ir.actions.act_window.view,base.model_ir_actions_act_window_view,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_sf_supplier_sort_group_plan_dispatch,sf.supplier.sort,model_sf_supplier_sort,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_sf_international_standards_group_sale_salemanager,sf_international_standards_group_sale_salemanager,model_sf_international_standards,sf_base.group_sale_salemanager,1,0,0,0
|
||||
access_sf_international_standards_group_sale_director,sf_international_standards_group_sale_director,model_sf_international_standards,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_international_standards_group_plan_director,sf_international_standards_group_plan_director,model_sf_international_standards,sf_base.group_plan_director,1,0,0,0
|
||||
access_sf_international_standards_group_purchase,sf_international_standards_group_purchase,model_sf_international_standards,sf_base.group_purchase,1,0,0,0
|
||||
access_sf_international_standards_group_purchase_director,sf_international_standards_group_purchase_director,model_sf_international_standards,sf_base.group_purchase_director,1,0,0,0
|
||||
access_sf_machine_brand_tags_group_sale_salemanager,sf_machine_brand_tags_group_sale_salemanager,model_sf_machine_brand_tags,sf_base.group_sale_salemanager,1,0,0,0
|
||||
access_sf_machine_brand_tags_group_sale_director,sf_machine_brand_tags_group_sale_director,model_sf_machine_brand_tags,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_machine_brand_tags_group_plan_director,sf_machine_brand_tags_group_plan_director,model_sf_machine_brand_tags,sf_base.group_plan_director,1,0,0,0
|
||||
access_sf_machine_brand_tags_group_purchase,sf_machine_brand_tags_group_purchase,model_sf_machine_brand_tags,sf_base.group_purchase,1,0,0,0
|
||||
access_sf_machine_brand_tags_group_purchase_director,sf_machine_brand_tags_group_purchase_director,model_sf_machine_brand_tags,sf_base.group_purchase_director,1,0,0,0
|
||||
|
||||
|
||||
access_printer,printer,model_printer,base.group_user,1,1,1,1
|
||||
access_printer_configuration,printer.configuration,model_printer_configuration,base.group_user,1,1,1,1
|
||||
|
||||
access_group_sf_mrp_user,sf_tool_inventory,model_sf_tool_inventory,base.group_user,1,1,1,0
|
||||
access_group_sf_mrp_user_admin,sf_tool_inventory_admin,model_sf_tool_inventory,base.group_system,1,1,1,0
|
||||
access_group_sf_mrp_user_group_purchase_director,sf_tool_inventory_group_purchase_director,model_sf_tool_inventory,sf_base.group_purchase_director,1,0,1,0
|
||||
access_group_sf_mrp_user_group_sale_director,sf_tool_inventory_group_sale_director,model_sf_tool_inventory,sf_base.group_sale_director,1,0,1,0
|
||||
access_sf_cutting_tool_material_group_plan_director,sf_tool_inventory_group_plan_director,model_sf_tool_inventory,sf_base.group_plan_director,1,0,1,0
|
||||
access_group_sf_mrp_user_group_sf_mrp_user,sf_tool_inventory_group_sf_mrp_user,model_sf_tool_inventory,sf_base.group_sf_mrp_user,1,1,0,0
|
||||
|
||||
|
||||
access_sf_fixture_material_group_purchase_director,sf_fixture_material_group_purchase_director,model_sf_fixture_material,sf_base.group_purchase_director,1,0,0,0
|
||||
access_sf_multi_mounting_type_group_purchase_director,sf_multi_mounting_type_group_purchase_director,model_sf_multi_mounting_type,sf_base.group_purchase_director,1,0,0,0
|
||||
access_sf_fixture_model_group_purchase_director,sf_fixture_model_group_purchase_director,model_sf_fixture_model,sf_base.group_purchase_director,1,0,0,0
|
||||
access_sf_fixture_materials_basic_parameters_group_purchase_director,sf_fixture_materials_basic_parameters_group_purchase_director,model_sf_fixture_materials_basic_parameters,sf_base.group_purchase_director,1,0,0,0
|
||||
access_sf_machine_tool_type_group_purchase_director,sf_machine_tool_type_group_purchase_director,model_sf_machine_tool_type,sf_base.group_purchase_director,1,0,0,0
|
||||
|
||||
access_sf_fixture_material_group_sale_director,sf_fixture_material_group_sale_director,model_sf_fixture_material,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_multi_mounting_type_group_sale_director,sf_multi_mounting_type_group_sale_director,model_sf_multi_mounting_type,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_fixture_model_group_sale_director,sf_fixture_model_group_sale_director,model_sf_fixture_model,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_fixture_materials_basic_parameters_group_sale_director,sf_fixture_materials_basic_parameters_group_sale_director,model_sf_fixture_materials_basic_parameters,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_machine_tool_type_group_sale_director,sf_machine_tool_type_group_sale_director,model_sf_machine_tool_type,sf_base.group_sale_director,1,0,0,0
|
||||
|
||||
access_sf_supplier_sort_group_plan_dispatch,sf.supplier.sort,model_sf_supplier_sort,sf_base.group_plan_dispatch,1,0,0,0
|
||||
|
@@ -189,6 +189,3 @@ td.o_required_modifier {
|
||||
flex-direction: row !important;
|
||||
}
|
||||
|
||||
.supplier_ids_set_css thead th[data-name=partner_id]{
|
||||
width: 500px!important;
|
||||
}
|
||||
@@ -1,112 +0,0 @@
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<record id="view_printer_tree" model="ir.ui.view">
|
||||
<field name="name">printer.tree</field>
|
||||
<field name="model">printer</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Printer">
|
||||
<field name="name"/>
|
||||
<field name="ip_address"/>
|
||||
<field name="port"/>
|
||||
<!-- 其他字段... -->
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_printer_form" model="ir.ui.view">
|
||||
<field name="name">printer.form</field>
|
||||
<field name="model">printer</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Printer">
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="ip_address"/>
|
||||
<field name="port"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_printer_configuration_tree" model="ir.ui.view">
|
||||
<field name="name">printer.configuration.tree</field>
|
||||
<field name="model">printer.configuration</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Printer Configuration">
|
||||
<field name="name"/>
|
||||
<field name="printer_id"/>
|
||||
<field name="model"/>
|
||||
<!-- 其他字段... -->
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_printer_configuration_form" model="ir.ui.view">
|
||||
<field name="name">printer.configuration.form</field>
|
||||
<field name="model">printer.configuration</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Printer Configuration">
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="printer_id"/>
|
||||
<field name="model"/>
|
||||
<!-- 其他字段... -->
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- 其他视图... -->
|
||||
|
||||
<record id="action_printer" model="ir.actions.act_window">
|
||||
<field name="name">打印机</field>
|
||||
<field name="res_model">printer</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
<!-- Action to open the printer configuration list -->
|
||||
<record id="action_printer_configuration" model="ir.actions.act_window">
|
||||
<field name="name">打印配置</field>
|
||||
<field name="res_model">printer.configuration</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
<!-- Add a menu item for the printer configuration -->
|
||||
<!-- <record id="menu_printer_configuration" model="ir.ui.menu"> -->
|
||||
<!-- <field name="name">打印配置</field> -->
|
||||
<!-- <field name="action" ref="action_printer_configuration"/> -->
|
||||
<!-- <field name="parent_id" ref="base.menu_administration"/> -->
|
||||
<!-- </record> -->
|
||||
|
||||
<!-- <record id="menu_printer" model="ir.ui.menu"> -->
|
||||
<!-- <field name="name">打印机</field> -->
|
||||
<!-- <field name="action" ref="action_printer"/> -->
|
||||
<!-- <field name="parent_id" ref="menu_printer"/> -->
|
||||
<!-- </record> -->
|
||||
|
||||
<menuitem
|
||||
id="printer_main_menu"
|
||||
name="打印配置"
|
||||
sequence="10"
|
||||
parent="base.menu_administration"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_printer"
|
||||
name="打印机"
|
||||
action="action_printer"
|
||||
sequence="1"
|
||||
parent="printer_main_menu"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_printer_configuration"
|
||||
name="打印配置"
|
||||
action="action_printer_configuration"
|
||||
sequence="2"
|
||||
parent="printer_main_menu"/>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -98,7 +98,6 @@
|
||||
<field name="name" string="名称"/>
|
||||
<field name="machine_tool_category"/>
|
||||
<field name="brand_id"/>
|
||||
<field name="function_type"/>
|
||||
<field name="machine_tool_picture" widget="image"/>
|
||||
<field name="remark"/>
|
||||
</tree>
|
||||
@@ -123,7 +122,6 @@
|
||||
domain="[('tag_ids', '=', '机床')]"
|
||||
options="{'no_create': True}"/>
|
||||
<field name="machine_tool_category" required="1"/>
|
||||
<field name="function_type" required="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="machine_tool_picture" widget="image" nolabel="1"/>
|
||||
@@ -173,10 +171,6 @@
|
||||
<label for="workbench_W" string="宽"/>
|
||||
<field name="workbench_W" class="o_address_zip" required="1"
|
||||
options="{'format': false}"/>
|
||||
<span>&nbsp;</span>
|
||||
<label for="workbench_H" string="高"/>
|
||||
<field name="workbench_H" class="o_address_zip" required="1"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="workpiece_load"/>
|
||||
<label for="machine_tool_L" string="机床尺寸(mm)"/>
|
||||
@@ -243,15 +237,15 @@
|
||||
attrs="{'invisible': [('number_of_axles', '=', '三轴')]}"
|
||||
options="{'format': false}"/>
|
||||
<span>&nbsp;</span>
|
||||
<label for="c_axis" string="c"
|
||||
<label for="b_axis" string="b"
|
||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"/>
|
||||
<field name="c_axis" class="o_address_zip"
|
||||
<field name="b_axis" class="o_address_zip"
|
||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"
|
||||
options="{'format': false}"/>
|
||||
<span>&nbsp;</span>
|
||||
<label for="b_axis" string="b"
|
||||
<label for="c_axis" string="c"
|
||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"/>
|
||||
<field name="b_axis" class="o_address_zip"
|
||||
<field name="c_axis" class="o_address_zip"
|
||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
|
||||
@@ -1,61 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<!--表面工艺可选参数-->
|
||||
<record model="ir.ui.view" id="mrs_production_process_parameter_tree">
|
||||
<field name="model">sf.production.process.parameter</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="表面工艺可选参数" create="0" delete="0">
|
||||
<field name="code"/>
|
||||
<field name="name"/>
|
||||
<field name="gain_way"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="mrs_production_process_parameter_form">
|
||||
<field name="model">sf.production.process.parameter</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="表面工艺可选参数" create="0" delete="0">
|
||||
<sheet>
|
||||
<div class="oe_title">
|
||||
<h1>
|
||||
<field name="name" required="1" placeholder="名称"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="code" readonly="1"/>
|
||||
<field name="process_id" readonly="1"/>
|
||||
<field name="gain_way"/>
|
||||
</group>
|
||||
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="适用材料">
|
||||
<field name="materials_model_ids" readonly="1"></field>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="search_mrs_production_process_parameter_view">
|
||||
<field name="name">search.mrs.production.process.parameter</field>
|
||||
<field name="model">sf.production.process.parameter</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
||||
<field name="name" string="名称" filter_domain="[('name','ilike',self)]"/>
|
||||
<field name="code" string="编码" filter_domain="[('codeNum','ilike',self)]"/>
|
||||
<searchpanel class="account_root">
|
||||
<field name="process_id" icon="fa-filter"/>
|
||||
</searchpanel>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!--加工工艺-->
|
||||
<!-- <record model="ir.ui.view" id="sf_processing_technology_form">-->
|
||||
<!-- <field name="model">sf.processing.technology</field>-->
|
||||
@@ -75,26 +20,26 @@
|
||||
<!-- </form>-->
|
||||
<!-- </field>-->
|
||||
<!-- </record>-->
|
||||
<!-- <record model="ir.ui.view" id="sf_processing_technology_tree">-->
|
||||
<!-- <field name="model">sf.processing.technology</field>-->
|
||||
<!-- <field name="arch" type="xml">-->
|
||||
<!-- <tree string="加工工艺" create="0" edit="0" delete="1">-->
|
||||
<!-- <field name="code"/>-->
|
||||
<!-- <field name="name"/>-->
|
||||
<!-- </tree>-->
|
||||
<!-- </field>-->
|
||||
<!-- </record>-->
|
||||
<!-- <record model="ir.ui.view" id="search_sf_processing_technology_view">-->
|
||||
<!-- <field name="name">search.sf.processing.technology.type</field>-->
|
||||
<!-- <field name="model">sf.processing.technology</field>-->
|
||||
<!-- <field name="arch" type="xml">-->
|
||||
<!-- <search>-->
|
||||
<!-- <field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>-->
|
||||
<!-- <field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>-->
|
||||
<!-- <filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>-->
|
||||
<!-- </search>-->
|
||||
<!-- </field>-->
|
||||
<!-- </record>-->
|
||||
<record model="ir.ui.view" id="sf_processing_technology_tree">
|
||||
<field name="model">sf.processing.technology</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="加工工艺" create="0" edit="0" delete="1">
|
||||
<field name="code"/>
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="search_sf_processing_technology_view">
|
||||
<field name="name">search.sf.processing.technology.type</field>
|
||||
<field name="model">sf.processing.technology</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
|
||||
<field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>
|
||||
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!--表面工艺类别-->
|
||||
<record model="ir.ui.view" id="sf_production_process_category_form">
|
||||
@@ -211,7 +156,19 @@
|
||||
</form>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<page string="工序">
|
||||
<field name='processing_order_ids' options="{'no_create':True}" widget="one2many">
|
||||
<tree editable='bottom'>
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="processing_technology_ids" widget="many2many_tags">
|
||||
</field>
|
||||
</tree>
|
||||
<form>
|
||||
<field name="processing_technology_ids" widget="many2many">
|
||||
</field>
|
||||
</form>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</group>
|
||||
<group>
|
||||
@@ -231,9 +188,6 @@
|
||||
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
|
||||
<field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>
|
||||
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
||||
<searchpanel>
|
||||
<field name="category_id" icon="fa-building" enable_counters="1"/>
|
||||
</searchpanel>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
@@ -269,7 +223,7 @@
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="供应商">
|
||||
<field name='supplier_ids' class="supplier_ids_set_css">
|
||||
<field name='supplier_ids'>
|
||||
<tree editable='bottom'>
|
||||
<field name="sequence" widget="handle" string="序号"/>
|
||||
<field name="partner_id" string="名称"/>
|
||||
@@ -287,7 +241,7 @@
|
||||
<record model="ir.ui.view" id="sf_materials_model_tree">
|
||||
<field name="model">sf.materials.model</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="材料型号" delete="0">
|
||||
<tree string="材料型号" delete="0">
|
||||
<field name="materials_no"/>
|
||||
<field name="materials_code"/>
|
||||
<field name="name"/>
|
||||
@@ -396,12 +350,12 @@
|
||||
<field name="res_model">sf.materials.model</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
<!-- <record id="sf_processing_technology" model="ir.actions.act_window">-->
|
||||
<!-- <field name="name">加工工艺</field>-->
|
||||
<!-- <field name="type">ir.actions.act_window</field>-->
|
||||
<!-- <field name="res_model">sf.processing.technology</field>-->
|
||||
<!-- <field name="view_mode">tree</field>-->
|
||||
<!-- </record>-->
|
||||
<record id="sf_processing_technology" model="ir.actions.act_window">
|
||||
<field name="name">加工工艺</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">sf.processing.technology</field>
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_production_process_category" model="ir.actions.act_window">
|
||||
<field name="name">表面工艺类别</field>
|
||||
@@ -409,12 +363,6 @@
|
||||
<field name="res_model">sf.production.process.category</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
<record id="mrs_production_process_parameter_action" model="ir.actions.act_window">
|
||||
<field name="name">表面工艺可选参数</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">sf.production.process.parameter</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
|
||||
</data>
|
||||
|
||||
@@ -165,7 +165,6 @@
|
||||
<field name="zero_chuck_ids"
|
||||
attrs="{'invisible': [('fixture_material_type', '!=', '零点卡盘')]}">
|
||||
<tree editable="bottom" class="center" delete="0">
|
||||
<field name="code" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="length"/>
|
||||
<field name="width"/>
|
||||
@@ -191,7 +190,6 @@
|
||||
<field name="zero_tray_ids"
|
||||
attrs="{'invisible': [('fixture_material_type', '!=', '零点托盘')]}">
|
||||
<tree editable="bottom" class="center" delete="0">
|
||||
<field name="code" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="length"/>
|
||||
<field name="width"/>
|
||||
@@ -215,7 +213,6 @@
|
||||
<field name="pneumatic_fixture_ids"
|
||||
attrs="{'invisible': [('fixture_material_type', '!=', '气动夹具')]}">
|
||||
<tree editable="bottom" class="center" delete="0">
|
||||
<field name="code" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="length"/>
|
||||
<field name="width"/>
|
||||
@@ -243,7 +240,6 @@
|
||||
<field name="jaw_vice_fixture_ids"
|
||||
attrs="{'invisible': [('fixture_material_type', '!=', '虎钳夹具')]}">
|
||||
<tree editable="bottom" class="center" delete="0">
|
||||
<field name="code" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="length"/>
|
||||
<field name="width"/>
|
||||
@@ -272,7 +268,6 @@
|
||||
<field name="magnet_fixture_ids"
|
||||
attrs="{'invisible': [('fixture_material_type', '!=', '磁吸夹具')]}">
|
||||
<tree editable="bottom" class="center" delete="0">
|
||||
<field name="code" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="length"/>
|
||||
<field name="width"/>
|
||||
@@ -302,7 +297,6 @@
|
||||
<field name="adapter_board_fixture_ids"
|
||||
attrs="{'invisible': [('fixture_material_type', '!=', '转接板(锁板)夹具')]}">
|
||||
<tree editable="bottom" class="center" delete="0">
|
||||
<field name="code" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="length"/>
|
||||
<field name="width"/>
|
||||
@@ -329,7 +323,6 @@
|
||||
<field name="scroll_chuck_ids"
|
||||
attrs="{'invisible': [('fixture_material_type', '!=', '三爪卡盘')]}">
|
||||
<tree editable="bottom" class="center" delete="0">
|
||||
<field name="code" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="length"/>
|
||||
<field name="width"/>
|
||||
|
||||
@@ -111,19 +111,13 @@
|
||||
|
||||
/>
|
||||
|
||||
<menuitem
|
||||
id="mrs_production_process_parameter_view"
|
||||
name="表面工艺可选参数"
|
||||
|
||||
<menuitem
|
||||
id="menu_sf_processing_technology"
|
||||
name="加工工艺"
|
||||
parent="menu_sf_production_process_1"
|
||||
sequence="2"
|
||||
action="mrs_production_process_parameter_action"
|
||||
/>
|
||||
<!-- <menuitem-->
|
||||
<!-- id="menu_sf_processing_technology"-->
|
||||
<!-- name="加工工艺"-->
|
||||
<!-- parent="menu_sf_production_process_1"-->
|
||||
<!-- sequence="3"-->
|
||||
<!-- action="sf_processing_technology"/>-->
|
||||
sequence="3"
|
||||
action="sf_processing_technology"/>
|
||||
|
||||
<!-- <menuitem-->
|
||||
<!-- id="menu_sf_partner_views"-->
|
||||
@@ -149,6 +143,5 @@
|
||||
sequence="1"
|
||||
action="action_sf_machine_control_system"/>
|
||||
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,302 +1,132 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<!-- ================================================刀具基础参数================================================ -->
|
||||
<record id="view_sf_tool_materials_basic_parameters_integral_tree" model="ir.ui.view">
|
||||
<field name="name">sf.tool.materials.basic.parameters.tree</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="基础参数" delete="0" create="0" edit="0" sample="1">
|
||||
<field name="total_length"/>
|
||||
<field name="blade_number"/>
|
||||
<field name="neck_diameter"/>
|
||||
<field name="neck_length"/>
|
||||
<field name="handle_diameter"/>
|
||||
<field name="handle_length"/>
|
||||
<field name="blade_tip_diameter"/>
|
||||
<field name="blade_tip_working_size"/>
|
||||
<field name="blade_tip_taper"/>
|
||||
<field name="blade_diameter"/>
|
||||
<field name="blade_length"/>
|
||||
<field name="blade_helix_angle"/>
|
||||
<field name="blade_width"/>
|
||||
<field name="blade_width"/>
|
||||
<field name="pitch"/>
|
||||
<field name="cutting_depth"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<!-- ================================================刀具基础参数================================================ -->
|
||||
<record id="view_sf_tool_materials_basic_parameters_integral_tree" model="ir.ui.view">
|
||||
<field name="name">sf.tool.materials.basic.parameters.tree</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="基础参数" delete="0" create="0" edit="0" sample="1">
|
||||
<field name="total_length" />
|
||||
<field name="blade_number" />
|
||||
<field name="neck_diameter"/>
|
||||
<field name="neck_length"/>
|
||||
<field name="handle_diameter" />
|
||||
<field name="handle_length" />
|
||||
<field name="blade_tip_diameter"/>
|
||||
<field name="blade_tip_working_size"/>
|
||||
<field name="blade_tip_taper" />
|
||||
<field name="blade_diameter" />
|
||||
<field name="blade_length"/>
|
||||
<field name="blade_helix_angle"/>
|
||||
<field name="blade_width" />
|
||||
<field name="blade_width" />
|
||||
<field name="pitch"/>
|
||||
<field name="cutting_depth"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_sf_tool_materials_basic_parameters_blade_tree" model="ir.ui.view">
|
||||
<field name="name">sf.tool.materials.basic.parameters.tree</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="基础参数" delete="0" create="0">
|
||||
<field name="total_length"/>
|
||||
<field name="length"/>
|
||||
<field name="thickness"/>
|
||||
<field name="width"/>
|
||||
<field name="cutting_blade_length"/>
|
||||
<field name="relief_angle"/>
|
||||
<field name="blade_tip_circular_arc_radius"/>
|
||||
<field name="inscribed_circle_diameter"/>
|
||||
<field name="install_aperture_diameter"/>
|
||||
<field name="chip_breaker_groove"/>
|
||||
<field name="blade_teeth_model"/>
|
||||
<field name="blade_blade_number"/>
|
||||
<field name="main_included_angle"/>
|
||||
<field name="top_angle"/>
|
||||
<field name="thread_model"/>
|
||||
<field name="thread_num"/>
|
||||
<field name="blade_tip_height_tolerance"/>
|
||||
<field name="inscribed_circle_tolerance"/>
|
||||
<field name="thickness_tolerance"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_sf_tool_materials_basic_parameters_blade_tree" model="ir.ui.view">
|
||||
<field name="name">sf.tool.materials.basic.parameters.tree</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="基础参数" delete="0" create="0">
|
||||
<field name="total_length" />
|
||||
<field name="length" />
|
||||
<field name="thickness"/>
|
||||
<field name="width"/>
|
||||
<field name="cutting_blade_length" />
|
||||
<field name="relief_angle" />
|
||||
<field name="blade_tip_circular_arc_radius"/>
|
||||
<field name="inscribed_circle_diameter"/>
|
||||
<field name="install_aperture_diameter" />
|
||||
<field name="chip_breaker_groove" />
|
||||
<field name="blade_teeth_model"/>
|
||||
<field name="blade_blade_number"/>
|
||||
<field name="main_included_angle" />
|
||||
<field name="top_angle" />
|
||||
<field name="thread_model"/>
|
||||
<field name="thread_num" />
|
||||
<field name="blade_tip_height_tolerance" />
|
||||
<field name="inscribed_circle_tolerance"/>
|
||||
<field name="thickness_tolerance"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_sf_tool_materials_basic_parameters_cutter_bar_tree" model="ir.ui.view">
|
||||
<field name="name">sf.tool.materials.basic.parameters.tree</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="基础参数" delete="0" create="0">
|
||||
<field name="total_length"/>
|
||||
<field name="height"/>
|
||||
<field name="blade_height"/>
|
||||
<field name="cut_depth_max"/>
|
||||
<field name="cutter_arbor_diameter"/>
|
||||
<field name="min_machining_aperture"/>
|
||||
<field name="install_blade_tip_num"/>
|
||||
<field name="cutting_blade_model"/>
|
||||
<field name="is_cooling_hole"/>
|
||||
<field name="locating_slot_code"/>
|
||||
<field name="installing_structure"/>
|
||||
<field name="blade_id"/>
|
||||
<field name="tool_shim"/>
|
||||
<field name="cotter_pin"/>
|
||||
<field name="pressing_plate"/>
|
||||
<field name="screw"/>
|
||||
<field name="spanner"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<field name="name">sf.tool.materials.basic.parameters.tree</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="基础参数" delete="0" create="0">
|
||||
<field name="total_length" />
|
||||
<field name="height" />
|
||||
<field name="blade_height"/>
|
||||
<field name="cut_depth_max"/>
|
||||
<field name="cutter_arbor_diameter" />
|
||||
<field name="min_machining_aperture" />
|
||||
<field name="install_blade_tip_num"/>
|
||||
<field name="cutting_blade_model"/>
|
||||
<field name="is_cooling_hole" />
|
||||
<field name="locating_slot_code" />
|
||||
<field name="installing_structure"/>
|
||||
<field name="blade_id"/>
|
||||
<field name="tool_shim" />
|
||||
<field name="cotter_pin" />
|
||||
<field name="pressing_plate"/>
|
||||
<field name="screw"/>
|
||||
<field name="spanner" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="view_sf_tool_materials_basic_parameters_tree" model="ir.ui.view">
|
||||
<field name="name">sf.tool.materials.basic.parameters.tree</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="基础参数">
|
||||
<field name="total_length"/>
|
||||
<field name="blade_number"/>
|
||||
<field name="neck_diameter"/>
|
||||
<field name="neck_length"/>
|
||||
<field name="handle_diameter"/>
|
||||
<field name="handle_length"/>
|
||||
<field name="blade_tip_diameter"/>
|
||||
<field name="blade_tip_working_size"/>
|
||||
<field name="blade_tip_taper"/>
|
||||
<field name="blade_diameter"/>
|
||||
<field name="blade_length"/>
|
||||
<field name="blade_helix_angle"/>
|
||||
<field name="blade_width"/>
|
||||
<field name="blade_width"/>
|
||||
<field name="pitch"/>
|
||||
<field name="cutting_depth"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<field name="name">sf.tool.materials.basic.parameters.tree</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="基础参数" >
|
||||
<field name="total_length" />
|
||||
<field name="blade_number" />
|
||||
<field name="neck_diameter"/>
|
||||
<field name="neck_length"/>
|
||||
<field name="handle_diameter" />
|
||||
<field name="handle_length" />
|
||||
<field name="blade_tip_diameter"/>
|
||||
<field name="blade_tip_working_size"/>
|
||||
<field name="blade_tip_taper" />
|
||||
<field name="blade_diameter" />
|
||||
<field name="blade_length"/>
|
||||
<field name="blade_helix_angle"/>
|
||||
<field name="blade_width" />
|
||||
<field name="blade_width" />
|
||||
<field name="pitch"/>
|
||||
<field name="cutting_depth"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="ir.ui.view" id="view_sf_tool_materials_basic_parameters_search">
|
||||
<field name="name">sf.tool.materials.basic.parameters.search</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<field name="name"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="view_sf_tool_materials_basic_parameters_search">
|
||||
<field name="name">sf.tool.materials.basic.parameters.search</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<field name="name"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_sf_tool_materials_basic_parameters_form" model="ir.ui.view">
|
||||
<field name="name">sf.tool.materials.basic.parameters.form</field>
|
||||
<field name="model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="规则">
|
||||
<sheet>
|
||||
<field name="cutting_tool_type" invisible="1"/>
|
||||
<field name="standard_library_id" invisible="1"/>
|
||||
<group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
|
||||
<field name="total_length"/>
|
||||
<field name="blade_diameter" class="diameter"/>
|
||||
<field name="blade_length"/>
|
||||
<field name="blade_number"/>
|
||||
<field name="neck_length"/>
|
||||
<field name="neck_diameter" class="diameter"/>
|
||||
<field name="handle_diameter" class="diameter"/>
|
||||
<field name="handle_length"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
|
||||
<field name="blade_tip_working_size"/>
|
||||
<field name="blade_tip_diameter" class="diameter"/>
|
||||
<field name="blade_tip_taper"/>
|
||||
<field name="blade_helix_angle"/>
|
||||
<field name="pitch"/>
|
||||
<field name="blade_width"/>
|
||||
<field name="blade_depth"/>
|
||||
<field name="cut_depth_max"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}">
|
||||
<field name="length"/>
|
||||
<field name="thickness"/>
|
||||
<field name="inscribed_circle_diameter" class="diameter"/>
|
||||
<field name="install_aperture_diameter" class="diameter" string="安装孔直径D1(mm)"/>
|
||||
<field name="blade_tip_circular_arc_radius" string="刀尖圆弧半径RE(mm)"/>
|
||||
<field name="cutting_blade_length"/>
|
||||
<field name="relief_angle"/>
|
||||
<field name="chip_breaker_groove"/>
|
||||
<field name="chip_breaker_type_code"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}">
|
||||
<field name="blade_teeth_model"/>
|
||||
<field name="thread_model"/>
|
||||
<field name="pitch"/>
|
||||
<field name="thread_num"/>
|
||||
<field name="cut_depth_max"/>
|
||||
<field name="blade_blade_number" string="刃数"/>
|
||||
<field name="blade_width" string="刃宽"/>
|
||||
<field name="main_included_angle"/>
|
||||
<field name="top_angle"/>
|
||||
<field name="blade_tip_height_tolerance"/>
|
||||
<field name="inscribed_circle_tolerance"/>
|
||||
<field name="thickness_tolerance"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}">
|
||||
<field name="total_length"/>
|
||||
<field name="width"/>
|
||||
<field name="height"/>
|
||||
<label for="knife_head_length" string="刀头尺寸"/>
|
||||
<div class="test_model">
|
||||
<label for="knife_head_length" string="长"/>
|
||||
<field name="knife_head_length" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<label for="knife_head_width" string="宽"/>
|
||||
<field name="knife_head_width" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<label for="knife_head_height" string="高"/>
|
||||
<field name="knife_head_height" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="blade_diameter" class="diameter"/>
|
||||
<field name="cutter_arbor_diameter" class="diameter"/>
|
||||
<field name="is_cooling_hole"/>
|
||||
<field name="locating_slot_code"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}">
|
||||
<field name="main_included_angle"/>
|
||||
<field name="relief_angle"/>
|
||||
<field name="cutting_blade_length"/>
|
||||
<field name="cut_depth_max"/>
|
||||
<field name="min_machining_aperture"/>
|
||||
<field name="install_blade_tip_num"/>
|
||||
<field name="installing_structure"/>
|
||||
<field name="blade_id" options="{'no_create': True}"/>
|
||||
<field name="tool_shim"/>
|
||||
<field name="cotter_pin"/>
|
||||
<field name="pressing_plate"/>
|
||||
<field name="screw"/>
|
||||
<field name="spanner"/>
|
||||
</group>
|
||||
<record id="action_sf_tool_materials_basic_parameters" model="ir.actions.act_window">
|
||||
<field name="name">基础参数</field>
|
||||
<field name="res_model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="view_mode">tree</field>
|
||||
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}">
|
||||
<field name="install_blade_tip_num"/>
|
||||
<field name="blade_diameter" class="diameter"/>
|
||||
<field name="cutter_head_diameter" class="diameter"/>
|
||||
<field name="interface_diameter" class="diameter"/>
|
||||
<field name="total_length"/>
|
||||
<field name="blade_length"/>
|
||||
<field name="cutting_blade_length"/>
|
||||
<field name="cut_depth_max"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}">
|
||||
<field name="main_included_angle"/>
|
||||
<field name="installing_structure"/>
|
||||
<field name="blade_id" options="{'no_create': True}"/>
|
||||
<field name="screw"/>
|
||||
<field name="spanner"/>
|
||||
<field name="is_cooling_hole"/>
|
||||
<field name="locating_slot_code"/>
|
||||
</group>
|
||||
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}">
|
||||
<field name="er_size_model" string="尺寸型号"/>
|
||||
<label for="min_clamping_diameter" string="夹持直径"/>
|
||||
<div class="test_model">
|
||||
<label for="min_clamping_diameter" string="最小"/>
|
||||
<field name="min_clamping_diameter" class="o_address_zip diameter"
|
||||
options="{'format': false}"/>
|
||||
<label for="max_clamping_diameter" string="最大"/>
|
||||
<field name="max_clamping_diameter" class="o_address_zip diameter"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="total_length"/>
|
||||
<field name="outer_diameter" class="diameter"/>
|
||||
<field name="inner_diameter" class="diameter"/>
|
||||
<field name="taper"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}">
|
||||
<field name="run_out_accuracy"/>
|
||||
<field name="top_diameter" class="diameter"/>
|
||||
<field name="weight"/>
|
||||
<field name="max_load_capacity"/>
|
||||
<field name="cooling_jacket"/>
|
||||
</group>
|
||||
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}">
|
||||
<field name="taper_shank_model"/>
|
||||
<field name="total_length"/>
|
||||
<field name="shank_length"/>
|
||||
<field name="shank_diameter" class="diameter"/>
|
||||
<field name="flange_shank_length"/>
|
||||
<field name="flange_diameter" class="diameter"/>
|
||||
<field name="diameter_slip_accuracy"/>
|
||||
<field name="dynamic_balance_class"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}">
|
||||
<label for="min_clamping_diameter" string="夹持直径"/>
|
||||
<div class="test_model">
|
||||
<label for="min_clamping_diameter" string="最小"/>
|
||||
<field name="min_clamping_diameter" class="o_address_zip diameter"
|
||||
options="{'format': false}"/>
|
||||
<label for="max_clamping_diameter" string="最大"/>
|
||||
<field name="max_clamping_diameter" class="o_address_zip diameter"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="max_rotate_speed"/>
|
||||
<field name="fit_chuck_size"/>
|
||||
<field name="nut"/>
|
||||
<field name="spanner"/>
|
||||
<field name="clamping_mode"/>
|
||||
<field name="tool_changing_time"/>
|
||||
<field name="cooling_model"/>
|
||||
<field name="is_quick_cutting"/>
|
||||
<field name="is_safe_lock"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_sf_tool_materials_basic_parameters" model="ir.actions.act_window">
|
||||
<field name="name">基础参数</field>
|
||||
<field name="res_model">sf.tool.materials.basic.parameters</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="context">{'default_cutting_tool_type': cutting_tool_type}</field>
|
||||
<field name="domain">[]</field>
|
||||
<!-- <field name="multi">false</field>-->
|
||||
</record>
|
||||
<!-- <field name="context">{'selection_mode': 'single'}</field>-->
|
||||
<field name="domain">[]</field>
|
||||
<!-- <field name="multi">false</field>-->
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
<field name="name">刀具标准库</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">sf.cutting_tool.standard.library</field>
|
||||
<!-- <field name="context">{'default_cutting_tool_material_id': cutting_tool_material_id}</field>-->
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
<!-- 功能刀具action -->
|
||||
@@ -59,54 +58,46 @@
|
||||
id="menu_sf_cutting_tool_type"
|
||||
parent="menu_sf_cutting_tool"
|
||||
name="刀具类型"
|
||||
sequence="10"
|
||||
sequence="2"
|
||||
action="action_sf_cutting_tool_type"
|
||||
/>
|
||||
<menuitem
|
||||
id="menu_sf_cutting_tool_standard_library"
|
||||
parent="menu_sf_cutting_tool"
|
||||
name="刀具标准库"
|
||||
sequence="20"
|
||||
sequence="3"
|
||||
action="action_sf_cutting_tool_standard_library"
|
||||
/>
|
||||
|
||||
<menuitem
|
||||
id="menu_sf_tool_inventory"
|
||||
parent="menu_sf_cutting_tool"
|
||||
name="功能刀具清单"
|
||||
sequence="25"
|
||||
action="action_sf_tool_inventory"
|
||||
/>
|
||||
<!-- 功能刀具 -->
|
||||
<!-- <menuitem-->
|
||||
<!-- id="menu_sf_functional_cutting_tool"-->
|
||||
<!-- parent="menu_sf_cutting_tool"-->
|
||||
<!-- name="功能刀具"-->
|
||||
<!-- sequence="5"-->
|
||||
<!-- action="action_sf_functional_cutting_tool"-->
|
||||
<!-- />-->
|
||||
<!-- <menuitem-->
|
||||
<!-- id="menu_sf_functional_cutting_tool"-->
|
||||
<!-- parent="menu_sf_cutting_tool"-->
|
||||
<!-- name="功能刀具"-->
|
||||
<!-- sequence="5"-->
|
||||
<!-- action="action_sf_functional_cutting_tool"-->
|
||||
<!-- />-->
|
||||
<!-- 功能刀具类型 -->
|
||||
<menuitem
|
||||
id="menu_sf_functional_cutting_tool_model_type"
|
||||
parent="menu_sf_cutting_tool"
|
||||
name="功能刀具类型"
|
||||
sequence="30"
|
||||
sequence="4"
|
||||
action="action_sf_functional_cutting_tool_model_type"
|
||||
/>
|
||||
|
||||
<menuitem
|
||||
id="menu_sf_maintenance_equipment_image"
|
||||
name="能力特征库"
|
||||
parent="menu_sf_cutting_tool"
|
||||
action="action_maintenance_equipment_image"
|
||||
sequence="40"/>
|
||||
id="menu_sf_maintenance_equipment_image"
|
||||
name="能力特征库"
|
||||
parent="menu_sf_cutting_tool"
|
||||
action="action_maintenance_equipment_image"
|
||||
sequence="5"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_sf_tool_groups"
|
||||
name="刀具组"
|
||||
parent="menu_sf_cutting_tool"
|
||||
action="sf_tool_groups_view_act"
|
||||
sequence="50"/>
|
||||
id="menu_sf_tool_groups"
|
||||
name="刀具组"
|
||||
parent="menu_sf_cutting_tool"
|
||||
action="sf_tool_groups_view_act"
|
||||
sequence="10"/>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
@@ -123,19 +123,19 @@
|
||||
<form string="刀具标准库" delete="0" create="0" edit="0">
|
||||
<sheet>
|
||||
<field name="image" widget='image' class="oe_avatar"
|
||||
required="1"/>
|
||||
options="{'zoom': true, 'preview_image':'image_128'}"/>
|
||||
<div class="oe_title">
|
||||
<h1>
|
||||
<field name="code" readonly="1" force_save="1"/>
|
||||
<field name="code"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="cutting_tool_material_id" readonly="1"/>
|
||||
<field name="cutting_tool_type" invisible="1"/>
|
||||
<field name="cutting_tool_type_id" required="1"/>
|
||||
<field name="brand_id" required="1"/>
|
||||
<field name="cutting_tool_material_id"/>
|
||||
<field name="cutting_tool_type"/>
|
||||
<field name="cutting_tool_type_id"/>
|
||||
<field name="brand_id"/>
|
||||
<label for="integral_run_out_accuracy_min" string="端跳精度"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<div class="o_address_format"
|
||||
@@ -165,7 +165,8 @@
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="material_model_id" placeholder="请选择" string="材质"/>
|
||||
<field name="material_model_id" placeholder="请选择" string="材质"
|
||||
attrs="{'required': [('cutting_tool_type', 'not in', ['刀柄', '夹头'])]}"/>
|
||||
<field name="tool_hardness" string="硬度(hrc)" options="{'format': false}"
|
||||
widget="integer"/>
|
||||
<field name="coating_material"/>
|
||||
@@ -504,23 +505,11 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_tool_groups_search" model="ir.ui.view">
|
||||
<field name="name">刀具组搜索</field>
|
||||
<field name="model">sf.tool.groups</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<field name="name"/>
|
||||
<field name="equipment_ids"/>
|
||||
<filter string="已归档" name="inactive" domain="[('active', '=', False)]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_tool_groups_view_act" model="ir.actions.act_window">
|
||||
<field name="name">刀具组</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">sf.tool.groups</field>
|
||||
<field name="view_mode">tree,search</field>
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
|
||||
<!-- ================================================刀具基础参数================================================ -->
|
||||
@@ -547,66 +536,7 @@
|
||||
<!-- <field name="cutting_depth"/>-->
|
||||
<!-- </tree>-->
|
||||
<!-- </field>-->
|
||||
<!-- </record>-->'
|
||||
<!-- </record>-->
|
||||
|
||||
<!-- ================================================功能刀具清单================================================ -->
|
||||
<record id="view_tool_inventory_tree" model="ir.ui.view">
|
||||
<field name="name">sf.tool.inventory.tree</field>
|
||||
<field name="model">sf.tool.inventory</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="功能刀具清单" create="1" edit="1" delete="0" editable="bottom">
|
||||
<field name="name"/>
|
||||
<field name="functional_cutting_tool_model_id"/>
|
||||
<field name="tool_groups_id"/>
|
||||
<field name="work_material"/>
|
||||
<field name="life_span"/>
|
||||
<field name="prefix" optional="hide"/>
|
||||
<field name="postfix" optional="hide"/>
|
||||
<field name="diameter"/>
|
||||
<field name="angle"/>
|
||||
<field name="tool_length"/>
|
||||
<field name="blade_length"/>
|
||||
<field name="knife_head_name" optional="hide"/>
|
||||
<field name="cutter_number"/>
|
||||
<field name="blade_number"/>
|
||||
<field name="extension"/>
|
||||
<field name="create_uid" string="创建人" optional="hide"/>
|
||||
<field name="create_date" string="创建时间" optional="hide"/>
|
||||
<field name="type" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_cutting_tool_material_search">
|
||||
<field name="name">sf.tool.inventory.search</field>
|
||||
<field name="model">sf.tool.inventory</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="功能刀具清单">
|
||||
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
|
||||
<field name="functional_cutting_tool_model_id"/>
|
||||
<field name="tool_groups_id"/>
|
||||
<field name="work_material"/>
|
||||
<field name="life_span"/>
|
||||
<field name="prefix"/>
|
||||
<field name="postfix"/>
|
||||
<field name="diameter"/>
|
||||
<field name="angle"/>
|
||||
<field name="tool_length"/>
|
||||
<field name="blade_length"/>
|
||||
<field name="knife_head_name"/>
|
||||
<field name="cutter_number"/>
|
||||
<field name="blade_number"/>
|
||||
<field name="extension"/>
|
||||
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_sf_tool_inventory" model="ir.actions.act_window">
|
||||
<field name="name">功能刀具清单</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">sf.tool.inventory</field>
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -16,7 +16,7 @@ class Sf_Bf_Connect(http.Controller):
|
||||
:return:
|
||||
"""
|
||||
res = {'status': 1, 'factory_order_no': ''}
|
||||
logging.info('get_bfm_process_order_list:%s' % kw['order_number'])
|
||||
logging.info('get_bfm_process_order_list:%s' % kw)
|
||||
try:
|
||||
product_id = request.env.ref('sf_dlm.product_template_sf').sudo()
|
||||
self_machining_id = request.env.ref('sf_dlm.product_embryo_sf_self_machining').sudo()
|
||||
@@ -62,7 +62,7 @@ class Sf_Bf_Connect(http.Controller):
|
||||
request.env.ref("base.user_admin")).bom_create_line(
|
||||
self_machining_embryo)
|
||||
if not self_machining_bom_line:
|
||||
res['status'] = -2
|
||||
res['status'] = 2
|
||||
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配'
|
||||
request.cr.rollback()
|
||||
return json.JSONEncoder().encode(res)
|
||||
@@ -79,11 +79,6 @@ class Sf_Bf_Connect(http.Controller):
|
||||
order_id,
|
||||
'subcontract',
|
||||
i)
|
||||
if outsource_embryo == -3:
|
||||
res['status'] = -3
|
||||
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未设置获取方式和供应商,请先配置再进行分配'
|
||||
request.cr.rollback()
|
||||
return json.JSONEncoder().encode(res)
|
||||
# 创建坯料的bom
|
||||
outsource_bom = request.env['mrp.bom'].with_user(request.env.ref("base.user_admin")).bom_create(
|
||||
outsource_embryo,
|
||||
@@ -92,7 +87,7 @@ class Sf_Bf_Connect(http.Controller):
|
||||
outsource_bom_line = outsource_bom.with_user(
|
||||
request.env.ref("base.user_admin")).bom_create_line(outsource_embryo)
|
||||
if not outsource_bom_line:
|
||||
res['status'] = -2
|
||||
res['status'] = 2
|
||||
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配'
|
||||
request.cr.rollback()
|
||||
return json.JSONEncoder().encode(res)
|
||||
@@ -106,11 +101,6 @@ class Sf_Bf_Connect(http.Controller):
|
||||
item,
|
||||
order_id,
|
||||
'purchase', i)
|
||||
if purchase_embryo == -3:
|
||||
res['status'] = -3
|
||||
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未设置获取方式和供应商,请先配置再进行分配'
|
||||
request.cr.rollback()
|
||||
return json.JSONEncoder().encode(res)
|
||||
# 产品配置bom
|
||||
product_bom_purchase = request.env['mrp.bom'].with_user(
|
||||
request.env.ref("base.user_admin")).bom_create(product, 'normal', False)
|
||||
@@ -153,17 +143,3 @@ class jdElcp(http.Controller):
|
||||
aa.bill_url = kw['bill']
|
||||
logging.info('get_jd_bill================:%s' %
|
||||
aa.bill_url)
|
||||
|
||||
@http.route('/api/update/order/status', type='http', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def update_order_status(self, **kw):
|
||||
"""
|
||||
根据拿到的商家单号,修改订单状态
|
||||
"""
|
||||
logging.info('change_sale_order_state================:%s', kw)
|
||||
if not kw.get('orderNo'):
|
||||
return json.dumps({'statusCode': 415, 'statusMessage': '订单号不能为空'}, ensure_ascii=False)
|
||||
aa = request.env['sale.order'].sudo().search([('name', '=', kw['orderNo'])])
|
||||
if aa:
|
||||
aa.schedule_status = 'received'
|
||||
return json.dumps({'statusCode': 200, 'statusMessage': '修改成功'}, ensure_ascii=False)
|
||||
|
||||
@@ -21,6 +21,7 @@ class Http(models.AbstractModel):
|
||||
def _auth_method_sf_token(cls):
|
||||
# 从headers.environ中获取对方传过来的token,timestamp,加密的校验字符串
|
||||
datas = request.httprequest.headers.environ
|
||||
logging.info(datas)
|
||||
if 'HTTP_TOKEN' in datas:
|
||||
_logger.info('token:%s' % datas['HTTP_TOKEN'])
|
||||
# 查询密钥
|
||||
@@ -40,11 +41,7 @@ class Http(models.AbstractModel):
|
||||
raise AuthenticationError('请求已过期')
|
||||
check_str = '%s%s%s' % (datas['HTTP_TOKEN'], post_time, factory_secret.sf_secret_key)
|
||||
check_sf_str = hashlib.sha1(check_str.encode('utf-8')).hexdigest()
|
||||
_logger.info('HTTP_TIMESTAMP:%s' % post_time)
|
||||
_logger.info('HTTP_CHECKSTR:%s' % datas['HTTP_CHECKSTR'])
|
||||
_logger.info('check_sf_str:%s' % check_sf_str)
|
||||
_logger.info('check_str:%s' % check_str)
|
||||
_logger.info('sf_secret_key:%s' % factory_secret.sf_secret_key)
|
||||
_logger.info('check_str:%s' % check_sf_str)
|
||||
if check_sf_str != datas['HTTP_CHECKSTR']:
|
||||
raise AuthenticationError('数据校验不通过')
|
||||
else:
|
||||
|
||||
@@ -164,9 +164,6 @@ class JdEclp(models.Model):
|
||||
self.is_bill = True
|
||||
self.logistics_status = '1'
|
||||
|
||||
# 京东物流下单后,销售订单状态改为待收货
|
||||
self.env['sale.order'].search([('name', '=', self.origin)]).write({'scheduled_status': 'to receive'})
|
||||
|
||||
# else:
|
||||
# raise UserError("选择京东物流才能下单呦")
|
||||
|
||||
|
||||
@@ -35,14 +35,14 @@
|
||||
<field name="type">功能刀具</field>
|
||||
</record>
|
||||
|
||||
<record id="res_partner_bfm" model="res.partner">
|
||||
<field name="name">业务平台</field>
|
||||
<!-- <field name="company_id" ref="base.main_company"/>-->
|
||||
</record>
|
||||
<!-- <record id="res_partner_bfm" model="res.partner">-->
|
||||
<!-- <field name="name">业务平台</field>-->
|
||||
<!-- <!– <field name="company_id" ref="base.main_company"/>–>-->
|
||||
<!-- </record>-->
|
||||
|
||||
<!-- <record id="res_users_bfm" model="res.users">-->
|
||||
<!-- <field name="name">业务平台</field>-->
|
||||
<!--<!– <field name="partner_id" ref="res_partner_bfm"/>–>-->
|
||||
<!-- <field name="partner_id" ref="res_partner_bfm"/>-->
|
||||
<!-- </record>-->
|
||||
|
||||
<record id="product_functional_tool_sf" model="product.product">
|
||||
|
||||
@@ -100,7 +100,7 @@ class ResMrpBomMo(models.Model):
|
||||
if rate_of_waste <= 20:
|
||||
return embryo_has
|
||||
else:
|
||||
return None
|
||||
return
|
||||
|
||||
# 查bom的原材料
|
||||
def get_raw_bom(self, product):
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
'website': 'https://www.sf.jikimo.com',
|
||||
'depends': ['sf_sale', 'sf_dlm', 'sf_manufacturing'],
|
||||
'data': [
|
||||
'data/stock_data.xml',
|
||||
# 'data/stock_data.xml',
|
||||
'views/product_template_management_view.xml',
|
||||
],
|
||||
'demo': [
|
||||
|
||||
@@ -7,10 +7,13 @@
|
||||
<field name="inherit_id" ref="sf_sale.view_product_template_form_inherit_sf"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="invoice_policy" position="after">
|
||||
<field name='categ_id' class="custom_required" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||
<<<<<<< HEAD
|
||||
<field name='categ_id'/>
|
||||
=======
|
||||
<field name='categ_id' attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
<field name='is_bfm' invisible="1"/>
|
||||
<field name='categ_type' invisible="1"/>
|
||||
<field name='manual_quotation' attrs="{'invisible':[('upload_model_file', '=', [])]}"/>
|
||||
<field name="upload_model_file"
|
||||
widget="many2many_binary"
|
||||
attrs="{'invisible': ['|', '|',('categ_type', '!=', '成品'),('categ_type', '=', False),('is_bfm','=', True)]}"/>
|
||||
@@ -18,40 +21,55 @@
|
||||
attrs="{'invisible': ['|','|', ('categ_type', '!=', '成品'),('categ_type', '=', False),('model_file', '=', False)]}"/>
|
||||
<field name='cutting_tool_type' invisible="1"/>
|
||||
<field name="fixture_material_type" invisible="1"/>
|
||||
<field name="embryo_model_type_id" string="模型类型" options="{'no_create': True}"
|
||||
<field name="embryo_model_type_id" string="模型类型"
|
||||
<<<<<<< HEAD
|
||||
attrs="{'invisible': ['|',('categ_type', '!=', '坯料'),('categ_type', '=', False)]}"/>
|
||||
<field name="materials_id" string="材料" placeholder="请选择"
|
||||
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])]}"/>
|
||||
<field name="materials_type_id" string="型号" placeholder="请选择"
|
||||
domain="[('materials_id', '=', materials_id)]"
|
||||
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])]}"/>
|
||||
<field name="server_product_process_parameters_id" string="表面工艺参数"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': ['|',('categ_type', '!=', '表面工艺'),('categ_type', '=', False)]}"/>
|
||||
<field name="cutting_tool_material_id" attrs="{'invisible': [('categ_type', '!=', '刀具')]}"
|
||||
placeholder="请选择"/>
|
||||
<field name="cutting_tool_model_id" placeholder="请选择"
|
||||
attrs="{'invisible': [('categ_type', '!=', '刀具')]}"
|
||||
domain="[('cutting_tool_material_id','=',cutting_tool_material_id)]"/>
|
||||
<field name="specification_id" placeholder="请选择" options='{"limit": 1}'
|
||||
attrs="{'invisible': [('categ_type', '!=', '刀具')]}"
|
||||
=======
|
||||
attrs="{'invisible': ['|',('categ_type', '!=', '坯料'),('categ_type', '=', False)],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="materials_id" string="材料" placeholder="请选择" options="{'no_create': True}"
|
||||
<field name="materials_id" string="材料" placeholder="请选择"
|
||||
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="materials_type_id" string="型号" placeholder="请选择" options="{'no_create': True}"
|
||||
<field name="materials_type_id" string="型号" placeholder="请选择"
|
||||
domain="[('materials_id', '=', materials_id)]"
|
||||
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="server_product_process_parameters_id" string="表面工艺参数"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': ['|',('categ_type', '!=', '表面工艺'),('categ_type', '=', False)]}"/>
|
||||
<field name="cutting_tool_material_id" class="custom_required"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': [('categ_type', '!=', '刀具')],'required': [('categ_type', '=', '刀具')],'readonly': [('id', '!=', False)]}"
|
||||
<field name="cutting_tool_material_id"
|
||||
attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}"
|
||||
placeholder="请选择"/>
|
||||
<field name="cutting_tool_model_id" placeholder="请选择" class="custom_required"
|
||||
domain="[('cutting_tool_material_id','=',cutting_tool_material_id)]"
|
||||
context="{'default_cutting_tool_material_id': cutting_tool_material_id}"
|
||||
attrs="{'invisible': [('categ_type', '!=', '刀具')],'required': [('categ_type', '=', '刀具')],'readonly': [('id', '!=', False)]}">
|
||||
</field>
|
||||
<!-- <button name="%(sf_base.action_sf_cutting_tool_standard_library)d" string="新建" type="action"-->
|
||||
<!-- context="{'default_cutting_tool_material_id': cutting_tool_material_id}"/>-->
|
||||
<field name="specification_id" placeholder="请选择" class="custom_required"
|
||||
context="{'default_cutting_tool_type': cutting_tool_type,'default_standard_library_id':cutting_tool_model_id}"
|
||||
attrs="{'invisible': [('categ_type', '!=', '刀具')],'required': [('categ_type', '=', '刀具')],'readonly': [('id', '!=', False)]}"
|
||||
<field name="cutting_tool_model_id" placeholder="请选择"
|
||||
attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}"
|
||||
domain="[('cutting_tool_material_id','=',cutting_tool_material_id)]"/>
|
||||
<field name="specification_id" placeholder="请选择"
|
||||
attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}"
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
domain="[('standard_library_id','=',cutting_tool_model_id)]"/>
|
||||
<field name="fixture_material_id"
|
||||
attrs="{'invisible': [('categ_type', '!=', '夹具')],'required': [('categ_type', '=', '夹具')]}"
|
||||
placeholder="请选择" options="{'no_create': True}"/>
|
||||
<field name="fixture_model_id" string="型号" placeholder="请选择" options="{'no_create': True}"
|
||||
<field name="fixture_material_id" attrs="{'invisible': [('categ_type', '!=', '夹具')]}"
|
||||
placeholder="请选择"/>
|
||||
<field name="fixture_model_id" string="型号" placeholder="请选择"
|
||||
attrs="{'invisible': [('categ_type', '!=', '夹具')],'required': [('categ_type', '=', '夹具')]}"
|
||||
domain="[('fixture_material_id','=',fixture_material_id)]"/>
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
<field name="specification_fixture_id" string="规格" placeholder="请选择"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': [('categ_type', '!=', '夹具')],'required': [('categ_type', '=', '夹具')]}"
|
||||
attrs="{'invisible': [('categ_type', '!=', '夹具')]}"
|
||||
domain="[('fixture_model_id','=',fixture_model_id)]"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
</field>
|
||||
<xpath expr="//label[@for='volume']" position="before">
|
||||
<label for="length" string="尺寸"
|
||||
@@ -96,7 +114,7 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_product_template_only_form_inherit_sf">
|
||||
<record model="ir.ui.view" id="view_product_template_form_inherit_sf">
|
||||
<field name="name">product.template.only.form.inherit.sf</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_only_form_view"/>
|
||||
@@ -107,10 +125,30 @@
|
||||
<field name="default_code" position="replace">
|
||||
<field name='default_code' invisible="1"/>
|
||||
</field>
|
||||
<<<<<<< HEAD
|
||||
<xpath expr="//page[@name='variants']" position="before">
|
||||
<page string="刀具物料参数" attrs="{'invisible': [('categ_type', '!=', '刀具')]}">
|
||||
<group>
|
||||
<group attrs="{'invisible': [('categ_type', '!=', '刀具')]}" col="1">
|
||||
<field name="cutting_tool_type_id" options="{'no_create': True}"
|
||||
placeholder="请选择"/>
|
||||
<field name="brand_id" options="{'no_create': True}" placeholder="请选择"/>
|
||||
<field name="cutting_tool_total_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','夹头','刀柄'))]}"/>
|
||||
<field name="tool_hardness" string="硬度(hrc)"/>
|
||||
<label for="cutting_tool_run_out_accuracy_min" string="端跳精度"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<div class="o_address_format"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
|
||||
<label for="cutting_tool_run_out_accuracy_min" string="最小"/>
|
||||
<field name="cutting_tool_run_out_accuracy_min" class="o_address_zip"
|
||||
options="{'format': false}"
|
||||
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}"/>
|
||||
=======
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_product_template_only_dlm_form_inherit_sf">
|
||||
<record model="ir.ui.view" id="view_product_template_only_form_inherit_sf">
|
||||
<field name="name">product.template.only.form.inherit.sf</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="sf_dlm_management.view_sale_product_template_form_inherit_sf"/>
|
||||
@@ -136,22 +174,104 @@
|
||||
<field name="cutting_tool_run_out_accuracy_min" class="o_address_zip"
|
||||
options="{'format': false}"
|
||||
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
<span>(mm)&nbsp;</span>
|
||||
<label for="cutting_tool_run_out_accuracy_max" string="最大"/>
|
||||
<field name="cutting_tool_run_out_accuracy_max" class="o_address_zip"
|
||||
options="{'format': false}"
|
||||
<<<<<<< HEAD
|
||||
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}"/>
|
||||
=======
|
||||
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
<span>(mm)&nbsp;</span>
|
||||
</div>
|
||||
|
||||
<field name="tool_width"
|
||||
<<<<<<< HEAD
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="tool_height"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_flange_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_shank_outer_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_shank_inner_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
|
||||
<!-- <field name="materials_type_id" options="{'no_create': True}" string="刀具材质"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"-->
|
||||
<!-- placeholder="请选择"/>-->
|
||||
<!-- <field name="tool_hardness" string="刀具硬度(hrc)"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>-->
|
||||
<!-- <field name="materials_type_id" options="{'no_create': True}" string="夹头材质"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"-->
|
||||
<!-- placeholder="请选择"/>-->
|
||||
<!-- <field name="tool_hardness" string="夹头硬度(hrc)"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>-->
|
||||
<!-- <field name="materials_type_id" options="{'no_create': True}" string="刀柄材质"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"-->
|
||||
<!-- placeholder="请选择"/>-->
|
||||
<!-- <field name="tool_hardness" string="刀柄硬度(hrc)"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>-->
|
||||
|
||||
<field name="cutting_tool_blade_diameter" string="刃部直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_width"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_depth"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_helix_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_number" placeholder="请选择"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_tip_working_size"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_tip_diameter" string="刀尖直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_tip_taper" string="刀尖锥度(°)"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<!--刀片-->
|
||||
<label for="tool_length" string="尺寸(mm)"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<div class="test_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}">
|
||||
<label for="tool_length" string="长"/>
|
||||
<field name="tool_length" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<label for="tool_thickness" string="厚"/>
|
||||
<field name="tool_thickness" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<label for="tool_width" string="宽"/>
|
||||
<field name="tool_width" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="cutting_tool_cut_blade_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_blade_tip_circular_arc_radius"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_blade_tip_height_tolerance"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_inscribed_circle_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_inscribed_circle_tolerance"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_install_aperture_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_chip_breaker_groove"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_cut_depth_max"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_blade_blade_number" string="刃数"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_blade_width" string="刃宽"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
=======
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="tool_height"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_shank_length" string="刀柄长度(mm)"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_shank_diameter" string="刀柄直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_flange_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_flange_length"
|
||||
@@ -210,6 +330,7 @@
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_cut_depth_max"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
<!--刀杆-->
|
||||
|
||||
<label for="cutting_tool_knife_head_length" string="刀头尺寸(mm)"
|
||||
@@ -218,6 +339,37 @@
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}">
|
||||
<label for="cutting_tool_knife_head_length" string="长"/>
|
||||
<field name="cutting_tool_knife_head_length" class="o_address_zip"
|
||||
<<<<<<< HEAD
|
||||
options="{'format': false}"/>
|
||||
<label for="cutting_tool_knife_head_width" string="宽"/>
|
||||
<field name="cutting_tool_knife_head_width" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<label for="cutting_tool_knife_head_height" string="高"/>
|
||||
<field name="cutting_tool_knife_head_height" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="cutting_tool_blade_diameter" string="刃部直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
|
||||
<field name="cutting_tool_blade_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||
|
||||
<field name="cutting_tool_cutter_arbor_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_cut_blade_length" string="切削刃长度(mm)"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_cut_depth_max"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_min_machining_aperture"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_install_blade_tip_num"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<!--刀盘-->
|
||||
<field name="cutting_tool_cutter_head_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||
<field name="cutting_tool_interface_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||
=======
|
||||
options="{'format': false}"
|
||||
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||
<label for="cutting_tool_knife_head_width" string="宽"/>
|
||||
@@ -250,6 +402,7 @@
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_interface_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')],'readonly': [('id', '!=', False)]}"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
|
||||
<!--夹头-->
|
||||
<label for="cutting_tool_clamping_diameter_min" string="夹持直径"
|
||||
@@ -259,16 +412,149 @@
|
||||
<label for="cutting_tool_clamping_diameter_min" string="最小"/>
|
||||
<field name="cutting_tool_clamping_diameter_min" class="o_address_zip diameter"
|
||||
options="{'format': false}"
|
||||
<<<<<<< HEAD
|
||||
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))]}"/>
|
||||
=======
|
||||
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))],'readonly': [('id', '!=', False)]}"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
<span>(mm)&nbsp;</span>
|
||||
<label for="cutting_tool_clamping_diameter_max" string="最大"/>
|
||||
<field name="cutting_tool_clamping_diameter_max" class="o_address_zip diameter"
|
||||
options="{'format': false}"
|
||||
<<<<<<< HEAD
|
||||
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))]}"/>
|
||||
<span>(mm)&nbsp;</span>
|
||||
</div>
|
||||
<field name="cutting_tool_clamping_way"
|
||||
attrs="{'invisible': [('cutting_tool_type','not in',('刀柄','夹头'))]}"/>
|
||||
<field name="cutting_tool_top_diameter" class="diameter"
|
||||
attrs='{"invisible": [("cutting_tool_type","!=","夹头")]}'/>
|
||||
<field name="cutting_tool_outer_diameter" class="diameter"
|
||||
attrs='{"invisible": [("cutting_tool_type","!=","夹头")]}'/>
|
||||
<field name="cutting_tool_inner_diameter" class="diameter"
|
||||
attrs='{"invisible": [("cutting_tool_type","!=","夹头")]}'/>
|
||||
<!--夹头-->
|
||||
|
||||
<field name="cutting_tool_standard_speed"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_speed_max"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_change_time"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_cooling_type"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('categ_type', '!=', '刀具')]}">
|
||||
<field name="materials_type_id" options="{'no_create': True}" placeholder="请选择"
|
||||
string="材质"/>
|
||||
<field name="coating_material"/>
|
||||
<field name="cutting_tool_blade_type"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_coarse_medium_fine" string="粗/中/精" placeholder="请选择"
|
||||
attrs="{'required': [('cutting_tool_type','=','整体式刀具')],'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}"/>
|
||||
<!--整体式刀具-->
|
||||
<field name="cutting_tool_shank_diameter" string="柄部直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_shank_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_neck_diameter" string="颈部直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_neck_length" string="颈部长度(mm)"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_cut_depth"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_pitch"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="tool_weight"
|
||||
attrs='{"invisible": [("cutting_tool_type","not in",("夹头","刀柄"))]}'/>
|
||||
<field name="cutting_tool_taper"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('夹头','刀柄'))]}"/>
|
||||
<field name="cutting_tool_jump_accuracy"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_rear_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))]}"/>
|
||||
<field name="cutting_tool_main_included_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片','刀杆'))]}"/>
|
||||
<!-- <field name="cutting_tool_front_angle"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))]}"/>-->
|
||||
<field name="cutting_tool_top_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))]}"/>
|
||||
<field name="cutting_tool_blade_tip_dip_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_side_cutting_edge_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_pitch"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_bladed_teeth_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_thickness_tolerance"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_thread_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_thread_num"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_cutter_bar_ids" widget="many2many_tags"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_cutter_pad_ids" widget="many2many_tags"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<!--刀柄-->
|
||||
<field name="cutting_tool_is_rough_finish"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_is_finish"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_is_drill_hole"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_is_high_speed_cutting"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_is_safety_lock" string="有无安全锁"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
|
||||
|
||||
<field name="cutting_tool_jump_accuracy" string="跳动精度(mm)"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cutting_tool_max_load_capacity"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cutting_tool_er_size_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cutting_tool_handle_ids" widget="many2many_tags"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cooling_suit_type_ids"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<!-- 刀杆 -->
|
||||
<field name="cutting_tool_rear_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_installing_structure"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_is_cooling_hole"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_locating_slot_code"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_blade_ids" widget="many2many_tags"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_tool_shim"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_cotter_pin"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_pressing_plate"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_screw"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀柄'))]}"/>
|
||||
<field name="cutting_tool_wrench"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀柄'))]}"/>
|
||||
<!-- 刀盘 -->
|
||||
<field name="cutting_tool_blade_ids" widget="many2many_tags"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||
<field name="cutting_tool_blade_ids" widget="many2many_tags"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||
=======
|
||||
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))],'readonly': [('id', '!=', False)]}"/>
|
||||
<span>(mm)&nbsp;</span>
|
||||
</div>
|
||||
<field name="cutting_tool_clamping_way"
|
||||
attrs="{'invisible': [('cutting_tool_type','not in',('刀柄'))],'readonly': [('id', '!=', False)]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type','not in',('刀柄','夹头'))],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_top_diameter" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type','not in',('夹头'))],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_outer_diameter" class="diameter"
|
||||
@@ -307,7 +593,7 @@
|
||||
<field name="tool_weight"
|
||||
attrs='{"invisible": [("cutting_tool_type","not in",("夹头","刀柄"))],"readonly": [("id", "!=", False)]}'/>
|
||||
<field name="cutting_tool_taper"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('夹头'))],'readonly': [('id', '!=', False)]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('夹头','刀柄'))],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_taper_shank_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_dynamic_balance_class"
|
||||
@@ -350,9 +636,9 @@
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_er_size_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
|
||||
<!-- <field name="cutting_tool_handle_id"-->
|
||||
<!-- options="{'no_create': True}"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>-->
|
||||
<field name="cutting_tool_handle_id"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cooling_suit_type_ids"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
|
||||
<!-- 刀杆 -->
|
||||
@@ -364,7 +650,7 @@
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_locating_slot_code"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_blade_id" options="{'no_create': True}"
|
||||
<field name="cutting_tool_blade_id"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_tool_shim"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||
@@ -388,29 +674,47 @@
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')],'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="cutting_tool_wrench"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')],'readonly': [('id', '!=', False)]}"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
|
||||
</group>
|
||||
</group>
|
||||
<group string="适配刀片形状"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'in', ('刀柄','夹头','整体式刀具',False))]}">
|
||||
<<<<<<< HEAD
|
||||
<field name="fit_blade_shape_id" string="" widget="many2one_radio"/>
|
||||
=======
|
||||
<field name="fit_blade_shape_id" string="" widget="many2one_radio"
|
||||
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
</group>
|
||||
<group string="适合加工方式"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||
<field name="suitable_machining_method_ids" string=""
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
attrs="{'readonly': [('id', '!=', False)]}"
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
widget="custom_many2many_checkboxes"/>
|
||||
</group>
|
||||
<group string="刀尖特征"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||
<field name="blade_tip_characteristics_id" string=""
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
attrs="{'readonly': [('id', '!=', False)]}"
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
widget="many2one_radio"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||
<group string="柄部类型"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
|
||||
<<<<<<< HEAD
|
||||
<field name="handle_type_id" string="" widget="many2one_radio"/>
|
||||
</group>
|
||||
<group string="压紧方式"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}">
|
||||
<field name="compaction_way_id" string="" widget="many2one_radio"/>
|
||||
=======
|
||||
<field name="handle_type_id" string="" widget="many2one_radio"
|
||||
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||
</group>
|
||||
@@ -418,23 +722,35 @@
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}">
|
||||
<field name="compaction_way_id" string="" widget="many2one_radio"
|
||||
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
</group>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||
<group string="走刀方向">
|
||||
<<<<<<< HEAD
|
||||
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes"/>
|
||||
</group>
|
||||
<group string="适合冷却液">
|
||||
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes"/>
|
||||
=======
|
||||
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes"
|
||||
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||
</group>
|
||||
<group string="适合冷却方式">
|
||||
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes"
|
||||
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="切削速度Vc"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}">
|
||||
<<<<<<< HEAD
|
||||
<field name="cutting_speed_ids" string="" widget="one2many">
|
||||
=======
|
||||
<field name="cutting_speed_ids" string="" widget="one2many"
|
||||
attrs="{'readonly': [('id', '!=', False)]}" class="fixTableCss">
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
<tree editable="bottom">
|
||||
<field name="execution_standard_id"/>
|
||||
<field name="material_code"/>
|
||||
@@ -447,9 +763,14 @@
|
||||
<script src="/sf_dlm_management/static/js/changeCss.js"></script>
|
||||
</page>
|
||||
<page string="每齿走刀量fz"
|
||||
<<<<<<< HEAD
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}">
|
||||
<field name="feed_per_tooth_ids" string="" widget="one2many">
|
||||
=======
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))],'readonly': [('categ_type', '=', '刀具')]}">
|
||||
<field name="feed_per_tooth_ids" string="" widget="one2many"
|
||||
attrs="{'readonly': [('id', '!=', False)]}">
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
<tree editable="bottom">
|
||||
<!-- <field name="cutting_speed"-->
|
||||
<!-- attrs="{'readonly': [('materials_type_id','!=',False)]}"/>-->
|
||||
|
||||
@@ -2,23 +2,18 @@
|
||||
<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.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="//group" position="before">
|
||||
<searchpanel>
|
||||
<field name="routing_type" select="multi" string="工序类型" icon="fa-building" enable_counters="1"/>
|
||||
<field name="state" select="multi" string="状态" icon="fa-building" enable_counters="1"/>
|
||||
</searchpanel>
|
||||
|
||||
<!-- <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>-->
|
||||
<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>
|
||||
|
||||
@@ -51,7 +51,7 @@ class SfEquipmentSaintenanceStandards(models.Model):
|
||||
domain="[('category_id', '=', maintenance_equipment_category_id)]"
|
||||
)
|
||||
maintenance_standards_ids = fields.One2many('maintenance.standards', 'equipment_maintenance_standards_id',
|
||||
string='维保项目')
|
||||
string='维保项目', widget='one2many_list')
|
||||
eq_maintenance_ids = fields.One2many('maintenance.equipment', 'eq_maintenance_id', string='保养设备')
|
||||
overhaul_ids = fields.One2many('maintenance.equipment', 'overhaul_id', string='检修设备')
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ class SfMaintenanceEquipmentCategory(models.Model):
|
||||
_description = '设备类别'
|
||||
|
||||
equipment_type = fields.Selection([('机床', '机床'), ('机器人', '机器人'), ('AGV小车', 'AGV小车'),
|
||||
('检测设备', '检测设备'), ('其他', '其他')], string='类型', default='机床')
|
||||
('检测设备', '检测设备')], string='类型', default='机床')
|
||||
equipment_type_code = fields.Char('简写')
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ class SfMaintenanceEquipment(models.Model):
|
||||
default="", string="轴数")
|
||||
|
||||
# 1212新增字段
|
||||
|
||||
a_axis = fields.Integer('a轴')
|
||||
function_type = fields.Selection(
|
||||
[("ZXJGZX", "钻铣加工中心"), ("CXJGZX", "车削加工中心"), ("FHJGZX", "复合加工中心")],
|
||||
default="", string="功能类型")
|
||||
@@ -73,23 +73,23 @@ class SfMaintenanceEquipment(models.Model):
|
||||
straight_cutting_feed_rate = fields.Char('直线切削进给速度(mm/min)')
|
||||
rotary_cutting_feed_rate = fields.Char('回转切削进给速度(mm/min)')
|
||||
|
||||
X_precision = fields.Char('X轴定位精度(mm)')
|
||||
X_precision_repeat = fields.Char('X轴重复定位精度(mm)')
|
||||
Y_precision = fields.Char('Y轴定位精度(mm)')
|
||||
Y_precision_repeat = fields.Char('Y轴重复定位精度(mm)')
|
||||
Z_precision = fields.Char('Z轴定位精度(mm)')
|
||||
Z_precision_repeat = fields.Char('Z轴重复定位精度(mm)')
|
||||
a_precision = fields.Char('a轴定位精度(mm)')
|
||||
a_precision_repeat = fields.Char('a轴重复定位精度(mm)')
|
||||
b_precision = fields.Char('b轴定位精度(mm)')
|
||||
b_precision_repeat = fields.Char('b轴重复定位精度(mm)')
|
||||
c_precision = fields.Char('c轴定位精度(mm)')
|
||||
c_precision_repeat = fields.Char('c轴重复定位精度(mm)')
|
||||
X_precision = fields.Float('X轴定位精度(mm)', digits=(12, 3))
|
||||
X_precision_repeat = fields.Float('X轴重复定位精度(mm)', digits=(12, 3))
|
||||
Y_precision = fields.Float('Y轴定位精度(mm)', digits=(12, 3))
|
||||
Y_precision_repeat = fields.Float('Y轴重复定位精度(mm)', digits=(12, 3))
|
||||
Z_precision = fields.Float('Z轴定位精度(mm)', digits=(12, 3))
|
||||
Z_precision_repeat = fields.Float('Z轴重复定位精度(mm)', digits=(12, 3))
|
||||
a_precision = fields.Float('a轴定位精度(mm)', digits=(12, 3))
|
||||
a_precision_repeat = fields.Float('a轴重复定位精度(mm)', digits=(12, 3))
|
||||
b_precision = fields.Float('b轴定位精度(mm)', digits=(12, 3))
|
||||
b_precision_repeat = fields.Float('b轴重复定位精度(mm)', digits=(12, 3))
|
||||
c_precision = fields.Float('c轴定位精度(mm)', digits=(12, 3))
|
||||
c_precision_repeat = fields.Float('c轴重复定位精度(mm)', digits=(12, 3))
|
||||
|
||||
tool_full_diameter_max = fields.Float('刀具满刀最大直径(mm)')
|
||||
tool_perimeter_diameter_max = fields.Float('刀具邻空刀最大直径(mm)')
|
||||
T_tool_time = fields.Float('T-T换刀时间(s)', digits=(12, 1))
|
||||
C_tool_time = fields.Float('C-C换刀时间(s)', digits=(12, 1))
|
||||
T_tool_time = fields.Integer('T-T换刀时间(s)')
|
||||
C_tool_time = fields.Integer('C-C换刀时间(s)')
|
||||
|
||||
# 待删除字段
|
||||
precision_min = fields.Float('X轴定位精度min(mm)', digits=(12, 3))
|
||||
@@ -104,18 +104,18 @@ class SfMaintenanceEquipment(models.Model):
|
||||
tool_diameter_max = fields.Char('刀具刀径max(mm)')
|
||||
tool_diameter_min = fields.Char('刀具刀径min(mm)')
|
||||
|
||||
# def get_no(self):
|
||||
# partner = self.env['maintenance.equipment'].sudo().search(
|
||||
# [('MTcode', '!=', '')],
|
||||
# limit=1,
|
||||
# order="id desc")
|
||||
# if not partner:
|
||||
# num = "%04d" % 1
|
||||
#
|
||||
# else:
|
||||
# m = int(partner.MTcode) + 1
|
||||
# num = "%04d" % m
|
||||
# return num
|
||||
def get_no(self):
|
||||
partner = self.env['maintenance.equipment'].sudo().search(
|
||||
[('MTcode', '!=', '')],
|
||||
limit=1,
|
||||
order="id desc")
|
||||
if not partner:
|
||||
num = "%04d" % 1
|
||||
|
||||
else:
|
||||
m = int(partner.MTcode) + 1
|
||||
num = "%04d" % m
|
||||
return num
|
||||
|
||||
|
||||
equipment_maintenance_standards_ids = fields.Many2many('equipment.maintenance.standards',
|
||||
@@ -145,10 +145,10 @@ class SfMaintenanceEquipment(models.Model):
|
||||
else:
|
||||
record.equipment_maintenance_standards_ids = False
|
||||
|
||||
MTcode = fields.Char("机台编码")
|
||||
MTcode = fields.Char("机台编码", default=get_no)
|
||||
created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user)
|
||||
equipment_type = fields.Selection([('机床', '机床'), ('机器人', '机器人'), ('AGV小车', 'AGV小车'),
|
||||
('检测设备', '检测设备'), ('其他', '其他')], compute='_compute_category_id')
|
||||
('检测设备', '检测设备')], compute='_compute_category_id')
|
||||
|
||||
@api.depends('category_id')
|
||||
def _compute_category_id(self):
|
||||
@@ -164,12 +164,11 @@ class SfMaintenanceEquipment(models.Model):
|
||||
number_of_knife_library = fields.Integer('刀库数量(把)')
|
||||
rotate_speed = fields.Integer('转速')
|
||||
# 加工进程
|
||||
a_axis = fields.Char('a轴')
|
||||
x_axis = fields.Integer('X轴')
|
||||
y_axis = fields.Integer('Y轴')
|
||||
z_axis = fields.Integer('Z轴')
|
||||
b_axis = fields.Char('B轴')
|
||||
c_axis = fields.Char('C轴')
|
||||
b_axis = fields.Integer('B轴')
|
||||
c_axis = fields.Integer('C轴')
|
||||
remark = fields.Char('备注')
|
||||
is_binding = fields.Boolean('是否绑定机床', default=False)
|
||||
control_system_id = fields.Many2one('sf.machine.control_system',
|
||||
@@ -179,7 +178,7 @@ class SfMaintenanceEquipment(models.Model):
|
||||
type_id = fields.Many2one('sf.machine_tool.type', '型号')
|
||||
|
||||
state = fields.Selection(
|
||||
[("正常", "正常"), ("故障停机", "故障停机"), ("计划维保", "计划维保"), ("空闲", "空闲"), ("封存(报废)", "封存(报废)")],
|
||||
[("正常", "正常"), ("故障停机", "故障停机"), ("计划维保", "计划维保"),("空闲", "空闲"),("封存(报废)", "封存(报废)")],
|
||||
default='正常', string="机床状态")
|
||||
run_time = fields.Char('总运行时长')
|
||||
# 0606新增字段
|
||||
@@ -192,7 +191,6 @@ class SfMaintenanceEquipment(models.Model):
|
||||
workpiece_load = fields.Char('工件最大负载(kg)')
|
||||
workbench_L = fields.Char('工作台长度(mm)')
|
||||
workbench_W = fields.Char('工作台宽度(mm)')
|
||||
workbench_H = fields.Char('工作台高度(mm)')
|
||||
machine_tool_L = fields.Char('机床长度(mm)')
|
||||
machine_tool_W = fields.Char('机床宽度(mm)')
|
||||
machine_tool_H = fields.Char('机床高度(mm)')
|
||||
@@ -232,15 +230,7 @@ class SfMaintenanceEquipment(models.Model):
|
||||
|
||||
equipment = super(SfMaintenanceEquipment, self).create(vals)
|
||||
if equipment.category_id:
|
||||
equipment.name = "%s%s" % (equipment.MTcode, equipment.category_id.name)
|
||||
if equipment.category_id.equipment_type == '机床':
|
||||
equipment_id = self.env['maintenance.equipment.oee'].search([('equipment_id', '=', equipment.id)])
|
||||
if not equipment_id:
|
||||
self.env['maintenance.equipment.oee'].sudo().create({
|
||||
'equipment_id': equipment.id,
|
||||
'name': equipment.name,
|
||||
|
||||
})
|
||||
equipment.name = equipment.MTcode + '#' + equipment.category_id.name
|
||||
|
||||
# 在创建设备之后执行一些自定义逻辑
|
||||
# ...
|
||||
@@ -386,8 +376,8 @@ class SfMaintenanceEquipment(models.Model):
|
||||
AGV_turning_radius = fields.Char('最小转弯半径')
|
||||
AGV_gradeability_max = fields.Integer('最大爬坡度')
|
||||
AGV_parking_accuracy = fields.Char('停车精度')
|
||||
AGV_load_weight_max = fields.Char('AGV最大负载重量')
|
||||
AGV_weight = fields.Char('AGV本体总重量')
|
||||
AGV_load_weight_max = fields.Char('最大负载重量')
|
||||
AGV_weight = fields.Char('本体总重量')
|
||||
AGV_job_duration = fields.Char('连续作业时长')
|
||||
AGV_transfer_mode = fields.Char('移载方式')
|
||||
AGV_drive_motor_power = fields.Char('驱动电机功率')
|
||||
@@ -397,11 +387,11 @@ class SfMaintenanceEquipment(models.Model):
|
||||
AGV_veer_motor_speed_ratio = fields.Char('转向电机速比')
|
||||
AGV_move_motor_power = fields.Char('前移电机功率')
|
||||
AGV_move_motor_speed_ratio = fields.Char('前移电机速比')
|
||||
AGV_drive_mode = fields.Char('AGV驱动方式')
|
||||
AGV_drive_mode = fields.Char('驱动方式')
|
||||
AGV_navigation_mode = fields.Char('导航方式')
|
||||
AGV_communication_mode = fields.Char('通讯方式')
|
||||
AGV_direction_travel = fields.Char('行走方向')
|
||||
AGV_power_requirements = fields.Char('AGV电源要求')
|
||||
AGV_power_requirements = fields.Char('电源要求')
|
||||
AGV_charge_mode = fields.Selection([('手动', '手动'), ('自动', '自动')], string='充电方式')
|
||||
AGV_security = fields.Char('安全防护')
|
||||
AGV_operating_temperature = fields.Char('环境温度')
|
||||
@@ -418,8 +408,8 @@ class SfMaintenanceEquipment(models.Model):
|
||||
detect_measurement_mode = fields.Selection([('光栅尺', '光栅尺'), ('容栅', '容栅'), ('磁栅', '磁栅'),
|
||||
('激光干涉仪', '激光干涉仪')], string='测量方式')
|
||||
detect_resolution = fields.Char('分辨率')
|
||||
detect_load_weight_max = fields.Char('检测设备最大负载重量')
|
||||
detect_weight = fields.Char('检测设备本体总重量')
|
||||
detect_load_weight_max = fields.Char('最大负载重量')
|
||||
detect_weight = fields.Char('本体总重量')
|
||||
detect_measurement_length = fields.Char('深孔测量长度(max)')
|
||||
detect_control_mode = fields.Char('控制方式')
|
||||
detect_balance_mode_for_Z = fields.Char('Z轴平衡方式')
|
||||
@@ -439,11 +429,11 @@ class SfMaintenanceEquipment(models.Model):
|
||||
robot_gripping_of_workpieces_W = fields.Char('可抓取工件(宽)')
|
||||
robot_gripping_of_workpieces_H = fields.Char('可抓取工件(高)')
|
||||
robot_radius_of_the_boom = fields.Char('展臂半径')
|
||||
robot_load_weight_max = fields.Char('机械臂最大负载重量')
|
||||
robot_weight = fields.Char('机械臂本体总重量')
|
||||
robot_load_weight_max = fields.Char('最大负载重量')
|
||||
robot_weight = fields.Char('本体总重量')
|
||||
robot_repeatable_positioning_accuracy = fields.Char('重复定位精度')
|
||||
robot_axis_num = fields.Selection([('2轴', '2轴'), ('3轴', '3轴'), ('4轴', '4轴'), ('5轴', '5轴'), ('6轴', '6轴'),
|
||||
('7轴', '7轴'), ('8轴', '8轴')], string='机械臂轴数')
|
||||
('7轴', '7轴'), ('8轴', '8轴')], string='轴数')
|
||||
axis_ids = fields.One2many('sf.robot.axis.num', 'equipment_id', string='动作范围')
|
||||
robot_track_dimensions_L = fields.Char('轨道尺寸(长)')
|
||||
robot_track_dimensions_W = fields.Char('轨道尺寸(宽)')
|
||||
@@ -520,7 +510,6 @@ class SfMaintenanceEquipment(models.Model):
|
||||
'lead_screw': item.lead_screw,
|
||||
'workbench_L': item.workbench_L,
|
||||
'workbench_W': item.workbench_W,
|
||||
'workbench_H': item.workbench_H,
|
||||
'guide_rail': item.guide_rail,
|
||||
'machine_tool_L': item.machine_tool_L,
|
||||
'machine_tool_W': item.machine_tool_W,
|
||||
@@ -577,7 +566,7 @@ class SfMaintenanceEquipment(models.Model):
|
||||
'tool_perimeter_diameter_max': item.tool_perimeter_diameter_max,
|
||||
'T_tool_time': item.T_tool_time,
|
||||
'C_tool_time': item.C_tool_time,
|
||||
'jiancheng': item.category_id.equipment_type_code,
|
||||
'jiancheng': item.category_id.equipment_type_code
|
||||
}
|
||||
machine_tool_list.append(val)
|
||||
# kw = machine_tool_list
|
||||
|
||||
@@ -1,23 +1,24 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_equipment_maintenance_standards_manager,equipment_maintenance_standards,model_equipment_maintenance_standards,sf_maintenance.sf_group_equipment_manager,1,1,1,1
|
||||
access_equipment_maintenance_standards,equipment_maintenance_standards,model_equipment_maintenance_standards,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_maintenance_logs_sf_group_equipment_user,sf_maintenance_logs,model_sf_maintenance_logs,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_maintenance_logs_sf_group_equipment_manager,sf_maintenance_logs,model_sf_maintenance_logs,sf_maintenance.sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_equipment_sf_group_equipment_user,maintenance_equipment,model_maintenance_equipment,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,sf_maintenance.sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_equipment_oee_sf_group_equipment_user,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_maintenance.sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_equipment_oee_logs_sf_group_equipment_user,maintenance_equipment_oee_logs,model_maintenance_equipment_oee_logs,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_equipment_oee_logs,maintenance_equipment_oee_logs,model_maintenance_equipment_oee_logs,sf_maintenance.sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_standards_sf_group_equipment_user,maintenance_standards,model_maintenance_standards,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_standards,maintenance_standards,model_maintenance_standards,sf_maintenance.sf_group_equipment_manager,1,1,1,1
|
||||
access_maintenance_standard_image_sf_group_equipment_user,maintenance_standard_image,model_maintenance_standard_image,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_standard_image,maintenance_standard_image,model_maintenance_standard_image,sf_maintenance.sf_group_equipment_manager,1,1,1,0
|
||||
access_sf_robot_axis_num_sf_group_equipment_user,sf_robot_axis_num,model_sf_robot_axis_num,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_robot_axis_num,sf_robot_axis_num,model_sf_robot_axis_num,sf_maintenance.sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_equipment_agv_log_sf_group_equipment_user,maintenance_equipment_agv_log,model_maintenance_equipment_agv_log,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_equipment_agv_log,maintenance_equipment_agv_log,model_maintenance_equipment_agv_log,sf_maintenance.sf_group_equipment_manager,1,1,1,0
|
||||
|
||||
access_equipment_maintenance_standards,equipment_maintenance_standards,model_equipment_maintenance_standards,sf_group_equipment_user,1,1,1,0
|
||||
access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,sf_group_equipment_user,1,0,0,0
|
||||
access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,base.group_user,1,1,1,1
|
||||
access_maintenance_equipment_oee_logs,maintenance_equipment_oee_logs,model_maintenance_equipment_oee_logs,sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_equipment_oee_logs,maintenance_equipment_oee_logs,model_maintenance_equipment_oee_logs,sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_equipment_oee_logs,maintenance_equipment_oee_logs,model_maintenance_equipment_oee_logs,base.group_user,1,1,1,1
|
||||
access_maintenance_standards,maintenance_standards,model_maintenance_standards,sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_standards,maintenance_standards,model_maintenance_standards,sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_standard_image,maintenance_standard_image,model_maintenance_standard_image,sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_standard_image,maintenance_standard_image,model_maintenance_standard_image,sf_group_equipment_manager,1,1,1,0
|
||||
access_sf_robot_axis_num,sf_robot_axis_num,model_sf_robot_axis_num,sf_group_equipment_user,1,0,0,0
|
||||
access_sf_robot_axis_num,sf_robot_axis_num,model_sf_robot_axis_num,sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_equipment_agv_log,maintenance_equipment_agv_log,model_maintenance_equipment_agv_log,sf_group_equipment_user,1,0,0,0
|
||||
access_maintenance_equipment_agv_log,maintenance_equipment_agv_log,model_maintenance_equipment_agv_log,sf_group_equipment_manager,1,1,1,0
|
||||
access_maintenance_equipment_agv_log,maintenance_equipment_agv_log,model_maintenance_equipment_agv_log,base.group_user,1,1,1,1
|
||||
|
||||
|
||||
access_maintenance_system_user,equipment.request system user,maintenance.model_maintenance_request,base.group_user,1,0,0,0
|
||||
@@ -28,42 +29,5 @@ access_sf_maintenance_logs_group_plan_dispatch,sf_maintenance_logs,model_sf_main
|
||||
access_maintenance_standard_image_group_plan_dispatch,maintenance_standard_image,model_maintenance_standard_image,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_equipment_maintenance_standards_group_plan_dispatch,equipment_maintenance_standards,model_equipment_maintenance_standards,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_maintenance_standards_group_plan_dispatch,maintenance_standards,model_maintenance_standards,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_maintenance_equipment_agv_log_group_plan_dispatch,maintenance.equipment.agv.log,model_maintenance_equipment_agv_log,sf_base.group_plan_dispatch,1,0,0,0
|
||||
|
||||
access_sf_robot_axis_num_group_plan_dispatch,sf.robot.axis.num,model_sf_robot_axis_num,sf_base.group_plan_dispatch,1,0,0,0
|
||||
|
||||
access_sf_machine_tool_sf_group_equipment_user,sf_machine_tool,sf_base.model_sf_machine_tool,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_tool_admin_sf_group_equipment_user,sf_machine_tool_admin,sf_base.model_sf_machine_tool,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_tool_type_sf_group_equipment_user,sf_machine_tool_type,sf_base.model_sf_machine_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_tool_type_admin_sf_group_equipment_user,sf_machine_tool_type_admin,sf_base.model_sf_machine_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_brand_sf_group_equipment_user,sf_machine_brand,sf_base.model_sf_machine_brand,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_brand_admin_sf_group_equipment_user,sf_machine_brand_admin,sf_base.model_sf_machine_brand,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_brand_tags_sf_group_equipment_user,sf_machine_brand_tags,sf_base.model_sf_machine_brand_tags,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_brand_tags_admin_sf_group_equipment_user,sf_machine_brand_tags_admin,sf_base.model_sf_machine_brand_tags,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_control_system_sf_group_equipment_user,sf_machine_control_system,sf_base.model_sf_machine_control_system,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_control_system_admin_sf_group_equipment_user,sf_machine_control_system_admin,sf_base.model_sf_machine_control_system,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_process_sf_group_equipment_user,sf_production_process,sf_base.model_sf_production_process,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_process_admin_sf_group_equipment_user,sf_production_process_admin,sf_base.model_sf_production_process,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_materials_sf_group_equipment_user,sf_production_materials,sf_base.model_sf_production_materials,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_materials_admin_sf_group_equipment_user,sf_production_materials_admin,sf_base.model_sf_production_materials,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_materials_model_sf_group_equipment_user,sf_materials_model,sf_base.model_sf_materials_model,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_materials_model_admin_sf_group_equipment_user,sf_materials_model_admin,sf_base.model_sf_materials_model,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
|
||||
access_sf_supplier_sort_sf_group_equipment_user,sf_supplier_sort,sf_base.model_sf_supplier_sort,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_supplier_sort_admin_sf_group_equipment_user,sf_supplier_sort_admin,sf_base.model_sf_supplier_sort,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_process_parameter_sf_group_equipment_user,sf_production_process_parameter,sf_base.model_sf_production_process_parameter,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_process_parameter_group_plan_director_sf_group_equipment_user,sf_production_process_parameter_group_plan_director,sf_base.model_sf_production_process_parameter,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_process_parameter_group_purchase_director_sf_group_equipment_user,sf_production_process_parameter_group_purchase_director,sf_base.model_sf_production_process_parameter,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_process_parameter_group_sale_director_sf_group_equipment_user,sf_production_process_parameter_group_sale_director,sf_base.model_sf_production_process_parameter,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_process_parameter_admin_sf_group_equipment_user,sf_production_process_parameter_admin,sf_base.model_sf_production_process_parameter,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_process_category_sf_group_equipment_user,sf_production_process_category,sf_base.model_sf_production_process_category,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_production_process_category_admin_sf_group_equipment_user,sf_production_process_category_admin,sf_base.model_sf_production_process_category,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_tool_category_sf_group_equipment_user,sf_machine_tool_category,sf_base.model_sf_machine_tool_category,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_machine_tool_category_admin_sf_group_equipment_user,sf_machine_tool_category_admin,sf_base.model_sf_machine_tool_category,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_cutting_tool_material_sf_group_equipment_user,sf_cutting_tool_material,sf_base.model_sf_cutting_tool_material,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_cutting_tool_material_admin_sf_group_equipment_user,sf_cutting_tool_material_admin,sf_base.model_sf_cutting_tool_material,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_cutting_tool_type_sf_group_equipment_user,sf_cutting_tool_type,sf_base.model_sf_cutting_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_cutting_tool_type_admin_sf_group_equipment_user,sf_cutting_tool_type_admin,sf_base.model_sf_cutting_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_cutting_tool_type_group_purchase_director_sf_group_equipment_user,sf_cutting_tool_type_group_purchase_director,sf_base.model_sf_cutting_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_cutting_tool_type_group_sale_director_sf_group_equipment_user,sf_cutting_tool_type_group_sale_director,sf_base.model_sf_cutting_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_cutting_tool_type_group_plan_director_sf_group_equipment_user,sf_cutting_tool_type_group_plan_director,sf_base.model_sf_cutting_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
|
||||
access_sf_robot_axis_num_group_plan_dispatch,sf.robot.axis.num,model_sf_robot_axis_num,sf_base.group_plan_dispatch,1,0,0,0
|
||||
|
@@ -12,7 +12,7 @@
|
||||
<group>
|
||||
<field name="code" readonly="1" force_save="1"/>
|
||||
<field name="name" readonly="1" force_save="1"/>
|
||||
<field name="maintenance_equipment_category_id" required="1" />
|
||||
<field name="maintenance_equipment_category_id" required="1"/>
|
||||
<field name="eq_maintenance_ids" invisible='1'/>
|
||||
<field name="overhaul_ids" invisible='1'/>
|
||||
|
||||
@@ -31,12 +31,12 @@
|
||||
<notebook>
|
||||
<page string="维保项目">
|
||||
|
||||
<field name="maintenance_standards_ids" delete="1">
|
||||
<tree editable="bottom" >
|
||||
<field name="name" />
|
||||
<field name="fault_type" />
|
||||
<field name="maintenance_standards" />
|
||||
<field name="Period" />
|
||||
<field name="maintenance_standards_ids">
|
||||
<tree editable="bottom">
|
||||
<field name="name"/>
|
||||
<field name="fault_type"/>
|
||||
<field name="maintenance_standards"/>
|
||||
<field name="Period"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
<field name="inherit_id" ref="maintenance.hr_equipment_category_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='technician_user_id']" position="before">
|
||||
<field name="equipment_type" class="custom_required"/>
|
||||
<field name="equipment_type_code" required='1' class="custom_required"/>
|
||||
<field name="equipment_type"/>
|
||||
<field name="equipment_type_code" required='1'/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -76,30 +76,22 @@
|
||||
<field name="equipment_maintenance_id"/>
|
||||
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='user_id']" position="replace">
|
||||
<field name="user_id" string="维保人"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='close_date']" position="replace">
|
||||
<field name="close_date" attrs="{'invisible': [('done', '!=', True)]}" readonly="True" string="维保日期"/>
|
||||
</xpath>
|
||||
|
||||
<sheet>
|
||||
|
||||
<notebook>
|
||||
<page string="维保标准" attrs="{'invisible': [('equipment_maintenance_id', '=', False)]}" context="{'default_standard_id': 'id'}">
|
||||
<field name="maintenance_standards" widget="one2many_list">
|
||||
<tree multi_edit="" editable="">
|
||||
<field name="name" class="table_custom_required"/>
|
||||
<field name="maintenance_standards" class="table_custom_required"/>
|
||||
<field name="images" force_save="1" required="1" class="table_custom_required">
|
||||
<field name="name" />
|
||||
<field name="maintenance_standards"/>
|
||||
<field name="images" force_save="1" required="1">
|
||||
</field>
|
||||
<field name="remark" class="table_custom_required"/>
|
||||
<field name="remark"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
|
||||
|
||||
</sheet>
|
||||
|
||||
|
||||
|
||||
@@ -36,7 +36,8 @@
|
||||
type="action"
|
||||
class="oe_stat_button"
|
||||
context="{'search_default_equipment_id': [active_id]}"
|
||||
icon="fa-exchange">
|
||||
icon="fa-exchange"
|
||||
attrs="{'invisible': [('state_zc', '!=', '已注册')]}">
|
||||
<field string="设备oee" name="equipment_oee_ids" widget="statinfo"/>
|
||||
</button>
|
||||
|
||||
@@ -55,14 +56,12 @@
|
||||
<field name="MTcode"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='category_id']" position="after">
|
||||
|
||||
<field name="state_zc" readonly="1"/>
|
||||
<field name="function_type"/>
|
||||
<field name="code" readonly="1"/>
|
||||
<field name="equipment_type" invisible="1"/>
|
||||
<field name="brand_id" force_save="1" />
|
||||
<field name="brand_id" force_save="1"/>
|
||||
<field name="type_id" attrs="{'required': [('equipment_type', '=', '机床')]}"
|
||||
domain="[('brand_id', '=', brand_id)]" />
|
||||
domain="[('brand_id', '=', brand_id)]"/>
|
||||
<field name="machine_tool_category" readonly="1" attrs="{'invisible': [('type_id', '=', False)]}"
|
||||
force_save="1"/>
|
||||
<field name="run_time" force_save="1"/>
|
||||
@@ -73,7 +72,7 @@
|
||||
<group>
|
||||
<group string="基础参数">
|
||||
<field name="control_system_id" attrs="{'required': [('equipment_type', '=', '机床')]}"
|
||||
options="{'no_create': True}" />
|
||||
options="{'no_create': True}"/>
|
||||
<label for="workbench_L" string="工作台尺寸(mm)"/>
|
||||
<div class="test_model">
|
||||
<label for="workbench_L" string="长"/>
|
||||
@@ -85,11 +84,6 @@
|
||||
<field name="workbench_W" class="o_address_zip"
|
||||
attrs="{'required': [('equipment_type', '=', '机床')]}"
|
||||
options="{'format': false}"/>
|
||||
<span>&nbsp;</span>
|
||||
<label for="workbench_H" string="高"/>
|
||||
<field name="workbench_H" class="o_address_zip"
|
||||
attrs="{'required': [('equipment_type', '=', '机床')]}"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="workpiece_load"/>
|
||||
<label for="machine_tool_L" string="机床尺寸(mm)"/>
|
||||
@@ -134,7 +128,7 @@
|
||||
<!-- <field name="guide_rail" required="1"/>-->
|
||||
<field name="number_of_axles" attrs="{'required': [('equipment_type', '=', '机床')]}"
|
||||
widget="radio"
|
||||
options="{'horizontal': true}" />
|
||||
options="{'horizontal': true}"/>
|
||||
<label for="x_axis" string="加工行程(mm)"
|
||||
attrs="{'invisible': [('number_of_axles', '=', False)]}"/>
|
||||
<div class="test_model"
|
||||
@@ -160,44 +154,21 @@
|
||||
attrs="{'invisible': [('number_of_axles', '=', '三轴')]}"
|
||||
options="{'format': false}"/>
|
||||
<span>&nbsp;</span>
|
||||
<label for="c_axis" string="c"
|
||||
<label for="b_axis" string="b"
|
||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"/>
|
||||
<field name="c_axis" class="o_address_zip"
|
||||
<field name="b_axis" class="o_address_zip"
|
||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"
|
||||
options="{'format': false}"/>
|
||||
<span>&nbsp;</span>
|
||||
<label for="b_axis" string="b"
|
||||
<label for="c_axis" string="c"
|
||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"/>
|
||||
<field name="b_axis" class="o_address_zip"
|
||||
<field name="c_axis" class="o_address_zip"
|
||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
</group>
|
||||
|
||||
<group string="刀具">
|
||||
<!-- <field name="knife_type" required="1"/>-->
|
||||
<field name="number_of_knife_library"
|
||||
attrs="{'required': [('equipment_type', '=', '机床')]}"/>
|
||||
<!-- <field name="tool_speed" required="1"/>-->
|
||||
<field name="tool_full_diameter_max"/>
|
||||
<field name="tool_perimeter_diameter_max"/>
|
||||
<field name="tool_long_max"/>
|
||||
<!-- <label for="tool_diameter_min" string="刀具刀径(mm)"/>-->
|
||||
<!-- <div class="test_model">-->
|
||||
<!-- <label for="tool_diameter_min" string="最小(min)"/>-->
|
||||
<!-- <field name="tool_diameter_min" class="o_address_zip" required="1"-->
|
||||
<!-- options="{'format': false}"/>-->
|
||||
<!-- <span>&nbsp;</span>-->
|
||||
<!-- <label for="tool_diameter_max" string="最大(max)"/>-->
|
||||
<!-- <field name="tool_diameter_max" class="o_address_zip" required="1"-->
|
||||
<!-- options="{'format': false}"/>-->
|
||||
<!-- </div>-->
|
||||
<field name="tool_quality_max"/>
|
||||
<field name="T_tool_time"/>
|
||||
<field name="C_tool_time"/>
|
||||
</group>
|
||||
<group string="主轴">
|
||||
<field name="taper_type_id" attrs="{'required': [('equipment_type', '=', '机床')]}" />
|
||||
<group string="主轴">
|
||||
<field name="taper_type_id" attrs="{'required': [('equipment_type', '=', '机床')]}"/>
|
||||
<label for="distance_min" string="主轴端面-工作台距离(mm)"/>
|
||||
<div class="test_model">
|
||||
<label for="distance_min" string="最小(min)"/>
|
||||
@@ -221,8 +192,40 @@
|
||||
|
||||
<!-- <field name="distance" required="1"/>-->
|
||||
</group>
|
||||
<group string="刀具">
|
||||
<!-- <field name="knife_type" required="1"/>-->
|
||||
<field name="number_of_knife_library"
|
||||
attrs="{'required': [('equipment_type', '=', '机床')]}"
|
||||
options="{'format': false}"/>
|
||||
<!-- <field name="tool_speed" required="1"/>-->
|
||||
<field name="tool_full_diameter_max"/>
|
||||
<field name="tool_perimeter_diameter_max"/>
|
||||
<field name="tool_long_max"/>
|
||||
<!-- <label for="tool_diameter_min" string="刀具刀径(mm)"/>-->
|
||||
<!-- <div class="test_model">-->
|
||||
<!-- <label for="tool_diameter_min" string="最小(min)"/>-->
|
||||
<!-- <field name="tool_diameter_min" class="o_address_zip" required="1"-->
|
||||
<!-- options="{'format': false}"/>-->
|
||||
<!-- <span>&nbsp;</span>-->
|
||||
<!-- <label for="tool_diameter_max" string="最大(max)"/>-->
|
||||
<!-- <field name="tool_diameter_max" class="o_address_zip" required="1"-->
|
||||
<!-- options="{'format': false}"/>-->
|
||||
<!-- </div>-->
|
||||
<field name="tool_quality_max"/>
|
||||
<field name="T_tool_time"/>
|
||||
<field name="C_tool_time"/>
|
||||
</group>
|
||||
|
||||
|
||||
<group string="进给参数">
|
||||
<field name="X_axis_rapid_traverse_speed"/>
|
||||
<field name="Y_axis_rapid_traverse_speed"/>
|
||||
<field name="Z_axis_rapid_traverse_speed"/>
|
||||
<field name="a_axis_rapid_traverse_speed"/>
|
||||
<field name="b_axis_rapid_traverse_speed"/>
|
||||
<field name="c_axis_rapid_traverse_speed"/>
|
||||
<field name="straight_cutting_feed_rate"/>
|
||||
<field name="rotary_cutting_feed_rate"/>
|
||||
</group>
|
||||
<group string="精度参数">
|
||||
<field name="X_precision"/>
|
||||
<field name="X_precision_repeat"/>
|
||||
@@ -237,16 +240,6 @@
|
||||
<field name="c_precision"/>
|
||||
<field name="c_precision_repeat"/>
|
||||
</group>
|
||||
<group string="进给参数">
|
||||
<field name="X_axis_rapid_traverse_speed"/>
|
||||
<field name="Y_axis_rapid_traverse_speed"/>
|
||||
<field name="Z_axis_rapid_traverse_speed"/>
|
||||
<field name="a_axis_rapid_traverse_speed"/>
|
||||
<field name="b_axis_rapid_traverse_speed"/>
|
||||
<field name="c_axis_rapid_traverse_speed"/>
|
||||
<field name="straight_cutting_feed_rate"/>
|
||||
<field name="rotary_cutting_feed_rate"/>
|
||||
</group>
|
||||
|
||||
</group>
|
||||
|
||||
@@ -1187,7 +1180,7 @@
|
||||
<field name="name" readonly="1"/>
|
||||
<field name="type" readonly="1"/>
|
||||
<field name="image" widget="image" readonly="1"/>
|
||||
<!-- <field name="equipment_id"/>-->
|
||||
<field name="equipment_id"/>
|
||||
<field name="active" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
'views/mrp_workcenter_views.xml',
|
||||
'views/mrp_workorder_view.xml',
|
||||
'views/model_type_view.xml',
|
||||
'views/agv_setting_views.xml',
|
||||
'views/sf_maintenance_equipment.xml',
|
||||
|
||||
],
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
from . import controllers
|
||||
from . import workpiece
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import logging
|
||||
import json
|
||||
from datetime import datetime
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
@@ -22,32 +21,27 @@ class Manufacturing_Connect(http.Controller):
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
logging.info('RfidCode:%s' % ret['RfidCode'])
|
||||
if 'RfidCode' in ret:
|
||||
workorder = request.env['mrp.workorder'].sudo().search([('rfid_code', '=', ret['RfidCode'])])
|
||||
if workorder:
|
||||
for item in workorder:
|
||||
res['Datas'].append({
|
||||
'BillId': item.production_id.name,
|
||||
'ProductionLine': item.production_id.production_line_id.id,
|
||||
'SortId': item.sequence,
|
||||
'CraftName': item.name,
|
||||
'Quantity': 1,
|
||||
'MaterialId': item.product_id.default_code,
|
||||
'MaterialName': item.product_id.name,
|
||||
'Spec': '%s×%s×%s' % (item.move_raw_ids.materiel_length, item.move_raw_ids.materiel_width,
|
||||
item.move_raw_ids.materiel_height),
|
||||
'Material': item.product_id.materials_type_id.name
|
||||
})
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该rfid暂未有对应的工单'}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传RfidCode字段'}
|
||||
workorder = request.env['mrp.workorder'].sudo().search(
|
||||
[('rfid_code', '=', ret['RfidCode']), ('routing_type', '=', '装夹预调')])
|
||||
if workorder:
|
||||
for item in workorder:
|
||||
res['Datas'].append({
|
||||
'BillId': item.production_id.name,
|
||||
'ProductionLine': item.production_line,
|
||||
'CraftName': item.name,
|
||||
'Quantity': 1,
|
||||
'MaterialId': item.product_id.default_code,
|
||||
'MaterialName': item.product_id.name,
|
||||
'Spec': '%s×%s×%s' % (item.move_raw_ids.materiel_length, item.move_raw_ids.materiel_width,
|
||||
item.move_raw_ids.materiel_height),
|
||||
'Material': item.product_id.materials_type_id.name
|
||||
})
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('get_Work_Info error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
@http.route('/AutoDeviceApi/GetShiftPlan', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
@http.route('/AutoDeviceApi/GetShiftPlan', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def get_ShiftPlan(self, **kw):
|
||||
"""
|
||||
@@ -60,29 +54,22 @@ class Manufacturing_Connect(http.Controller):
|
||||
res = {'Succeed': True, 'Datas': []}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
if 'ProductionLine' in ret:
|
||||
workorder_ids = request.env['mrp.workorder'].sudo().get_plan_workorder(ret['ProductionLine'])
|
||||
else:
|
||||
ProductionLine = False
|
||||
workorder_ids = request.env['mrp.workorder'].sudo().get_plan_workorder(ProductionLine)
|
||||
ret = json.loads(ret['result'])
|
||||
logging.info('RfidCode:%s' % ret)
|
||||
logging.info('workorder_ids:%s' % workorder_ids)
|
||||
workorder = request.env['mrp.workorder'].sudo().search(workorder_ids)
|
||||
workorder = request.env['mrp.workorder'].sudo().search([('name', '=', ret['ProductionLine'])])
|
||||
if workorder:
|
||||
for item in workorder:
|
||||
date_planned_start = ''
|
||||
date_planned_finished = ''
|
||||
if item.date_planned_start is not False:
|
||||
logging.info('date_planned_start:%s' % item.date_planned_start)
|
||||
planned_start = item.date_planned_start.strftime("%Y-%m-%d %H:%M:%S")
|
||||
date_planned_start = request.env['sf.sync.common'].sudo().get_add_time(planned_start)
|
||||
if item.date_planned_finished is not False:
|
||||
logging.info('date_planned_finished:%s' % item.date_planned_finished)
|
||||
planned_finished = item.date_planned_finished.strftime("%Y-%m-%d %H:%M:%S")
|
||||
date_planned_finished = request.env['sf.sync.common'].sudo().get_add_time(planned_finished)
|
||||
res['Datas'].append({
|
||||
'BillId': item.production_id.name,
|
||||
'RfidCode': item.rfid_code,
|
||||
'RfidCode': item.RfidCode,
|
||||
'CraftName': item.name,
|
||||
'Quantity': 1,
|
||||
'WortkStart': date_planned_start,
|
||||
@@ -90,7 +77,7 @@ class Manufacturing_Connect(http.Controller):
|
||||
'MaterialId': item.product_id.default_code,
|
||||
'MaterialName': item.product_id.name,
|
||||
# 'Spec':item.mat,
|
||||
'Material': item.product_id.materials_type_id.name
|
||||
'Material': item.materials_type_id.name
|
||||
})
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
@@ -112,25 +99,17 @@ class Manufacturing_Connect(http.Controller):
|
||||
res = {'Succeed': True, 'Datas': []}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
logging.info('RfidCode:%s' % ret['RfidCode'])
|
||||
if 'RfidCode' in ret:
|
||||
workorder = request.env['mrp.workorder'].sudo().search(
|
||||
[('routing_type', '=', '装夹预调'), ('rfid_code', '=', ret['RfidCode'])], limit=1, order='id asc')
|
||||
if workorder:
|
||||
for item in workorder:
|
||||
if item.material_center_point:
|
||||
offset = item.material_center_point[1:-1].split(",")
|
||||
res['Datas'].append({
|
||||
'XOffset': 0 if not item.material_center_point else offset[0],
|
||||
'YOffset': 0 if not item.material_center_point else offset[1],
|
||||
'ZOffset': 0 if not item.material_center_point else offset[2],
|
||||
'COffset': 0,
|
||||
'Coordinate': 'G54'
|
||||
})
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该rfid暂未有对应的工件预调(前置三元检测)工单'}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传RfidCode字段'}
|
||||
ret = json.loads(ret['result'])
|
||||
logging.info('RfidCode:%s' % ret)
|
||||
workorder = request.env['mrp.workorder'].sudo().search([('routing_type', '=', '前置三元定位检测')])
|
||||
if workorder:
|
||||
for item in workorder:
|
||||
res['Datas'].append({
|
||||
'XOffset': item.production_id.name,
|
||||
'YOffset': item.RfidCode,
|
||||
'ZOffet': item.name,
|
||||
'COffset': 1
|
||||
})
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('get_qcCheck error:%s' % e)
|
||||
@@ -146,34 +125,23 @@ class Manufacturing_Connect(http.Controller):
|
||||
"""
|
||||
logging.info('button_Work_START:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True, 'Datas': ['工单已开始']}
|
||||
res = {'Succeed': True, 'Datas': []}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
if not ret['BillId']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传制造订单号'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if not ret['CraftId']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传工序名称'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if not ret['DeviceId']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传设备号'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
production_id = ret['BillId']
|
||||
routing_type = ret['CraftId']
|
||||
equipment_id = ret["DeviceId"]
|
||||
workorder = request.env['mrp.workorder'].sudo().search(
|
||||
[('production_id', '=', production_id), ('routing_type', '=', routing_type)], limit=1)
|
||||
if not workorder:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '该工单不存在'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if workorder.state != 'ready':
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '工单未就绪'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
work_equipment_id = request.env['maintenance.equipment'].sudo().search([('name', '=', equipment_id)],
|
||||
limit=1)
|
||||
if not work_equipment_id:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有找到该加工设备'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
workorder.equipment_id = work_equipment_id
|
||||
workorder.button_start()
|
||||
|
||||
# 根据工单的实际开始时间修改排程单的开始时间、状态
|
||||
if workorder.date_start:
|
||||
request.env['sf.production.plan'].sudo().search([('production_id', '=', production_id)]).write(
|
||||
{'actual_start_time': workorder.date_start,
|
||||
'state': 'processing'})
|
||||
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('button_Work_START error:%s' % e)
|
||||
@@ -189,342 +157,61 @@ class Manufacturing_Connect(http.Controller):
|
||||
"""
|
||||
logging.info('button_Work_End:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True, 'Datas': ['工单已结束']}
|
||||
res = {'Succeed': True, 'Datas': []}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
if not ret['BillId']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传制造订单号'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if not ret['CraftId']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传工序名称'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if not ret['DeviceId']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传设备号'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
production_id = ret['BillId']
|
||||
routing_type = ret['CraftId']
|
||||
workorder = request.env['mrp.workorder'].sudo().search(
|
||||
[('production_id', '=', production_id), ('routing_type', '=', routing_type)], limit=1)
|
||||
if not workorder:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '该工单不存在'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if workorder.state != 'progress':
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '该工单未开始'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
workorder.button_finish()
|
||||
|
||||
# 根据工单的实际结束时间修改排程单的结束时间、状态,同时修改销售订单的状态
|
||||
if workorder.date_finished:
|
||||
request.env['sf.production.plan'].sudo().search([('production_id', '=', production_id)]).write(
|
||||
{'actual_end_time': workorder.date_finished,
|
||||
'state': 'finished'})
|
||||
production_obj = request.env['mrp.production'].sudo().search([('name', '=', production_id)])
|
||||
if production_obj:
|
||||
production_obj.sudo().work_order_state = '已完成'
|
||||
production_obj.write({'state': 'completed'})
|
||||
request.env['sale.order'].sudo().search(
|
||||
[('name', '=', production_obj.origin)]).write({'schedule_status': 'to deliver'})
|
||||
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('button_Work_End error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
@http.route('/AutoDeviceApi/PartQualityInspect', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
@http.route('/AutoDeviceApi/QcCheck', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def PartQualityInspect(self, **kw):
|
||||
def Workorder_QcCheck(self, **kw):
|
||||
"""
|
||||
零件质检
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
logging.info('PartQualityInspect:%s' % kw)
|
||||
logging.info('Workorder_QcCheck:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True}
|
||||
res = {'Succeed': True, 'Datas': []}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
if not ret['BillId']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传制造订单号'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if not ret['CraftId']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传工序名称'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if not ret['DeviceId']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传设备号'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if not ret['Quality']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传检测结果'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if not ret['ReportPaht']:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传检查报告文件(地址)'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
production_id = ret['BillId']
|
||||
routing_type = ret['CraftId']
|
||||
workorder = request.env['mrp.workorder'].sudo().search(
|
||||
request.env['mrp.workorder'].sudo().search(
|
||||
[('production_id', '=', production_id), ('routing_type', '=', routing_type)], limit=1)
|
||||
if workorder:
|
||||
# workorder.test_results = ret['Quality']
|
||||
logging.info('制造订单:%s' % workorder.production_id.name)
|
||||
if 'ReportPaht' in ret:
|
||||
download_state = request.env['mrp.workorder'].with_user(
|
||||
request.env.ref("base.user_admin")).download_reportfile_tmp(workorder,
|
||||
ret['ReportPaht'])
|
||||
if download_state == 1:
|
||||
detection_ret = request.env['mrp.workorder'].with_user(
|
||||
request.env.ref("base.user_admin")).get_detection_file(workorder, ret['ReportPaht'])
|
||||
if detection_ret is True:
|
||||
stock_picking_type = request.env['stock.picking.type'].sudo().search(
|
||||
[('sequence_code', '=', 'SFP')])
|
||||
if stock_picking_type:
|
||||
stock_picking = request.env['stock.picking'].sudo().search(
|
||||
[('product_id', '=', workorder.product_id.id),
|
||||
('origin', '=', workorder.production_id.origin),
|
||||
('picking_type_id', '=', stock_picking_type.id)])
|
||||
if stock_picking:
|
||||
quality_check = request.env['quality.check'].sudo().search(
|
||||
[('product_id', '=', workorder.product_id.id),
|
||||
('picking_id', '=', stock_picking.id)])
|
||||
if quality_check:
|
||||
logging.info('质检单:%s' % quality_check.name)
|
||||
quality_check.write({'report_pdf': workorder.detection_report})
|
||||
elif download_state == 2:
|
||||
res = {'Succeed': False, 'ErrorCode': 205,
|
||||
'Error': 'ReportPaht中的工件号与制造订单%s不匹配,请检查ReportPaht是否正确' % workorder.production_id.name}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 204, 'Error': '检测报告文件从FTP拉取失败'}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '未传ReportPaht字段'}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 206, 'Error': '未查询到工单'}
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('PartQualityInspect error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
@http.route('/AutoDeviceApi/CMMProgDolod', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def CMMProgDolod(self, **kw):
|
||||
"""
|
||||
中控系统传递RFID编号给MES,获取测量程序文件。Ftp下载文件
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
logging.info('CMMProgDolod:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True, 'Datas': []}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
if 'RfidCode' in ret:
|
||||
logging.info('RfidCode:%s' % ret['RfidCode'])
|
||||
workorder = request.env['mrp.workorder'].sudo().search(
|
||||
[('rfid_code', '=', ret['RfidCode']), ('routing_type', '=', 'CNC加工')])
|
||||
if workorder:
|
||||
for item in workorder.cmm_ids:
|
||||
if item.program_date is not False:
|
||||
program_date = item.program_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
program_date_str = request.env['sf.sync.common'].sudo().get_add_time(program_date)
|
||||
res['Datas'].append({
|
||||
'CraftId': workorder.id,
|
||||
'CraftKey': workorder.name,
|
||||
'ProgramDate': '' if not item.program_date else program_date_str,
|
||||
'ProgramPath': item.program_path,
|
||||
'PostProcessing': item.post_processing_name,
|
||||
})
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '暂无工单及对应的CNC程序数据'}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传RfidCode字段'}
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('CMMProgDolod error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
@http.route('/AutoDeviceApi/NCProgDolod', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def NCProgDolod(self, **kw):
|
||||
"""
|
||||
中控系统传递RFID编号给MES,获取程序单及程序文件。Ftp下载文件
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
logging.info('NCProgDolod:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True, 'Datas': []}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
if 'RfidCode' in ret:
|
||||
logging.info('RfidCode:%s' % ret['RfidCode'])
|
||||
workorder = request.env['mrp.workorder'].sudo().search(
|
||||
[('rfid_code', '=', ret['RfidCode']), ('routing_type', '=', 'CNC加工')])
|
||||
if workorder:
|
||||
for item in workorder.cnc_ids:
|
||||
res['Datas'].append({
|
||||
'CraftId': workorder.id,
|
||||
'CraftName': workorder.name,
|
||||
'SortId': item.sequence_number,
|
||||
'ProgramName': item.program_name,
|
||||
'ToolId': item.cutting_tool_no,
|
||||
'ToolName': item.cutting_tool_name,
|
||||
'Depth': item.depth_of_processing_z,
|
||||
'ProgramPath': item.program_path,
|
||||
'ProgramTime': item.estimated_processing_time,
|
||||
})
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '暂无工单及对应的CNC程序数据'}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传RfidCode字段'}
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('NCProgDolod error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
@http.route('/AutoDeviceApi/LocationChange', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def LocationChange(self, **kw):
|
||||
"""
|
||||
库位变更
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
logging.info('LocationChange:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True, 'Datas': []}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
RfidCode = ret['RfidCode']
|
||||
ChangeType = ret['ChangeType']
|
||||
OldDeciveId = ret['OldDeciveId']
|
||||
OldPosition = ret['OldPosition']
|
||||
NewDeciveId = ret['NewDeciveId']
|
||||
NewPosition = ret['NewPosition']
|
||||
OldDeciveStart = ret['OldDeciveStart']
|
||||
OldDeciveEnd = ret['OldDeciveEnd']
|
||||
# Part、Tool
|
||||
if ChangeType == 'Part':
|
||||
workorder = request.env['mrp.workorder'].sudo().search(
|
||||
[('rfid_code', '=', RfidCode)], limit=1)
|
||||
if not workorder:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未根据RfidCode找到该工单'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
old_localtion = request.env['sf.shelf.location'].sudo().search(
|
||||
[('barcode', '=', OldPosition)], limit=1)
|
||||
new_localtion = request.env['sf.shelf.location'].sudo().search(
|
||||
[('barcode', '=', NewPosition)], limit=1)
|
||||
if not new_localtion:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有该目标位置'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if old_localtion:
|
||||
old_localtion.location_status = '空闲'
|
||||
old_localtion.production_id = False
|
||||
new_localtion.location_status = '占用'
|
||||
new_localtion.production_id = workorder.production_id.id
|
||||
if ChangeType == 'Tool':
|
||||
old_localtion = request.env['sf.shelf.location'].sudo().search(
|
||||
[('barcode', '=', OldPosition)], limit=1)
|
||||
equipment_id = request.env['maintenance.equipment'].sudo().search(
|
||||
[('name', '=', NewPosition)], limit=1)
|
||||
equipment_id.register_equipment_tool()
|
||||
if not equipment_id:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有该目标位置'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if old_localtion:
|
||||
old_localtion.location_status = '空闲'
|
||||
old_localtion.production_id = False
|
||||
|
||||
# return json.JSONEncoder().encode(res)
|
||||
# else:
|
||||
# res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传RfidCode字段'}
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('LocationChange error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
@http.route('/AutoDeviceApi/AGVToProduct', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def AGVToProduct(self, **kw):
|
||||
"""
|
||||
AGV运送上产线(完成)
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
logging.info('AGVToProduct:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
if 'DeviceId' in ret:
|
||||
logging.info('DeviceId:%s' % ret['DeviceId'])
|
||||
workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(
|
||||
[('feeder_station_start_id.name', '=', ret['DeviceId']),
|
||||
('status', '=', '待配送')], limit=1, order='id asc')
|
||||
if workpiece_delivery:
|
||||
for wd in workpiece_delivery:
|
||||
logging.info('wd.production_id:%s' % wd.production_id.name)
|
||||
if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '待上产线':
|
||||
logging.info('wd.production_line_state:%s' % wd.production_id.production_line_state)
|
||||
wd.production_id.write({'production_line_state': '已上产线'})
|
||||
wd.write({'production_line_state': '已上产线'})
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该DeviceId没有对应的工件配送数据'}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传DeviceId字段'}
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('AGVToProduct error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
@http.route('/AutoDeviceApi/AGVDownProduct', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def AGVDownProduct(self, **kw):
|
||||
"""
|
||||
MES调度AGV,搬运零件AGV托盘到产线接驳站。
|
||||
生产线接受到零件AGV托盘到位信号后,把生产合格或特采的零件,机器人搬运零件到AGV接驳站中,触发AGV运送下产线接口。
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
logging.info('AGVDownProduct:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
if 'DeviceId' in ret:
|
||||
logging.info('DeviceId:%s' % ret['DeviceId'])
|
||||
workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(
|
||||
[('feeder_station_destination_id.name', '=', ret['DeviceId']),
|
||||
('status', '=', '待配送')], limit=1, order='id asc')
|
||||
if workpiece_delivery:
|
||||
for wd in workpiece_delivery:
|
||||
logging.info('wd.production_id:%s' % wd.production_id.name)
|
||||
if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '已上产线':
|
||||
logging.info('wd.production_line_state:%s' % wd.production_id.production_line_state)
|
||||
workpiece_delivery_off = request.env['sf.workpiece.delivery'].sudo().create({
|
||||
'production_id': wd.production_id.id,
|
||||
'feeder_station_start_id': workpiece_delivery.feeder_station_start_id.id,
|
||||
'feeder_station_destination_id': '',
|
||||
'workorder_id': workpiece_delivery.workorder_id.id,
|
||||
'workpiece_code': workpiece_delivery.workpiece_code,
|
||||
'production_line_id': workpiece_delivery.production_line_id.id,
|
||||
'task_delivery_time': datetime.now(),
|
||||
'production_line_state': '已下产线'
|
||||
})
|
||||
wd.production_id.write({'production_line_state': '已下产线'})
|
||||
logging.info('开始向agv下发下产线任务')
|
||||
workpiece_delivery_off._delivery_avg()
|
||||
logging.info('agv下发下产线任务已配送')
|
||||
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该DeviceId没有对应的工件配送数据'}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传DeviceId字段'}
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('AGVDownProduct error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
@http.route('/AutoDeviceApi/EquipmentBaseCoordinate', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def PutEquipmentBaseCoordinate(self, **kw):
|
||||
"""
|
||||
获取机床基坐标
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
logging.info('PutEquipmentBaseCoordinate:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
if 'DeviceId' in ret:
|
||||
equipment = request.env['maintenance.equipment'].sudo().search('name', '=', ret['DeviceId'])
|
||||
if equipment:
|
||||
equipment.sudo().write({
|
||||
'base_coordinate_fixture_model_id': ret['base_coordinate_fixture_model_id'],
|
||||
'base_coordinate_g_coordinate': ret['base_coordinate_g_coordinate'],
|
||||
'base_coordinate_x': ret['base_coordinate_x'],
|
||||
'base_coordinate_y': ret['base_coordinate_y'],
|
||||
'base_coordinate_z': ret['base_coordinate_z'],
|
||||
})
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 203, 'Error': 'DeviceId为%s的设备不存在!' % ret['DeviceId']}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传DeviceId字段'}
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('AGVDownProduct error:%s' % e)
|
||||
logging.info('Workorder_QcCheck error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import logging
|
||||
import json
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
|
||||
class Workpiece(http.Controller):
|
||||
|
||||
@http.route('/agvApi/backfeed', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def backfeed(self, **kw):
|
||||
"""
|
||||
agv小车反馈工单(工件)结果
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
logging.info('backfeed:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
logging.info('backfeed-ret:%s' % ret)
|
||||
if 'reqCode' in ret:
|
||||
if 'method' in ret:
|
||||
if ret['method'] == 'end':
|
||||
workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(
|
||||
[('production_id.name', '=', ret['reqCode']), ('agv_task_code'), '=', ret['taskCode']])
|
||||
if workpiece_delivery:
|
||||
workpiece_delivery.write({'status': '已配送', 'task_completion_time': ret['reqTime']})
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该reqCode暂未查到对应的工件配送记录'}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 204, 'Error': '未传method字段'}
|
||||
else:
|
||||
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传reqCode字段'}
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('backfeed error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
@@ -67,21 +67,5 @@
|
||||
search="[('barcode','=','WH-PREPRODUCTION')]"/>
|
||||
<field name="default_location_dest_id" ref="stock_location_locations_virtual_outcontract"/>
|
||||
</record>
|
||||
|
||||
<record id="route_surface_technology_outsourcing" model="stock.route">
|
||||
<field name="name">表面工艺外协</field>
|
||||
<!-- <field name="company_id"></field>-->
|
||||
<field name="active">True</field>
|
||||
<field name="sequence">11</field>
|
||||
</record>
|
||||
<!-- <record id="route_surface_technology_outsourcing" model="stock.rule">-->
|
||||
<!-- <field name="name">外协出库单</field>-->
|
||||
<!-- <field name="action">push</field>-->
|
||||
<!-- <field name="pick_type_id" ref="outcontract_picking_out"></field>-->
|
||||
<!-- <field name="location_src_id" ref=""/>-->
|
||||
<!-- <field name="location_dest_id" ref="stock_location_locations_virtual_outcontract"/>-->
|
||||
<!-- <field name="active">True</field>-->
|
||||
<!-- <field name="sequence">11</field>-->
|
||||
<!-- </record>-->
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
@@ -8,4 +8,3 @@ from . import mrp_routing_workcenter
|
||||
from . import stock
|
||||
from . import res_user
|
||||
from . import production_line_base
|
||||
from . import agv_setting
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class AgvSetting(models.Model):
|
||||
_name = 'sf.agv.site'
|
||||
_description = 'agv站点'
|
||||
|
||||
number = fields.Integer('序号')
|
||||
name = fields.Char('位置编号')
|
||||
owning_region = fields.Char('所属区域')
|
||||
state = fields.Selection([
|
||||
('占用', '占用'),
|
||||
('空闲', '空闲')], string='状态')
|
||||
divide_the_work = fields.Char('主要分工')
|
||||
|
||||
|
||||
class AgvTaskRoute(models.Model):
|
||||
_name = 'sf.agv.task.route'
|
||||
_description = 'agv任务路线'
|
||||
|
||||
name = fields.Char('名称')
|
||||
type = fields.Selection([
|
||||
('F01', '搬运'), ], string='类型', default="F01")
|
||||
start_site_id = fields.Many2one('sf.agv.site', '起点接驳站位置编号')
|
||||
end_site_id = fields.Many2one('sf.agv.site', '终点接驳站位置编号')
|
||||
destination_production_line_id = fields.Many2one('sf.production.line', '目的生产线')
|
||||
priority = fields.Selection([
|
||||
('0', '正常'),
|
||||
('1', '低'),
|
||||
('2', '中'),
|
||||
('3', '高'),
|
||||
('4', '紧急'),
|
||||
], string='优先级', default='0')
|
||||
active = fields.Boolean('有效', default=True)
|
||||
@@ -20,8 +20,6 @@ class MrpProduction(models.Model):
|
||||
model_file = fields.Binary('模型文件', related='product_id.model_file')
|
||||
schedule_state = fields.Selection([('未排', '未排'), ('已排', '已排'), ('已完成', '已完成')],
|
||||
string='排程状态', default='未排')
|
||||
work_order_state = fields.Selection([('未排', '未排'), ('已排', '已排'), ('已完成', '已完成')],
|
||||
string='工单状态', default='未排')
|
||||
|
||||
# state = fields.Selection(selection_add=[
|
||||
# ('pending_scheduling', '待排程'),
|
||||
@@ -54,11 +52,7 @@ class MrpProduction(models.Model):
|
||||
glb_file = fields.Binary("glb模型文件")
|
||||
production_line_id = fields.Many2one('sf.production.line', string='生产线')
|
||||
plan_start_processing_time = fields.Datetime('计划开始加工时间')
|
||||
production_line_state = fields.Selection(
|
||||
[('待上产线', '待上产线'), ('已上产线', '已上产线'), ('已下产线', '已下产线')],
|
||||
string='上/下产线', default='待上产线')
|
||||
|
||||
manual_quotation = fields.Boolean('人工编程', default=False, readonly=True)
|
||||
|
||||
@api.depends(
|
||||
'move_raw_ids.state', 'move_raw_ids.quantity_done', 'move_finished_ids.state',
|
||||
@@ -96,11 +90,7 @@ class MrpProduction(models.Model):
|
||||
# 新添加的状态逻辑
|
||||
if production.state == 'progress' and production.schedule_state == '已排':
|
||||
production.state = 'pending_processing'
|
||||
# elif production.state == 'progress' and production.schedule_state == '已完成':
|
||||
# production.state = 'completed'
|
||||
elif production.state == 'pending_processing' and production.work_order_state == '已完成':
|
||||
production.state = 'completed'
|
||||
elif production.state == 'progress' and production.work_order_state == '已完成':
|
||||
elif production.state == 'progress' and production.schedule_state == '已完成':
|
||||
production.state = 'completed'
|
||||
|
||||
def action_check(self):
|
||||
@@ -135,15 +125,6 @@ class MrpProduction(models.Model):
|
||||
# cnc程序获取
|
||||
def fetchCNC(self):
|
||||
cnc = self.env['mrp.production'].search([('id', '=', self.id)])
|
||||
quick_order = self.env['quick.easy.order'].search(
|
||||
[('name', '=', cnc.product_id.default_code.rsplit('-', 1)[0])])
|
||||
programme_way = False
|
||||
if cnc.manual_quotation is True:
|
||||
programme_way = 'manual operation'
|
||||
else:
|
||||
programme_way = 'auto'
|
||||
if quick_order:
|
||||
programme_way = 'manual operation'
|
||||
try:
|
||||
res = {'model_code': '' if not cnc.product_id.model_code else cnc.product_id.model_code,
|
||||
'production_no': cnc.name,
|
||||
@@ -158,9 +139,8 @@ class MrpProduction(models.Model):
|
||||
'embryo_height': cnc.product_id.bom_ids.bom_line_ids.product_id.height,
|
||||
'embryo_width': cnc.product_id.bom_ids.bom_line_ids.product_id.width,
|
||||
'order_no': cnc.origin,
|
||||
'model_order_no': cnc.product_id.default_code,
|
||||
'model_order_no': cnc.product_id.default_code.rsplit(' -', 1)[0],
|
||||
'user': cnc.env.user.name,
|
||||
'programme_way': programme_way,
|
||||
'model_file': '' if not cnc.product_id.model_file else base64.b64encode(
|
||||
cnc.product_id.model_file).decode('utf-8')
|
||||
}
|
||||
|
||||
@@ -22,19 +22,10 @@ class ResMrpRoutingWorkcenter(models.Model):
|
||||
bom_id = fields.Many2one('mrp.bom', required=False)
|
||||
surface_technics_id = fields.Many2one('sf.production.process', string="表面工艺")
|
||||
|
||||
def get_no(self):
|
||||
international_standards = self.search(
|
||||
[('code', '!=', ''), ('active', 'in', [True, False])],
|
||||
limit=1,
|
||||
order="id desc")
|
||||
if not international_standards:
|
||||
num = "%03d" % 1
|
||||
else:
|
||||
m = int(international_standards.code) + 1
|
||||
num = "%03d" % m
|
||||
return num
|
||||
def generate_code(self):
|
||||
return self.env['ir.sequence'].next_by_code('mrp.routing.workcenter')
|
||||
|
||||
code = fields.Char('编码', default=get_no)
|
||||
code = fields.Char('编码', default=generate_code)
|
||||
|
||||
# 获得当前登陆者公司
|
||||
def get_company_id(self):
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
import re
|
||||
|
||||
import logging
|
||||
import base64
|
||||
import urllib.parse
|
||||
from datetime import date
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime
|
||||
import requests
|
||||
import os
|
||||
import math
|
||||
from lxml import etree
|
||||
from dateutil.relativedelta import relativedelta
|
||||
# import subprocess
|
||||
from odoo import api, fields, models, SUPERUSER_ID, _
|
||||
@@ -46,8 +41,6 @@ class ResMrpWorkOrder(models.Model):
|
||||
], string="工序类型")
|
||||
results = fields.Char('结果')
|
||||
|
||||
manual_quotation = fields.Boolean('人工编程', default=False, readonly=True)
|
||||
|
||||
@api.onchange('users_ids')
|
||||
def get_user_permissions(self):
|
||||
uid = self.env.uid
|
||||
@@ -103,10 +96,9 @@ class ResMrpWorkOrder(models.Model):
|
||||
X_deviation_angle = fields.Integer(string="X轴偏差度", default=0)
|
||||
test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], default='合格',
|
||||
string="检测结果")
|
||||
cnc_ids = fields.One2many("sf.cnc.processing", 'workorder_id', string="CNC加工程序")
|
||||
cmm_ids = fields.One2many("sf.cmm.program", 'workorder_id', string="CMM程序")
|
||||
cnc_ids = fields.One2many("sf.cnc.processing", 'workorder_id', string="CNC加工")
|
||||
tray_code = fields.Char(string="托盘编码")
|
||||
glb_file = fields.Binary("glb模型文件", related='production_id.model_file')
|
||||
glb_file = fields.Binary("glb模型文件")
|
||||
is_subcontract = fields.Boolean(string='是否外协')
|
||||
surface_technics_parameters_id = fields.Many2one('sf.production.process.parameter', string="表面工艺可选参数")
|
||||
picking_in_id = fields.Many2one('stock.picking', string='外协入库单')
|
||||
@@ -118,19 +110,6 @@ class ResMrpWorkOrder(models.Model):
|
||||
processing_user_id = fields.Many2one('res.users', string='加工人')
|
||||
# 检测人
|
||||
inspection_user_id = fields.Many2one('res.users', string='检测人')
|
||||
# 保存名称
|
||||
save_name = fields.Char(string='检测文件保存名称', compute='_compute_save_name')
|
||||
# 获取数据状态
|
||||
data_state = fields.Boolean(string='获取数据状态', default=False)
|
||||
|
||||
@api.depends('production_id')
|
||||
def _compute_save_name(self):
|
||||
"""
|
||||
保存名称
|
||||
"""
|
||||
for record in self:
|
||||
record.save_name = record.production_id.name.replace('/', '_')
|
||||
|
||||
schedule_state = fields.Selection(related='production_id.schedule_state', store=True)
|
||||
# 工件装夹信息
|
||||
functional_fixture_code = fields.Char(string="功能夹具编码", readonly=True)
|
||||
@@ -150,37 +129,11 @@ class ResMrpWorkOrder(models.Model):
|
||||
total_wight = fields.Float(string="总重量")
|
||||
maximum_carrying_weight = fields.Char(string="最大承载重量[kg]")
|
||||
maximum_clamping_force = fields.Char(string="最大夹持力[n]")
|
||||
production_line = fields.Char(string="生产线")
|
||||
preset_program_information = fields.Char(string="预调程序信息")
|
||||
workpiece_delivery_ids = fields.One2many('sf.workpiece.delivery', 'workorder_id', '工件配送')
|
||||
is_delivery = fields.Boolean('是否配送完成', default=False)
|
||||
rfid_code = fields.Char('RFID码')
|
||||
rfid_code_old = fields.Char('RFID码(已解除)')
|
||||
production_line_id = fields.Many2one('sf.production.line', related='production_id.production_line_id',
|
||||
string='生产线', store=True)
|
||||
production_line_state = fields.Selection(related='production_id.production_line_state',
|
||||
string='上/下产线', store=True)
|
||||
detection_report = fields.Binary('检测报告', readonly=True)
|
||||
is_remanufacture = fields.Boolean(string='是否重新生成制造订单', default=True)
|
||||
|
||||
def get_plan_workorder(self, production_line):
|
||||
tomorrow = (date.today() + timedelta(days=+1)).strftime("%Y-%m-%d")
|
||||
tomorrow_start = tomorrow + ' 00:00:00'
|
||||
tomorrow_end = tomorrow + ' 23:59:59'
|
||||
logging.info('tomorrow:%s' % tomorrow)
|
||||
sql = """
|
||||
SELECT *
|
||||
FROM mrp_workorder
|
||||
WHERE
|
||||
to_char(date_planned_start::timestamp + '8 hour','YYYY-MM-DD HH:mm:SS')>= %s
|
||||
AND to_char(date_planned_finished::timestamp + '8 hour','YYYY-MM-DD HH:mm:SS')<= %s
|
||||
"""
|
||||
params = [tomorrow_start, tomorrow_end]
|
||||
if production_line:
|
||||
sql += "AND production_line_id = %s"
|
||||
params.append(production_line)
|
||||
self.env.cr.execute(sql, params)
|
||||
ids = [t[0] for t in self.env.cr.fetchall()]
|
||||
return [('id', 'in', ids)]
|
||||
rfid_code = fields.Char('RFID')
|
||||
|
||||
@api.onchange('is_ok')
|
||||
def _onchange_inspection_user_id(self):
|
||||
@@ -203,149 +156,6 @@ class ResMrpWorkOrder(models.Model):
|
||||
[('surface_technics_parameters_id', '!=', False), ('production_id', '=', production_id)])
|
||||
return process_parameter_workorder
|
||||
|
||||
# 获取三次元检测点数据
|
||||
def get_three_check_datas(self):
|
||||
factory_nick_name = 'XT'
|
||||
ftp_resconfig = self.env['res.config.settings'].get_values()
|
||||
ftp = FtpController(str(ftp_resconfig['ftp_host']), int(ftp_resconfig['ftp_port']),
|
||||
ftp_resconfig['ftp_user'],
|
||||
ftp_resconfig['ftp_password'])
|
||||
# ftp.connect()
|
||||
|
||||
local_dir_path = '/ftp/before'
|
||||
os.makedirs(local_dir_path, exist_ok=True)
|
||||
local_filename = self.save_name + '.xls'
|
||||
local_file_path = os.path.join(local_dir_path, local_filename)
|
||||
logging.info('local_file_path:%s' % local_file_path)
|
||||
remote_path = '/home/ftp/ftp_root/ThreeTest/XT/Before/' + local_filename
|
||||
logging.info('remote_path:%s' % remote_path)
|
||||
|
||||
if not ftp.file_exists(remote_path):
|
||||
raise UserError(f"文件不存在: {remote_path}")
|
||||
|
||||
with open(local_file_path, 'wb') as local_file:
|
||||
ftp.ftp.retrbinary('RETR ' + remote_path, local_file.write)
|
||||
logging.info('下载文件成功')
|
||||
# 解析本地文件
|
||||
# file_path = 'WH_MO_00099.xls' # 使用下载的实际文件路径
|
||||
parser = etree.XMLParser(recover=True) # Using recover to handle errors
|
||||
tree = etree.parse(local_file_path, parser)
|
||||
logging.info('tree:%s' % tree)
|
||||
root = tree.getroot()
|
||||
logging.info('root:%s' % root)
|
||||
|
||||
# 准备一个外部字典来存储以PT为键的坐标字典
|
||||
pt_coordinates = {}
|
||||
# 遍历每个工作表和行
|
||||
for worksheet in root.iterfind('.//{urn:schemas-microsoft-com:office:spreadsheet}Worksheet'):
|
||||
sheet_name = worksheet.attrib.get('{urn:schemas-microsoft-com:office:spreadsheet}Name')
|
||||
logging.info('sheet_name:%s' % sheet_name)
|
||||
if sheet_name == "Sheet1": # 确保我们只查看包含数据的工作表
|
||||
current_pt = None
|
||||
for row in worksheet.iterfind('.//{urn:schemas-microsoft-com:office:spreadsheet}Row'):
|
||||
cells = list(row.iterfind('.//{urn:schemas-microsoft-com:office:spreadsheet}Cell'))
|
||||
for i, cell in enumerate(cells):
|
||||
data_cell = cell.find('.//{urn:schemas-microsoft-com:office:spreadsheet}Data')
|
||||
if data_cell is not None and data_cell.text is not None: # 添加检查以确保data_cell.text不为空
|
||||
# 检查是否是PT标识
|
||||
logging.info(f"Data in cell: {data_cell.text}") # 输出单元格数据
|
||||
if "PT" in data_cell.text:
|
||||
current_pt = data_cell.text
|
||||
pt_coordinates[current_pt] = []
|
||||
elif data_cell.text in ["X", "Y", "Z"] and current_pt is not None:
|
||||
# 确保当前单元格后面还有单元格存在,以获取理论值
|
||||
if i + 1 < len(cells):
|
||||
next_cell = cells[i + 1]
|
||||
theory_value = next_cell.find(
|
||||
'.//{urn:schemas-microsoft-com:office:spreadsheet}Data')
|
||||
if theory_value is not None:
|
||||
# 为当前PT键添加坐标数据
|
||||
pt_coordinates[current_pt].append({
|
||||
data_cell.text: float(theory_value.text)
|
||||
})
|
||||
logging.info(f"PT: {current_pt} - {data_cell.text}: {theory_value.text}")
|
||||
logging.info('pt_coordinates=====%s' % pt_coordinates)
|
||||
# pt_coordinates:{'PT1': [{'X': 38.9221}, {'Y': -18.7304}, {'Z': 128.0783}],
|
||||
# 'PT2': [{'X': 39.2456}, {'Y': -76.9169}, {'Z': 123.7541}]}
|
||||
|
||||
# 检查是否存在PT1等键
|
||||
if 'PT1' in pt_coordinates and pt_coordinates['PT1']:
|
||||
self.X1_axis = pt_coordinates['PT3'][0]['X']
|
||||
self.Y1_axis = pt_coordinates['PT3'][1]['Y']
|
||||
self.Z1_axis = pt_coordinates['PT3'][2]['Z']
|
||||
else:
|
||||
raise UserError('PT1点未测或数据错误')
|
||||
if 'PT2' in pt_coordinates and pt_coordinates['PT2']:
|
||||
self.X2_axis = pt_coordinates['PT4'][0]['X']
|
||||
self.Y2_axis = pt_coordinates['PT4'][1]['Y']
|
||||
self.Z2_axis = pt_coordinates['PT4'][2]['Z']
|
||||
else:
|
||||
raise UserError('PT2点未测或数据错误')
|
||||
if 'PT3' in pt_coordinates and pt_coordinates['PT3']:
|
||||
self.X3_axis = pt_coordinates['PT5'][0]['X']
|
||||
self.Y3_axis = pt_coordinates['PT5'][1]['Y']
|
||||
self.Z3_axis = pt_coordinates['PT5'][2]['Z']
|
||||
else:
|
||||
raise UserError('PT3点未测或数据错误')
|
||||
if 'PT4' in pt_coordinates and pt_coordinates['PT4']:
|
||||
self.X4_axis = pt_coordinates['PT6'][0]['X']
|
||||
self.Y4_axis = pt_coordinates['PT6'][1]['Y']
|
||||
self.Z4_axis = pt_coordinates['PT6'][2]['Z']
|
||||
else:
|
||||
raise UserError('PT4点未测或数据错误')
|
||||
if 'PT5' in pt_coordinates and pt_coordinates['PT5']:
|
||||
self.X5_axis = pt_coordinates['PT7'][0]['X']
|
||||
self.Y5_axis = pt_coordinates['PT7'][1]['Y']
|
||||
self.Z5_axis = pt_coordinates['PT7'][2]['Z']
|
||||
else:
|
||||
raise UserError('PT5点未测或数据错误')
|
||||
if 'PT6' in pt_coordinates and pt_coordinates['PT6']:
|
||||
self.X6_axis = pt_coordinates['PT8'][0]['X']
|
||||
self.Y6_axis = pt_coordinates['PT8'][1]['Y']
|
||||
self.Z6_axis = pt_coordinates['PT8'][2]['Z']
|
||||
else:
|
||||
raise UserError('PT6点未测或数据错误')
|
||||
if 'PT7' in pt_coordinates and pt_coordinates['PT7']:
|
||||
self.X7_axis = pt_coordinates['PT9'][0]['X']
|
||||
self.Y7_axis = pt_coordinates['PT9'][1]['Y']
|
||||
self.Z7_axis = pt_coordinates['PT9'][2]['Z']
|
||||
else:
|
||||
raise UserError('PT7点未测或数据错误')
|
||||
if 'PT8' in pt_coordinates and pt_coordinates['PT8']:
|
||||
self.X8_axis = pt_coordinates['PT10'][0]['X']
|
||||
self.Y8_axis = pt_coordinates['PT10'][1]['Y']
|
||||
self.Z8_axis = pt_coordinates['PT10'][2]['Z']
|
||||
else:
|
||||
raise UserError('PT8点未测或数据错误')
|
||||
if 'PT9' in pt_coordinates and pt_coordinates['PT9']:
|
||||
self.X9_axis = pt_coordinates['PT1'][0]['X']
|
||||
self.Y9_axis = pt_coordinates['PT1'][1]['Y']
|
||||
self.Z9_axis = pt_coordinates['PT1'][2]['Z']
|
||||
else:
|
||||
raise UserError('PT9点未测或数据错误')
|
||||
if 'PT10' in pt_coordinates and pt_coordinates['PT10']:
|
||||
self.X10_axis = pt_coordinates['PT2'][0]['X']
|
||||
self.Y10_axis = pt_coordinates['PT2'][1]['Y']
|
||||
self.Z10_axis = pt_coordinates['PT2'][2]['Z']
|
||||
else:
|
||||
raise UserError('PT10点未测或数据错误')
|
||||
|
||||
self.data_state = True
|
||||
|
||||
return True
|
||||
|
||||
# ftp.download_file('three_check_datas.xls', '/home/ftpuser/three_check_datas.xls')
|
||||
# ftp.close()
|
||||
# data = xlrd.open_workbook('/home/ftpuser/three_check_datas.xls')
|
||||
# table = data.sheets()[0]
|
||||
# nrows = table.nrows
|
||||
# # 点坐标列表
|
||||
# point_list = []
|
||||
# datas = []
|
||||
# for i in range(1, nrows):
|
||||
# datas.append(table.row_values(i))
|
||||
# return datas
|
||||
|
||||
# 计算配料中心点和与x轴倾斜度方法
|
||||
def getcenter(self):
|
||||
try:
|
||||
@@ -366,7 +176,6 @@ class ResMrpWorkOrder(models.Model):
|
||||
y7 = self.Y7_axis
|
||||
y8 = self.Y8_axis
|
||||
z1 = self.Z9_axis
|
||||
z2 = self.Z10_axis
|
||||
x0 = ((x3 - x4) * (x2 * y1 - x1 * y2) - (x1 - x2) * (x4 * y3 - x3 * y4)) / (
|
||||
(x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4))
|
||||
y0 = ((y3 - y4) * (y2 * x1 - y1 * x2) - (y1 - y2) * (y4 * x3 - y3 * x4)) / (
|
||||
@@ -377,7 +186,7 @@ class ResMrpWorkOrder(models.Model):
|
||||
(y7 - y8) * (x5 - x6) - (y5 - y6) * (x7 - x8))
|
||||
x = (x0 + x1) / 2
|
||||
y = (y0 + y1) / 2
|
||||
z = (z1 + z2) / 2
|
||||
z = z1 / 2
|
||||
|
||||
jd = math.atan2((x5 - x6), (y5 - y6))
|
||||
jdz = jd * 180 / math.pi
|
||||
@@ -390,31 +199,18 @@ class ResMrpWorkOrder(models.Model):
|
||||
work.compensation_value_x = eval(self.material_center_point)[0]
|
||||
work.compensation_value_y = eval(self.material_center_point)[1]
|
||||
workorder.button_finish()
|
||||
except Exception as e:
|
||||
# 重新抛出捕获到的异常信息
|
||||
raise UserError(str(e))
|
||||
except:
|
||||
raise UserError("参数计算有误")
|
||||
|
||||
def button_workpiece_delivery(self):
|
||||
if self.routing_type == '装夹预调':
|
||||
for item in self.workpiece_delivery_ids:
|
||||
if not item.route_id:
|
||||
raise UserError('【工件配送】明细中请选择【任务路线】')
|
||||
if not item.feeder_station_start:
|
||||
raise UserError('【工件配送】明细中请输入起点接驳站')
|
||||
# if not item.workpiece_code:
|
||||
# raise UserError('请对【同运工件】进行扫描')
|
||||
else:
|
||||
if self.cnc_program_down_state == '已下发':
|
||||
if item.status == '待下发':
|
||||
return {
|
||||
'name': _('确认'),
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'sf.workpiece.delivery.wizard',
|
||||
'target': 'new',
|
||||
'context': {
|
||||
'default_workorder_id': self.id,
|
||||
}}
|
||||
else:
|
||||
raise UserError(_("该制造订单还未下发CNC程序单,无法进行工件配送"))
|
||||
item.write({'task_delivery_time': fields.Datetime.now(), 'status': '待配送'})
|
||||
|
||||
# 拼接工单对象属性值
|
||||
def json_workorder_str(self, k, production, route):
|
||||
@@ -652,6 +448,47 @@ class ResMrpWorkOrder(models.Model):
|
||||
else:
|
||||
self.results = '合格'
|
||||
|
||||
# cnc程序获取
|
||||
def fetchCNC(self):
|
||||
try:
|
||||
cnc = self.env['mrp.workorder'].search(
|
||||
[('routing_type', '=', 'CNC加工'), ('production_id', '=', self.production_id.id)], limit=1)
|
||||
res = {'model_code': '' if not cnc.product_id.model_code else cnc.product_id.model_code,
|
||||
'production_no': self.production_id.name,
|
||||
'machine_tool_code': cnc.workcenter_id.equipment_id.code,
|
||||
'material_code': cnc.env['sf.production.materials'].search(
|
||||
[('id', '=', cnc.product_id.materials_id.id)]).materials_no,
|
||||
'material_type_code': cnc.env['sf.materials.model'].search(
|
||||
[('id', '=', cnc.product_id.materials_type_id.id)]).materials_no,
|
||||
'machining_processing_panel': cnc.product_id.model_processing_panel,
|
||||
'machining_precision': cnc.product_id.model_machining_precision,
|
||||
'embryo_long': cnc.product_id.bom_ids.bom_line_ids.product_id.length,
|
||||
'embryo_height': cnc.product_id.bom_ids.bom_line_ids.product_id.height,
|
||||
'embryo_width': cnc.product_id.bom_ids.bom_line_ids.product_id.width,
|
||||
'order_no': cnc.production_id.origin,
|
||||
'model_order_no': cnc.product_id.default_code.rsplit(' -', 1)[0],
|
||||
'user': self.env.user.name,
|
||||
'model_file': '' if not cnc.product_id.model_file else base64.b64encode(
|
||||
cnc.product_id.model_file).decode('utf-8')
|
||||
}
|
||||
logging.info('res:%s' % res)
|
||||
configsettings = self.env['res.config.settings'].get_values()
|
||||
config_header = Common.get_headers(self, configsettings['token'], configsettings['sf_secret_key'])
|
||||
url = '/api/intelligent_programming/create'
|
||||
config_url = configsettings['sf_url'] + url
|
||||
# res_str = json.dumps(res)
|
||||
ret = requests.post(config_url, json={}, data=res, headers=config_header)
|
||||
ret = ret.json()
|
||||
logging.info('fetchCNC-ret:%s' % ret)
|
||||
if ret['status'] == 1:
|
||||
self.write(
|
||||
{'programming_no': ret['programming_no'], 'programming_state': '编程中', 'work_state': '编程中'})
|
||||
else:
|
||||
raise UserError(ret['message'])
|
||||
except Exception as e:
|
||||
logging.info('fetchCNC error:%s' % e)
|
||||
raise UserError("cnc程序获取编程单失败,请联系管理员")
|
||||
|
||||
def json_workorder_str1(self, k, production, route):
|
||||
workorders_values_str = [0, '', {
|
||||
'product_uom_id': production.product_uom_id.id,
|
||||
@@ -683,12 +520,6 @@ class ResMrpWorkOrder(models.Model):
|
||||
picking_out.write({'state': 'assigned'})
|
||||
if self.state == 'waiting' or self.state == 'ready' or self.state == 'progress':
|
||||
self.move_raw_ids = self.production_id.move_raw_ids
|
||||
self.move_raw_ids[0].write({
|
||||
'materiel_length': self.move_raw_ids[0].product_id.length,
|
||||
'materiel_width': self.move_raw_ids[0].product_id.width,
|
||||
'materiel_height': self.move_raw_ids[0].product_id.height
|
||||
})
|
||||
|
||||
self.ensure_one()
|
||||
if any(not time.date_end for time in self.time_ids.filtered(lambda t: t.user_id.id == self.env.user.id)):
|
||||
return True
|
||||
@@ -739,8 +570,6 @@ class ResMrpWorkOrder(models.Model):
|
||||
if self.routing_type == '装夹预调':
|
||||
if not self.material_center_point and self.X_deviation_angle > 0:
|
||||
raise UserError("请对前置三元检测定位参数进行计算定位")
|
||||
if not self.rfid_code:
|
||||
raise UserError("请扫RFID码进行绑定")
|
||||
if self.picking_out_id:
|
||||
picking_out = self.env['stock.picking'].search([('id', '=', self.picking_out_id.id)])
|
||||
if picking_out.workorder_out_id:
|
||||
@@ -769,56 +598,16 @@ class ResMrpWorkOrder(models.Model):
|
||||
if workorder.state != 'done':
|
||||
is_production_id = False
|
||||
if is_production_id == True and self.name == '解除装夹':
|
||||
for workorder in self.production_id.workorder_ids:
|
||||
workorder.rfid_code_old = workorder.rfid_code
|
||||
workorder.rfid_code = None
|
||||
for move_raw_id in self.production_id.move_raw_ids:
|
||||
move_raw_id.quantity_done = move_raw_id.product_uom_qty
|
||||
self.production_id.button_mark_done1()
|
||||
# self.production_id.state = 'done'
|
||||
|
||||
# 将FTP的检测报告文件下载到临时目录
|
||||
def download_reportfile_tmp(self, workorder, reportpath):
|
||||
logging.info('reportpath:%s' % reportpath)
|
||||
production_no_ftp = reportpath.split('/')
|
||||
production_no = workorder.production_id.name.replace('/', '_')
|
||||
# ftp地址
|
||||
remotepath = os.path.join('/NC', production_no_ftp[1], 'detection')
|
||||
logging.info('ftp地址:%s' % remotepath)
|
||||
if reportpath.find(production_no) != -1:
|
||||
# 服务器内临时地址
|
||||
serverdir = os.path.join('/tmp', production_no_ftp[1], 'detection')
|
||||
ftp_resconfig = self.env['res.config.settings'].get_values()
|
||||
ftp = FtpController(str(ftp_resconfig['ftp_host']), int(ftp_resconfig['ftp_port']),
|
||||
ftp_resconfig['ftp_user'],
|
||||
ftp_resconfig['ftp_password'])
|
||||
download_state = ftp.download_reportfile_tree(remotepath, serverdir, reportpath)
|
||||
logging.info('download_state:%s' % download_state)
|
||||
else:
|
||||
download_state = 2
|
||||
return download_state
|
||||
|
||||
# 根据中控系统提供的检测文件地址去ftp里对应的制造订单里获取
|
||||
def get_detection_file(self, workorder, reportPath):
|
||||
if reportPath.startswith('/'):
|
||||
reportPath = reportPath[1:]
|
||||
serverdir = os.path.join('/tmp', reportPath)
|
||||
logging.info('get_detection_file-serverdir:%s' % serverdir)
|
||||
serverdir_prefix = os.path.dirname(serverdir)
|
||||
for root, dirs, files in os.walk(serverdir_prefix):
|
||||
for filename in files:
|
||||
if filename == os.path.basename(reportPath):
|
||||
report_file_path = os.path.join(root, filename)
|
||||
logging.info('get_detection_file-report_file_path:%s' % report_file_path)
|
||||
workorder.detection_report = base64.b64encode(open(report_file_path, 'rb').read())
|
||||
return True
|
||||
|
||||
|
||||
class CNCprocessing(models.Model):
|
||||
_name = 'sf.cnc.processing'
|
||||
_description = "CNC加工"
|
||||
_rec_name = 'program_name'
|
||||
_order = 'sequence_number,id'
|
||||
|
||||
cnc_id = fields.Many2one('ir.attachment')
|
||||
sequence_number = fields.Char('序号')
|
||||
@@ -837,55 +626,57 @@ class CNCprocessing(models.Model):
|
||||
workorder_id = fields.Many2one('mrp.workorder', string="工单")
|
||||
production_id = fields.Many2one('mrp.production', string="制造订单")
|
||||
button_state = fields.Boolean(string='是否已经下发')
|
||||
program_path = fields.Char('程序文件路径')
|
||||
|
||||
# mrs下发编程单创建CNC加工
|
||||
def cnc_processing_create(self, cnc_workorder, ret, program_path, program_path_tmp):
|
||||
def cnc_processing_create(self, cnc_workorder, ret):
|
||||
logging.info('ret:%s' % ret)
|
||||
for obj in ret['programming_list']:
|
||||
workorder = self.env['mrp.workorder'].search([('production_id.name', '=', ret['production_order_no']),
|
||||
('processing_panel', '=', obj['processing_panel']),
|
||||
('routing_type', '=', 'CNC加工')])
|
||||
logging.info('workorder:%s' % workorder.id)
|
||||
if obj['program_name'] in program_path:
|
||||
logging.info('obj:%s' % obj['program_name'])
|
||||
cnc_processing = self.env['sf.cnc.processing'].create({
|
||||
'workorder_id': workorder.id,
|
||||
'sequence_number': obj['sequence_number'],
|
||||
'program_name': obj['program_name'],
|
||||
'cutting_tool_name': obj['cutting_tool_name'],
|
||||
'cutting_tool_no': obj['cutting_tool_no'],
|
||||
'processing_type': obj['processing_type'],
|
||||
'margin_x_y': obj['margin_x_y'],
|
||||
'margin_z': obj['margin_z'],
|
||||
'depth_of_processing_z': obj['depth_of_processing_z'],
|
||||
'cutting_tool_extension_length': obj['cutting_tool_extension_length'],
|
||||
'cutting_tool_handle_type': obj['cutting_tool_handle_type'],
|
||||
'estimated_processing_time': obj['estimated_processing_time'],
|
||||
'remark': obj['remark'],
|
||||
'program_path': program_path.replace('/tmp', '/home/ftp/ftp_root/NC')
|
||||
})
|
||||
cnc_processing.get_cnc_processing_file(program_path_tmp, cnc_processing, program_path)
|
||||
logging.info('workorder:%s' % workorder)
|
||||
logging.info('obj:%s' % obj)
|
||||
cnc_processing = self.env['sf.cnc.processing'].create({
|
||||
'workorder_id': workorder.id,
|
||||
'sequence_number': obj['sequence_number'],
|
||||
'program_name': obj['program_name'],
|
||||
'cutting_tool_name': obj['cutting_tool_name'],
|
||||
'cutting_tool_no': obj['cutting_tool_no'],
|
||||
'processing_type': obj['processing_type'],
|
||||
'margin_x_y': obj['margin_x_y'],
|
||||
'margin_z': obj['margin_z'],
|
||||
'depth_of_processing_z': obj['depth_of_processing_z'],
|
||||
'cutting_tool_extension_length': obj['cutting_tool_extension_length'],
|
||||
'cutting_tool_handle_type': obj['cutting_tool_handle_type'],
|
||||
'estimated_processing_time': obj['estimated_processing_time'],
|
||||
'remark': obj['remark']
|
||||
})
|
||||
cnc_processing.get_cnc_processing_file(ret['folder_name'], cnc_processing, workorder.processing_panel)
|
||||
# cnc_workorder.state = 'done'
|
||||
cnc_workorder.work_state = '已编程'
|
||||
cnc_workorder.programming_state = '已编程'
|
||||
# cnc_workorder.time_ids.date_end = datetime.now()
|
||||
# cnc_workorder.button_finish()
|
||||
|
||||
# 根据程序名和加工面匹配到ftp里对应的Nc程序名,可优化为根据cnc_processing.program_path进行匹配
|
||||
def get_cnc_processing_file(self, serverdir, cnc_processing, program_path):
|
||||
# 根据程序名和加工面匹配到ftp里对应的Nc程序名
|
||||
def get_cnc_processing_file(self, folder_name, cnc_processing, processing_panel):
|
||||
logging.info('folder_name:%s' % folder_name)
|
||||
serverdir = os.path.join('/tmp', folder_name, 'return', processing_panel)
|
||||
logging.info('serverdir:%s' % serverdir)
|
||||
for root, dirs, files in os.walk(serverdir):
|
||||
for f in files:
|
||||
logging.info('f:%s' % f)
|
||||
if os.path.splitext(f)[1] == ".pdf":
|
||||
full_path = os.path.join(serverdir, root, f)
|
||||
logging.info('pdf:%s' % full_path)
|
||||
if full_path is not False:
|
||||
if not cnc_processing.workorder_id.cnc_worksheet:
|
||||
cnc_processing.workorder_id.cnc_worksheet = base64.b64encode(
|
||||
open(full_path, 'rb').read())
|
||||
else:
|
||||
if f in program_path:
|
||||
# if cnc_processing.program_name == f.split('.')[0]:
|
||||
if cnc_processing.program_name == f.split('.')[0]:
|
||||
cnc_file_path = os.path.join(serverdir, root, f)
|
||||
logging.info('cnc_file_path:%s' % cnc_file_path)
|
||||
self.write_file(cnc_file_path, cnc_processing)
|
||||
|
||||
# 创建附件(nc文件)
|
||||
@@ -901,8 +692,8 @@ class CNCprocessing(models.Model):
|
||||
|
||||
# 将FTP的nc文件下载到临时目录
|
||||
def download_file_tmp(self, production_no, processing_panel):
|
||||
remotepath = os.path.join('/NC', production_no, 'return', processing_panel)
|
||||
serverdir = os.pat.join('/tmp', production_no, 'return', processing_panel)
|
||||
remotepath = os.path.join('/', production_no, 'return', processing_panel)
|
||||
serverdir = os.path.join('/tmp', production_no, 'return', processing_panel)
|
||||
ftp_resconfig = self.env['res.config.settings'].get_values()
|
||||
ftp = FtpController(str(ftp_resconfig['ftp_host']), int(ftp_resconfig['ftp_port']), ftp_resconfig['ftp_user'],
|
||||
ftp_resconfig['ftp_password'])
|
||||
@@ -912,12 +703,10 @@ class CNCprocessing(models.Model):
|
||||
|
||||
# 将nc文件存到attach的datas里
|
||||
def write_file(self, nc_file_path, cnc):
|
||||
nc_file_name = nc_file_path.split('/')
|
||||
logging.info('file_name:%s' % nc_file_name[-1])
|
||||
if os.path.exists(nc_file_path):
|
||||
with open(nc_file_path, 'rb') as file:
|
||||
data_bytes = file.read()
|
||||
attachment = self.attachment_create(cnc.program_name + nc_file_name[-1], data_bytes)
|
||||
attachment = self.attachment_create(cnc.program_name + '.NC', data_bytes)
|
||||
cnc.write({'cnc_id': attachment.id})
|
||||
file.close()
|
||||
else:
|
||||
@@ -954,35 +743,25 @@ class SfWorkOrderBarcodes(models.Model):
|
||||
workorder = self.env['mrp.workorder'].browse(self.ids)
|
||||
# workorder = self.env['mrp.workorder'].search(
|
||||
# [('routing_type', '=', '装夹预调'), ('production_id', '=', self.production_id.id)])
|
||||
workorder_old = self.env['mrp.workorder'].search([('rfid_code', '=', barcode)])
|
||||
if workorder_old:
|
||||
raise UserError('该托盘已绑定工件,请先解除绑定!!!')
|
||||
if workorder:
|
||||
if workorder.routing_type == '装夹预调':
|
||||
if workorder.state in ['done']:
|
||||
work_state = {'done': '已完工'}
|
||||
raise UserError('装夹%s,请勿重复扫码' % work_state.get(workorder.state))
|
||||
lots = self.env['stock.lot'].sudo().search([('rfid', '=', barcode)])
|
||||
logging.info("托盘信息:%s" % lots)
|
||||
if lots:
|
||||
for lot in lots:
|
||||
if lot.product_id.categ_type == '夹具':
|
||||
val = {
|
||||
'tray_serial_number': lot.name,
|
||||
'tray_product_id': lot.product_id.id,
|
||||
'tray_brand_id': lot.product_id.brand_id.id,
|
||||
'tray_type_id': lot.product_id.fixture_material_id.id,
|
||||
'tray_model_id': lot.product_id.fixture_model_id.id,
|
||||
'rfid_code': barcode
|
||||
}
|
||||
workorder.write(val)
|
||||
self.write(val)
|
||||
workorder_rfid = self.env['mrp.workorder'].search(
|
||||
[('production_id', '=', workorder.production_id.id)])
|
||||
if workorder_rfid:
|
||||
for item in workorder_rfid:
|
||||
item.write({'rfid_code': barcode})
|
||||
logging.info("Rfid绑定成功!!!")
|
||||
stock_move_line = self.env['stock.move.line'].search([('lot_name', '=', barcode)])
|
||||
if stock_move_line.product_id.categ_type == '夹具':
|
||||
workorder.write({
|
||||
'tray_serial_number': stock_move_line.lot_name,
|
||||
'tray_product_id': stock_move_line.product_id.id,
|
||||
'tray_brand_id': stock_move_line.product_id.brand_id.id,
|
||||
'tray_type_id': stock_move_line.product_id.fixture_material_id.id,
|
||||
'tray_model_id': stock_move_line.product_id.fixture_model_id.id
|
||||
})
|
||||
workorder.button_start()
|
||||
# return {
|
||||
# 'type': 'ir.actions.act_window',
|
||||
# 'res_model': 'mrp.workorder',
|
||||
# 'view_mode': 'form',
|
||||
# 'domain': [('id', 'in', workorder.id)],
|
||||
# 'target': 'current'
|
||||
# }
|
||||
else:
|
||||
embryo_stock_lot = self.env['stock.lot'].search([('name', '=', barcode)])
|
||||
if embryo_stock_lot:
|
||||
@@ -1009,63 +788,6 @@ class SfWorkOrderBarcodes(models.Model):
|
||||
workpiece_delivery.write({'workpiece_code': embryo_workpiece_code})
|
||||
else:
|
||||
raise UserError('工件生产线不一致,请重新确认')
|
||||
else:
|
||||
workorder_rfid = self.env['mrp.workorder'].search(
|
||||
[('production_id', '=', workorder.production_id.id)])
|
||||
if workorder_rfid:
|
||||
for item in workorder_rfid:
|
||||
if item.state == "progress":
|
||||
item.write({'rfid_code': barcode})
|
||||
raise UserError('该托盘信息不存在!!!')
|
||||
# stock_move_line = self.env['stock.move.line'].search([('lot_name', '=', barcode)])
|
||||
# if stock_move_line.product_id.categ_type == '夹具':
|
||||
# workorder.write({
|
||||
# 'tray_serial_number': stock_move_line.lot_name,
|
||||
# 'tray_product_id': stock_move_line.product_id.id,
|
||||
# 'tray_brand_id': stock_move_line.product_id.brand_id.id,
|
||||
# 'tray_type_id': stock_move_line.product_id.fixture_material_id.id,
|
||||
# 'tray_model_id': stock_move_line.product_id.fixture_model_id.id
|
||||
# })
|
||||
# workorder.button_start()
|
||||
# # return {
|
||||
# # 'type': 'ir.actions.act_window',
|
||||
# # 'res_model': 'mrp.workorder',
|
||||
# # 'view_mode': 'form',
|
||||
# # 'domain': [('id', 'in', workorder.id)],
|
||||
# # 'target': 'current'
|
||||
# # }
|
||||
# else:
|
||||
# embryo_stock_lot = self.env['stock.lot'].search([('name', '=', barcode)])
|
||||
# if embryo_stock_lot:
|
||||
# embryo_stock_move_line = self.env['stock.move.line'].search(
|
||||
# [('product_id', '=', embryo_stock_lot.product_id.id),
|
||||
# ('reference', '=', workorder.production_id.name),
|
||||
# ('lot_id', '=', embryo_stock_lot.id),
|
||||
# ('product_category_name', '=', '坯料')])
|
||||
# if embryo_stock_move_line:
|
||||
# bom_production = self.env['mrp.production'].search(
|
||||
# [('product_id', '=', embryo_stock_lot.product_id.id),
|
||||
# ('origin', '=', workorder.production_id.name)], limit=1, order='id asc')
|
||||
# workpiece_delivery = self.env['sf.workpiece.delivery'].search(
|
||||
# [('workorder_id', '=', workorder.id)], limit=1, order='id asc')
|
||||
# if workpiece_delivery:
|
||||
# embryo_workpiece_code = workpiece_delivery.workpiece_code
|
||||
# if bom_production:
|
||||
# if workpiece_delivery.workpiece_code and bom_production.name not in \
|
||||
# workpiece_delivery.workpiece_code:
|
||||
# embryo_workpiece_code = workpiece_delivery.workpiece_code + ',' + \
|
||||
# bom_production.name
|
||||
# if not workpiece_delivery.workpiece_code:
|
||||
# embryo_workpiece_code = bom_production.name
|
||||
# workpiece_delivery.write({'workpiece_code': embryo_workpiece_code})
|
||||
# else:
|
||||
# raise UserError('工件生产线不一致,请重新确认')
|
||||
# else:
|
||||
# workorder_rfid = self.env['mrp.workorder'].search(
|
||||
# [('production_id', '=', workorder.production_id.id)])
|
||||
# if workorder_rfid:
|
||||
# for item in workorder_rfid:
|
||||
# item.write({'rfid_code': barcode})
|
||||
|
||||
|
||||
class WorkPieceDelivery(models.Model):
|
||||
@@ -1079,88 +801,35 @@ class WorkPieceDelivery(models.Model):
|
||||
store=True)
|
||||
plan_start_processing_time = fields.Datetime('计划开始加工时间', readonly=True)
|
||||
workpiece_code = fields.Char('同运工件编码')
|
||||
route_id = fields.Many2one('sf.agv.task.route', '任务路线')
|
||||
feeder_station_start_id = fields.Many2one('sf.agv.site', '起点接驳站')
|
||||
feeder_station_destination_id = fields.Many2one('sf.agv.site', '目的接驳站')
|
||||
feeder_station_start = fields.Char('起点接驳站')
|
||||
feeder_station_destination = fields.Char('目的接驳站')
|
||||
task_delivery_time = fields.Datetime('任务下发时间')
|
||||
task_completion_time = fields.Datetime('任务完成时间')
|
||||
delivery_duration = fields.Float('配送时长', compute='_compute_delivery_duration')
|
||||
status = fields.Selection(
|
||||
[('待下发', '待下发'), ('待配送', '待配送'), ('已配送', '已配送')], string='状态',
|
||||
default='待下发')
|
||||
production_line_state = fields.Selection(
|
||||
[('待上产线', '待上产线'), ('已上产线', '已上产线'), ('已下产线', '已下产线')],
|
||||
string='上/下产线', default='待上产线')
|
||||
cnc_program_down_state = fields.Selection([('待下发', '待下发'), ('已下发', '已下发')],
|
||||
string='CNC程序下发状态', default='待下发')
|
||||
agv_task_code = fields.Char('agv任务单号')
|
||||
|
||||
@api.onchange('route_id')
|
||||
def onchage_route(self):
|
||||
if self.route_id:
|
||||
self.feeder_station_start_id = self.route_id.start_site_id
|
||||
self.feeder_station_destination_id = self.route_id.end_site_id
|
||||
|
||||
# 工件配送
|
||||
def button_delivery(self):
|
||||
if self.cnc_program_down_state == '待下发':
|
||||
if self.route_id:
|
||||
if self.status == '待下发':
|
||||
return {
|
||||
'name': _('确认'),
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'sf.workpiece.delivery.wizard',
|
||||
'target': 'new',
|
||||
'context': {
|
||||
'default_delivery_id': self.id,
|
||||
}}
|
||||
else:
|
||||
raise UserError('状态为【待下发】的工件记录可进行配送')
|
||||
else:
|
||||
raise UserError('请选择任务路线再进行配送')
|
||||
if self.status == '待下发':
|
||||
return {
|
||||
'name': _('确认'),
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'sf.workpiece.delivery.wizard',
|
||||
'target': 'new',
|
||||
'context': {
|
||||
'default_delivery_id': self.id,
|
||||
}}
|
||||
else:
|
||||
raise UserError(_("该制造订单还未下发CNC程序单,无法进行工件配送"))
|
||||
raise UserError('状态为【待下发】的工件记录可进行配送')
|
||||
|
||||
# 配送至avg小车
|
||||
def _delivery_avg(self):
|
||||
config = self.env['res.config.settings'].get_values()
|
||||
positionCode_Arr = []
|
||||
if self.feeder_station_start_id:
|
||||
positionCode_Arr.append({
|
||||
'positionCode': self.feeder_station_start_id.name,
|
||||
'code': '00'
|
||||
})
|
||||
if self.feeder_station_destination_id:
|
||||
positionCode_Arr.append({
|
||||
'positionCode': self.feeder_station_destination_id.name,
|
||||
'code': '00'
|
||||
})
|
||||
res = {'reqCode': self.production_id.name, 'reqTime': '', 'clientCode': '', 'tokenCode': '',
|
||||
'taskTyp': 'F01', 'ctnrTyp': '', 'ctnrCode': '', 'wbCode': config['wbcode'],
|
||||
'positionCodePath': positionCode_Arr,
|
||||
'podCode': '',
|
||||
'podDir': '', 'materialLot': '', 'priority': '', 'taskCode': '', 'agvCode': '', 'materialLot': '',
|
||||
'data': ''}
|
||||
try:
|
||||
config['agv_rcs_url'] = 'http://172.16.10.114:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask'
|
||||
logging.info('AGV请求路径:%s' % config['agv_rcs_url'])
|
||||
logging.info('AGV-json:%s' % res)
|
||||
headers = {'Content-Type': 'application/json'}
|
||||
ret = requests.post((config['agv_rcs_url']), json=res, headers=headers)
|
||||
ret = ret.json()
|
||||
logging.info('config-ret:%s' % ret)
|
||||
if ret['code'] == 0:
|
||||
if self.production_id.name == ret['reqCode']:
|
||||
self.write(
|
||||
{'task_delivery_time': fields.Datetime.now(), 'status': '待配送', 'agv_task_code': ret['data']})
|
||||
else:
|
||||
raise UserError(ret['message'])
|
||||
except Exception as e:
|
||||
logging.info('config-e:%s' % e)
|
||||
raise UserError("工件配送请求agv失败")
|
||||
self.write({'task_delivery_time': fields.Datetime.now(), 'status': '待配送'})
|
||||
|
||||
@api.onchange('production_id.production_line_id')
|
||||
@api.depends('production_id.production_line_id')
|
||||
def _compute_production_line_id(self):
|
||||
if self.production_id.production_line_id:
|
||||
self.production_line_id = self.production_id.production_line_id.id
|
||||
@@ -1174,83 +843,3 @@ class WorkPieceDelivery(models.Model):
|
||||
(obj.task_completion_time - obj.task_delivery_time).total_seconds() / 60.0, 2)
|
||||
else:
|
||||
obj.delivery_duration = 0.0
|
||||
|
||||
|
||||
class CMMprogram(models.Model):
|
||||
_name = 'sf.cmm.program'
|
||||
_description = "CMM程序"
|
||||
|
||||
cmm_id = fields.Many2one('ir.attachment')
|
||||
sequence_number = fields.Integer('序号')
|
||||
program_name = fields.Char('程序名')
|
||||
cutting_tool_name = fields.Char('刀具名称')
|
||||
cutting_tool_no = fields.Char('刀号')
|
||||
processing_type = fields.Char('加工类型')
|
||||
margin_x_y = fields.Char('余量_X/Y')
|
||||
margin_z = fields.Char('余量_Z')
|
||||
depth_of_processing_z = fields.Char('加工深度(Z)')
|
||||
cutting_tool_extension_length = fields.Char('刀具伸出长度')
|
||||
cutting_tool_handle_type = fields.Char('刀柄型号')
|
||||
estimated_processing_time = fields.Char('预计加工时间')
|
||||
remark = fields.Text('备注')
|
||||
workorder_id = fields.Many2one('mrp.workorder', string="工单")
|
||||
production_id = fields.Many2one('mrp.production', string="制造订单")
|
||||
program_path = fields.Char('程序文件路径')
|
||||
|
||||
def cmm_program_create(self, ret, program_path, program_path_tmp):
|
||||
for obj in ret['programming_list']:
|
||||
workorder = self.env['mrp.workorder'].search([('production_id.name', '=', ret['production_order_no']),
|
||||
('processing_panel', '=', obj['processing_panel']),
|
||||
('routing_type', '=', 'CNC加工')])
|
||||
if obj['program_name'] in program_path:
|
||||
logging.info('obj:%s' % obj['program_name'])
|
||||
cmm_program = self.sudo().create({
|
||||
'workorder_id': workorder.id,
|
||||
'sequence_number': obj['sequence_number'],
|
||||
'program_name': obj['program_name'],
|
||||
'cutting_tool_name': obj['cutting_tool_name'],
|
||||
'cutting_tool_no': obj['cutting_tool_no'],
|
||||
'processing_type': obj['processing_type'],
|
||||
'margin_x_y': obj['margin_x_y'],
|
||||
'margin_z': obj['margin_z'],
|
||||
'depth_of_processing_z': obj['depth_of_processing_z'],
|
||||
'cutting_tool_extension_length': obj['cutting_tool_extension_length'],
|
||||
'cutting_tool_handle_type': obj['cutting_tool_handle_type'],
|
||||
'estimated_processing_time': obj['estimated_processing_time'],
|
||||
'remark': obj['remark'],
|
||||
'program_path': program_path.replace('/tmp', '')
|
||||
})
|
||||
cmm_program.get_cmm_program_file(program_path_tmp, cmm_program, program_path)
|
||||
|
||||
# 根据程序名和加工面匹配到ftp里对应的cmm程序名
|
||||
def get_cmm_program_file(self, serverdir, cmm_program, program_path):
|
||||
logging.info('cmm-serverdir:%s' % serverdir)
|
||||
for root, dirs, files in os.walk(serverdir):
|
||||
for f in files:
|
||||
if f in program_path:
|
||||
cmm_program_file_path = os.path.join(serverdir, root, f)
|
||||
self.write_file_cmm(cmm_program_file_path, cmm_program)
|
||||
|
||||
# 创建附件(nc文件)
|
||||
def attachment_create(self, name, data):
|
||||
attachment = self.env['ir.attachment'].create({
|
||||
'datas': base64.b64encode(data),
|
||||
'type': 'binary',
|
||||
'public': True,
|
||||
'description': '程序文件',
|
||||
'name': name
|
||||
})
|
||||
return attachment
|
||||
|
||||
# 将cmm文件存到attach的datas里
|
||||
def write_file_cmm(self, cmm_file_path, cnc):
|
||||
cmm_file_name = cmm_file_path.split('/')
|
||||
logging.info('cmm_file_name:%s' % cmm_file_name[-1])
|
||||
if os.path.exists(cmm_file_path):
|
||||
with open(cmm_file_path, 'rb') as file:
|
||||
data_bytes = file.read()
|
||||
attachment = self.attachment_create(cnc.program_name + cmm_file_name[-1], data_bytes)
|
||||
cnc.write({'cmm_id': attachment.id})
|
||||
file.close()
|
||||
else:
|
||||
return False
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import logging
|
||||
import requests
|
||||
import base64
|
||||
import hashlib
|
||||
import os
|
||||
@@ -40,8 +39,7 @@ class ResProductMo(models.Model):
|
||||
product_model_type_id = fields.Many2one('sf.model.type', string='产品模型类型')
|
||||
embryo_model_type_id = fields.Many2one('sf.model.type', string='坯料模型类型')
|
||||
materials_id = fields.Many2one('sf.production.materials', string='材料')
|
||||
materials_type_id = fields.Many2one('sf.materials.model', string='材料型号',
|
||||
domain="[('materials_id', '=', materials_id)]")
|
||||
materials_type_id = fields.Many2one('sf.materials.model', string='材料型号')
|
||||
server_product_process_parameters_id = fields.Many2one('sf.production.process.parameter',
|
||||
string='表面工艺参数(服务产品)')
|
||||
model_process_parameters_ids = fields.Many2many('sf.production.process.parameter', 'process_parameter_rel',
|
||||
@@ -70,8 +68,7 @@ class ResProductMo(models.Model):
|
||||
cutting_tool_shank_length = fields.Float('柄部长度(mm)', digits=(6, 1))
|
||||
cutting_tool_blade_length = fields.Float('刃部长度(mm)')
|
||||
cutting_tool_blade_number = fields.Selection(
|
||||
[('0', '0'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')],
|
||||
string='刃数(个)', default='0')
|
||||
[('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')], '刃数(个)')
|
||||
# 整体式刀具新增字段
|
||||
cutting_tool_neck_length = fields.Float('颈部长度(mm)', digits=(6, 1))
|
||||
cutting_tool_neck_diameter = fields.Float('颈部直径(mm)', digits=(6, 1))
|
||||
@@ -104,13 +101,6 @@ class ResProductMo(models.Model):
|
||||
compaction_way_id = fields.Many2one('maintenance.equipment.image',
|
||||
'压紧方式', domain=[('type', '=', '压紧方式')])
|
||||
|
||||
@api.onchange('cutting_tool_model_id')
|
||||
def _onchange_cutting_tool_model_id(self):
|
||||
for item in self:
|
||||
if item:
|
||||
item.specification_id = False
|
||||
item.cutting_tool_chuck_id = item.cutting_tool_model_id.chuck_id
|
||||
|
||||
@api.onchange('cutting_tool_material_id')
|
||||
def _onchange_cutting_tool_material_id(self):
|
||||
for item in self:
|
||||
@@ -200,24 +190,20 @@ class ResProductMo(models.Model):
|
||||
self.cutting_tool_blade_number = self.specification_id.blade_number
|
||||
self.cutting_tool_blade_type = self.cutting_tool_model_id.blade_type
|
||||
self.cutting_tool_shank_diameter = self.specification_id.handle_diameter
|
||||
self.cutting_tool_shank_length = self.specification_id.handle_length
|
||||
self.cutting_tool_neck_length = self.specification_id.neck_length
|
||||
self.cutting_tool_neck_diameter = self.specification_id.neck_diameter
|
||||
self.cutting_tool_blade_tip_diameter = self.specification_id.blade_tip_diameter
|
||||
self.cutting_tool_blade_tip_taper = self.specification_id.blade_tip_taper
|
||||
self.cutting_tool_blade_helix_angle = self.specification_id.blade_helix_angle
|
||||
self.cutting_tool_blade_tip_working_size = self.specification_id.blade_tip_working_size
|
||||
self.cutting_tool_pitch = self.specification_id.pitch
|
||||
self.cutting_tool_blade_width = self.specification_id.blade_width
|
||||
self.cutting_tool_blade_depth = self.specification_id.blade_depth
|
||||
self.cutting_tool_cut_depth_max = self.specification_id.cut_depth_max
|
||||
self.cutting_tool_cut_depth = self.specification_id.cutting_depth
|
||||
self.cutting_speed_ids = self.cutting_tool_model_id.cutting_speed_ids
|
||||
self.feed_per_tooth_ids = self.cutting_tool_model_id.feed_per_tooth_ids.filtered(
|
||||
lambda r: int(r.blade_diameter) == int(self.specification_id.blade_diameter))
|
||||
elif self.cutting_tool_type == '夹头':
|
||||
self.cutting_tool_clamping_diameter_min = self.specification_id.min_clamping_diameter
|
||||
self.cutting_tool_clamping_diameter_max = self.specification_id.max_clamping_diameter
|
||||
self.cutting_tool_taper = self.specification_id.taper
|
||||
self.cutting_tool_clamping_diameter_min = self.specification_id.max_clamping_diameter
|
||||
self.cutting_tool_clamping_way = self.specification_id.clamping_mode
|
||||
self.cutting_tool_top_diameter = self.specification_id.top_diameter
|
||||
self.cutting_tool_outer_diameter = self.specification_id.outer_diameter
|
||||
self.cutting_tool_inner_diameter = self.specification_id.inner_diameter
|
||||
@@ -255,7 +241,6 @@ class ResProductMo(models.Model):
|
||||
self.cutting_speed_ids = self.cutting_tool_model_id.cutting_speed_ids
|
||||
self.feed_per_tooth_ids = self.cutting_tool_model_id.feed_per_tooth_ids
|
||||
elif self.cutting_tool_type in ('刀盘', '刀杆'):
|
||||
self.cutting_tool_blade_diameter = self.specification_id.blade_diameter
|
||||
self.cutting_tool_total_length = self.specification_id.total_length
|
||||
self.tool_length = self.specification_id.length
|
||||
self.tool_thickness = self.specification_id.thickness
|
||||
@@ -286,19 +271,14 @@ class ResProductMo(models.Model):
|
||||
self.cutting_tool_cutter_head_diameter = self.specification_id.cutter_head_diameter
|
||||
self.cutting_tool_interface_diameter = self.specification_id.interface_diameter
|
||||
else:
|
||||
self.cutting_tool_cutter_arbor_diameter = self.specification_id.cutter_arbor_diameter
|
||||
self.cutting_tool_knife_head_height = self.specification_id.knife_head_height
|
||||
self.cutting_tool_knife_head_width = self.specification_id.knife_head_width
|
||||
self.cutting_tool_knife_head_length = self.specification_id.knife_head_length
|
||||
self.cutting_tool_tool_shim = self.specification_id.tool_shim
|
||||
self.cutting_tool_cotter_pin = self.specification_id.cotter_pin
|
||||
self.cutting_tool_pressing_plate = self.specification_id.pressing_plate
|
||||
self.cutting_tool_min_machining_aperture = self.specification_id.min_machining_aperture
|
||||
self.cutting_tool_rear_angle = self.specification_id.relief_angle
|
||||
elif self.cutting_tool_type == '刀柄':
|
||||
self.cutting_tool_total_length = self.specification_id.total_length
|
||||
self.cutting_tool_shank_diameter = self.specification_id.shank_diameter
|
||||
self.cutting_tool_shank_length = self.specification_id.shank_length
|
||||
self.cutting_tool_speed_max = self.specification_id.max_rotate_speed
|
||||
self.cutting_tool_change_time = self.specification_id.tool_changing_time
|
||||
self.cutting_tool_total_length = self.specification_id.total_length
|
||||
@@ -312,10 +292,9 @@ class ResProductMo(models.Model):
|
||||
self.cutting_tool_is_safety_lock = self.specification_id.is_safe_lock
|
||||
self.cutting_tool_fit_nut_model = self.specification_id.nut
|
||||
self.cutting_tool_wrench = self.specification_id.spanner
|
||||
self.cutting_tool_chuck_id = self.specification_id.chuck_id.id
|
||||
self.cutting_tool_jump_accuracy = self.specification_id.diameter_slip_accuracy
|
||||
self.cutting_tool_taper_shank_model = self.specification_id.taper_shank_model
|
||||
self.cutting_tool_cooling_type = self.specification_id.cooling_model
|
||||
self.cutting_tool_clamping_way = self.specification_id.clamping_mode
|
||||
self.suitable_machining_method_ids = [(6, 0, [])] if not \
|
||||
self.cutting_tool_model_id.suitable_machining_method_ids \
|
||||
else [(6, 0, self.cutting_tool_model_id.suitable_machining_method_ids.ids)]
|
||||
@@ -332,7 +311,6 @@ class ResProductMo(models.Model):
|
||||
(6, 0, self.cutting_tool_model_id.suitable_coolant_ids.ids)]
|
||||
self.compaction_way_id = self.cutting_tool_model_id.compaction_way_id.id
|
||||
self.fit_blade_shape_id = self.cutting_tool_model_id.fit_blade_shape_id.id
|
||||
self.image_1920 = self.cutting_tool_model_id.image
|
||||
else:
|
||||
self.cutting_tool_type_id = False
|
||||
self.brand_id = False
|
||||
@@ -372,30 +350,30 @@ class ResProductMo(models.Model):
|
||||
self.cutting_speed_ids = False
|
||||
self.feed_per_tooth_ids = False
|
||||
|
||||
# @api.constrains('fit_blade_shape_id', 'suitable_machining_method_ids', 'blade_tip_characteristics_id',
|
||||
# 'handle_type_id', 'cutting_direction_ids', 'suitable_coolant_ids', 'compaction_way_id')
|
||||
# def _check_cutting_tool_ability(self):
|
||||
# if self.cutting_tool_type in ['整体式刀具', '刀片', '刀杆', '刀盘']:
|
||||
# if self.cutting_tool_type in ['刀片', '刀杆', '刀盘']:
|
||||
# if not self.fit_blade_shape_id:
|
||||
# raise ValidationError("请选择适配刀片形状")
|
||||
# if self.cutting_tool_type in ['刀杆', '刀盘']:
|
||||
# if not self.compaction_way_id:
|
||||
# raise ValidationError("请选择压紧方式")
|
||||
# if self.cutting_tool_type == '刀片':
|
||||
# if not self.suitable_coolant_ids:
|
||||
# raise ValidationError("请选择适合冷却方式")
|
||||
# elif self.cutting_tool_type == '整体式刀具':
|
||||
# if not self.handle_type_id:
|
||||
# raise ValidationError("请选择柄部类型")
|
||||
# if not self.suitable_coolant_ids:
|
||||
# raise ValidationError("请选择适合冷却方式")
|
||||
# if not self.suitable_machining_method_ids:
|
||||
# raise ValidationError("请选择适合加工方式")
|
||||
# if not self.blade_tip_characteristics_id:
|
||||
# raise ValidationError("请选择刀尖特征")
|
||||
# if not self.cutting_direction_ids:
|
||||
# raise ValidationError("请选择走刀方向")
|
||||
@api.constrains('fit_blade_shape_id', 'suitable_machining_method_ids', 'blade_tip_characteristics_id',
|
||||
'handle_type_id', 'cutting_direction_ids', 'suitable_coolant_ids', 'compaction_way_id')
|
||||
def _check_cutting_tool_ability(self):
|
||||
if self.cutting_tool_type in ['整体式刀具', '刀片', '刀杆', '刀盘']:
|
||||
if self.cutting_tool_type in ['刀片', '刀杆', '刀盘']:
|
||||
if not self.fit_blade_shape_id:
|
||||
raise ValidationError("请选择适配刀片形状")
|
||||
if self.cutting_tool_type in ['刀杆', '刀盘']:
|
||||
if not self.compaction_way_id:
|
||||
raise ValidationError("请选择压紧方式")
|
||||
if self.cutting_tool_type == '刀片':
|
||||
if not self.suitable_coolant_ids:
|
||||
raise ValidationError("请选择适合冷却方式")
|
||||
elif self.cutting_tool_type == '整体式刀具':
|
||||
if not self.handle_type_id:
|
||||
raise ValidationError("请选择柄部类型")
|
||||
if not self.suitable_coolant_ids:
|
||||
raise ValidationError("请选择适合冷却方式")
|
||||
if not self.suitable_machining_method_ids:
|
||||
raise ValidationError("请选择适合加工方式")
|
||||
if not self.blade_tip_characteristics_id:
|
||||
raise ValidationError("请选择刀尖特征")
|
||||
if not self.cutting_direction_ids:
|
||||
raise ValidationError("请选择走刀方向")
|
||||
|
||||
cutting_speed_ids = fields.One2many('sf.cutting.speed', 'product_template_id', string='切削速度Vc')
|
||||
feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'product_template_id', string='每齿走刀量fz')
|
||||
@@ -522,9 +500,6 @@ class ResProductMo(models.Model):
|
||||
string='注册状态', default='未注册')
|
||||
industry_code = fields.Char('行业编码', readonly=True)
|
||||
|
||||
# bfm下单
|
||||
manual_quotation = fields.Boolean('人工编程', default=False, readonly=True)
|
||||
|
||||
@api.constrains('tool_length')
|
||||
def _check_tool_length_size(self):
|
||||
if self.tool_length > 1000000:
|
||||
@@ -619,7 +594,6 @@ class ResProductMo(models.Model):
|
||||
'process_parameters_code') else self.get_process_parameters_id(item['process_parameters_code']),
|
||||
'model_remark': item['remark'],
|
||||
'default_code': '%s-%s' % (order_number, i),
|
||||
'manual_quotation': item['manual_quotation'] or False,
|
||||
'active': True,
|
||||
}
|
||||
copy_product_id.sudo().write(vals)
|
||||
@@ -684,14 +658,11 @@ class ResProductMo(models.Model):
|
||||
# 外协和采购生成的坯料需要根据材料型号绑定供应商
|
||||
if route_type == 'subcontract' or route_type == 'purchase':
|
||||
no_bom_copy_product_id.purchase_ok = True
|
||||
if supplier:
|
||||
no_bom_copy_product_id.seller_ids = [
|
||||
(0, 0, {'partner_id': supplier.partner_id.id, 'delay': 1.0})]
|
||||
if route_type == 'subcontract':
|
||||
partner = self.env['res.partner'].search([('id', '=', supplier.partner_id.id)])
|
||||
partner.is_subcontractor = True
|
||||
else:
|
||||
return -3
|
||||
no_bom_copy_product_id.seller_ids = [
|
||||
(0, 0, {'partner_id': supplier.partner_id.id, 'delay': 1.0})]
|
||||
if route_type == 'subcontract':
|
||||
partner = self.env['res.partner'].search([('id', '=', supplier.partner_id.id)])
|
||||
partner.is_subcontractor = True
|
||||
no_bom_copy_product_id.write(vals)
|
||||
return no_bom_copy_product_id
|
||||
|
||||
@@ -888,38 +859,11 @@ class SfMaintenanceEquipmentAndProductTemplate(models.Model):
|
||||
for i in range(1, number + 1):
|
||||
self.env['maintenance.equipment.tool'].create({
|
||||
'equipment_id': res.id,
|
||||
'code': "T%02d" % i
|
||||
'code': 'T' + str(i)
|
||||
})
|
||||
vals.append(res)
|
||||
return vals[0]
|
||||
|
||||
base_coordinate_fixture_model_id = fields.Many2one('sf.fixture.model', '基坐标卡盘型号',
|
||||
domain=[('fixture_material_id', '=', '零点卡盘')])
|
||||
base_coordinate_g_coordinate = fields.Char('G坐标')
|
||||
base_coordinate_x = fields.Float('x轴', digits=(12, 3))
|
||||
base_coordinate_y = fields.Float('y轴', digits=(12, 3))
|
||||
base_coordinate_z = fields.Float('z轴', digits=(12, 3))
|
||||
|
||||
# ==========获取机床基坐标接口==========
|
||||
def get_equipment_base_coordinate(self):
|
||||
headers = {'Authorization': 'Ba F2CF5DCC-1A00-4234-9E95-65603F70CC8A'}
|
||||
crea_url = "https://x24467i973.zicp.fun/AutoDeviceApi/EquipmentBaseCoordinate"
|
||||
params = {"DeviceId": self.name}
|
||||
r = requests.get(crea_url, params=params, headers=headers)
|
||||
ret = r.json()
|
||||
logging.info('register_equipment_tool:%s' % ret)
|
||||
self.write({
|
||||
'base_coordinate_fixture_model_id': ret['base_coordinate_fixture_model_id'],
|
||||
'base_coordinate_g_coordinate': ret['base_coordinate_g_coordinate'],
|
||||
'base_coordinate_x': ret['base_coordinate_x'],
|
||||
'base_coordinate_y': ret['base_coordinate_y'],
|
||||
'base_coordinate_z': ret['base_coordinate_z'],
|
||||
})
|
||||
if ret['Succeed']:
|
||||
return "机床基坐标获取成功"
|
||||
else:
|
||||
raise ValidationError("机床基坐标获取失败")
|
||||
|
||||
|
||||
class SfMaintenanceEquipmentTool(models.Model):
|
||||
_name = 'maintenance.equipment.tool'
|
||||
|
||||
@@ -14,51 +14,6 @@ from odoo.addons.stock.models.stock_rule import ProcurementException
|
||||
from odoo.addons.sf_base.commons.common import Common
|
||||
from odoo.exceptions import UserError
|
||||
from io import BytesIO
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class stockWarehouse(models.Model):
|
||||
_inherit = 'stock.warehouse'
|
||||
|
||||
subcontracting_surface_technology_pull_out_id = fields.Many2one(
|
||||
'stock.rule', '表面工艺规则1')
|
||||
subcontracting_surface_technology_pull_in_id = fields.Many2one(
|
||||
'stock.rule', '表面工艺规则2'
|
||||
)
|
||||
|
||||
def _get_global_route_rules_values(self):
|
||||
rules = super(stockWarehouse, self)._get_global_route_rules_values()
|
||||
location_virtual_id = self.env.ref(
|
||||
'sf_manufacturing.stock_location_locations_virtual_outcontract').id,
|
||||
location_pre_id = self.env['stock.location'].search(
|
||||
[('barcode', 'ilike', 'WH-PREPRODUCTION')]).id,
|
||||
rules.update({
|
||||
'subcontracting_surface_technology_pull_in_id': {
|
||||
'create_values': {
|
||||
'action': 'pull',
|
||||
'picking_type_id': self.env.ref('sf_manufacturing.outcontract_picking_in').id,
|
||||
'group_propagation_option': 'none',
|
||||
'company_id': self.company_id.id,
|
||||
'location_src_id': location_virtual_id,
|
||||
'location_dest_id': location_pre_id,
|
||||
'route_id': self._find_global_route('sf_manufacturing.route_surface_technology_outsourcing',
|
||||
_('表面工艺外协')).id,
|
||||
}
|
||||
},
|
||||
'subcontracting_surface_technology_pull_out_id': {
|
||||
'create_values': {
|
||||
'action': 'pull',
|
||||
'picking_type_id': self.env.ref('sf_manufacturing.outcontract_picking_out').id,
|
||||
'group_propagation_option': 'none',
|
||||
'company_id': self.company_id.id,
|
||||
'location_src_id': location_pre_id,
|
||||
'location_dest_id': location_virtual_id,
|
||||
'route_id': self._find_global_route('sf_manufacturing.route_surface_technology_outsourcing',
|
||||
_('表面工艺外协')).id,
|
||||
}
|
||||
}
|
||||
})
|
||||
return rules
|
||||
|
||||
|
||||
class StockRule(models.Model):
|
||||
@@ -263,23 +218,7 @@ class StockRule(models.Model):
|
||||
|
||||
|
||||
class ProductionLot(models.Model):
|
||||
_name = 'stock.lot'
|
||||
_inherit = ['stock.lot', 'printing.utils']
|
||||
|
||||
rfid = fields.Char('Rfid', readonly=True)
|
||||
product_specification = fields.Char('规格', compute='_compute_product_specification', store=True)
|
||||
|
||||
@api.depends('product_id')
|
||||
def _compute_product_specification(self):
|
||||
for stock in self:
|
||||
if stock:
|
||||
if stock.product_id:
|
||||
if stock.product_id.categ_id.name in '刀具':
|
||||
stock.product_specification = stock.product_id.specification_id.name
|
||||
elif stock.product_id.categ_id.name in '夹具':
|
||||
stock.product_specification = stock.product_id.specification_fixture_id.name
|
||||
else:
|
||||
stock.product_specification = stock.product_id.default_code
|
||||
_inherit = 'stock.lot'
|
||||
|
||||
@api.model
|
||||
def generate_lot_names1(self, display_name, first_lot, count):
|
||||
@@ -311,24 +250,6 @@ class ProductionLot(models.Model):
|
||||
))
|
||||
return lot_names
|
||||
|
||||
def get_tool_generate_lot_names1(self, company, product):
|
||||
"""
|
||||
采购时生成刀具物料序列号
|
||||
"""
|
||||
now = datetime.now().strftime("%Y%m%d")
|
||||
last_serial = self.env['stock.lot'].search(
|
||||
[('company_id', '=', company.id), ('product_id', '=', product.id)],
|
||||
limit=1, order='id DESC')
|
||||
if product.cutting_tool_model_id:
|
||||
split_codes = product.cutting_tool_model_id.code.split('-')
|
||||
if not last_serial:
|
||||
return "%s-T-%s-%s-%03d" % (split_codes[0], now, product.specification_id.name, 1)
|
||||
else:
|
||||
return "%s-T-%s-%s-%03d" % (
|
||||
split_codes[0], now, product.specification_id.name, int(last_serial.name[-3:]) + 1)
|
||||
else:
|
||||
raise ValidationError('该刀具物料产品的型号字段为空,请补充完整!!!')
|
||||
|
||||
@api.model
|
||||
def _get_next_serial(self, company, product):
|
||||
"""Return the next serial number to be attributed to the product."""
|
||||
@@ -337,14 +258,12 @@ class ProductionLot(models.Model):
|
||||
[('company_id', '=', company.id), ('product_id', '=', product.id)],
|
||||
limit=1, order='id DESC')
|
||||
if last_serial:
|
||||
if product.categ_id.name == '刀具':
|
||||
return self.env['stock.lot'].get_tool_generate_lot_names1(company, product)
|
||||
else:
|
||||
return self.env['stock.lot'].generate_lot_names1(product.name, last_serial.name, 2)[1]
|
||||
now = datetime.now().strftime("%Y%m%d")
|
||||
return self.env['stock.lot'].generate_lot_names1(product.name, last_serial.name, 2)[
|
||||
1]
|
||||
now = datetime.now().strftime("%Y-%m-%d")
|
||||
# formatted_date = now.strftime("%Y-%m-%d")
|
||||
if product.cutting_tool_model_id:
|
||||
split_codes = product.cutting_tool_model_id.code.split('-')
|
||||
return "%s-T-%s-%s-%03d" % (split_codes[0], now, product.specification_id.name, 1)
|
||||
return "%s-%s-%03d" % (product.cutting_tool_model_id.code, now, 1)
|
||||
return "%s-%03d" % (product.name, 1)
|
||||
|
||||
qr_code_image = fields.Binary(string='二维码', compute='_generate_qr_code')
|
||||
@@ -370,53 +289,36 @@ class ProductionLot(models.Model):
|
||||
|
||||
record.qr_code_image = encoded_image
|
||||
|
||||
def print_single_method(self):
|
||||
|
||||
self.ensure_one()
|
||||
def print_qr_code(self):
|
||||
self.ensure_one() # 确保这个方法只为一个记录调用
|
||||
# if not self.lot_id:
|
||||
# raise UserError("没有找到序列号。")
|
||||
# 假设_lot_qr_code方法已经生成了二维码并保存在字段中
|
||||
qr_code_data = self.qr_code_image
|
||||
if not qr_code_data:
|
||||
raise UserError("没有找到二维码数据。")
|
||||
lot_name = self.name
|
||||
# host = "192.168.50.110" # 可以根据实际情况修改
|
||||
# port = 9100 # 可以根据实际情况修改
|
||||
|
||||
# 获取默认打印机配置
|
||||
printer_config = self.env['printer.configuration'].sudo().search([('model', '=', self._name)], limit=1)
|
||||
if not printer_config:
|
||||
raise UserError('请先配置打印机')
|
||||
host = printer_config.printer_id.ip_address
|
||||
port = printer_config.printer_id.port
|
||||
self.print_qr_code(lot_name, host, port)
|
||||
|
||||
# self.ensure_one() # 确保这个方法只为一个记录调用
|
||||
# # if not self.lot_id:
|
||||
# # raise UserError("没有找到序列号。")
|
||||
# # 假设_lot_qr_code方法已经生成了二维码并保存在字段中
|
||||
# qr_code_data = self.qr_code_image
|
||||
# if not qr_code_data:
|
||||
# raise UserError("没有找到二维码数据。")
|
||||
#
|
||||
# # 生成下载链接或直接触发下载
|
||||
# # 此处的实现依赖于你的具体需求,以下是触发下载的一种示例
|
||||
# attachment = self.env['ir.attachment'].sudo().create({
|
||||
# 'datas': self.qr_code_image,
|
||||
# 'type': 'binary',
|
||||
# 'description': '二维码图片',
|
||||
# 'name': self.name + '.png',
|
||||
# # 'res_id': invoice.id,
|
||||
# # 'res_model': 'stock.picking',
|
||||
# 'public': True,
|
||||
# 'mimetype': 'application/x-png',
|
||||
# # 'model_name': 'stock.picking',
|
||||
# })
|
||||
# # 返回附件的下载链接
|
||||
# download_url = '/web/content/%s?download=true' % attachment.id
|
||||
# base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
||||
# return {
|
||||
# 'type': 'ir.actions.act_url',
|
||||
# 'url': str(base_url) + download_url,
|
||||
# 'target': 'self',
|
||||
# }
|
||||
# 生成下载链接或直接触发下载
|
||||
# 此处的实现依赖于你的具体需求,以下是触发下载的一种示例
|
||||
attachment = self.env['ir.attachment'].sudo().create({
|
||||
'datas': self.qr_code_image,
|
||||
'type': 'binary',
|
||||
'description': '二维码图片',
|
||||
'name': self.name + '.png',
|
||||
# 'res_id': invoice.id,
|
||||
# 'res_model': 'stock.picking',
|
||||
'public': True,
|
||||
'mimetype': 'application/x-png',
|
||||
# 'model_name': 'stock.picking',
|
||||
})
|
||||
# 返回附件的下载链接
|
||||
download_url = '/web/content/%s?download=true' % attachment.id
|
||||
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
||||
return {
|
||||
'type': 'ir.actions.act_url',
|
||||
'url': str(base_url) + download_url,
|
||||
'target': 'self',
|
||||
}
|
||||
|
||||
|
||||
class StockPicking(models.Model):
|
||||
@@ -428,10 +330,10 @@ class StockPicking(models.Model):
|
||||
# 设置外协出入单的名称
|
||||
def _get_name_Res(self, rescode):
|
||||
last_picking = self.sudo().search([('name', 'like', rescode)], order='create_date DESC', limit=1)
|
||||
logging.info('编号:' + last_picking.name)
|
||||
if not last_picking:
|
||||
num = "%04d" % 1
|
||||
else:
|
||||
logging.info('编号:' + last_picking.name)
|
||||
m = int(last_picking.name[-3:]) + 1
|
||||
num = "%04d" % m
|
||||
return '%s%s' % (rescode, num)
|
||||
@@ -481,7 +383,7 @@ class StockPicking(models.Model):
|
||||
location_id = self.env.ref(
|
||||
'sf_manufacturing.stock_location_locations_virtual_outcontract').id,
|
||||
location_dest_id = self.env['stock.location'].search(
|
||||
[('barcode', 'ilike', 'WH-PREPRODUCTION')]).id,
|
||||
[('barcode', '=', 'WH-PREPRODUCTION')]).id,
|
||||
outcontract_picking_type_in = self.env.ref(
|
||||
'sf_manufacturing.outcontract_picking_in').id,
|
||||
outcontract_picking_type_out = self.env.ref(
|
||||
@@ -542,65 +444,6 @@ class ReStockMove(models.Model):
|
||||
else:
|
||||
raise UserError(_("没有可打印的标签数据"))
|
||||
|
||||
def action_show_details(self):
|
||||
""" Returns an action that will open a form view (in a popup) allowing to work on all the
|
||||
move lines of a particular move. This form view is used when "show operations" is not
|
||||
checked on the picking type.
|
||||
"""
|
||||
self.ensure_one()
|
||||
|
||||
# If "show suggestions" is not checked on the picking type, we have to filter out the
|
||||
# reserved move lines. We do this by displaying `move_line_nosuggest_ids`. We use
|
||||
# different views to display one field or another so that the webclient doesn't have to
|
||||
# fetch both.
|
||||
if self.picking_type_id.show_reserved:
|
||||
view = self.env.ref('stock.view_stock_move_operations')
|
||||
else:
|
||||
view = self.env.ref('stock.view_stock_move_nosuggest_operations')
|
||||
|
||||
if self.product_id.tracking == "serial" and self.state == "assigned":
|
||||
print(self.origin)
|
||||
if self.product_id.categ_id.name == '刀具':
|
||||
self.next_serial = self._get_tool_next_serial(self.company_id, self.product_id, self.origin)
|
||||
else:
|
||||
self.next_serial = self.env['stock.lot']._get_next_serial(self.company_id, self.product_id)
|
||||
|
||||
return {
|
||||
'name': _('Detailed Operations'),
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'stock.move',
|
||||
'views': [(view.id, 'form')],
|
||||
'view_id': view.id,
|
||||
'target': 'new',
|
||||
'res_id': self.id,
|
||||
'context': dict(
|
||||
self.env.context,
|
||||
show_owner=self.picking_type_id.code != 'incoming',
|
||||
show_lots_m2o=self.has_tracking != 'none' and (
|
||||
self.picking_type_id.use_existing_lots or self.state == 'done' or self.origin_returned_move_id.id),
|
||||
# able to create lots, whatever the value of ` use_create_lots`.
|
||||
show_lots_text=self.has_tracking != 'none' and self.picking_type_id.use_create_lots and not self.picking_type_id.use_existing_lots and self.state != 'done' and not self.origin_returned_move_id.id,
|
||||
show_source_location=self.picking_type_id.code != 'incoming',
|
||||
show_destination_location=self.picking_type_id.code != 'outgoing',
|
||||
show_package=not self.location_id.usage == 'supplier',
|
||||
show_reserved_quantity=self.state != 'done' and not self.picking_id.immediate_transfer and self.picking_type_id.code != 'incoming'
|
||||
),
|
||||
}
|
||||
|
||||
def _get_tool_next_serial(self, company, product, origin):
|
||||
"""Return the next serial number to be attributed to the product."""
|
||||
if product.tracking == "serial":
|
||||
last_serial = self.env['stock.lot'].search(
|
||||
[('company_id', '=', company.id), ('product_id', '=', product.id), ('name', 'ilike', origin)],
|
||||
limit=1, order='id DESC')
|
||||
split_codes = product.cutting_tool_model_id.code.split('-')
|
||||
if last_serial:
|
||||
return "%s-T-%s-%s-%03d" % (
|
||||
split_codes[0], origin, product.specification_id.name, int(last_serial.name[-3:]) + 1)
|
||||
else:
|
||||
return "%s-T-%s-%s-%03d" % (split_codes[0], origin, product.specification_id.name, 1)
|
||||
|
||||
|
||||
class ReStockQuant(models.Model):
|
||||
_inherit = 'stock.quant'
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 14 KiB |
@@ -1,34 +1,29 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_sf_cnc_processing_group_sf_mrp_user,sf_cnc_processing,model_sf_cnc_processing,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_cnc_processing,sf_cnc_processing,model_sf_cnc_processing,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_cnc_processing_manager,sf_cnc_processing,model_sf_cnc_processing,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_sf_cmm_program_group_sf_mrp_user_group_sf_mrp_user,sf_cmm_program_group_sf_mrp_user,model_sf_cmm_program,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_cmm_program_group_sf_mrp_manager,sf_cmm_program_group_sf_mrp_manager,model_sf_cmm_program,sf_base.group_sf_mrp_manager,1,0,0,0
|
||||
access_sf_model_type_group_sf_mrp_user,sf_model_type,model_sf_model_type,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_model_type_admin,sf_model_type_admin,model_sf_model_type,base.group_system,1,1,1,0
|
||||
access_sf_model_type,sf_model_type,model_sf_model_type,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_model_type_manager,sf_model_type,model_sf_model_type,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_sf_model_type_group_sale_director,sf_model_type_group_sale_director,model_sf_model_type,sf_base.group_sale_director,1,0,0,0
|
||||
access_sf_model_type_group_purchase_director,sf_model_type_group_purchase_director,model_sf_model_type,sf_base.group_purchase_director,1,0,0,0
|
||||
access_sf_model_type_group_plan_director,sf_model_type_group_plan_director,model_sf_model_type,sf_base.group_plan_director,1,0,0,0
|
||||
access_sf_product_model_type_routing_sort_group_sf_mrp_user,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_product_model_type_routing_sort,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_product_model_type_routing_sort_manager,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_sf_embryo_model_type_routing_sort_group_sf_mrp_user,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_embryo_model_type_routing_sort,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_embryo_model_type_routing_sort_manager,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_sf_surface_technics_model_type_routing_sort,sf_surface_technics_model_type_routing_sort,model_sf_surface_technics_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_sf_surface_technics_model_type_routing_sort_manager,sf_surface_technics_model_type_routing_sort,model_sf_surface_technics_model_type_routing_sort,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_sf_production_line_group_sf_mrp_user,sf.production.line,model_sf_production_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_sf_production_line,sf.production.line,model_sf_production_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_sf_production_line_manager,sf.production.line,model_sf_production_line,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_maintenance_equipment_tool_group_sf_mrp_user,maintenance_equipment_tool,model_maintenance_equipment_tool,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_maintenance_equipment_tool,maintenance_equipment_tool,model_maintenance_equipment_tool,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_maintenance_equipment_tool_manager,maintenance_equipment_tool,model_maintenance_equipment_tool,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_maintenance_equipment_tool_equipment_manager,maintenance_equipment_tool,model_maintenance_equipment_tool,sf_maintenance.sf_group_equipment_user,1,1,1,0
|
||||
access_mrp_production_group_sf_mrp_user,mrp_production,model_mrp_production,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_production,mrp_production,model_mrp_production,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_production_manager,mrp_production,model_mrp_production,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_mrp_production_group_quality,mrp_production_group_quality,model_mrp_production,sf_base.group_quality,1,0,0,0
|
||||
access_mrp_production_group_quality_director,mrp_production_group_quality_director,model_mrp_production,sf_base.group_quality_director,1,0,0,0
|
||||
access_mrp_workorder_group_sf_mrp_user,mrp_workorder,model_mrp_workorder,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workorder,mrp_workorder,model_mrp_workorder,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workorder_manager,mrp_workorder,model_mrp_workorder,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_mrp_workcenter_group_sf_mrp_user,mrp_workcenter,model_mrp_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workcenter,mrp_workcenter,model_mrp_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workcenter_manager,mrp_workcenter,model_mrp_workcenter,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_mrp_workcenter_productivity_group_sf_mrp_user,mrp_workcenter_productivity,model_mrp_workcenter_productivity,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workcenter_productivity,mrp_workcenter_productivity,model_mrp_workcenter_productivity,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workcenter_productivity_manager,mrp_workcenter_productivity,model_mrp_workcenter_productivity,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_sf_workpiece_delivery_group_sf_order_user,sf_workpiece_delivery_group_sf_order_user,model_sf_workpiece_delivery,sf_base.group_sf_order_user,1,1,0,0
|
||||
access_sf_workpiece_delivery_group_sf_equipment_user,sf_workpiece_delivery_group_sf_equipment_user,model_sf_workpiece_delivery,sf_base.group_sf_equipment_user,1,1,0,0
|
||||
@@ -36,72 +31,73 @@ access_sf_workpiece_delivery_group_sf_equipment_user,sf_workpiece_delivery_group
|
||||
access_sf_workpiece_delivery_manager,sf_workpiece_delivery,model_sf_workpiece_delivery,sf_base.group_sf_mrp_manager,1,1,0,0
|
||||
access_sf_workpiece_delivery_admin,sf_workpiece_delivery_admin,model_sf_workpiece_delivery,base.group_system,1,1,1,0
|
||||
access_sf_workpiece_delivery_wizard_group_sf_order_user,sf_workpiece_delivery_wizard_group_sf_order_user,model_sf_workpiece_delivery_wizard,sf_base.group_sf_order_user,1,1,1,0
|
||||
access_mrp_workcenter_productivity_loss_manager_group_sf_mrp_user,mrp.workcenter.productivity.loss,mrp.model_mrp_workcenter_productivity_loss,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter_productivity_loss_group_sf_mrp_user,mrp.workcenter.productivity.loss,mrp.model_mrp_workcenter_productivity_loss,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workcenter_productivity_loss_type_group_sf_mrp_user,mrp.workcenter.productivity.loss.type,mrp.model_mrp_workcenter_productivity_loss_type,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workcenter_productivity_group_sf_mrp_user,mrp.workcenter.productivity,mrp.model_mrp_workcenter_productivity,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter_group_sf_mrp_user,mrp.workcenter,mrp.model_mrp_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_routing_workcenter_group_sf_mrp_user,mrp.routing.workcenter,mrp.model_mrp_routing_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_bom_group_sf_mrp_user,mrp.bom,mrp.model_mrp_bom,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_bom_line_group_sf_mrp_user,mrp.bom.line,mrp.model_mrp_bom_line,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_bom_byproduct_user_group_sf_mrp_user,mrp.bom.byproduct,mrp.model_mrp_bom_byproduct,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_production_group_sf_mrp_user,mrp.production user,mrp.model_mrp_production,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter_manager_group_sf_mrp_user,mrp.workcenter.manager,mrp.model_mrp_workcenter,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_routing_workcenter_manager_group_sf_mrp_user,mrp.routing.workcenter.manager,mrp.model_mrp_routing_workcenter,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_bom_manager_group_sf_mrp_user,mrp.bom.manager,mrp.model_mrp_bom,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_bom_line_manager_group_sf_mrp_user,mrp.bom.line.manager,mrp.model_mrp_bom_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter_productivity_loss_manager,mrp.workcenter.productivity.loss,mrp.model_mrp_workcenter_productivity_loss,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter_productivity_loss,mrp.workcenter.productivity.loss,mrp.model_mrp_workcenter_productivity_loss,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workcenter_productivity_loss_type,mrp.workcenter.productivity.loss.type,mrp.model_mrp_workcenter_productivity_loss_type,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workcenter_productivity,mrp.workcenter.productivity,mrp.model_mrp_workcenter_productivity,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter,mrp.workcenter,mrp.model_mrp_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_routing_workcenter,mrp.routing.workcenter,mrp.model_mrp_routing_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_bom,mrp.bom,mrp.model_mrp_bom,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_bom_line,mrp.bom.line,mrp.model_mrp_bom_line,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_bom_byproduct_user,mrp.bom.byproduct,mrp.model_mrp_bom_byproduct,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_production,mrp.production user,mrp.model_mrp_production,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter_manager,mrp.workcenter.manager,mrp.model_mrp_workcenter,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_routing_workcenter_manager,mrp.routing.workcenter.manager,mrp.model_mrp_routing_workcenter,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_bom_manager,mrp.bom.manager,mrp.model_mrp_bom,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_bom_line_manager,mrp.bom.line.manager,mrp.model_mrp_bom_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_bom_line_group_plan_director,mrp_bom_line_group_plan_director,mrp.model_mrp_bom_line,sf_base.group_plan_director,1,1,1,0
|
||||
access_mrp_bom_line_group_sale_director,mrp_bom_line_group_sale_director,mrp.model_mrp_bom_line,sf_base.group_sale_director,1,1,1,0
|
||||
access_mrp_bom_line_group_purchase_director,mrp_bom_line_group_purchase_director,mrp.model_mrp_bom_line,sf_base.group_purchase_director,1,1,1,0
|
||||
|
||||
access_mrp_bom_byproduct_manager_group_sf_mrp_user,mrp.bom.byproduct manager,mrp.model_mrp_bom_byproduct,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_bom_byproduct_manager,mrp.bom.byproduct manager,mrp.model_mrp_bom_byproduct,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_stock_worker,mrp.production stock_worker,mrp.model_mrp_production,stock.group_stock_user,1,0,0,0
|
||||
access_product_product_user_group_sf_mrp_user,product.product user,product.model_product_product,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_product_template_user_group_sf_mrp_user,product.template user,product.model_product_template,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_uom_uom_user,uom.uom user_group_sf_mrp_user,uom.model_uom_uom,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_product_supplierinfo_user_group_sf_mrp_user,product.supplierinfo user,product.model_product_supplierinfo,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_res_partner_group_sf_mrp_user,res.partner,base.model_res_partner,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workorder_mrp_user_group_sf_mrp_user,mrp.workorder.user,mrp.model_mrp_workorder,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workorder_mrp_manager_group_sf_mrp_user,mrp.workorder,mrp.model_mrp_workorder,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_resource_calendar_leaves_user_group_sf_mrp_user,mrp.resource.calendar.leaves.user,resource.model_resource_calendar_leaves,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_resource_calendar_leaves_manager_group_sf_mrp_user,mrp.resource.calendar.leaves.manager,resource.model_resource_calendar_leaves,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_resource_calendar_attendance_mrp_user_group_sf_mrp_user,mrp.resource.calendar.attendance.mrp.user,resource.model_resource_calendar_attendance,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_resource_calendar_attendance_manager_group_sf_mrp_user,mrp.resource.calendar.attendance.manager,resource.model_resource_calendar_attendance,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_uom_category_group_sf_mrp_user,uom.category,uom.model_uom_category,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_resource_resource_group_sf_mrp_user,resource.resource,resource.model_resource_resource,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_resource_resource_manager_group_sf_mrp_user,resource.resource.manager,resource.model_resource_resource,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_supplierinfo_manager_group_sf_mrp_user,product.supplierinfo user,product.model_product_supplierinfo,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_production_manager_group_sf_mrp_user,mrp.production manager,mrp.model_mrp_production,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_product_product_user,product.product user,product.model_product_product,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_product_template_user,product.template user,product.model_product_template,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_uom_uom_user,uom.uom user,uom.model_uom_uom,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_product_supplierinfo_user,product.supplierinfo user,product.model_product_supplierinfo,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_res_partner,res.partner,base.model_res_partner,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workorder_mrp_user,mrp.workorder.user,mrp.model_mrp_workorder,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workorder_mrp_manager,mrp.workorder,mrp.model_mrp_workorder,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_resource_calendar_leaves_user,mrp.resource.calendar.leaves.user,resource.model_resource_calendar_leaves,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_resource_calendar_leaves_manager,mrp.resource.calendar.leaves.manager,resource.model_resource_calendar_leaves,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_resource_calendar_attendance_mrp_user,mrp.resource.calendar.attendance.mrp.user,resource.model_resource_calendar_attendance,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_resource_calendar_attendance_manager,mrp.resource.calendar.attendance.manager,resource.model_resource_calendar_attendance,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_uom_category,uom.category,uom.model_uom_category,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_resource_resource,resource.resource,resource.model_resource_resource,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_resource_resource_manager,resource.resource.manager,resource.model_resource_resource,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_supplierinfo_manager,product.supplierinfo user,product.model_product_supplierinfo,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_production_manager,mrp.production manager,mrp.model_mrp_production,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_bom_stockuser,mrp.bom,mrp.model_mrp_bom,stock.group_stock_user,1,0,0,0
|
||||
access_mrp_bom_line_stockuser,mrp.bom.line,mrp.model_mrp_bom_line,stock.group_stock_user,1,0,0,0
|
||||
access_uom_category_mrp_manager_group_sf_mrp_user,uom.category mrp_manager,uom.model_uom_category,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_uom_uom_mrp_manager_group_sf_mrp_user,uom.uom mrp_manager,uom.model_uom_uom,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_category_mrp_manager_group_sf_mrp_user,product.category mrp_manager,product.model_product_category,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_template_mrp_manager_group_sf_mrp_user,product.template mrp_manager,product.model_product_template,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_product_mrp_manager_group_sf_mrp_user,product.product mrp_manager,product.model_product_product,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_packaging_mrp_manager_group_sf_mrp_user,product.packaging mrp_manager,product.model_product_packaging,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_pricelist_mrp_manager_group_sf_mrp_user,product.pricelist mrp_manager,product.model_product_pricelist,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_group_res_partner_mrp_manager_group_sf_mrp_user,res_partner sf_base.group_sf_mrp_manager,base.model_res_partner,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_pricelist_item_mrp_manager_group_sf_mrp_user,product.pricelist.item mrp_manager,product.model_product_pricelist_item,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_uom_category_mrp_manager,uom.category mrp_manager,uom.model_uom_category,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_uom_uom_mrp_manager,uom.uom mrp_manager,uom.model_uom_uom,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_category_mrp_manager,product.category mrp_manager,product.model_product_category,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_template_mrp_manager,product.template mrp_manager,product.model_product_template,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_product_mrp_manager,product.product mrp_manager,product.model_product_product,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_packaging_mrp_manager,product.packaging mrp_manager,product.model_product_packaging,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_pricelist_mrp_manager,product.pricelist mrp_manager,product.model_product_pricelist,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_group_res_partner_mrp_manager,res_partner sf_base.group_sf_mrp_manager,base.model_res_partner,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_pricelist_item_mrp_manager,product.pricelist.item mrp_manager,product.model_product_pricelist_item,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_product_tag_mrp_manager,product.tag.mrp.manager,product.model_product_tag,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_resource_calendar_manufacturinguser_group_sf_mrp_user,resource.calendar manufacturing.user,resource.model_resource_calendar,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_unbuild_group_sf_mrp_user,mrp.unbuild,mrp.model_mrp_unbuild,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_resource_calendar_manufacturinguser,resource.calendar manufacturing.user,resource.model_resource_calendar,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_unbuild,mrp.unbuild,mrp.model_mrp_unbuild,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_unbuild_manager,mrp.unbuild manager,mrp.model_mrp_unbuild,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_mrp_document_mrp_manager,mrp.document group_user,mrp.model_mrp_document,sf_base.group_sf_mrp_manager,1,1,1,0
|
||||
access_mrp_document_mrp_user_group_sf_mrp_user,mrp.document group_user,mrp.model_mrp_document,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_change_production_qty_group_sf_mrp_user,access.change.production.qty,mrp.model_change_production_qty,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_stock_warn_insufficient_qty_unbuild_group_sf_mrp_user,access.stock.warn.insufficient.qty.unbuild,mrp.model_stock_warn_insufficient_qty_unbuild,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_backorder_group_sf_mrp_user,access.mrp.production.backorder,mrp.model_mrp_production_backorder,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_backorder_line_group_sf_mrp_user,access.mrp.production.backorder.line,mrp.model_mrp_production_backorder_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_consumption_warning_group_sf_mrp_user,access.mrp.consumption.warning,mrp.model_mrp_consumption_warning,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_consumption_warning_line_group_sf_mrp_user,access.mrp.consumption.warning.line,mrp.model_mrp_consumption_warning_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_immediate_production_group_sf_mrp_user,access.mrp.immediate.production,mrp.model_mrp_immediate_production,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_immediate_production_line_group_sf_mrp_user,access.mrp.immediate.production.line,mrp.model_mrp_immediate_production_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter_tag_manager_group_sf_mrp_user,access.mrp.workcenter.tag,mrp.model_mrp_workcenter_tag,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_split_multi_group_sf_mrp_user,access.mrp.production.split.multi,mrp.model_mrp_production_split_multi,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_split_group_sf_mrp_user,access.mrp.production.split,mrp.model_mrp_production_split,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_split_line_group_sf_mrp_user,access.mrp.production.split.line,mrp.model_mrp_production_split_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter_capacity_manager_group_sf_mrp_user,mrp.workcenter.capacity.manager,mrp.model_mrp_workcenter_capacity,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_document_mrp_user,mrp.document group_user,mrp.model_mrp_document,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_change_production_qty,access.change.production.qty,mrp.model_change_production_qty,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_stock_warn_insufficient_qty_unbuild,access.stock.warn.insufficient.qty.unbuild,mrp.model_stock_warn_insufficient_qty_unbuild,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_backorder,access.mrp.production.backorder,mrp.model_mrp_production_backorder,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_backorder_line,access.mrp.production.backorder.line,mrp.model_mrp_production_backorder_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_consumption_warning,access.mrp.consumption.warning,mrp.model_mrp_consumption_warning,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_consumption_warning_line,access.mrp.consumption.warning.line,mrp.model_mrp_consumption_warning_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_immediate_production,access.mrp.immediate.production,mrp.model_mrp_immediate_production,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_immediate_production_line,access.mrp.immediate.production.line,mrp.model_mrp_immediate_production_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter_tag_group_user,access.mrp.workcenter.tag,mrp.model_mrp_workcenter_tag,sf_base.group_sf_mrp_user,1,0,0,0
|
||||
access_mrp_workcenter_tag_manager,access.mrp.workcenter.tag,mrp.model_mrp_workcenter_tag,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_split_multi,access.mrp.production.split.multi,mrp.model_mrp_production_split_multi,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_split,access.mrp.production.split,mrp.model_mrp_production_split,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_production_split_line,access.mrp.production.split.line,mrp.model_mrp_production_split_line,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
access_mrp_workcenter_capacity_manager,mrp.workcenter.capacity.manager,mrp.model_mrp_workcenter_capacity,sf_base.group_sf_mrp_user,1,1,1,0
|
||||
|
||||
|
||||
access_mrp_production_group_plan_dispatch,mrp_production,model_mrp_production,sf_base.group_plan_dispatch,1,0,0,0
|
||||
@@ -110,9 +106,9 @@ access_sf_production_line_group_plan_dispatch,sf.production.line,model_sf_produc
|
||||
access_sf_production_line_group_plan_director,sf.production.line,model_sf_production_line,sf_base.group_plan_director,1,1,1,0
|
||||
access_sf_production_line,sf.production.line,model_sf_production_line,sf_maintenance.sf_group_equipment_user,1,1,1,0
|
||||
access_mrp_workcenter,mrp_workcenter,model_mrp_workcenter,sf_base.group_plan_dispatch,1,1,1,0
|
||||
access_mrp_bom_group_plan_dispatch,mrp.bom,mrp.model_mrp_bom,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_mrp_bom,mrp.bom,mrp.model_mrp_bom,sf_base.group_plan_dispatch,1,1,1,0
|
||||
access_mrp_bom_line,mrp.bom.line,mrp.model_mrp_bom_line,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_mrp_unbuild_group_plan_dispatch,mrp.unbuild,mrp.model_mrp_unbuild,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_mrp_unbuild,mrp.unbuild,mrp.model_mrp_unbuild,sf_base.group_plan_dispatch,1,1,1,0
|
||||
access_stock_scrap_group_plan_dispatch,stock.scrap,stock.model_stock_scrap,sf_base.group_plan_dispatch,1,0,0,0
|
||||
|
||||
access_sf_model_type,sf.model.type,model_sf_model_type,sf_base.group_plan_dispatch,1,1,1,0
|
||||
@@ -123,13 +119,8 @@ access_sf_embryo_model_type_routing_sort,sf.embryo.model.type.routing.sort,model
|
||||
access_sf_surface_technics_model_type_routing_sort,sf.surface_technics.model.type.routing.sort,model_sf_surface_technics_model_type_routing_sort,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_mrp_workcenter_capacity,mrp.workcenter.capacity,mrp.model_mrp_workcenter_capacity,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_sf_cnc_processing,sf.cnc.processing,model_sf_cnc_processing,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_sf_cmm_program_group_plan_dispatch,sf_cmm_program_group_plan_dispatch,model_sf_cmm_program,sf_base.group_plan_dispatch,1,0,0,0
|
||||
|
||||
|
||||
|
||||
access_mrp_workcenter_productivity,mrp.workcenter.productivity,mrp.model_mrp_workcenter_productivity,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_maintenance_equipment_tool_group_plan_dispatch,maintenance.equipment.tool,sf_manufacturing.model_maintenance_equipment_tool,sf_base.group_plan_dispatch,1,0,0,0
|
||||
|
||||
access_sf_workpiece_delivery_group_plan_dispatch,sf.workpiece.delivery,sf_manufacturing.model_sf_workpiece_delivery,sf_base.group_plan_dispatch,1,0,0,0
|
||||
|
||||
access_sf_agv_site_group_sf_order_user,sf_agv_site_group_sf_order_user,model_sf_agv_site,sf_base.group_sf_order_user,1,1,1,0
|
||||
access_sf_agv_task_route_group_sf_order_user,sf_agv_task_route_group_sf_order_user,model_sf_agv_task_route,sf_base.group_sf_order_user,1,1,1,0
|
||||
|
@@ -1,17 +0,0 @@
|
||||
var RFID = ''
|
||||
$(document).off('keydown')
|
||||
console.log(2222)
|
||||
$(document).on('keydown', '.modal.d-block.o_technical_modal,body.o_web_client', function (e) {
|
||||
const dom = $('.customRFID')
|
||||
if(!dom.length) return
|
||||
setTimeout(() => {
|
||||
RFID = ''
|
||||
}, 200)
|
||||
if(e.key == 'Enter' && e.keyCode == 13 || e.key == 'Tab' && e.keyCode == 9){
|
||||
if(!RFID || RFID.length <= 3) return;
|
||||
dom.children('span').text(RFID)
|
||||
RFID = ''
|
||||
return;
|
||||
}
|
||||
RFID += e.key
|
||||
})
|
||||
@@ -1,59 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<!-- agv站点 -->
|
||||
<record id="view_agv_site_tree" model="ir.ui.view">
|
||||
<field name="name">agv站点</field>
|
||||
<field name="model">sf.agv.site</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree editable="bottom">
|
||||
<field name="number" required="1"/>
|
||||
<field name="name" required="1"/>
|
||||
<field name="owning_region" required="1"/>
|
||||
<field name="state" required="1"/>
|
||||
<field name="divide_the_work" required="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_agv_site_form" model="ir.actions.act_window">
|
||||
<field name="name">AGV站点</field>
|
||||
<field name="res_model">sf.agv.site</field>
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_action_agv_site"
|
||||
parent="sf_base.menu_sf_base"
|
||||
name="AGV站点"
|
||||
sequence="12"
|
||||
action="action_agv_site_form"/>
|
||||
|
||||
<!-- agv任务路线 -->
|
||||
<record id="view_agv_task_route_tree" model="ir.ui.view">
|
||||
<field name="name">AGV任务路线</field>
|
||||
<field name="model">sf.agv.task.route</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree editable="bottom">
|
||||
<field name="name" required="1"/>
|
||||
<field name="type" readonly="1"/>
|
||||
<field name="start_site_id" required="1" options="{'no_create': True}" string="起点接驳站"/>
|
||||
<field name="end_site_id" required="1" options="{'no_create': True}" string="终点接驳站"/>
|
||||
<field name="destination_production_line_id" required="1" options="{'no_create': True}"/>
|
||||
<field name="priority" widget="priority"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_agv_task_route_form" model="ir.actions.act_window">
|
||||
<field name="name">AGV任务路线</field>
|
||||
<field name="res_model">sf.agv.task.route</field>
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_action_agv_task_route"
|
||||
parent="sf_base.menu_sf_base"
|
||||
name="AGV任务路线"
|
||||
sequence="13"
|
||||
action="action_agv_task_route_form"/>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -68,11 +68,9 @@
|
||||
<xpath expr="//field[@name='user_id']" position="after">
|
||||
<field name="programming_no" readonly="1"/>
|
||||
<field name="work_state" invisible="1"/>
|
||||
<field name="schedule_state" invisible='1'/>
|
||||
<field name="programming_state" readonly="1"/>
|
||||
<field name="production_line_id" readonly="1"/>
|
||||
<field name="production_line_id" readonly="1"/>
|
||||
<field name="plan_start_processing_time" readonly="1"/>
|
||||
<field name="production_line_state" readonly="1"/>
|
||||
</xpath>
|
||||
<xpath expr="//header//button[@name='action_cancel']" position="replace">
|
||||
<button name="action_cancel" type="object" string="取消" data-hotkey="z"
|
||||
@@ -236,10 +234,6 @@
|
||||
attrs="{'invisible': [('state', '!=', 'done')]}" data-hotkey="shift+v"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//sheet//notebook//page[@name='operations']" position="attributes">
|
||||
<attribute name="attrs">{'invisible': [('schedule_state', '=', '未排')]}</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -250,62 +244,61 @@
|
||||
<field name="inherit_id" ref="mrp.mrp_production_workorder_tree_editable_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//tree//button[@name='button_start']" position="replace">
|
||||
<field name="routing_type" invisible="True"/>
|
||||
<button name="button_start" type="object" string="开始" class="btn-success"
|
||||
attrs="{'invisible': ['|', '|', '|','|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), ('is_user_working', '!=', False), ('routing_type', '=', 'CNC加工')]}"
|
||||
attrs="{'invisible': ['|', '|', '|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), ('is_user_working', '!=', False)]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree//button[@name='button_pending']" position="replace">
|
||||
<button name="button_pending" type="object" string="Pause" class="btn-warning"
|
||||
attrs="{'invisible': ['|', '|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False), ('routing_type', '=', 'CNC加工')]}"
|
||||
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree//button[@name='button_finish']" position="replace">
|
||||
<button name="button_finish" type="object" string="Done" class="btn-success"
|
||||
attrs="{'invisible': ['|', '|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False), ('routing_type', '=', 'CNC加工')]}"
|
||||
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree//button[@name='%(mrp.act_mrp_block_workcenter_wo)d']" position="replace">
|
||||
<button name="%(mrp.act_mrp_block_workcenter_wo)d" type="action" string="Block"
|
||||
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
|
||||
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('routing_type', '=', 'CNC加工')]}"
|
||||
attrs="{'invisible': ['|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked')]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree//button[@name='button_unblock']" position="replace">
|
||||
<button name="button_unblock" type="object" string="Unblock"
|
||||
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
|
||||
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked'), ('routing_type', '=', 'CNC加工')]}"
|
||||
attrs="{'invisible': ['|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked')]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree//button[@name='action_open_wizard']" position="replace">
|
||||
<button name="action_open_wizard" type="object" icon="fa-external-link" class="oe_edit_only"
|
||||
title="Open Work Order"
|
||||
context="{'default_workcenter_id': workcenter_id}" groups="sf_base.group_sf_mrp_user"/>
|
||||
<!-- ======= -->
|
||||
<!-- <button name="button_start" type="object" string="开始" class="btn-success" -->
|
||||
<!-- attrs="{'invisible': ['|', '|', '|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), ('is_user_working', '!=', False)]}" -->
|
||||
<!-- groups="sf_base.group_sf_mrp_user"/> -->
|
||||
=======
|
||||
<button name="button_start" type="object" string="开始" class="btn-success"
|
||||
attrs="{'invisible': ['|', '|', '|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), ('is_user_working', '!=', False)]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree//button[@name='button_pending']" position="replace">
|
||||
<button name="button_pending" type="object" string="暂停" class="btn-warning"
|
||||
attrs="{'invisible': ['|', '|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False), ('routing_type', '=', 'CNC加工')]}"
|
||||
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree//button[@name='button_finish']" position="replace">
|
||||
<button name="button_finish" type="object" string="完成" class="btn-success"
|
||||
attrs="{'invisible': ['|', '|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False), ('routing_type', '=', 'CNC加工')]}"
|
||||
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree//button[@name='%(mrp.act_mrp_block_workcenter_wo)d']" position="replace">
|
||||
<button name="%(mrp.act_mrp_block_workcenter_wo)d" type="action" string="阻塞"
|
||||
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
|
||||
attrs="{'invisible': ['|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('routing_type', '=', 'CNC加工')]}"
|
||||
attrs="{'invisible': ['|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked')]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree//button[@name='button_unblock']" position="replace">
|
||||
<button name="button_unblock" type="object" string="取消阻塞"
|
||||
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
|
||||
attrs="{'invisible': ['|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked'), ('routing_type', '=', 'CNC加工')]}"
|
||||
attrs="{'invisible': ['|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked')]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree//button[@name='action_open_wizard']" position="replace">
|
||||
@@ -422,8 +415,7 @@
|
||||
|
||||
<div name="product_specification_id" class="mt-1">
|
||||
规格:
|
||||
<field name="specification_id"/>
|
||||
<field name="specification_fixture_id"/>
|
||||
<field name="specification_id"></field>
|
||||
</div>
|
||||
<t t-if="record.default_code.value">[<field name="default_code"/>]
|
||||
</t>
|
||||
|
||||
@@ -46,9 +46,6 @@
|
||||
<attribute name="invisible">1</attribute>
|
||||
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='name']" position="after">
|
||||
<field name="production_id"/>
|
||||
</xpath>
|
||||
<!-- <button name="button_start" type="object" string="Start" class="btn-success"-->
|
||||
<!-- attrs="{'invisible': ['|', '|', '|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), ('is_user_working', '!=', False)]}"/>-->
|
||||
<!-- <button name="button_pending" type="object" string="Pause" class="btn-warning"-->
|
||||
@@ -106,21 +103,23 @@
|
||||
<xpath expr="//field[@name='state']" position="before">
|
||||
<field name='user_permissions' invisible="1"/>
|
||||
<field name='name' invisible="1"/>
|
||||
<field name='routing_type' invisible="1"/>
|
||||
<field name='is_delivery' invisible="1"/>
|
||||
<!-- 工单form页面的开始停工按钮等 -->
|
||||
<button name="button_start" type="object" string="开始" class="btn-success"
|
||||
attrs="{'invisible': ['|', ('production_state', '!=', 'pending_processing'), ('state','!=','ready')]}"
|
||||
attrs="{'invisible': ['|', '|', '|','|',('production_state','in', ('draft', 'done',
|
||||
'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')),
|
||||
('is_user_working', '!=', False),('user_permissions','=',False)]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
<button name="button_pending" type="object" string="暂停" class="btn-warning"
|
||||
attrs="{'invisible': ['|', ('production_state', '!=', 'pending_processing'), ('state','!=','progress')]}"
|
||||
groups="sf_base.group_sf_mrp_user"/>
|
||||
groups="sf_base.group_sf_mrp_user"
|
||||
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"/>
|
||||
<button name="button_finish" type="object" string="完成" class="btn-success"
|
||||
attrs="{'invisible': ['|', ('production_state', '!=', 'pending_processing'), ('state','!=','progress')]}"
|
||||
groups="sf_base.group_sf_mrp_user" confirm="是否确认完工"/>
|
||||
groups="sf_base.group_sf_mrp_user"
|
||||
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"/>
|
||||
<button name="%(mrp.act_mrp_block_workcenter_wo)d" type="action" string="停工"
|
||||
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
|
||||
groups="sf_base.group_sf_mrp_user"
|
||||
attrs="{'invisible': ['|', ('production_state', '!=', 'pending_processing'), ('state','!=','progress')]}"/>
|
||||
attrs="{'invisible': ['|', '|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'),('user_permissions','=',False),('state','=','done')]}"/>
|
||||
<button name="button_unblock" type="object" string="Unblock"
|
||||
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
|
||||
groups="sf_base.group_sf_mrp_user"
|
||||
@@ -145,12 +144,7 @@
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
<xpath expr="//label[1]" position="before">
|
||||
<field name='routing_type'/>
|
||||
</xpath>
|
||||
<xpath expr="//label[1]" position="attributes">
|
||||
<attribute name="string">计划加工时间</attribute>
|
||||
</xpath>
|
||||
|
||||
<!-- 隐藏物料清单-->
|
||||
<!-- <xpath expr="//page[@name='components']" position="attributes">-->
|
||||
<!-- <attribute name="invisible">1</attribute>-->
|
||||
@@ -172,31 +166,26 @@
|
||||
<field name="duration" widget="mrp_timer"
|
||||
attrs="{'invisible': [('production_state','=', 'draft')], 'readonly': [('is_user_working', '=', True)]}"
|
||||
sum="real duration"/>
|
||||
<field name="glb_file" readonly="1" widget="Viewer3D" string="加工模型"/>
|
||||
<field name="processing_panel" readonly="1"
|
||||
attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/>
|
||||
<field name="equipment_id"
|
||||
attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/>
|
||||
<field name="production_line_state"
|
||||
attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/>
|
||||
<field name="functional_fixture_id"
|
||||
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
|
||||
<field name="functional_fixture_code" force_save="1"
|
||||
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
|
||||
<field name="functional_fixture_type_id"
|
||||
<field name="functional_fixture_type_id" force_save="1"
|
||||
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
|
||||
<field name="rfid_code"
|
||||
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
|
||||
|
||||
<field name="rfid_code" force_save="1" readonly="1" cache="True"
|
||||
attrs="{'invisible': [('rfid_code_old', '!=', False)]}"/>
|
||||
<field name="rfid_code_old" readonly="1" attrs="{'invisible': [('rfid_code_old', '=', False)]}"/>
|
||||
</group>
|
||||
<!-- <group>-->
|
||||
<!-- <div>-->
|
||||
<!-- <label for="glb_file" string="加工模型"/>-->
|
||||
<!-- <field name="glb_file" readonly="1" widget="Viewer3D"/>-->
|
||||
<!-- </div>-->
|
||||
<!-- <!– <field name="glb_file" string="模型" readonly="1" widget="Viewer3D"/>–>-->
|
||||
<!-- </group>-->
|
||||
<group attrs='{"invisible": [("routing_type","=","获取CNC加工程序")]}'>
|
||||
<div>
|
||||
<label for="glb_file" string="加工模型"/>
|
||||
<field name="glb_file" readonly="1" widget="Viewer3D"/>
|
||||
</div>
|
||||
<!-- <field name="glb_file" string="模型" readonly="1" widget="Viewer3D"/>-->
|
||||
</group>
|
||||
|
||||
<!-- <field name="processing_panel" readonly="1" attrs="{'invisible': [('routing_type', 'in', ('获取CNC加工程序','装夹','解除装夹',-->
|
||||
<!-- '前置三元定位检测','后置三元质量检测','解除装夹'))]}"/>-->
|
||||
@@ -210,12 +199,12 @@
|
||||
<field name="programming_state" readonly="1"
|
||||
attrs='{"invisible": [("programming_no","=",False)]}'/>
|
||||
</group>
|
||||
<!-- <group>-->
|
||||
<!-- <div class="col-12 col-lg-6 o_setting_box" style="white-space: nowrap">-->
|
||||
<!-- <button type="object" class="oe_highlight" name="fetchCNC" string="获取CNC程序代码"-->
|
||||
<!-- />-->
|
||||
<!-- </div>-->
|
||||
<!-- </group>-->
|
||||
<group>
|
||||
<div class="col-12 col-lg-6 o_setting_box" style="white-space: nowrap">
|
||||
<button type="object" class="oe_highlight" name="fetchCNC" string="获取CNC程序代码"
|
||||
/>
|
||||
</div>
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
<!-- <page string="Components" name="components">-->
|
||||
@@ -243,7 +232,6 @@
|
||||
<!-- </page>-->
|
||||
<page string="工件装夹" attrs='{"invisible": [("routing_type","!=","装夹预调")]}'>
|
||||
<group>
|
||||
<field name="_barcode_scanned" widget="barcode_handler"/>
|
||||
<group string="卡盘">
|
||||
<field name="chuck_serial_number"/>
|
||||
<field name="chuck_name"/>
|
||||
@@ -252,6 +240,7 @@
|
||||
<field name="chuck_model_id"/>
|
||||
</group>
|
||||
<group string="托盘">
|
||||
<field name="_barcode_scanned" widget="barcode_handler"/>
|
||||
<field name="tray_serial_number" readonly="1" string="序列号"/>
|
||||
<field name="tray_product_id" readonly="1" string="名称"/>
|
||||
<field name="tray_brand_id" readonly="1" string="品牌"/>
|
||||
@@ -408,11 +397,8 @@
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-lg-6 o_setting_box">
|
||||
<field name="data_state" invisible="1"/>
|
||||
<button type="object" class="oe_highlight" name="get_three_check_datas" string="获取数据"
|
||||
attrs='{"invisible": ["|", "|", "|", ("material_center_point","!=",False),("state","!=","progress"),("user_permissions","=",False), ("data_state", "=", True)]}'/>
|
||||
<button type="object" class="oe_highlight" name="getcenter" string="计算定位"
|
||||
attrs='{"invisible": ["|","|", "|",("material_center_point","!=",False),("state","!=","progress"),("user_permissions","=",False), ("data_state", "=", False)]}'/>
|
||||
attrs='{"invisible": ["|","|",("material_center_point","!=",False),("state","!=","progress"),("user_permissions","=",False)]}'/>
|
||||
</div>
|
||||
|
||||
<group>
|
||||
@@ -425,10 +411,8 @@
|
||||
<tree editable="bottom">
|
||||
<field name="production_id" invisible="1"/>
|
||||
<field name="workpiece_code"/>
|
||||
<field name="route_id" options="{'no_create': True}"/>
|
||||
<field name="feeder_station_start_id" readonly="1" force_save="1"/>
|
||||
<field name="feeder_station_destination_id" readonly="1" force_save="1"/>
|
||||
<field name="cnc_program_down_state" readonly="1"/>
|
||||
<field name="feeder_station_start" force_save="1"/>
|
||||
<field name="feeder_station_destination"/>
|
||||
<field name="production_line_id"/>
|
||||
<field name="task_delivery_time" readonly="1"/>
|
||||
<field name="task_completion_time" readonly="1"/>
|
||||
@@ -443,22 +427,19 @@
|
||||
<field name="results" invisible="1"/>
|
||||
<page string="后置三元检测" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
|
||||
<group>
|
||||
<field name="test_results" attrs='{"invisible":[("results","!=",False)]}'/>
|
||||
<field name="is_remanufacture" attrs='{"invisible":[("test_results","=","合格")]}'/>
|
||||
<field name="test_results" widget="selection" attrs='{"invisible":[("results","!=",False)]}'/>
|
||||
<field name="results" readonly="1" attrs='{"invisible":[("results","!=","合格")]}'/>
|
||||
<field name="detection_report" attrs='{"invisible":[("results","!=",False)]}'
|
||||
widget="pdf_viewer"/>
|
||||
</group>
|
||||
<!-- <div class="col-12 col-lg-6 o_setting_box">-->
|
||||
<!-- <button type="object" class="oe_highlight" name="recreateManufacturingOrWorkerOrder"-->
|
||||
<!-- string="检测确认"-->
|
||||
<!-- attrs='{"invisible": ["|","|",("state","!=","progress"),("user_permissions","=",False),("results","=","合格")]}'/>-->
|
||||
<!-- </div>-->
|
||||
<div class="col-12 col-lg-6 o_setting_box">
|
||||
<button type="object" class="oe_highlight" name="recreateManufacturingOrWorkerOrder"
|
||||
string="检测确认"
|
||||
attrs='{"invisible": ["|","|",("state","!=","progress"),("user_permissions","=",False),("results","=","合格")]}'/>
|
||||
</div>
|
||||
</page>
|
||||
</xpath>
|
||||
<xpath expr="//page[1]" position="before">
|
||||
<page string="CNC程序" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
|
||||
<field name="cnc_ids" widget="one2many" string="工作程序" default_order="sequence_number,id">
|
||||
<field name="cnc_ids" widget="one2many" string="工作程序">
|
||||
<tree decoration-success="button_state" decoration-bf="button_state">
|
||||
<field name="sequence_number"/>
|
||||
<field name="program_name"/>
|
||||
@@ -480,25 +461,6 @@
|
||||
<field name="cnc_worksheet" string="工作指令" widget="pdf_viewer"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="CMM程序" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
|
||||
<field name="cmm_ids" widget="one2many" string="CMM程序">
|
||||
<tree>
|
||||
<field name="sequence_number"/>
|
||||
<field name="program_name"/>
|
||||
<field name="cmm_id" string="文件"/>
|
||||
<field name="cutting_tool_name"/>
|
||||
<field name="cutting_tool_no"/>
|
||||
<field name="processing_type"/>
|
||||
<field name="margin_x_y"/>
|
||||
<field name="margin_z"/>
|
||||
<field name="depth_of_processing_z"/>
|
||||
<field name="cutting_tool_extension_length"/>
|
||||
<field name="cutting_tool_handle_type"/>
|
||||
<field name="estimated_processing_time"/>
|
||||
<field name="remark"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</xpath>
|
||||
<xpath expr="//page[1]" position="before">
|
||||
<page string="解除装夹" attrs='{"invisible": [("routing_type","!=","解除装夹")]}'>
|
||||
@@ -516,7 +478,7 @@
|
||||
</page>
|
||||
</xpath>
|
||||
<xpath expr="//form//sheet//group//group//div[1]" position="after">
|
||||
<label for="date_start" string="实际加工时间"/>
|
||||
<label for="date_start" string="实际开始时间"/>
|
||||
<div class="oe_inline">
|
||||
<field name="date_start" class="mr8 oe_inline"/>
|
||||
<strong class="mr8 oe_inline">到</strong>
|
||||
@@ -527,8 +489,6 @@
|
||||
<field name="is_ok"/>
|
||||
<field name="processing_user_id"/>
|
||||
<field name="inspection_user_id"/>
|
||||
<field name="save_name" widget="CopyClipboardChar"
|
||||
attrs="{'invisible':[('routing_type','!=','装夹预调')]}"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
@@ -559,9 +519,9 @@
|
||||
<field name="name">工件配送</field>
|
||||
<field name="model">sf.workpiece.delivery</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="工件配送" editable="bottom" class="center" create="0" delete="0">
|
||||
<tree string="工件配送">
|
||||
<header>
|
||||
<button name="button_delivery" type="object" string="配送" class="oe_highlight"/>
|
||||
<button name="button_delivery" type="object" string="配送"/>
|
||||
</header>
|
||||
<field name="status" widget="badge"
|
||||
decoration-success="status == '已配送'"
|
||||
@@ -569,13 +529,11 @@
|
||||
decoration-danger="status == '待配送'"/>
|
||||
<field name="production_id" string="工件编码"/>
|
||||
<field name="workpiece_code"/>
|
||||
<field name="production_line_id" options="{'no_create': True}"/>
|
||||
<field name="route_id" options="{'no_create': True}"/>
|
||||
<field name="feeder_station_start_id" readonly="1" force_save="1"/>
|
||||
<field name="feeder_station_destination_id" readonly="1" force_save="1"/>
|
||||
<field name="cnc_program_down_state" readonly="1"/>
|
||||
<field name="task_delivery_time" readonly="1"/>
|
||||
<field name="task_completion_time" readonly="1"/>
|
||||
<field name="production_line_id"/>
|
||||
<field name="feeder_station_start"/>
|
||||
<field name="feeder_station_destination"/>
|
||||
<field name="task_delivery_time"/>
|
||||
<field name="task_completion_time"/>
|
||||
<field name="delivery_duration" widget="float_time"/>
|
||||
</tree>
|
||||
</field>
|
||||
@@ -588,19 +546,16 @@
|
||||
<search string="工件配送">
|
||||
<field name="production_id"/>
|
||||
<field name="workpiece_code"/>
|
||||
<field name="feeder_station_start_id"/>
|
||||
<field name="feeder_station_start"/>
|
||||
<field name="production_line_id"/>
|
||||
<field name="task_delivery_time"/>
|
||||
<field name="feeder_station_destination_id"/>
|
||||
<field name="feeder_station_destination"/>
|
||||
<field name="task_completion_time"/>
|
||||
<field name="delivery_duration"/>
|
||||
<field name="status"/>
|
||||
<searchpanel>
|
||||
<field name="production_line_id" icon="fa-building" enable_counters="1"/>
|
||||
<field name="status" icon="fa-building" enable_counters="1"/>
|
||||
<field name="production_line_state" icon="fa-building" enable_counters="1"/>
|
||||
<field name="cnc_program_down_state" icon="fa-building" enable_counters="1"/>
|
||||
|
||||
</searchpanel>
|
||||
</search>
|
||||
</field>
|
||||
|
||||
@@ -1,38 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<!-- 设备增加刀具库位table-->
|
||||
设备增加刀具库位table
|
||||
<record id="sf_manufacturing_hr_equipment_view_form" model="ir.ui.view">
|
||||
<field name="name">sf_manufacturing_equipment.form</field>
|
||||
<field name="model">maintenance.equipment</field>
|
||||
<field name="inherit_id" ref="sf_maintenance.sf_hr_equipment_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//page[@name='sf_equipment']" position="after">
|
||||
<page string="机床基坐标" name="sf_equipment_base_coordinate"
|
||||
attrs="{'invisible': [('equipment_type', '!=', '机床')]}">
|
||||
<button name="get_equipment_base_coordinate" string="获取基坐标数据" type="object"
|
||||
class="oe_highlight"/>
|
||||
<separator invisible="0"/>
|
||||
<group>
|
||||
<group>
|
||||
<field name="base_coordinate_fixture_model_id" options="{'no_create': True}"/>
|
||||
<field name="base_coordinate_g_coordinate"/>
|
||||
<field name="base_coordinate_x"/>
|
||||
<field name="base_coordinate_y"/>
|
||||
<field name="base_coordinate_z"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
<page string="标准刀库" name="sf_equipment_product_template"
|
||||
attrs="{'invisible': [('equipment_type', '!=', '机床')]}">
|
||||
<field name='product_template_ids'>
|
||||
<tree editable='bottom'>
|
||||
<field name="code"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
<page string="标准刀库" name="sf_equipment_product_template"
|
||||
attrs="{'invisible': [('equipment_type', '!=', '机床')]}">
|
||||
<field name = 'product_template_ids' >
|
||||
<tree editable='bottom'>
|
||||
<field name="code"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
@@ -10,15 +10,9 @@
|
||||
</xpath>
|
||||
<xpath expr="//sheet" position="before">
|
||||
<header>
|
||||
<button string="打印二维码" name="print_single_method" type="object" class="btn-primary"/>
|
||||
<button string="打印二维码" name="print_qr_code" type="object" class="btn-primary"/>
|
||||
</header>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='product_id']" position="before">
|
||||
<field name="rfid" attrs="{'invisible': [('rfid', '=', False)]}"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='product_id']" position="after">
|
||||
<field name="product_specification"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -5,18 +5,12 @@
|
||||
<field name="model">sf.workpiece.delivery.wizard</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<group>
|
||||
<field name="delivery_id" invisible="True"/>
|
||||
<field name="workorder_id" invisible="True"/>
|
||||
<field name="route_id" required="1" options="{'no_create': True}"/>
|
||||
</group>
|
||||
<field name="delivery_id" invisible="True"/>
|
||||
<div>
|
||||
<field name="is_ok"/>
|
||||
确认上述信息正确无误.
|
||||
是否确定配送?
|
||||
</div>
|
||||
<footer>
|
||||
<button string="确认配送" name="confirm" type="object" class="oe_highlight"
|
||||
attrs="{'invisible':[('is_ok','=',False)]}"/>
|
||||
<button string="确认" name="confirm" type="object" class="oe_highlight"/>
|
||||
<button string="取消" class="btn btn-secondary" special="cancel"/>
|
||||
</footer>
|
||||
</form>
|
||||
|
||||
@@ -10,12 +10,7 @@ class WorkpieceDeliveryWizard(models.TransientModel):
|
||||
_description = '工件配送'
|
||||
|
||||
delivery_id = fields.Many2one('sf.workpiece.delivery', string='配送')
|
||||
workorder_id = fields.Many2one('mrp.workorder', string='工单')
|
||||
route_id = fields.Many2one('sf.agv.task.route', '任务路线')
|
||||
is_ok = fields.Boolean('确认上述信息正确无误.')
|
||||
|
||||
def confirm(self):
|
||||
if self.workorder_id:
|
||||
self.workorder_id.workpiece_delivery_ids._delivery_avg()
|
||||
else:
|
||||
self.delivery_id._delivery_avg()
|
||||
self.delivery_id._delivery_avg()
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import logging
|
||||
import os
|
||||
import json
|
||||
import base64
|
||||
from odoo import http
|
||||
@@ -43,19 +42,8 @@ class Sf_Mrs_Connect(http.Controller):
|
||||
res['message'] = '制造订单号为%s的CNC程序文件从FTP拉取失败' % (cnc_production.name)
|
||||
return json.JSONEncoder().encode(res)
|
||||
logging.info('创建cnc工单')
|
||||
program_path_tmp = os.path.join('/tmp', ret['folder_name'], 'return', r)
|
||||
# program_path_tmp = "C://Users//43484//Desktop//机企猫工作文档//其他//model_analysis"
|
||||
files = os.listdir(program_path_tmp)
|
||||
for f in files:
|
||||
program_path = os.path.join(program_path_tmp, f)
|
||||
logging.info('cnc程序路径 :%s' % program_path)
|
||||
if f.endswith(".doc"):
|
||||
# 插入cmm程序数据
|
||||
request.env['sf.cmm.program'].with_user(
|
||||
request.env.ref("base.user_admin")).cmm_program_create(ret, program_path, program_path_tmp)
|
||||
request.env['sf.cnc.processing'].with_user(
|
||||
request.env.ref("base.user_admin")).cnc_processing_create(cnc_production, ret, program_path,
|
||||
program_path_tmp)
|
||||
request.env['sf.cnc.processing'].with_user(
|
||||
request.env.ref("base.user_admin")).cnc_processing_create(cnc_production, ret)
|
||||
return json.JSONEncoder().encode(res)
|
||||
else:
|
||||
res = {'status': 0, 'message': '该制造订单暂未开始'}
|
||||
|
||||
@@ -21,32 +21,14 @@ class FtpController():
|
||||
except Exception:
|
||||
logging.info("ftp连接失败")
|
||||
|
||||
def file_exists(self, path):
|
||||
# 检查文件是否存在于FTP服务器上
|
||||
try:
|
||||
self.ftp.cwd(os.path.dirname(path))
|
||||
files = self.ftp.nlst()
|
||||
return os.path.basename(path) in files
|
||||
except Exception as e:
|
||||
logging.error(f"Error checking file: {e}")
|
||||
return False
|
||||
|
||||
# 下载目录下的文件
|
||||
def download_file_tree(self, target_dir, serverdir):
|
||||
if not os.path.exists(serverdir):
|
||||
os.makedirs(serverdir)
|
||||
try:
|
||||
logging.info("进入FTP目录 ")
|
||||
logging.info('目录:%s' % target_dir)
|
||||
target_dir1 = target_dir.split('/')
|
||||
logging.info('目录1:%s' % target_dir1[1])
|
||||
self.ftp.cwd(target_dir1[1]) # 切换工作路径
|
||||
logging.info('目录2:%s' % target_dir1[2])
|
||||
self.ftp.cwd(target_dir1[2]) # 切换工作路径
|
||||
logging.info('目录3:%s' % target_dir1[3])
|
||||
self.ftp.cwd(target_dir1[3]) # 切换工作路径
|
||||
logging.info('目录4:%s' % target_dir1[4])
|
||||
self.ftp.cwd(target_dir1[4]) # 切换工作路径
|
||||
self.ftp.cwd(target_dir) # 切换工作路径
|
||||
logging.info('FTP目录:%s' % target_dir)
|
||||
remotenames = self.ftp.nlst()
|
||||
logging.info('FTP目录文件:%s' % remotenames)
|
||||
for file in remotenames:
|
||||
@@ -56,34 +38,6 @@ class FtpController():
|
||||
return 1
|
||||
except Exception:
|
||||
return 0
|
||||
finally:
|
||||
self.ftp.quit()
|
||||
logging.info("ftp已关闭")
|
||||
|
||||
# 下载目录下的检测文件
|
||||
def download_reportfile_tree(self, target_dir, serverdir, reportpath):
|
||||
if not os.path.exists(serverdir):
|
||||
os.makedirs(serverdir)
|
||||
try:
|
||||
logging.info("进入FTP目录-检测文件")
|
||||
logging.info('serverdir:%s' % serverdir)
|
||||
target_dir1 = target_dir.split('/')
|
||||
logging.info('目录1:%s' % target_dir1[1])
|
||||
self.ftp.cwd(target_dir1[1]) # 切换工作路径
|
||||
logging.info('目录2:%s' % target_dir1[2])
|
||||
self.ftp.cwd(target_dir1[2]) # 切换工作路径
|
||||
logging.info('目录2:%s' % target_dir1[3])
|
||||
self.ftp.cwd(target_dir1[3]) # 切换工作路径
|
||||
remotenames = self.ftp.nlst()
|
||||
logging.info('FTP目录检测报告文件:%s' % remotenames)
|
||||
for filename in remotenames:
|
||||
if os.path.basename(filename) == os.path.basename(reportpath):
|
||||
server = os.path.join(serverdir, filename)
|
||||
logging.info('server%s' % server)
|
||||
self.download_file(server, filename)
|
||||
return 1
|
||||
except Exception:
|
||||
return 0
|
||||
|
||||
# 下载指定目录下的指定文件
|
||||
def download_file(self, serverfile, remotefile):
|
||||
|
||||
@@ -13,13 +13,7 @@ class ResConfigSettings(models.TransientModel):
|
||||
token = fields.Char(string='TOKEN', default='b811ac06-3f00-11ed-9aed-0242ac110003')
|
||||
sf_secret_key = fields.Char(string='密钥', default='wBmxej38OkErKhD6')
|
||||
sf_url = fields.Char(string='访问地址', default='https://sf.cs.jikimo.com')
|
||||
agv_rcs_url = fields.Char(string='avg_rcs访问地址',
|
||||
default='http://172.16.10.114:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask')
|
||||
center_control_url = fields.Char(string='中控访问地址',
|
||||
default='http://172.16.21.50:8001')
|
||||
wbcode = fields.Char('地码')
|
||||
agv_code = fields.Char(string='agv编号')
|
||||
task_type_no = fields.Char('任务单类型编号')
|
||||
agv_url = fields.Char(string='avg访问地址', default='http://IP:PORT/rcms/services/rest')
|
||||
model_parser_url = fields.Char('特征识别路径')
|
||||
ftp_host = fields.Char(string='FTP的ip')
|
||||
ftp_port = fields.Char(string='FTP端口')
|
||||
@@ -40,8 +34,8 @@ class ResConfigSettings(models.TransientModel):
|
||||
_logger.info("同步资源库表面工艺类别完成")
|
||||
self.env['sf.production.process'].sync_all_production_process()
|
||||
_logger.info("同步资源库表面工艺完成")
|
||||
# self.env['sf.processing.technology'].sync_all_processing_technology()
|
||||
# _logger.info("同步资源库加工工艺")
|
||||
self.env['sf.processing.technology'].sync_all_processing_technology()
|
||||
_logger.info("同步资源库加工工艺")
|
||||
self.env['sf.machine.brand.tags'].sync_all_machine_brand_tags()
|
||||
_logger.info("同步资源库品牌类别完成")
|
||||
self.env['sf.machine.brand'].sync_all_machine_brand()
|
||||
@@ -64,8 +58,6 @@ class ResConfigSettings(models.TransientModel):
|
||||
_logger.info("同步联装类型完成")
|
||||
self.env['sf.fixture.model'].sync_all_fixture_model()
|
||||
_logger.info("同步夹具型号完成")
|
||||
self.env['sf.fixture.materials.basic.parameters'].sync_all_fixture_materials_basic_parameters()
|
||||
_logger.info("同步夹具型号基本信息完成")
|
||||
self.env['sf.functional.fixture.type'].sync_all_functional_fixture_type()
|
||||
_logger.info("同步夹具型号类型完成")
|
||||
self.env['sf.machine_tool.type'].sync_all_machine_tool_type()
|
||||
@@ -98,10 +90,7 @@ class ResConfigSettings(models.TransientModel):
|
||||
token = config.get_param('token', default='')
|
||||
sf_secret_key = config.get_param('sf_secret_key', default='')
|
||||
sf_url = config.get_param('sf_url', default='')
|
||||
agv_rcs_url = config.get_param('agv_rcs_url', default='')
|
||||
wbcode = config.get_param('wbcode', default='')
|
||||
agv_code = config.get_param('agv_code', default='')
|
||||
center_control_url = config.get_param('center_control_url', default='')
|
||||
bfm_url = config.get_param('bfm_url', default='')
|
||||
ftp_host = config.get_param('ftp_host', default='')
|
||||
ftp_port = config.get_param('ftp_port', default='')
|
||||
ftp_user = config.get_param('ftp_user', default='')
|
||||
@@ -111,10 +100,7 @@ class ResConfigSettings(models.TransientModel):
|
||||
token=token,
|
||||
sf_secret_key=sf_secret_key,
|
||||
sf_url=sf_url,
|
||||
agv_rcs_url=agv_rcs_url,
|
||||
wbcode=wbcode,
|
||||
agv_code=agv_code,
|
||||
center_control_url=center_control_url,
|
||||
bfm_url=bfm_url,
|
||||
ftp_host=ftp_host,
|
||||
ftp_port=ftp_port,
|
||||
ftp_user=ftp_user,
|
||||
@@ -128,10 +114,7 @@ class ResConfigSettings(models.TransientModel):
|
||||
ir_config.set_param("token", self.token or "")
|
||||
ir_config.set_param("sf_secret_key", self.sf_secret_key or "")
|
||||
ir_config.set_param("sf_url", self.sf_url or "")
|
||||
ir_config.set_param("agv_rcs_url", self.agv_rcs_url or "")
|
||||
ir_config.set_param("wbcode", self.wbcode or "")
|
||||
ir_config.set_param("agv_code", self.agv_code or "")
|
||||
ir_config.set_param("center_control_url", self.center_control_url or "")
|
||||
ir_config.set_param("bfm_url", self.bfm_url or "")
|
||||
ir_config.set_param("ftp_host", self.ftp_host or "")
|
||||
ir_config.set_param("ftp_port", self.ftp_port or "")
|
||||
ir_config.set_param("ftp_user", self.ftp_user or "")
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -74,44 +74,9 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h2>AGV参数配置</h2>
|
||||
<div class="row mt16 o_settings_container">
|
||||
<div class="col-12 col-lg-6 o_setting_box">
|
||||
<div class="o_setting_left_pane"/>
|
||||
<div class="o_setting_right_pane">
|
||||
<div class="text-muted">
|
||||
<label for="agv_rcs_url" string="访问地址"/>
|
||||
<field name="agv_rcs_url"/>
|
||||
</div>
|
||||
<div class="text-muted">
|
||||
<label for="agv_code" string="车辆编号"/>
|
||||
<field name="agv_code"/>
|
||||
</div>
|
||||
<div class="text-muted">
|
||||
<label for="wbcode"/>
|
||||
<field name="wbcode"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h2>中控参数配置</h2>
|
||||
<div class="row mt16 o_settings_container">
|
||||
<div class="col-12 col-lg-6 o_setting_box">
|
||||
<div class="o_setting_left_pane"/>
|
||||
<div class="o_setting_right_pane">
|
||||
<div class="text-muted">
|
||||
<label for="center_control_url" string="访问地址"/>
|
||||
<field name="center_control_url"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -44,19 +44,18 @@ class sf_production_plan(models.Model):
|
||||
production_id = fields.Many2one('mrp.production', '关联制造订单')
|
||||
product_qty = fields.Float(string='数量', digits='Product Unit of Measure', required=True, default=0.0)
|
||||
production_line_id = fields.Many2one('sf.production.line', string='生产线')
|
||||
# date_planned_start = fields.Datetime(string='计划开始时间', required=True, index=True, copy=False,
|
||||
# default=fields.Datetime.now)
|
||||
date_planned_start = fields.Datetime(string='计划开始时间')
|
||||
date_planned_start = fields.Datetime(string='计划开始时间', required=True, index=True, copy=False,
|
||||
default=fields.Datetime.now)
|
||||
date_planned_finished = fields.Datetime(string='计划结束时间')
|
||||
# 排程设置selection(倒排,顺排,默认倒排)
|
||||
schedule_setting = fields.Selection([
|
||||
('reverse', '倒排'), ('positive', '顺排')], string='排程设置', default='reverse')
|
||||
product_id = fields.Many2one('product.product', '关联产品')
|
||||
origin = fields.Char(string='订单号')
|
||||
# # 加工时长
|
||||
# process_time = fields.Float(string='加工时长', digits=(16, 2))
|
||||
# 加工时长
|
||||
process_time = fields.Float(string='加工时长', digits=(16, 2))
|
||||
# 实际加工时长、实际开始时间、实际结束时间
|
||||
actual_process_time = fields.Float(string='实际加工时长(分钟)', digits=(16, 2), compute='_compute_actual_process_time')
|
||||
actual_process_time = fields.Float(string='实际加工时长', digits=(16, 2))
|
||||
actual_start_time = fields.Datetime(string='实际开始时间')
|
||||
actual_end_time = fields.Datetime(string='实际结束时间')
|
||||
shift = fields.Char(string='班次')
|
||||
@@ -68,25 +67,16 @@ class sf_production_plan(models.Model):
|
||||
sequence = fields.Integer(string='序号', copy=False, readonly=True, index=True)
|
||||
current_operation_name = fields.Char(string='当前工序名称', size=64, default='生产计划')
|
||||
|
||||
# 计算实际加工时长
|
||||
@api.depends('actual_start_time', 'actual_end_time')
|
||||
def _compute_actual_process_time(self):
|
||||
for item in self:
|
||||
if item.actual_start_time and item.actual_end_time:
|
||||
item.actual_process_time = (item.actual_end_time - item.actual_start_time).total_seconds() / 60
|
||||
else:
|
||||
item.actual_process_time = None
|
||||
|
||||
@api.onchange('production_line_id')
|
||||
def _compute_production_line_id(self):
|
||||
for item in self:
|
||||
item.sudo().production_id.production_line_id = item.production_line_id.id
|
||||
# item.sudo().production_id.plan_start_processing_time = item.date_planned_start
|
||||
item.sudo().production_id.plan_start_processing_time = item.date_planned_start
|
||||
|
||||
# @api.onchange('state')
|
||||
# def _onchange_state(self):
|
||||
# if self.state == 'finished':
|
||||
# self.production_id.schedule_state = '已完成'
|
||||
@api.onchange('state')
|
||||
def _onchange_state(self):
|
||||
if self.state == 'finished':
|
||||
self.production_id.schedule_state = '已完成'
|
||||
|
||||
# @api.model
|
||||
# def _search(self, args, offset=0, limit=None, order=None, count=False, access_rights_uid=None):
|
||||
@@ -199,9 +189,7 @@ class sf_production_plan(models.Model):
|
||||
for item in record.production_id.workorder_ids:
|
||||
if item.name == 'CNC加工':
|
||||
item.date_planned_finished = datetime.now() + timedelta(days=100)
|
||||
# item.date_planned_start = record.date_planned_start
|
||||
item.date_planned_start = datetime.now()
|
||||
record.sudo().production_id.plan_start_processing_time = item.date_planned_start
|
||||
item.date_planned_start = record.date_planned_start
|
||||
item.date_planned_finished = item.date_planned_start + timedelta(
|
||||
minutes=record.env['mrp.routing.workcenter'].sudo().search(
|
||||
[('name', '=', 'CNC加工')]).time_cycle)
|
||||
@@ -294,7 +282,6 @@ class sf_production_plan(models.Model):
|
||||
print('时间设置失败,请检查是否为工序分配工作中心,%s' % e)
|
||||
|
||||
def cancel_production_schedule(self):
|
||||
self.date_planned_start = False
|
||||
self.date_planned_finished = False
|
||||
self.state = 'draft'
|
||||
self.production_line_id = False
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<header>
|
||||
<!-- <button name="do_production_schedule" type="object" string="批量排程"/> -->
|
||||
<button string="批量排程" name="%(sf_plan.action_plan_some)d" type="action"
|
||||
class="treeHeaderBtn"/>
|
||||
class="btn-primary"/>
|
||||
</header>
|
||||
<field name="state" widget="badge" decoration-warning="state == 'draft'"
|
||||
decoration-success="state == 'done'" decoration-info="state == 'processing'"
|
||||
@@ -22,15 +22,12 @@
|
||||
<field name="production_line_id"/>
|
||||
<field name="date_planned_start"/>
|
||||
<field name="date_planned_finished"/>
|
||||
<field name="actual_start_time"/>
|
||||
<field name="actual_end_time"/>
|
||||
<field name="actual_process_time"/>
|
||||
<field name="schedule_setting"/>
|
||||
<button name="do_production_schedule" class="btn schedule_done" string="生产排程" type="object"
|
||||
attrs="{'invisible': ['|', ('state', '!=', 'draft'), ('actual_start_time', '!=', False)]}"
|
||||
attrs="{'invisible': [('state', 'not in', ['draft'])]}"
|
||||
groups="sf_base.group_plan_dispatch"/>
|
||||
<button name="cancel_production_schedule" class="btn schedule_cancel" string="取消排程" type="object"
|
||||
attrs="{'invisible': ['|', ('state', '!=', 'done'), ('actual_start_time', '!=', False)]}"
|
||||
<button name="cancel_production_schedule" class="btn schedule_cancel" string="取消排程"
|
||||
type="object" attrs="{'invisible': [('state', 'not in', ['done'])]}"
|
||||
groups="sf_base.group_plan_dispatch"/>
|
||||
</tree>
|
||||
</field>
|
||||
@@ -45,9 +42,9 @@
|
||||
<!-- <button string="执行排程" name="do_production_schedule" type="object" class="oe_highlight" icon="fa-step-forward"/> -->
|
||||
<button string="执行排程" name="do_production_schedule" type="object" class="oe_highlight"
|
||||
options='{"calendar_view": true, "date_begin": "2020-01-01", "date_end": "2020-12-31"}'
|
||||
groups="sf_base.group_plan_dispatch" attrs="{'invisible': ['|', ('state', '!=', 'draft'), ('actual_start_time', '!=', False)]}"/>
|
||||
groups="sf_base.group_plan_dispatch" attrs="{'invisible': [('state', '=', 'done')]}"/>
|
||||
<button string="取消排程" name="cancel_production_schedule" type="object" class="oe_highlight"
|
||||
groups="sf_base.group_plan_dispatch" attrs="{'invisible': ['|', ('state', '!=', 'done'), ('actual_start_time', '!=', False)]}"/>
|
||||
groups="sf_base.group_plan_dispatch" attrs="{'invisible': [('state', '=', 'draft')]}"/>
|
||||
<!-- <button name="archive" type="object" string="归档" icon="fa-archive" class="oe_highlight" attrs="{'invisible': [('active', '=', False)]}"/> -->
|
||||
<!-- <button name="unarchive" type="object" string="取消归档" icon="fa-archive" class="oe_highlight" attrs="{'invisible': [('active', '=', True)]}"/> -->
|
||||
|
||||
@@ -69,26 +66,10 @@
|
||||
<field name="origin"/>
|
||||
<field name="product_qty"/>
|
||||
<field name="order_deadline"/>
|
||||
<!-- <field name="process_time"/> -->
|
||||
<field name="process_time"/>
|
||||
<field name="schedule_setting"/>
|
||||
<field name="production_line_id" domain="[('name', 'ilike', 'CNC')]"/>
|
||||
|
||||
|
||||
<!-- Chatter -->
|
||||
<!-- <div class="oe_chatter"> -->
|
||||
<!-- <field name="message_follower_ids" widget="mail_followers"/> -->
|
||||
<!-- <field name="message_ids" widget="mail_thread"/> -->
|
||||
<!-- <field name="activity_ids"/> -->
|
||||
<!-- </div> -->
|
||||
<!-- <div class="oe_chatter"> -->
|
||||
<!-- <field name="message_follower_ids"/> -->
|
||||
<!-- <field name="message_ids"/> -->
|
||||
<!-- </div> -->
|
||||
</group>
|
||||
|
||||
<group string="加工信息">
|
||||
|
||||
<field name="date_planned_start" placeholder="如果不选择计划开始时间,会取当前时间来做排程"/>
|
||||
<field name="production_line_id"/>
|
||||
<field name="date_planned_start"/>
|
||||
<field name="date_planned_finished"/>
|
||||
<field name="actual_process_time"/>
|
||||
<field name="actual_start_time"/>
|
||||
@@ -102,7 +83,10 @@
|
||||
<!-- <field name="message_ids" widget="mail_thread"/> -->
|
||||
<!-- <field name="activity_ids"/> -->
|
||||
<!-- </div> -->
|
||||
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids"/>
|
||||
<field name="message_ids"/>
|
||||
</div>
|
||||
</group>
|
||||
<!-- <group string="规格信息" col="1"> -->
|
||||
<!-- <group col="3"> -->
|
||||
@@ -135,10 +119,6 @@
|
||||
<!-- <field name="delivery_quantity"/> -->
|
||||
<!-- <field name="delivery_date"/> -->
|
||||
<!-- </group> -->
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids"/>
|
||||
<field name="message_ids"/>
|
||||
</div>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<group>
|
||||
<field name="production_line_id" domain="[('name', 'ilike', 'CNC')]"/>
|
||||
<field name="production_line_id"/>
|
||||
</group>
|
||||
<footer>
|
||||
<button string="确认排程" name="action_plan_all" type="object" class="btn-primary"/>
|
||||
|
||||
@@ -25699,7 +25699,7 @@ msgstr "控制点"
|
||||
#. module: quality_control
|
||||
#: model:ir.ui.menu,name:quality_control.menu_quality_control_points
|
||||
msgid "Control Points"
|
||||
msgstr "质量标准"
|
||||
msgstr "控制点"
|
||||
|
||||
#. module: purchase
|
||||
#: model:ir.model.fields,field_description:purchase.field_product_product__purchase_method
|
||||
@@ -25719,7 +25719,7 @@ msgstr "控制面板按钮"
|
||||
#: model:ir.model.fields,field_description:quality_control.field_quality_check_wizard__measure_on
|
||||
#: model:ir.model.fields,field_description:quality_control.field_quality_point__measure_on
|
||||
msgid "Control per"
|
||||
msgstr "控制方式"
|
||||
msgstr "每次控制"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_quality_control
|
||||
@@ -60648,7 +60648,7 @@ msgstr "质量控制点 数量"
|
||||
#. module: quality_control
|
||||
#: model:ir.actions.act_window,name:quality_control.quality_point_action
|
||||
msgid "Quality Control Points"
|
||||
msgstr "质量控制标准"
|
||||
msgstr "质量管理点"
|
||||
|
||||
#. module: quality
|
||||
#: model:ir.model,name:quality.model_quality_point_test_type
|
||||
@@ -75621,7 +75621,7 @@ msgstr "二氧化钛"
|
||||
#: model:ir.model.fields,field_description:quality_control.field_quality_check_wizard__title
|
||||
#: model_terms:ir.ui.view,arch_db:mrp_workorder.add_quality_check_from_tablet
|
||||
msgid "Title"
|
||||
msgstr "名称"
|
||||
msgstr "称谓"
|
||||
|
||||
#. modules: account, mail, base, stock, mrp
|
||||
#: model:ir.model.fields,field_description:account.field_account_automatic_entry_wizard__destination_account_id
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
'depends': ['quality_control'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'views/view.xml'
|
||||
# 'views/view.xml'
|
||||
],
|
||||
|
||||
'assets': {
|
||||
|
||||
@@ -11,3 +11,26 @@ class SfQualityPoint(models.Model):
|
||||
"('product', 'consu')), '|', ('company_id', '=', False), ('company_id', '=', company_id)]", help=
|
||||
"Quality Point will apply to every selected Products.")
|
||||
|
||||
check_state = fields.Selection([
|
||||
('enable', '启用'),
|
||||
('close', '关闭')
|
||||
], string='审核状态', default='close')
|
||||
|
||||
# 审核
|
||||
def action_check(self):
|
||||
self.check_state = 'enable'
|
||||
# picking_type_ids = fields.Many2many(
|
||||
# 'stock.picking.type', string='执行节点', required=True, check_company=True)
|
||||
|
||||
|
||||
class ResQualityAlertTeam(models.Model):
|
||||
_inherit = 'quality.alert.team'
|
||||
|
||||
check_state = fields.Selection([
|
||||
('enable', '启用'),
|
||||
('close', '关闭')
|
||||
], string='审核状态', default='close')
|
||||
|
||||
# 审核
|
||||
def action_check(self):
|
||||
self.check_state = 'enable'
|
||||
|
||||
@@ -1,40 +1,34 @@
|
||||
import json
|
||||
import requests
|
||||
import logging
|
||||
from odoo import fields, models, api
|
||||
from odoo.exceptions import ValidationError
|
||||
from datetime import datetime
|
||||
from odoo.addons.sf_base.commons.common import Common
|
||||
|
||||
|
||||
class QualityCheck(models.Model):
|
||||
_inherit = "quality.check"
|
||||
_description = '零件特采'
|
||||
|
||||
# ==========零件特采接口==========
|
||||
def _register_quality_check(self):
|
||||
# create_url = '/AutoDeviceApi/PartSpecProc'
|
||||
# sf_sync_config = self.env['res.config.settings'].get_values()
|
||||
# token = sf_sync_config['token']
|
||||
# sf_secret_key = sf_sync_config['sf_secret_key']
|
||||
# headers = Common.get_headers(self, token, sf_secret_key)
|
||||
headers = {'Authorization': 'Ba F2CF5DCC-1A00-4234-9E95-65603F70CC8A'}
|
||||
crea_url = "https://x24467i973.zicp.fun/AutoDeviceApi/PartSpecProc"
|
||||
origin = self.picking_id.origin
|
||||
production_id = self.env['mrp.production'].sudo().search([('name', '=', origin)])
|
||||
rfid = '' if not production_id.workorder_ids else production_id.workorder_ids[-1].rfid_code or ''
|
||||
val = [rfid]
|
||||
r = requests.post(crea_url, json=val, headers=headers)
|
||||
def _register_tool_groups(self):
|
||||
create_url = '/AutoDeviceApi/ModSpecial'
|
||||
sf_sync_config = self.env['res.config.settings'].get_values()
|
||||
token = sf_sync_config['token']
|
||||
sf_secret_key = sf_sync_config['sf_secret_key']
|
||||
headers = Common.get_headers(self, token, sf_secret_key)
|
||||
strurl = sf_sync_config['sf_url'] + create_url
|
||||
val = {
|
||||
'RfidCode': None,
|
||||
}
|
||||
kw = json.dumps(val, ensure_ascii=False)
|
||||
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
|
||||
ret = r.json()
|
||||
logging.info('_register_quality_check:%s' % ret)
|
||||
if ret['Succeed']:
|
||||
if r == 200:
|
||||
return "零件特采发送成功"
|
||||
else:
|
||||
raise ValidationError("零件特采发送失败")
|
||||
|
||||
def do_fail(self):
|
||||
self.write({
|
||||
'quality_state': 'fail',
|
||||
'user_id': self.env.user.id,
|
||||
'control_date': datetime.now()})
|
||||
if self.picking_id and 'WH/MO/' in self.picking_id.origin:
|
||||
self._register_quality_check()
|
||||
# @api.onchange('quality_state')
|
||||
# def _onchange_quality_state(self):
|
||||
# if self.quality_state in ['pass', 'fail']:
|
||||
# self._register_tool_groups()
|
||||
|
||||
@@ -43,6 +43,8 @@ access_quality_alert_team_group_sf_mrp_manager,quality_alert_team_group_sf_mrp_m
|
||||
|
||||
access_product_template_group_quality,product_template_group_quality,product.model_product_template,sf_base.group_quality,1,0,0,0
|
||||
access_product_template_group_quality_director,product_template_group_quality_director,product.model_product_template,sf_base.group_quality_director,1,0,0,0
|
||||
access_product_template_group_plan_dispatch,product_template_group_plan_dispatch,product.model_product_template,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_product_template_group_plan_director,product_template_group_plan_director,product.model_product_template,sf_base.group_plan_director,1,0,0,0
|
||||
access_product_template_group_sf_equipment_user,product_template_group_sf_equipment_user,product.model_product_template,sf_base.group_sf_equipment_user,1,0,0,0
|
||||
access_product_template_group_sf_tool_user,product_template_group_sf_tool_user,product.model_product_template,sf_base.group_sf_tool_user,1,0,0,0
|
||||
access_product_template_group_sf_order_user,product_template_group_sf_order_user,product.model_product_template,sf_base.group_sf_order_user,1,0,0,0
|
||||
|
||||
|
@@ -6,8 +6,6 @@
|
||||
<field name="model">quality.alert</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree sample="1">
|
||||
<field name="name" decoration-bf="1"/>
|
||||
<field name="name" decoration-bf="1"/>
|
||||
<field name="name" decoration-bf="1"/>
|
||||
<field name="product_tmpl_id" optional="show"/>
|
||||
<field name="product_id" optional="hide"/>
|
||||
@@ -39,30 +37,27 @@
|
||||
<field name="model">quality.point</field>
|
||||
<field name="inherit_id" ref="quality.quality_point_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<!-- <xpath expr="//sheet//group//group//field[@name='title']" position="replace"> -->
|
||||
<!-- <field name="title" class="custom_required" required="1"/> -->
|
||||
<!-- </xpath> -->
|
||||
<xpath expr="//sheet//group//group//field[@name='title']" position="attributes">
|
||||
<attribute name="class">custom_required</attribute>
|
||||
<attribute name="required">1</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//sheet//group//group//field[@name='picking_type_ids']" position="attributes">
|
||||
<attribute name="class">custom_required</attribute>
|
||||
<attribute name="required">1</attribute>
|
||||
<xpath expr="//header" position="inside">
|
||||
<field name="check_state" invisible="1"/>
|
||||
<button name="action_check" string="审核" type="object"
|
||||
attrs="{'invisible': [('check_state','=', 'enable')]}"
|
||||
groups="sf_base.group_quality_director"
|
||||
class="oe_highlight"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="sf_quality_point_view_form_inherit_quality_control">
|
||||
<field name="name">sf.quality.point.form.inherit.sf</field>
|
||||
<field name="model">quality.point</field>
|
||||
<field name="inherit_id" ref="quality_control.quality_point_view_form_inherit_quality_control"/>
|
||||
<record model="ir.ui.view" id="quality_alert_team_view_form_inherit_sf">
|
||||
<field name="name">quality.alert.team.form.inherit.sf</field>
|
||||
<field name="model">quality.alert.team</field>
|
||||
<field name="inherit_id" ref="quality_control.quality_alert_team_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='measure_on']" position="attributes">
|
||||
<attribute name="class">custom_required</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='measure_frequency_type']" position="attributes">
|
||||
<attribute name="class">custom_required</attribute>
|
||||
<xpath expr="//header" position="inside">
|
||||
<field name="check_state" invisible="1"/>
|
||||
<button name="action_check" string="审核" type="object"
|
||||
attrs="{'invisible': [('check_state','=', 'enable')]}"
|
||||
groups="sf_base.group_quality_director"
|
||||
class="oe_highlight"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
""",
|
||||
'category': 'sf',
|
||||
'website': 'https://www.sf.jikimo.com',
|
||||
'depends': ['sale', 'sale_management', 'web_widget_model_viewer', 'sf_base', 'account', 'purchase', 'delivery'],
|
||||
'depends': ['sale', 'sale_management', 'web_widget_model_viewer', 'sf_base', 'account', 'purchase'],
|
||||
'data': [
|
||||
'security/group_security.xml',
|
||||
'security/ir.model.access.csv',
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from . import sale_order
|
||||
# from . import quick_easy_order
|
||||
from . import quick_easy_order_old
|
||||
from . import quick_easy_order
|
||||
from . import auto_quatotion_common
|
||||
from . import parser_and_calculate_work_time
|
||||
from . import preload_datas_functions
|
||||
|
||||
@@ -5,9 +5,13 @@ import os
|
||||
import platform
|
||||
import json
|
||||
from datetime import datetime
|
||||
<<<<<<< HEAD
|
||||
# import requests
|
||||
=======
|
||||
import requests
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
# from OCC.Extend.DataExchange import read_step_file
|
||||
# from OCC.Extend.DataExchange import write_stl_file
|
||||
from odoo import models, fields, api
|
||||
|
||||
@@ -1,311 +0,0 @@
|
||||
import logging
|
||||
import base64
|
||||
import hashlib
|
||||
import requests
|
||||
import os
|
||||
from datetime import datetime
|
||||
from stl import mesh
|
||||
# from OCC.Core.GProp import GProp_GProps
|
||||
# from OCC.Extend.DataExchange import read_step_file
|
||||
# from OCC.Extend.DataExchange import write_stl_file
|
||||
from odoo.addons.sf_base.commons.common import Common
|
||||
from odoo import models, fields, api
|
||||
from odoo.modules import get_resource_path
|
||||
from odoo.exceptions import ValidationError, UserError
|
||||
|
||||
|
||||
class QuickEasyOrder(models.Model):
|
||||
_name = 'quick.easy.order'
|
||||
_description = '简易下单'
|
||||
_order = 'id desc'
|
||||
|
||||
name = fields.Char('订单编号', default=lambda self: self.env['ir.sequence'].next_by_code('quick.easy.order'))
|
||||
model_length = fields.Float('长(mm)', digits=(16, 3))
|
||||
model_width = fields.Float('宽(mm)', digits=(16, 3))
|
||||
model_height = fields.Float('高(mm)', digits=(16, 3))
|
||||
model_volume = fields.Float('体积(mm³)', digits=(16, 3))
|
||||
model_processing_side = fields.Char('加工面', default='A')
|
||||
model_feature = fields.Char('特征')
|
||||
machining_precision = fields.Selection([
|
||||
('0.10', '±0.10mm'),
|
||||
('0.05', '±0.05mm'),
|
||||
('0.03', '±0.03mm'),
|
||||
('0.02', '±0.02mm'),
|
||||
('0.01', '±0.01mm')], string='加工精度', default='0.10')
|
||||
material_id = fields.Many2one('sf.production.materials', '材料')
|
||||
material_model_id = fields.Many2one('sf.materials.model', '型号', domain="[('materials_id', '=', material_id)]")
|
||||
# process_id = fields.Many2one('sf.production.process', string='表面工艺')
|
||||
parameter_ids = fields.Many2many('sf.production.process.parameter', 'process_item_order_rel', string='可选参数')
|
||||
quantity = fields.Integer('数量', default=1)
|
||||
unit_price = fields.Float('单价')
|
||||
price = fields.Float('总价')
|
||||
model_file = fields.Binary('glb模型文件')
|
||||
upload_model_file = fields.Many2many('ir.attachment', 'upload_qf_model_file_attachment_ref', string='上传模型文件')
|
||||
delivery_time = fields.Date('交货日期')
|
||||
customer_id = fields.Many2one('res.partner', string='客户', default=lambda self: self.env.user.partner_id.id)
|
||||
state = fields.Selection([('草稿', '草稿'), ('待派单', '待派单'),
|
||||
('待接单', '待接单'), ('加工中', '加工中'),
|
||||
('物流中', '物流中'), ('已交付', '已交付')], string='订单状态', default='草稿',
|
||||
readonly=True)
|
||||
model_color_state = fields.Selection([
|
||||
('success', '成功'),
|
||||
('fail', '失败')], string='模型上色状态')
|
||||
processing_time = fields.Integer('加工时长(min)')
|
||||
|
||||
@api.depends('unit_price', 'quantity')
|
||||
def _compute_total_amount(self):
|
||||
for item in self:
|
||||
item.price = item.unit_price * item.quantity
|
||||
|
||||
@api.depends('material_id', 'material_model_id')
|
||||
def _compute_material_model(self):
|
||||
for item in self:
|
||||
materials = self.env['sf.production.materials'].search([], limit=1, order='id desc')
|
||||
item.material_id = materials.id
|
||||
item.material_model_id = self.env['sf.materials.model'].search(
|
||||
[('materials_id', '=', materials.id)],
|
||||
limit=1, order='id desc')
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
if vals.get('upload_model_file'):
|
||||
logging.info('create-attachment:%s' % vals['upload_model_file'][0])
|
||||
for item in vals['upload_model_file']:
|
||||
print(len(item[2]))
|
||||
if len(item[2]) > 0:
|
||||
logging.info('create-attachment:%s' % int(item[2][0]))
|
||||
attachment = self.env['ir.attachment'].sudo().search([('id', '=', int(item[2][0]))])
|
||||
base64_data = base64.b64encode(attachment.datas)
|
||||
base64_datas = base64_data.decode('utf-8')
|
||||
model_code = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest()
|
||||
report_path = attachment._full_path(attachment.store_fname)
|
||||
vals['model_file'] = self.transition_glb_file(report_path, model_code)
|
||||
obj = super(QuickEasyOrder, self).create(vals)
|
||||
logging.info('---------向cloud生成模型库记录-------')
|
||||
self.model_coloring(obj)
|
||||
logging.info('---------开始派单到工厂-------')
|
||||
self.distribute_to_factory(obj)
|
||||
obj.state = '待接单'
|
||||
return obj
|
||||
|
||||
# 将attach的datas内容转为glb文件
|
||||
def transition_glb_file(self, report_path, model_code):
|
||||
shapes = read_step_file(report_path)
|
||||
output_file = os.path.join('/tmp', str(model_code) + '.stl')
|
||||
write_stl_file(shapes, output_file, 'binary', 0.03, 0.5)
|
||||
# 转化为glb
|
||||
output_glb_file = os.path.join('/tmp', str(model_code) + '.glb')
|
||||
util_path = get_resource_path('sf_base', 'static/util')
|
||||
cmd = 'python3 %s/stl2gltf.py %s %s -b' % (util_path, output_file, output_glb_file)
|
||||
os.system(cmd)
|
||||
# 转base64
|
||||
with open(output_glb_file, 'rb') as fileObj:
|
||||
image_data = fileObj.read()
|
||||
base64_data = base64.b64encode(image_data)
|
||||
return base64_data
|
||||
|
||||
# return False
|
||||
|
||||
@api.onchange('upload_model_file')
|
||||
def onchange_model_file(self):
|
||||
for item in self:
|
||||
if len(item.upload_model_file) > 1:
|
||||
raise ValidationError('只允许上传一个文件')
|
||||
if item.upload_model_file:
|
||||
file_attachment_id = item.upload_model_file[0]
|
||||
# 附件路径
|
||||
report_path = file_attachment_id._full_path(file_attachment_id.store_fname)
|
||||
logging.info("模型路径: %s" % report_path)
|
||||
base64_data = base64.b64encode(file_attachment_id.datas)
|
||||
base64_datas = base64_data.decode('utf-8')
|
||||
model_code = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest()
|
||||
# 读取文件
|
||||
shapes = read_step_file(report_path)
|
||||
# # 第一种获取体积方式
|
||||
# props = GProp_GProps()
|
||||
# # brepgprop_VolumeProperties(shapes, props)
|
||||
# volume = props.Mass()
|
||||
# # print(volume)
|
||||
# item.model_volume = volume
|
||||
# # 长宽高/体积
|
||||
# output_file = os.path.join('C:/Users/43484/Desktop/机企猫工作文档', str(model_code) + '.stl')
|
||||
output_file = os.path.join('/tmp', str(model_code) + '.stl')
|
||||
# your_mesh = mesh.Mesh.from_file(output_file)
|
||||
# volume, cog, inertia = your_mesh.get_mass_properties()
|
||||
# xyz = (your_mesh.max_ - your_mesh.min_)
|
||||
# item.model_length = xyz[0] # 长 单位mm
|
||||
# item.model_width = xyz[1] # 宽
|
||||
# item.model_height = xyz[2] # 高
|
||||
# item.model_volume = volume
|
||||
write_stl_file(shapes, output_file, 'binary', 0.03, 0.5)
|
||||
# 转化为glb
|
||||
# output_glb_file = os.path.join('C:/Users/43484/Desktop/机企猫工作文档', str(model_code) + '.glb')
|
||||
output_glb_file = os.path.join('/tmp', str(model_code) + '.glb')
|
||||
util_path = get_resource_path('sf_base', 'static/util')
|
||||
cmd = 'python3 %s/stl2gltf.py %s %s -b' % (util_path, output_file, output_glb_file)
|
||||
os.system(cmd)
|
||||
# 转base64
|
||||
with open(output_glb_file, 'rb') as fileObj:
|
||||
image_data = fileObj.read()
|
||||
base64_data = base64.b64encode(image_data)
|
||||
item.model_file = base64_data
|
||||
else:
|
||||
item.model_length = False
|
||||
item.model_width = False
|
||||
item.model_height = False
|
||||
item.model_volume = False
|
||||
item.model_file = False
|
||||
|
||||
def distribute_to_factory(self, obj):
|
||||
"""
|
||||
派单到工厂
|
||||
:return:
|
||||
"""
|
||||
try:
|
||||
logging.info('---------派单到工厂-------')
|
||||
res = {'bfm_process_order_list': []}
|
||||
for item in obj:
|
||||
attachment = item.upload_model_file[0]
|
||||
base64_data = base64.b64encode(attachment.datas)
|
||||
base64_datas = base64_data.decode('utf-8')
|
||||
barcode = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest()
|
||||
# logging.info('model_file-size: %s' % len(item.model_file))
|
||||
res['bfm_process_order_list'].append({
|
||||
'model_long': item.model_length,
|
||||
'model_width': item.model_width,
|
||||
'model_height': item.model_height,
|
||||
'model_volume': item.model_volume,
|
||||
'model_machining_precision': item.machining_precision,
|
||||
'model_name': attachment.name,
|
||||
'model_data': base64_datas,
|
||||
'model_file': base64.b64encode(item.model_file).decode('utf-8'),
|
||||
'texture_code': item.material_id.materials_no,
|
||||
'texture_type_code': item.material_model_id.materials_no,
|
||||
# 'surface_process_code': self.env['jikimo.surface.process']._json_surface_process_code(item),
|
||||
'process_parameters_code': self.env[
|
||||
'sf.production.process.parameter']._json_production_process_item_code(
|
||||
item),
|
||||
'price': item.price,
|
||||
'number': item.quantity,
|
||||
'total_amount': item.price,
|
||||
'remark': '',
|
||||
'manual_quotation': True,
|
||||
'barcode': barcode
|
||||
})
|
||||
# res['bfm_process_order_list'] = json.dumps(res['bfm_process_order_list'])
|
||||
product_id = self.env.ref('sf_dlm.product_template_sf').sudo()
|
||||
self_machining_id = self.env.ref('sf_dlm.product_embryo_sf_self_machining').sudo()
|
||||
outsource_id = self.env.ref('sf_dlm.product_embryo_sf_outsource').sudo()
|
||||
purchase_id = self.env.ref('sf_dlm.product_embryo_sf_purchase').sudo()
|
||||
company_id = self.env.ref('base.main_company').sudo()
|
||||
# user_id = request.env.ref('base.user_admin').sudo()
|
||||
order_id = self.env['sale.order'].sale_order_create(company_id, 'XXXXX', 'XXXXX', 'XXXXX',
|
||||
str(datetime.now()), '现结', '支付宝')
|
||||
i = 1
|
||||
# 给sale_order的default_code字段赋值
|
||||
aa = self.env['sale.order'].sudo().search([('name', '=', order_id.name)])
|
||||
logging.info('---------aa------- %s' % aa.name)
|
||||
aa.default_code = obj.name
|
||||
for item in res['bfm_process_order_list']:
|
||||
product = self.env['product.template'].sudo().product_create(product_id, item, order_id,
|
||||
obj.name, i)
|
||||
bom_data = self.env['mrp.bom'].get_bom(product)
|
||||
logging.info('bom_data:%s' % bom_data)
|
||||
if bom_data:
|
||||
bom = self.env['mrp.bom'].bom_create(product, 'normal', False)
|
||||
bom.bom_create_line_has(bom_data)
|
||||
else:
|
||||
if product.materials_type_id.gain_way == '自加工':
|
||||
# 创建坯料
|
||||
self_machining_embryo = self.env['product.template'].sudo().no_bom_product_create(
|
||||
self_machining_id,
|
||||
item, order_id,
|
||||
'self_machining',
|
||||
i)
|
||||
# 创建坯料的bom
|
||||
self_machining_bom = self.env['mrp.bom'].bom_create(self_machining_embryo, 'normal', False)
|
||||
# 创建坯料里bom的组件
|
||||
self_machining_bom_line = self_machining_bom.bom_create_line(self_machining_embryo)
|
||||
if not self_machining_bom_line:
|
||||
self.cr.rollback()
|
||||
return UserError('该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配')
|
||||
# 产品配置bom
|
||||
product_bom_self_machining = self.env['mrp.bom'].bom_create(product, 'normal', False)
|
||||
product_bom_self_machining.bom_create_line_has(self_machining_embryo)
|
||||
elif product.materials_type_id.gain_way == '外协':
|
||||
# 创建坯料
|
||||
outsource_embryo = self.env['product.template'].sudo().no_bom_product_create(outsource_id, item,
|
||||
order_id,
|
||||
'subcontract', i)
|
||||
if outsource_embryo == -3:
|
||||
self.cr.rollback()
|
||||
return UserError(
|
||||
'该订单模型的材料型号在您分配的工厂里暂未设置获取方式和供应商,请先配置再进行分配')
|
||||
# 创建坯料的bom
|
||||
outsource_bom = self.env['mrp.bom'].bom_create(outsource_embryo, 'subcontract', True)
|
||||
# 创建坯料的bom的组件
|
||||
outsource_bom_line = outsource_bom.with_user(
|
||||
self.env.ref("base.user_admin")).bom_create_line(outsource_embryo)
|
||||
if not outsource_bom_line:
|
||||
self.cr.rollback()
|
||||
return UserError('该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配')
|
||||
# 产品配置bom
|
||||
product_bom_outsource = self.env['mrp.bom'].bom_create(product, 'normal', False)
|
||||
product_bom_outsource.bom_create_line_has(outsource_embryo)
|
||||
elif product.materials_type_id.gain_way == '采购':
|
||||
purchase_embryo = self.env['product.template'].sudo().no_bom_product_create(purchase_id, item,
|
||||
order_id,
|
||||
'purchase', i)
|
||||
if purchase_embryo == -3:
|
||||
self.cr.rollback()
|
||||
return UserError(
|
||||
'该订单模型的材料型号在您分配的工厂里暂未设置获取方式和供应商,请先配置再进行分配')
|
||||
# 产品配置bom
|
||||
product_bom_purchase = self.env['mrp.bom'].bom_create(product, 'normal', False)
|
||||
product_bom_purchase.bom_create_line_has(purchase_embryo)
|
||||
order_id.with_user(self.env.ref("base.user_admin")).sale_order_create_line(product, item)
|
||||
except Exception as e:
|
||||
# self.cr.rollback()
|
||||
return UserError('工厂创建销售订单和产品失败,请联系管理员')
|
||||
|
||||
# 模型上色
|
||||
|
||||
def model_coloring(self, order):
|
||||
url = '/api/library_of_models/create'
|
||||
config = self.env['res.config.settings'].get_values()
|
||||
config_header = Common.get_headers(self, config['token'], config['sf_secret_key'])
|
||||
logging.info('order: %s' % order.name)
|
||||
if order:
|
||||
attachment = order.upload_model_file[0]
|
||||
base64_data = base64.b64encode(attachment.datas)
|
||||
base64_datas = base64_data.decode('utf-8')
|
||||
model_code = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest()
|
||||
logging.info('model_file-size: %s' % len(order.model_file))
|
||||
logging.info('attachment.datas-size: %s' % len(attachment.datas))
|
||||
vals = {
|
||||
'programme_way': 'manual operation',
|
||||
'model_code': model_code,
|
||||
'model_data': base64.b64decode(attachment.datas),
|
||||
'model_color_data': '',
|
||||
'model_name': attachment.name,
|
||||
'model_long': order.model_length,
|
||||
'model_width': order.model_width,
|
||||
'model_height': order.model_height,
|
||||
'model_volume': order.model_volume,
|
||||
'model_color_path': '/tmp/' + str(model_code) + ".step",
|
||||
'model_order_no': '%s-%s' % (order.name, 1),
|
||||
'remark': '订单号:%s 客户:%s' % (order.name, order.customer_id.name)
|
||||
}
|
||||
try:
|
||||
ret = requests.post((config['sf_url'] + url), json={}, data=vals, headers=config_header,
|
||||
timeout=60)
|
||||
ret = ret.json()
|
||||
# result = json.loads(ret['result'])
|
||||
if ret['status'] == 1:
|
||||
self.model_color_state = 'success'
|
||||
else:
|
||||
self.model_color_state = 'fail'
|
||||
raise UserError(ret['message'])
|
||||
except Exception as e:
|
||||
self.model_color_state = 'fail'
|
||||
raise UserError("模型上色失败")
|
||||
@@ -1,13 +1,7 @@
|
||||
import datetime
|
||||
import base64
|
||||
from odoo import Command
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError, ValidationError
|
||||
|
||||
READONLY_FIELD_STATES = {
|
||||
state: [('readonly', True)]
|
||||
for state in {'sale', 'done', 'cancel'}
|
||||
}
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class ReSaleOrder(models.Model):
|
||||
@@ -45,12 +39,6 @@ class ReSaleOrder(models.Model):
|
||||
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]")
|
||||
remark = fields.Text('备注')
|
||||
|
||||
validity_date = fields.Date(
|
||||
string="Expiration",
|
||||
compute='_compute_validity_date',
|
||||
store=True, readonly=False, copy=False, precompute=True,
|
||||
states=READONLY_FIELD_STATES, default=fields.Datetime.now)
|
||||
|
||||
# 业务平台分配工厂后在智能工厂先创建销售订单
|
||||
def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address,
|
||||
deadline_of_delivery, payments_way, pay_way):
|
||||
@@ -85,19 +73,12 @@ class ReSaleOrder(models.Model):
|
||||
self.check_status = 'pending'
|
||||
|
||||
def get_customer(self):
|
||||
partner_tag = self.env['res.partner.category'].search([('name', '=', '业务平台')], limit=1, order='id asc')
|
||||
if not partner_tag:
|
||||
partner_tag = self.env['res.partner.category'].create({'name': '平台客户'})
|
||||
customer = self.env['res.partner'].search([('name', '=', '业务平台')], limit=1, order='id asc')
|
||||
if customer:
|
||||
if not customer.vat:
|
||||
customer.write({'name': '业务平台', 'vat': '91430103MA7BRH9K4M', 'phone': '0731-85115515',
|
||||
'email': 'jikimo@jikimo.com', 'category_id': [Command.set([partner_tag.id])]})
|
||||
return customer
|
||||
else:
|
||||
partner = self.env['res.partner'].create(
|
||||
{'name': '业务平台', 'vat': '91430103MA7BRH9K4M', 'phone': '0731-85115515',
|
||||
'email': 'jikimo@jikimo.com', 'category_id': [Command.set([partner_tag.id])]})
|
||||
partner = self.env['res.partner'].create({'name': '业务平台'})
|
||||
self.env['res.users'].create({'name': '业务平台', 'partner_id': partner.id})
|
||||
return partner
|
||||
|
||||
# 业务平台分配工厂时在创建完产品后再创建销售明细信息
|
||||
@@ -119,7 +100,7 @@ class ReSaleOrder(models.Model):
|
||||
def check_order_line(self):
|
||||
for item in self:
|
||||
if not item.order_line:
|
||||
raise ValidationError('请选择【订单行】中的【产品】')
|
||||
raise UserError('请选择【订单行】中的【产品】')
|
||||
for line in item.order_line:
|
||||
if not line.product_template_id:
|
||||
raise UserError('请对【订单行】中的【产品】进行选择')
|
||||
@@ -142,12 +123,6 @@ class ResaleOrderLine(models.Model):
|
||||
check_status = fields.Selection(related='order_id.check_status')
|
||||
|
||||
|
||||
class ProductTemplate(models.Model):
|
||||
_inherit = 'product.template'
|
||||
|
||||
manual_quotation = fields.Boolean('人工编程', default=False)
|
||||
|
||||
|
||||
class RePurchaseOrder(models.Model):
|
||||
_inherit = 'purchase.order'
|
||||
|
||||
@@ -198,6 +173,11 @@ class RePurchaseOrder(models.Model):
|
||||
return super().write(vals)
|
||||
|
||||
def button_confirm(self):
|
||||
<<<<<<< HEAD
|
||||
self.check_status = 'pending'
|
||||
res = super().button_confirm()
|
||||
return res
|
||||
=======
|
||||
for order in self:
|
||||
if order.state not in ['draft', 'sent', 'purchase']:
|
||||
continue
|
||||
@@ -211,16 +191,7 @@ class RePurchaseOrder(models.Model):
|
||||
if order.partner_id not in order.message_partner_ids:
|
||||
order.message_subscribe([order.partner_id.id])
|
||||
return True
|
||||
|
||||
@api.onchange('order_line')
|
||||
def _onchange_order_line(self):
|
||||
for order in self:
|
||||
if order.order_line:
|
||||
line = order.order_line
|
||||
product = line.product_id
|
||||
product_id = product.ids
|
||||
if len(product_id) != len(line):
|
||||
raise ValidationError('【%s】已存在,请勿重复添加' % product[-1].name)
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
|
||||
|
||||
class ResPartnerToSale(models.Model):
|
||||
|
||||
@@ -14,8 +14,6 @@ access_product_product_group_sale_salemanager,product_product_group_sale_saleman
|
||||
access_product_product_group_sale_director,product_product_group_sale_director,product.model_product_product,sf_base.group_sale_director,1,1,1,0
|
||||
access_product_product_group_purchase,product_product_group_purchase,product.model_product_product,sf_base.group_purchase,1,0,0,0
|
||||
access_product_product_group_purchase_director,product_product_group_purchase_director,product.model_product_product,sf_base.group_purchase_director,1,1,1,0
|
||||
access_product_product_group_plan_dispatch,product_product_group_plan_dispatch,product.model_product_product,sf_base.group_plan_dispatch,1,0,0,0
|
||||
access_product_product_group_plan_director,product_product_group_plan_director,product.model_product_product,sf_base.group_plan_director,1,1,1,0
|
||||
access_product_template_group_sale_salemanager,product_template_group_sale_salemanager,product.model_product_template,sf_base.group_sale_salemanager,1,0,0,0
|
||||
access_product_template_group_sale_director,product_template_group_sale_director,product.model_product_template,sf_base.group_sale_director,1,1,1,0
|
||||
access_product_template_group_purchase,product_template_group_purchase,product.model_product_template,sf_base.group_purchase,1,0,0,0
|
||||
@@ -26,9 +24,6 @@ access_stock_picking_group_sale_salemanager,stock_picking_group_sale_salemanager
|
||||
access_stock_picking_group_sale_director,stock_picking_group_sale_director,stock.model_stock_picking,sf_base.group_sale_director,1,0,0,0
|
||||
access_stock_picking_group_purchase,stock_picking_group_purchase,stock.model_stock_picking,sf_base.group_purchase,1,1,1,0
|
||||
access_stock_picking_group_purchase_director,stock_picking_group_purchase_director,stock.model_stock_picking,sf_base.group_purchase_director,1,1,1,0
|
||||
access_stock_picking_group_quality,stock_picking_group_quality,stock.model_stock_picking,sf_base.group_quality,1,0,0,0
|
||||
access_stock_picking_group_quality_director,stock_picking_group_quality_director,stock.model_stock_picking,sf_base.group_quality_director,1,0,0,0
|
||||
|
||||
access_account_move_group_sale_salemanager,account_move_group_sale_salemanager,account.model_account_move,sf_base.group_sale_salemanager,1,0,0,0
|
||||
access_account_move_group_sale_director,account_move_group_sale_director,account.model_account_move,sf_base.group_sale_director,1,0,0,0
|
||||
access_resource_resource_group_sale_director,resource_resource_group_sale_director,resource.model_resource_resource,sf_base.group_sale_director,1,1,1,0
|
||||
@@ -92,9 +87,6 @@ access_sale_report_group_sale_director,sale_report_group_sale_director,sale.mode
|
||||
access_product_supplierinfo_group_purchase_director,product.supplierinfo group_purchase_director,product.model_product_supplierinfo,sf_base.group_purchase_director,1,1,1,0
|
||||
access_product_category_group_purchase_director,product.category group_purchase_director,product.model_product_category,sf_base.group_purchase_director,1,1,1,0
|
||||
|
||||
access_product_supplierinfo_group_plan_director,product.supplierinfo user,product.model_product_supplierinfo,sf_base.group_plan_director,1,1,1,0
|
||||
access_product_category_group_plan_director,product.category user,product.model_product_category,sf_base.group_plan_director,1,1,1,0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -24,30 +24,20 @@
|
||||
<xpath expr="//form/header/button[@name='button_confirm'][2]" position="replace">
|
||||
<button name="button_confirm" type="object" context="{'validate_analytic': True}"
|
||||
string="确认订单" id="draft_confirm"
|
||||
groups="sf_base.group_purchase,sf_base.group_purchase_director"
|
||||
attrs="{'invisible': ['|','&','&', ('state', 'in', ['purchase','draft']), ('check_status', 'in', ['approved']), ('date_approve', '!=', False),'&', '&',('state', 'in', ['purchase', 'draft']),('check_status', 'in', [False, 'pending', 'fail']),('date_approve', '=', False)]}"
|
||||
/>
|
||||
<button name="button_confirming" type="object"
|
||||
string="确认订单" groups="sf_base.group_purchase,sf_base.group_purchase_director"
|
||||
string="确认订单"
|
||||
attrs="{'invisible': ['&',('check_status','!=', False),('state', 'not in', ['draft','send'])]}"
|
||||
/>
|
||||
</xpath>
|
||||
<xpath expr="//form/header/button[@name='action_rfq_send'][1]" position="replace">
|
||||
<button name="action_rfq_send" states="draft" string="通过Email发送采购单" type="object"
|
||||
context="{'send_rfq':True}" class="oe_highlight" data-hotkey="g"
|
||||
groups="sf_base.group_purchase,sf_base.group_purchase_director"/>
|
||||
</xpath>
|
||||
<xpath expr="//form/header/button[@name='action_rfq_send'][2]" position="replace">
|
||||
<button name="action_rfq_send" states="sent" string="通过Email重新发送采购单" type="object"
|
||||
context="{'send_rfq':True}" data-hotkey="g"
|
||||
groups="sf_base.group_purchase,sf_base.group_purchase_director"/>
|
||||
</xpath>
|
||||
<xpath expr="//form/header/button[@name='action_rfq_send'][3]" position="replace">
|
||||
<button name="action_rfq_send" states="purchase" string="通过Email发送订单" type="object"
|
||||
context="{'send_rfq':False}" data-hotkey="g"
|
||||
groups="sf_base.group_purchase,sf_base.group_purchase_director"/>
|
||||
</xpath>
|
||||
|
||||
<!-- <xpath expr="//form/header/button[@name='action_rfq_send[1]']" position="attributes">-->
|
||||
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>-->
|
||||
<!-- </xpath>-->
|
||||
<!-- <xpath expr="//form/header/button[@name='action_rfq_send[2]']" position="attributes">-->
|
||||
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>-->
|
||||
<!-- </xpath>-->
|
||||
<!-- <xpath expr="//form/header/button[@name='print_quotation[1]']" position="attributes">-->
|
||||
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>-->
|
||||
<!-- </xpath>-->
|
||||
@@ -58,20 +48,9 @@
|
||||
<attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//form/header/button[@name='action_create_invoice']" position="replace">
|
||||
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute> -->
|
||||
<button name="action_create_invoice" string="创建账单" type="object" class="oe_highlight"
|
||||
context="{'create_bill':True}"
|
||||
attrs="{'invisible': ['|', ('state', 'not in', ('purchase', 'done')), ('invoice_status', 'in', ('no', 'invoiced'))]}"
|
||||
data-hotkey="w" groups="sf_base.group_purchase,sf_base.group_purchase_director"/>
|
||||
</xpath>
|
||||
<xpath expr="//form/header/button[@name='action_create_invoice'][2]" position="attributes">
|
||||
<attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//form/header/button[@name='button_confirm']" position="attributes">
|
||||
<attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>
|
||||
<!-- <button name="action_create_invoice" string="创建账单" type="object" class="oe_highlight" context="{'create_bill':True}" attrs="{'invisible': ['|', ('state', 'not in', ('purchase', 'done')), ('invoice_status', 'in', ('no', 'invoiced'))]}" data-hotkey="w" groups="sf_base.group_purchase,sf_base.group_purchase_director"/> -->
|
||||
</xpath>
|
||||
<!-- <xpath expr="//form/header/button[@name='action_create_invoice[1]']" position="attributes">-->
|
||||
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>-->
|
||||
<!-- </xpath>-->
|
||||
<!-- <xpath expr="//form/header/button[@name='action_create_invoice[2]']" position="attributes">-->
|
||||
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>-->
|
||||
<!-- </xpath>-->
|
||||
@@ -135,17 +114,6 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="purchase_order_kpis_tree_inherit_sf" model="ir.ui.view">
|
||||
<field name="name">purchase.stock.order.tree.inherit.sf</field>
|
||||
<field name="model">purchase.order</field>
|
||||
<field name="inherit_id" ref="purchase.purchase_order_kpis_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//tree//header//button[@name='action_create_invoice']" position="attributes">
|
||||
<attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="purchase_stock_order_view_form_inherit_sf" model="ir.ui.view">
|
||||
<field name="name">purchase.stock.order.form.inherit.sf</field>
|
||||
@@ -165,15 +133,23 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<<<<<<< HEAD
|
||||
<record id="purchase_order_view_tree_inherit_sf" model="ir.ui.view">
|
||||
=======
|
||||
<record id="view_purchase_order_view_tree_inherit_sf" model="ir.ui.view">
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
<field name="name">purchase.order.tree.inherit.sf</field>
|
||||
<field name="model">purchase.order</field>
|
||||
<field name="inherit_id" ref="purchase.purchase_order_view_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<<<<<<< HEAD
|
||||
<field name="invoice_status" position="after">
|
||||
=======
|
||||
<tree position="attributes">
|
||||
<attribute name="default_order">check_status desc,date_approve asc</attribute>
|
||||
</tree>
|
||||
<field name="amount_total" position="after">
|
||||
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||
<field name="check_status" widget="badge"
|
||||
decoration-success="check_status == 'approved'"
|
||||
decoration-warning="check_status == 'pending'"
|
||||
@@ -181,16 +157,5 @@
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="purchase_order_search_inherit_sf" model="ir.ui.view">
|
||||
<field name="name">purchase.order.list.select.inherit.sf</field>
|
||||
<field name="model">purchase.order</field>
|
||||
<field name="inherit_id" ref="purchase.view_purchase_order_filter"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='name']" position="replace">
|
||||
<field name="name" string="单据编码" filter_domain="[('name', 'ilike', self)]"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -47,8 +47,17 @@
|
||||
</h1>
|
||||
<group>
|
||||
<group>
|
||||
<field name="customer_id" context="{'is_customer': True }"
|
||||
options="{'no_create': True}" required="1"/>
|
||||
<field name="customer_id" />
|
||||
<field name="material_id"/>
|
||||
<field name="material_model_id"/>
|
||||
<!-- <field name="process_id"/>-->
|
||||
<field name="parameter_ids" widget="many2many_tags" string="表面工艺参数"/>
|
||||
<field name="machining_precision"/>
|
||||
<field name="quantity"/>
|
||||
<field name="unit_price"/>
|
||||
<field name="price"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="upload_model_file" widget="many2many_binary"/>
|
||||
<field name="model_file" widget="Viewer3D" string="模型" readonly="1" force_save="1"
|
||||
attrs="{'invisible': [('model_file', '=', False)]}"/>
|
||||
@@ -66,18 +75,8 @@
|
||||
<field name="model_height" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="model_volume" attrs="{'invisible': [('model_file', '=', False)]}"
|
||||
options="{'format': false}"/>
|
||||
<field name="material_id" options="{'no_create': True}" required="1"/>
|
||||
<field name="material_model_id" options="{'no_create': True}" required="1"/>
|
||||
<!-- <field name="process_id"/>-->
|
||||
<field name="parameter_ids" widget="many2many_tags" string="表面工艺参数"
|
||||
options="{'no_create': True}" required="1"/>
|
||||
<field name="machining_precision" required="1"/>
|
||||
<field name="model_volume" attrs="{'invisible': [('model_file', '=', False)]}"/>
|
||||
<field name="processing_time"/>
|
||||
<field name="quantity" options="{'format': false}"/>
|
||||
<field name="unit_price"/>
|
||||
<field name="price" options="{'format': false}"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
</field>
|
||||
<field name="email" position="replace">
|
||||
<field name="email"
|
||||
attrs="{'readonly': [('id','!=', False)]}"/>
|
||||
attrs="{'required' : [('customer_rank','>', 0)],'readonly': [('id','!=', False)]}"/>
|
||||
</field>
|
||||
<field name="mobile" position="attributes">
|
||||
<attribute name="attrs">{'required': [('phone', '=', False)],'readonly': [('id','!=', False)]}
|
||||
@@ -37,19 +37,19 @@
|
||||
</attribute>
|
||||
</field>
|
||||
<field name="street" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('id','!=', False)]}
|
||||
<attribute name="attrs">{'required': [('supplier_rank','>', 0)],'readonly': [('id','!=', False)]}
|
||||
</attribute>
|
||||
</field>
|
||||
<field name="street2" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('id','!=', False)]}
|
||||
<attribute name="attrs">{'required': [('supplier_rank','>', 0)],'readonly': [('id','!=', False)]}
|
||||
</attribute>
|
||||
</field>
|
||||
<field name="city" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('id','!=', False)]}
|
||||
<attribute name="attrs">{'required': [('supplier_rank','>', 0)],'readonly': [('id','!=', False)]}
|
||||
</attribute>
|
||||
</field>
|
||||
<field name="country_id" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('id','!=', False)]}
|
||||
<attribute name="attrs">{'required': [('supplier_rank','>', 0)],'readonly': [('id','!=', False)]}
|
||||
</attribute>
|
||||
</field>
|
||||
<xpath expr="//group[@name='sale']/field[@name='user_id']" position="replace">
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
<field name="schedule_status" invisible="1"/>
|
||||
<button name="sf_sale.action_sale_order_check_wizard" string="审核" type="action"
|
||||
context="{'default_order_id':active_id}" groups="sf_base.group_sale_director"
|
||||
attrs="{'invisible': ['|',('check_status','in', ['approved',False,'fail']),('state', 'in', ['cancel'])]}"
|
||||
attrs="{'invisible': ['|',('check_status','in', ['approved',False]),('state', 'in', ['cancel'])]}"
|
||||
class="oe_highlight"/>
|
||||
</xpath>
|
||||
<!-- <xpath expr="//form/header/button[@name='action_confirm'][1]" position="attributes">-->
|
||||
@@ -103,7 +103,7 @@
|
||||
<!-- </xpath>-->
|
||||
<field name="partner_id" position="replace">
|
||||
<field name="partner_id" widget="res_partner_many2one" context="{'is_customer': True }"
|
||||
options='{"always_reload": True,"no_create": True}'/>
|
||||
options='{"always_reload": True}'/>
|
||||
</field>
|
||||
<field name="payment_term_id" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
@@ -243,10 +243,6 @@
|
||||
<form position="attributes">
|
||||
<attribute name="delete">False</attribute>
|
||||
</form>
|
||||
<field name="name" position="replace">
|
||||
<field name='name' placeholder="例如:奶酪汉堡" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||
|
||||
</field>
|
||||
<field name="categ_id" position="replace">
|
||||
<field name='categ_id' invisible="1"/>
|
||||
</field>
|
||||
|
||||
@@ -16,13 +16,10 @@
|
||||
'security/ir.model.access.csv',
|
||||
'wizard/wizard_view.xml',
|
||||
'views/tool_base_views.xml',
|
||||
'views/functional_tool_views.xml',
|
||||
'views/mrp_workcenter_views.xml',
|
||||
'views/sf_maintenance_equipment.xml',
|
||||
'views/menu_view.xml',
|
||||
'views/tool_material_search.xml',
|
||||
'views/fixture_material_search_views.xml',
|
||||
'data/tool_data.xml',
|
||||
],
|
||||
'demo': [
|
||||
],
|
||||
|
||||
@@ -8,7 +8,55 @@ from odoo.http import request
|
||||
|
||||
class Manufacturing_Connect(http.Controller):
|
||||
|
||||
@http.route('/AutoDeviceApi/ToolGroup', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
@http.route('/AutoDeviceApi/MachineToolLibrary', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def get_equipment_tool_Info(self, **kw):
|
||||
"""
|
||||
机床刀库实时信息
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
logging.info('get_equipment_tool_Info:%s' % kw)
|
||||
try:
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
ret = json.loads(ret['result'])
|
||||
logging.info('DeviceId:%s' % ret)
|
||||
equipment = request.env['maintenance.equipment'].sudo().search([('name', '=', ret['DeviceId'])])
|
||||
|
||||
res = {'Succeed': True, 'Datas': []}
|
||||
if equipment:
|
||||
for item in equipment:
|
||||
data = []
|
||||
for equipment_tool_id in item.product_template_ids:
|
||||
functional_tool_id = self.env['sf.functional.cutting.tool.entity'].sudo().search(
|
||||
[('code', '=', equipment_tool_id.tool_code)])
|
||||
|
||||
alarm_time = None
|
||||
if functional_tool_id.functional_tool_status == '报警':
|
||||
alarm_time = self.env['sf.functional.tool.warning'].sudo().search(
|
||||
[('code', '=', equipment_tool_id.tool_code)]).alarm_time
|
||||
equipment_tool = {
|
||||
'RfidCode': None,
|
||||
'ToolId': equipment_tool_id.code,
|
||||
'ToolName': equipment_tool_id.functional_tool_name_id.name,
|
||||
'MaxLife': equipment_tool_id.life_value_max,
|
||||
'UseLife': equipment_tool_id.used_value,
|
||||
'AddDatetime': equipment_tool_id.tool_install_time,
|
||||
'State': functional_tool_id.functional_tool_status,
|
||||
'WarnDate': alarm_time if alarm_time else False
|
||||
}
|
||||
data.append(equipment_tool)
|
||||
res['Datas'].append({
|
||||
'DeviceId': item.name,
|
||||
'Data': data
|
||||
})
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('get_equipment_tool_Info error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
@http.route('/AutoDeviceApi/ToolGroups', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def get_functional_tool_groups_Info(self, **kw):
|
||||
"""
|
||||
@@ -20,19 +68,19 @@ class Manufacturing_Connect(http.Controller):
|
||||
try:
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
# ret = json.loads(ret['result'])
|
||||
ret = json.loads(ret['result'])
|
||||
logging.info('DeviceId:%s' % ret)
|
||||
functional_tools = request.env['sf.tool.inventory'].sudo().search([])
|
||||
functional_tools = request.env['sf.functional.cutting.tool.entity'].sudo().search([])
|
||||
|
||||
res = {'Succeed': True, 'Datas': []}
|
||||
if functional_tools:
|
||||
for item in functional_tools:
|
||||
res['Datas'].append({
|
||||
'GroupName': item.tool_groups_id.name,
|
||||
'ToolId': item.functional_cutting_tool_model_id.name,
|
||||
'ToolId': item.code,
|
||||
'ToolName': item.name
|
||||
})
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('get_functional_tool_groups_Info error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
return json.JSONEncoder().encode(res)
|
||||
@@ -1,12 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record model="ir.cron" id="ir_cron_sf_tool_datasync">
|
||||
<field name="name">定时同步刀具物料、功能刀具信息到cloud</field>
|
||||
<field name="model_id" ref="model_sf_tool_datasync"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model._cron_tool_datasync_all()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
</record>
|
||||
<data>
|
||||
<!-- <record model="sf.machine.table.tool.changing.apply" id="sf_create_tool_change_application">-->
|
||||
|
||||
<!-- </record>-->
|
||||
</data>
|
||||
</odoo>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user