Merge branch refs/heads/develop into refs/heads/feature/修改机床参数bug
This commit is contained in:
@@ -11,7 +11,7 @@ var Dialog = require('web.Dialog');
|
|||||||
patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
|
patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
|
||||||
// 你可以重写或者添加一些方法和属性
|
// 你可以重写或者添加一些方法和属性
|
||||||
async _onDiscardChanges() {
|
async _onDiscardChanges() {
|
||||||
var self = this;
|
// var self = this;
|
||||||
Dialog.confirm(this, _t("Are you sure you want to discard changes?"), {
|
Dialog.confirm(this, _t("Are you sure you want to discard changes?"), {
|
||||||
title: _t("Discard Changes"),
|
title: _t("Discard Changes"),
|
||||||
|
|
||||||
@@ -25,7 +25,8 @@ patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
|
|||||||
// if (window.confirm("Are you sure you want to discard changes?")) {
|
// if (window.confirm("Are you sure you want to discard changes?")) {
|
||||||
// await this.props.discard();
|
// await this.props.discard();
|
||||||
// }
|
// }
|
||||||
const result = await this._confirmDiscardChange();
|
// const result = await this._confirmDiscardChange();
|
||||||
|
await this._confirmDiscardChange();
|
||||||
await this.props.discard();
|
await this.props.discard();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
|
|||||||
// The following code manipulates the DOM directly to avoid having to wait for a
|
// The following code manipulates the DOM directly to avoid having to wait for a
|
||||||
// render + patch which would occur on the next frame and cause flickering.
|
// render + patch which would occur on the next frame and cause flickering.
|
||||||
freezeColumnWidths() {
|
freezeColumnWidths() {
|
||||||
console.log('ccccccccccccccccccccccccccc')
|
// console.log('ccccccccccccccccccccccccccc')
|
||||||
if (!this.keepColumnWidths) {
|
if (!this.keepColumnWidths) {
|
||||||
this.columnWidths = null;
|
this.columnWidths = null;
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,8 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
|
|||||||
|
|
||||||
setDefaultColumnWidths(column_num) {
|
setDefaultColumnWidths(column_num) {
|
||||||
// const bbb = this.state.columns[0].name
|
// const bbb = this.state.columns[0].name
|
||||||
const widths = this.state.columns.map((col) => this.calculateColumnWidth(col));
|
const widths = this.state.columns.map((col) =>
|
||||||
|
this.calculateColumnWidth(col));
|
||||||
// const sumOfRelativeWidths = (widths
|
// const sumOfRelativeWidths = (widths
|
||||||
// .filter(({ type }) => type === "relative")
|
// .filter(({ type }) => type === "relative")
|
||||||
// .reduce((sum, { value }) => sum + value, 0));
|
// .reduce((sum, { value }) => sum + value, 0));
|
||||||
@@ -65,16 +66,19 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
// 判断 this.state.columns 是否存在且长度大于零
|
// 判断 this.state.columns 是否存在且长度大于零
|
||||||
if (this.state.columns && this.state.columns.length > 0 && this.state.columns[0].name === "sequence") {
|
if (this.state.columns && this.state.columns.length > 0 &&
|
||||||
|
this.state.columns[0].name === "sequence") {
|
||||||
widths[1] = { type: "relative", value: 0.1 };
|
widths[1] = { type: "relative", value: 0.1 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 1 because nth-child selectors are 1-indexed, 2 when the first column contains
|
// 1 because nth-child selectors are 1-indexed,
|
||||||
|
// 2 when the first column contains
|
||||||
// the checkboxes to select records.
|
// the checkboxes to select records.
|
||||||
const columnOffset = this.hasSelectors ? 2 : 1;
|
const columnOffset = this.hasSelectors ? 2 : 1;
|
||||||
widths.forEach(({ type, value }, i) => {
|
widths.forEach(({ type, value }, width) => {
|
||||||
const headerEl = this.tableRef.el.querySelector(`th:nth-child(${i + columnOffset})`);
|
const headerEl = this.tableRef.el.querySelector(
|
||||||
|
`th:nth-child(${width + columnOffset})`);
|
||||||
if (type === "absolute") {
|
if (type === "absolute") {
|
||||||
if (this.isEmpty) {
|
if (this.isEmpty) {
|
||||||
headerEl.style.width = value;
|
headerEl.style.width = value;
|
||||||
@@ -82,7 +86,8 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
|
|||||||
headerEl.style.minWidth = value;
|
headerEl.style.minWidth = value;
|
||||||
}
|
}
|
||||||
} else if (type === "relative" && this.isEmpty) {
|
} else if (type === "relative" && this.isEmpty) {
|
||||||
headerEl.style.width = `${((value / column_num) * 100).toFixed(2)}%`;
|
headerEl.style.width = `${((value / column_num) * 100
|
||||||
|
).toFixed(2)}%`;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
|
import requests
|
||||||
|
import json
|
||||||
from odoo import models, fields, api
|
from odoo import models, fields, api
|
||||||
from odoo.addons.sf_base.commons.common import Common
|
from odoo.addons.sf_base.commons.common import Common
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
import requests
|
|
||||||
import json
|
|
||||||
|
|
||||||
|
|
||||||
class FunctionalFixtureType(models.Model):
|
class FunctionalFixtureType(models.Model):
|
||||||
@@ -62,7 +62,8 @@ class FunctionalFixture(models.Model):
|
|||||||
def _get_name(self):
|
def _get_name(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
if record.type:
|
if record.type:
|
||||||
if not record.transfer_tray_model_ids and not record.pneumatic_tray_model_ids and not record.magnetic_tray_model_ids and not record.vice_tray_model_ids:
|
if not record.transfer_tray_model_ids and not record.pneumatic_tray_model_ids and \
|
||||||
|
not record.magnetic_tray_model_ids and not record.vice_tray_model_ids:
|
||||||
record.name = ''
|
record.name = ''
|
||||||
if record.transfer_tray_model_ids:
|
if record.transfer_tray_model_ids:
|
||||||
for i in record.transfer_tray_model_ids:
|
for i in record.transfer_tray_model_ids:
|
||||||
|
|||||||
@@ -2,11 +2,6 @@
|
|||||||
from odoo import fields, models, api
|
from odoo import fields, models, api
|
||||||
|
|
||||||
|
|
||||||
# from datetime import datetime
|
|
||||||
# from odoo.exceptions import ValidationError
|
|
||||||
|
|
||||||
|
|
||||||
# 刀具物料
|
|
||||||
class CuttingToolMaterial(models.Model):
|
class CuttingToolMaterial(models.Model):
|
||||||
_name = 'sf.cutting.tool.material'
|
_name = 'sf.cutting.tool.material'
|
||||||
_description = '刀具物料'
|
_description = '刀具物料'
|
||||||
@@ -28,57 +23,6 @@ class FunctionalCuttingTool(models.Model):
|
|||||||
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
|
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
|
||||||
mrs_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号')
|
mrs_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号')
|
||||||
|
|
||||||
# # 整体式刀具型号
|
|
||||||
# mrs_cutting_tool_integral_model_ids = fields.Many2many('sf.cutting.tool.model', 'rel_integral_model_functional_sf',
|
|
||||||
# string='整体式刀具型号', domain=
|
|
||||||
# [('cutting_tool_type', '=', '整体式刀具')])
|
|
||||||
# # 刀片型号
|
|
||||||
# mrs_cutting_tool_blade_model_ids = fields.Many2many('sf.cutting.tool.model', 'rel_blade_model_functional_sf',
|
|
||||||
# string='刀片型号', domain=
|
|
||||||
# [('cutting_tool_type', '=', '刀片')])
|
|
||||||
# # 刀杆型号
|
|
||||||
# mrs_cutting_tool_cutterbar_model_ids = fields.Many2many('sf.cutting.tool.model',
|
|
||||||
# 'rel_cutterbar_model_functional_sf',
|
|
||||||
# string='刀杆型号', domain=
|
|
||||||
# [('cutting_tool_type', '=', '刀杆')])
|
|
||||||
# # 刀盘型号
|
|
||||||
# mrs_cutting_tool_cutterpad_model_ids = fields.Many2many('sf.cutting.tool.model',
|
|
||||||
# 'rel_cutterpad_model_functional_sf',
|
|
||||||
# string='刀盘型号', domain=
|
|
||||||
# [('cutting_tool_type', '=', '刀盘')])
|
|
||||||
# # 刀柄型号
|
|
||||||
# mrs_cutting_tool_cutterhandle_model_ids = fields.Many2many('sf.cutting.tool.model',
|
|
||||||
# 'rel_cutterhandle_model_functional_sf',
|
|
||||||
# string='刀柄型号',
|
|
||||||
# domain=
|
|
||||||
# [('cutting_tool_type', '=', '刀柄')])
|
|
||||||
# # 夹头型号
|
|
||||||
# mrs_cutting_tool_cutterhead_model_ids = fields.Many2many('sf.cutting.tool.model',
|
|
||||||
# 'rel_cutterhead_model_functional_sf',
|
|
||||||
# string='夹头型号', domain=
|
|
||||||
# [('cutting_tool_type', '=', '夹头')])
|
|
||||||
#
|
|
||||||
# diameter = fields.Float('直径(mm)')
|
|
||||||
# tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')],
|
|
||||||
# string='刀具等级')
|
|
||||||
# machining_accuracy = fields.Float('加工精度(mm)')
|
|
||||||
# tool_length = fields.Float('装刀长')
|
|
||||||
# blade_number = fields.Integer('刃数')
|
|
||||||
# integral_blade_length = fields.Float('整体刃长(mm)')
|
|
||||||
# effective_blade_length = fields.Float('有效刃长(mm)')
|
|
||||||
# max_life = fields.Float('最大寿命值')
|
|
||||||
# is_standard = fields.Boolean('是否标准刀')
|
|
||||||
# applicable_range = fields.Char('适用范围')
|
|
||||||
# image = fields.Binary('图片')
|
|
||||||
# active = fields.Boolean('有效', default=True)
|
|
||||||
#
|
|
||||||
# def _get_functional_tool_model_ids(self, functional_tool_model_code):
|
|
||||||
# functional_tool_model_ids = []
|
|
||||||
# for item in functional_tool_model_code:
|
|
||||||
# functional_tool_model = self.env['sf.cutting.tool.model'].search([('code', '=', item)])
|
|
||||||
# functional_tool_model_ids.append(functional_tool_model.id)
|
|
||||||
# return [(6, 0, functional_tool_model_ids)]
|
|
||||||
|
|
||||||
|
|
||||||
# 功能刀具类型
|
# 功能刀具类型
|
||||||
class FunctionalCuttingToolModel(models.Model):
|
class FunctionalCuttingToolModel(models.Model):
|
||||||
|
|||||||
@@ -53,7 +53,8 @@ class ToolMaterialsBasicParameters(models.Model):
|
|||||||
top_angle = fields.Integer('顶角(°)')
|
top_angle = fields.Integer('顶角(°)')
|
||||||
blade_tip_dip_angle = fields.Integer('刀尖倾角(°)')
|
blade_tip_dip_angle = fields.Integer('刀尖倾角(°)')
|
||||||
side_cutting_edge_angle = fields.Integer('侧切削角(°)')
|
side_cutting_edge_angle = fields.Integer('侧切削角(°)')
|
||||||
thread_model = fields.Selection([('无', '无'), ('外螺纹', '外螺纹'), ('内螺纹', '内螺纹')], string='螺纹类型', default='无')
|
thread_model = fields.Selection([('无', '无'), ('外螺纹', '外螺纹'), ('内螺纹', '内螺纹')], string='螺纹类型',
|
||||||
|
default='无')
|
||||||
thread_num = fields.Float('每英寸螺纹数(tpi)')
|
thread_num = fields.Float('每英寸螺纹数(tpi)')
|
||||||
blade_tip_height_tolerance = fields.Char('刀尖高度公差(mm)', size=20)
|
blade_tip_height_tolerance = fields.Char('刀尖高度公差(mm)', size=20)
|
||||||
inscribed_circle_tolerance = fields.Char('内接圆公差(mm)', size=20)
|
inscribed_circle_tolerance = fields.Char('内接圆公差(mm)', size=20)
|
||||||
@@ -199,8 +200,8 @@ class ToolMaterialsBasicParameters(models.Model):
|
|||||||
'is_cooling_hole': obj['is_cooling_hole'],
|
'is_cooling_hole': obj['is_cooling_hole'],
|
||||||
'locating_slot_code': obj['locating_slot_code'],
|
'locating_slot_code': obj['locating_slot_code'],
|
||||||
'installing_structure': obj['installing_structure'],
|
'installing_structure': obj['installing_structure'],
|
||||||
'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else self.evn['sf.cutting_tool.standard.library']._get_ids(
|
'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else
|
||||||
obj['blade_codes']),
|
self.evn['sf.cutting_tool.standard.library']._get_ids(obj['blade_codes']),
|
||||||
'tool_shim': obj['tool_shim'],
|
'tool_shim': obj['tool_shim'],
|
||||||
'cotter_pin': obj['cotter_pin'],
|
'cotter_pin': obj['cotter_pin'],
|
||||||
'pressing_plate': obj['pressing_plate'],
|
'pressing_plate': obj['pressing_plate'],
|
||||||
@@ -222,8 +223,8 @@ class ToolMaterialsBasicParameters(models.Model):
|
|||||||
'cutting_depth': obj['cutting_depth'],
|
'cutting_depth': obj['cutting_depth'],
|
||||||
'main_included_angle': obj['main_included_angle'],
|
'main_included_angle': obj['main_included_angle'],
|
||||||
'installing_structure': obj['installing_structure'],
|
'installing_structure': obj['installing_structure'],
|
||||||
'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else self.evn['sf.cutting_tool.standard.library']._get_ids(
|
'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else
|
||||||
obj['blade_codes']),
|
self.evn['sf.cutting_tool.standard.library']._get_ids(obj['blade_codes']),
|
||||||
'screw': obj['screw'],
|
'screw': obj['screw'],
|
||||||
'spanner': obj['spanner'],
|
'spanner': obj['spanner'],
|
||||||
'cutting_blade_model': obj['cutting_blade_model'],
|
'cutting_blade_model': obj['cutting_blade_model'],
|
||||||
|
|||||||
@@ -38,5 +38,33 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<record model="ir.module.category" id="module_category_plan">
|
||||||
|
<field name="name">计划</field>
|
||||||
|
<field name="sequence">20</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="sales_team.group_sale_manager" model="res.groups">
|
||||||
|
<field name="name">销售经理</field>
|
||||||
|
<field name="category_id" ref="base.module_category_sales_sales"/>
|
||||||
|
<!-- <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>-->
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- <record id="group_sale_director" model="res.groups">-->
|
||||||
|
<!-- <field name="name">销售总监</field>-->
|
||||||
|
<!-- <field name="category_id" ref="base.module_category_sales_sales"/>-->
|
||||||
|
<!-- <field name="implied_ids" eval="[(4, ref('sf_base.group_sale_manager'))]"/>-->
|
||||||
|
<!-- </record>-->
|
||||||
|
|
||||||
|
<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'))]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="group_plan_director" model="res.groups">
|
||||||
|
<field name="name">计划总监</field>
|
||||||
|
<field name="category_id" ref="module_category_plan"/>
|
||||||
|
<field name="implied_ids" eval="[(4, ref('sf_base.group_plan_dispatch'))]"/>
|
||||||
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
from .import controllers
|
from .import controllers
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class Sf_Bf_Connect(http.Controller):
|
|||||||
self_machining_bom_line = self_machining_bom.with_user(
|
self_machining_bom_line = self_machining_bom.with_user(
|
||||||
request.env.ref("base.user_admin")).bom_create_line(
|
request.env.ref("base.user_admin")).bom_create_line(
|
||||||
self_machining_embryo)
|
self_machining_embryo)
|
||||||
if self_machining_bom_line == False:
|
if not self_machining_bom_line:
|
||||||
res['status'] = 2
|
res['status'] = 2
|
||||||
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配'
|
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配'
|
||||||
request.cr.rollback()
|
request.cr.rollback()
|
||||||
@@ -84,7 +84,7 @@ class Sf_Bf_Connect(http.Controller):
|
|||||||
# 创建坯料的bom的组件
|
# 创建坯料的bom的组件
|
||||||
outsource_bom_line = outsource_bom.with_user(
|
outsource_bom_line = outsource_bom.with_user(
|
||||||
request.env.ref("base.user_admin")).bom_create_line(outsource_embryo)
|
request.env.ref("base.user_admin")).bom_create_line(outsource_embryo)
|
||||||
if outsource_bom_line == False:
|
if not outsource_bom_line:
|
||||||
res['status'] = 2
|
res['status'] = 2
|
||||||
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配'
|
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配'
|
||||||
request.cr.rollback()
|
request.cr.rollback()
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# import cpca
|
|
||||||
import base64
|
import base64
|
||||||
import logging
|
import logging
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import requests
|
import requests
|
||||||
|
import cpca
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
from odoo import api, fields, models, SUPERUSER_ID, _
|
from odoo import api, fields, models, SUPERUSER_ID, _
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import logging
|
import logging
|
||||||
import requests
|
import requests
|
||||||
from odoo import api, fields, models, SUPERUSER_ID, _
|
from odoo import fields, models
|
||||||
from odoo.exceptions import UserError
|
|
||||||
from odoo.exceptions import ValidationError
|
|
||||||
from collections import defaultdict, namedtuple
|
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -197,7 +195,8 @@ class FinishStatusChange(models.Model):
|
|||||||
if self.user_has_groups('stock.group_reception_report') \
|
if self.user_has_groups('stock.group_reception_report') \
|
||||||
and self.picking_type_id.auto_show_reception_report:
|
and self.picking_type_id.auto_show_reception_report:
|
||||||
lines = self.move_ids.filtered(lambda
|
lines = self.move_ids.filtered(lambda
|
||||||
m: m.product_id.type == 'product' and m.state != 'cancel' and m.quantity_done and not m.move_dest_ids)
|
m: m.product_id.type == 'product' and m.state != 'cancel'
|
||||||
|
and m.quantity_done and not m.move_dest_ids)
|
||||||
if lines:
|
if lines:
|
||||||
# don't show reception report if all already assigned/nothing to assign
|
# don't show reception report if all already assigned/nothing to assign
|
||||||
wh_location_ids = self.env['stock.location']._search(
|
wh_location_ids = self.env['stock.location']._search(
|
||||||
|
|||||||
@@ -1 +1,2 @@
|
|||||||
from . import models
|
from . import models
|
||||||
|
|
||||||
|
|||||||
@@ -22,10 +22,11 @@
|
|||||||
'views/ftp_button.xml',
|
'views/ftp_button.xml',
|
||||||
|
|
||||||
'views/compensation.xml',
|
'views/compensation.xml',
|
||||||
|
# 只有它被屏蔽了
|
||||||
# 'views/SfWorkOrderBarcodes.xml',
|
# 'views/SfWorkOrderBarcodes.xml',
|
||||||
'views/WorkCenterBarcodes.xml',
|
'views/WorkCenterBarcodes.xml',
|
||||||
'views/Stock_picking_Barcodes.xml',
|
'views/Stock_picking_Barcodes.xml',
|
||||||
# 'views/machine_monitor.xml',
|
'views/machine_monitor.xml',
|
||||||
'views/machine_info_present.xml',
|
'views/machine_info_present.xml',
|
||||||
'views/delivery_record.xml',
|
'views/delivery_record.xml',
|
||||||
'views/res_config_settings_views.xml',
|
'views/res_config_settings_views.xml',
|
||||||
@@ -39,7 +40,7 @@
|
|||||||
],
|
],
|
||||||
|
|
||||||
},
|
},
|
||||||
'external_dependencies': {'python': ['opcua(使用pip install opcua -i https://pypi.tuna.tsinghua.edu.cn/simple)']},
|
# 'external_dependencies': {'python': ['opcua(使用pip install opcua -i https://pypi.tuna.tsinghua.edu.cn/simple)']},
|
||||||
|
|
||||||
'installable': True,
|
'installable': True,
|
||||||
'application': True,
|
'application': True,
|
||||||
|
|||||||
@@ -60,11 +60,11 @@ class FtpButton(models.Model):
|
|||||||
raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态")
|
raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态")
|
||||||
|
|
||||||
# host="192.168.2.158", port=8080, username="MITSUBISHI", password="CNC"
|
# host="192.168.2.158", port=8080, username="MITSUBISHI", password="CNC"
|
||||||
host = self.workorder_id.workcenter_id.machine_tool_id.ftp_host
|
host = self.workorder_id.equipment_id.ftp_host
|
||||||
port = self.workorder_id.workcenter_id.machine_tool_id.ftp_port
|
port = self.workorder_id.equipment_id.ftp_port
|
||||||
username = self.workorder_id.workcenter_id.machine_tool_id.ftp_num
|
username = self.workorder_id.equipment_id.ftp_num
|
||||||
pwd = self.workorder_id.workcenter_id.machine_tool_id.ftp_pwd
|
pwd = self.workorder_id.equipment_id.ftp_pwd
|
||||||
remote_path = self.workorder_id.workcenter_id.machine_tool_id.ftp_remote_path
|
remote_path = self.workorder_id.equipment_id.ftp_remote_path
|
||||||
print(host, port, username, pwd, remote_path)
|
print(host, port, username, pwd, remote_path)
|
||||||
ftp = ftp_operate.FtpController(host, port, username, pwd)
|
ftp = ftp_operate.FtpController(host, port, username, pwd)
|
||||||
# ftp.delAllfile('C://Users//马广威//Desktop//ftp')
|
# ftp.delAllfile('C://Users//马广威//Desktop//ftp')
|
||||||
@@ -107,8 +107,8 @@ class FtpButton(models.Model):
|
|||||||
下发NC代码前自动补偿三元检测偏差值
|
下发NC代码前自动补偿三元检测偏差值
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
hongbianliang550 = self.workorder_id.workcenter_id.machine_tool_id.x_compensation_node
|
hongbianliang550 = self.workorder_id.equipment_id.x_compensation_node
|
||||||
hongbianliang551 = self.workorder_id.workcenter_id.machine_tool_id.y_compensation_node
|
hongbianliang551 = self.workorder_id.equipment_id.y_compensation_node
|
||||||
try:
|
try:
|
||||||
temp_dict = {}
|
temp_dict = {}
|
||||||
temp_dict[hongbianliang550] = self.workorder_id.compensation_value_x
|
temp_dict[hongbianliang550] = self.workorder_id.compensation_value_x
|
||||||
@@ -124,9 +124,9 @@ class Machine_ftp(models.Model):
|
|||||||
"""
|
"""
|
||||||
数据采集类
|
数据采集类
|
||||||
"""
|
"""
|
||||||
_inherit = 'sf.machine_tool'
|
_inherit = 'maintenance.equipment'
|
||||||
|
|
||||||
workorder_ids = fields.One2many('mrp.workorder', 'machine_tool_id', string='工单')
|
# workorder_ids = fields.One2many('mrp.workorder', 'machine_tool_id', string='工单')
|
||||||
|
|
||||||
# 机床配置项目
|
# 机床配置项目
|
||||||
# ftp相关
|
# ftp相关
|
||||||
@@ -263,7 +263,7 @@ class WorkCenterBarcode(models.Model):
|
|||||||
compensation_value_y = fields.Float(string='Y轴补偿值')
|
compensation_value_y = fields.Float(string='Y轴补偿值')
|
||||||
button_compensation_state = fields.Boolean(string='是否已经补偿', readonly=True)
|
button_compensation_state = fields.Boolean(string='是否已经补偿', readonly=True)
|
||||||
button_up_all_state = fields.Boolean(string='是否已经全部下发', readonly=True)
|
button_up_all_state = fields.Boolean(string='是否已经全部下发', readonly=True)
|
||||||
machine_tool_id = fields.Many2one('sf.machine_tool', string='机床')
|
machine_tool_id = fields.Many2one('sf.machine_tool.type', string='机床')
|
||||||
machine_tool_name = fields.Char(string='机床名称', default='未知机床', compute='_run_info', readonly=True)
|
machine_tool_name = fields.Char(string='机床名称', default='未知机床', compute='_run_info', readonly=True)
|
||||||
machine_tool_type_id = fields.Char(string='机床型号', default='未知型号', compute='_run_info', readonly=True)
|
machine_tool_type_id = fields.Char(string='机床型号', default='未知型号', compute='_run_info', readonly=True)
|
||||||
machine_tool_status = fields.Boolean(string='在线状态', compute='_run_info', readonly=True)
|
machine_tool_status = fields.Boolean(string='在线状态', compute='_run_info', readonly=True)
|
||||||
@@ -281,27 +281,27 @@ class WorkCenterBarcode(models.Model):
|
|||||||
machine_tool_compensation_value_y = fields.Char('y补偿值', compute='_run_info', readonly=True)
|
machine_tool_compensation_value_y = fields.Char('y补偿值', compute='_run_info', readonly=True)
|
||||||
delivery_records = fields.One2many('delivery.record', 'workorder_id', string="下发记录")
|
delivery_records = fields.One2many('delivery.record', 'workorder_id', string="下发记录")
|
||||||
|
|
||||||
@api.depends('workcenter_id.machine_tool_id.timestamp')
|
@api.depends('equipment_id.timestamp')
|
||||||
def _run_info(self):
|
def _run_info(self):
|
||||||
# self.machine_tool_name = '1号机床'
|
# self.machine_tool_name = '1号机床'
|
||||||
self.machine_tool_name = self.workcenter_id.machine_tool_id.name
|
self.machine_tool_name = self.equipment_id.name
|
||||||
self.machine_tool_type_id = self.workcenter_id.machine_tool_id.type_id.name
|
self.machine_tool_type_id = self.equipment_id.type_id.name
|
||||||
self.machine_tool_status = self.workcenter_id.machine_tool_id.status
|
self.machine_tool_status = self.equipment_id.status
|
||||||
self.machine_tool_run_status = self.workcenter_id.machine_tool_id.run_status
|
self.machine_tool_run_status = self.equipment_id.run_status
|
||||||
self.machine_tool_timestamp = self.workcenter_id.machine_tool_id.timestamp
|
self.machine_tool_timestamp = self.equipment_id.timestamp
|
||||||
self.machine_tool_time_on = self.workcenter_id.machine_tool_id.time_on
|
self.machine_tool_time_on = self.equipment_id.time_on
|
||||||
self.machine_tool_time_on_now = self.workcenter_id.machine_tool_id.time_on_now
|
self.machine_tool_time_on_now = self.equipment_id.time_on_now
|
||||||
self.machine_tool_tool_num = self.workcenter_id.machine_tool_id.tool_num
|
self.machine_tool_tool_num = self.equipment_id.tool_num
|
||||||
self.machine_tool_program = self.workcenter_id.machine_tool_id.program
|
self.machine_tool_program = self.equipment_id.program
|
||||||
self.machine_tool_machine_ip = self.workcenter_id.machine_tool_id.machine_ip
|
self.machine_tool_machine_ip = self.equipment_id.machine_ip
|
||||||
self.machine_tool_cut_status = self.workcenter_id.machine_tool_id.cut_status
|
self.machine_tool_cut_status = self.equipment_id.cut_status
|
||||||
self.machine_tool_compensation_value_x = self.compensation_value_x
|
self.machine_tool_compensation_value_x = self.compensation_value_x
|
||||||
self.machine_tool_compensation_value_y = self.compensation_value_y
|
self.machine_tool_compensation_value_y = self.compensation_value_y
|
||||||
|
|
||||||
def compensation(self):
|
def compensation(self):
|
||||||
|
|
||||||
hongbianliang550 = self.workcenter_id.machine_tool_id.x_compensation_node
|
hongbianliang550 = self.equipment_id.x_compensation_node
|
||||||
hongbianliang551 = self.workcenter_id.machine_tool_id.y_compensation_node
|
hongbianliang551 = self.equipment_id.y_compensation_node
|
||||||
try:
|
try:
|
||||||
temp_dict = {}
|
temp_dict = {}
|
||||||
temp_dict[hongbianliang550] = self.compensation_value_x
|
temp_dict[hongbianliang550] = self.compensation_value_x
|
||||||
@@ -339,11 +339,11 @@ class WorkCenterBarcode(models.Model):
|
|||||||
except Exception:
|
except Exception:
|
||||||
raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态")
|
raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态")
|
||||||
sequence_collect = []
|
sequence_collect = []
|
||||||
host = self.workcenter_id.machine_tool_id.ftp_host
|
host = self.equipment_id.ftp_host
|
||||||
port = self.workcenter_id.machine_tool_id.ftp_port
|
port = self.equipment_id.ftp_port
|
||||||
username = self.workcenter_id.machine_tool_id.ftp_num
|
username = self.equipment_id.ftp_num
|
||||||
pwd = self.workcenter_id.machine_tool_id.ftp_pwd
|
pwd = self.equipment_id.ftp_pwd
|
||||||
remote_path = self.workcenter_id.machine_tool_id.ftp_remote_path
|
remote_path = self.equipment_id.ftp_remote_path
|
||||||
_logger.info("=====================1666666661111================%s,%s,%s,%s" % (host, port, username, pwd))
|
_logger.info("=====================1666666661111================%s,%s,%s,%s" % (host, port, username, pwd))
|
||||||
ftp = ftp_operate.FtpController(host, port, username, pwd)
|
ftp = ftp_operate.FtpController(host, port, username, pwd)
|
||||||
_logger.info("=====================1777777777111================")
|
_logger.info("=====================1777777777111================")
|
||||||
@@ -403,11 +403,11 @@ class WorkCenterBarcode(models.Model):
|
|||||||
except Exception:
|
except Exception:
|
||||||
raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态")
|
raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态")
|
||||||
sequence_collect = []
|
sequence_collect = []
|
||||||
host = self.workcenter_id.machine_tool_id.ftp_host
|
host = self.equipment_id.ftp_host
|
||||||
port = self.workcenter_id.machine_tool_id.ftp_port
|
port = self.equipment_id.ftp_port
|
||||||
username = self.workcenter_id.machine_tool_id.ftp_num
|
username = self.equipment_id.ftp_num
|
||||||
pwd = self.workcenter_id.machine_tool_id.ftp_pwd
|
pwd = self.equipment_id.ftp_pwd
|
||||||
remote_path = self.workcenter_id.machine_tool_id.ftp_remote_path
|
remote_path = self.equipment_id.ftp_remote_path
|
||||||
_logger.info("=====================1666666661111================%s,%s,%s,%s" % (host, port, username, pwd))
|
_logger.info("=====================1666666661111================%s,%s,%s,%s" % (host, port, username, pwd))
|
||||||
ftp = ftp_operate.FtpController(host, port, username, pwd)
|
ftp = ftp_operate.FtpController(host, port, username, pwd)
|
||||||
_logger.info("=====================1777777777111================")
|
_logger.info("=====================1777777777111================")
|
||||||
|
|||||||
@@ -91,7 +91,6 @@ class FtpController:
|
|||||||
"""
|
"""
|
||||||
self.ftp.close()
|
self.ftp.close()
|
||||||
|
|
||||||
|
|
||||||
def delAllfile(self, ftppath):
|
def delAllfile(self, ftppath):
|
||||||
"""
|
"""
|
||||||
删除ftp服务器端全部文件
|
删除ftp服务器端全部文件
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class ResBFMConfigSettings(models.TransientModel):
|
|||||||
|
|
||||||
bfm_url = fields.Selection(
|
bfm_url = fields.Selection(
|
||||||
[("https://bfm.cs.jikimo.com", "开发环境(https://bfm.cs.jikimo.com)"),
|
[("https://bfm.cs.jikimo.com", "开发环境(https://bfm.cs.jikimo.com)"),
|
||||||
("https://bfm.r.jikimo.com", "测试环境(https://bfm.r.jikimo.com)"),
|
("https://bfm.t.jikimo.com", "测试环境(https://bfm.t.jikimo.com)"),
|
||||||
# ("正式环境", "https://bfm.jikimo.com")], string='bfm环境', store=True)
|
# ("正式环境", "https://bfm.jikimo.com")], string='bfm环境', store=True)
|
||||||
("https://bfm.jikimo.com", "正式环境(https://bfm.jikimo.com)")], string='bfm环境', store=True)
|
("https://bfm.jikimo.com", "正式环境(https://bfm.jikimo.com)")], string='bfm环境', store=True)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/** @odoo-module **/
|
/** @odoo-module **/
|
||||||
|
|
||||||
import { browser } from "@web/core/browser/browser";
|
// import { browser } from "@web/core/browser/browser";
|
||||||
import * as BarcodeScanner from "@web/webclient/barcode/barcode_scanner";
|
// import * as BarcodeScanner from "@web/webclient/barcode/barcode_scanner";
|
||||||
const { Component } = owl;
|
const { Component } = owl;
|
||||||
import { standardFieldProps } from "@web/views/fields/standard_field_props";
|
import { standardFieldProps } from "@web/views/fields/standard_field_props";
|
||||||
import {registry} from "@web/core/registry";
|
import {registry} from "@web/core/registry";
|
||||||
@@ -23,19 +23,19 @@ export class CodeField extends Component {
|
|||||||
this.record = this.props.record;
|
this.record = this.props.record;
|
||||||
}
|
}
|
||||||
|
|
||||||
async onBarcodeBtnClick() {
|
// async onBarcodeBtnClick() {
|
||||||
const barcode = await BarcodeScanner.scanBarcode();
|
// const barcode = await BarcodeScanner.scanBarcode();
|
||||||
if (barcode) {
|
// if (barcode) {
|
||||||
await this.onBarcodeScanned(barcode);
|
// await this.onBarcodeScanned(barcode);
|
||||||
if ("vibrate" in browser.navigator) {
|
// if ("vibrate" in browser.navigator) {
|
||||||
browser.navigator.vibrate(100);
|
// browser.navigator.vibrate(100);
|
||||||
}
|
// }
|
||||||
} else {
|
// } else {
|
||||||
this.notification.add(this.env._t("Please, scan again !"), {
|
// this.notification.add(this.env._t("Please, scan again !"), {
|
||||||
type: "warning",
|
// type: "warning",
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
async search(barcode) {
|
async search(barcode) {
|
||||||
// alert('我是search')
|
// alert('我是search')
|
||||||
const domain = [["code", "=", barcode]];
|
const domain = [["code", "=", barcode]];
|
||||||
@@ -65,33 +65,33 @@ export class CodeField extends Component {
|
|||||||
// console.log('currentModel',this)
|
// console.log('currentModel',this)
|
||||||
// console.log('this.record.data',this.record.data)
|
// console.log('this.record.data',this.record.data)
|
||||||
// console.log('this.record.data.id', this.record.data.id)
|
// console.log('this.record.data.id', this.record.data.id)
|
||||||
const workorder = await this.orm.call('mrp.workorder', 'read', [this.record.data.id]);
|
// const workorder = await this.orm.call('mrp.workorder', 'read', [this.record.data.id]);
|
||||||
// console.log('workorder', workorder[0])
|
// console.log('workorder', workorder[0])
|
||||||
const updatedRecord = await this.orm.call("sf.tray", "write", [
|
// const updatedRecord = await this.orm.call("sf.tray", "write", [
|
||||||
[records[0].id],
|
// [records[0].id],
|
||||||
{
|
// {
|
||||||
state: "占用",
|
// state: "占用",
|
||||||
workorder_id: workorder[0].id,
|
// workorder_id: workorder[0].id,
|
||||||
production_id: workorder[0].product_id[0],
|
// production_id: workorder[0].product_id[0],
|
||||||
// workorder_id: workorder.id,
|
// // workorder_id: workorder.id,
|
||||||
}]);
|
// }]);
|
||||||
// console.log(workorder[0].routing_type);
|
// console.log(workorder[0].routing_type);
|
||||||
// console.log(workorder[0].production_id);
|
// console.log(workorder[0].production_id);
|
||||||
// const productionIDS = await this.orm.call('mrp.production', 'search', [[['id', '=', workorder[0].production_id[0]]]]);
|
// const productionIDS = await this.orm.call('mrp.production', 'search', [[['id', '=', workorder[0].production_id[0]]]]);
|
||||||
const productionIDS = await this.orm.call('mrp.workorder', 'search', [[["production_id", "=", workorder[0].production_id[0]]]]);
|
// const productionIDS = await this.orm.call('mrp.workorder', 'search', [[["production_id", "=", workorder[0].production_id[0]]]]);
|
||||||
// console.log('prooooooo', productionIDS);
|
// console.log('prooooooo', productionIDS);
|
||||||
// console.log('values', records[0].values[0]);
|
// console.log('values', records[0].values[0]);
|
||||||
productionIDS.forEach(async (data) => {
|
// productionIDS.forEach(async (data) => {
|
||||||
// 处理每一个数据
|
// // 处理每一个数据
|
||||||
// console.log(data);
|
// // console.log(data);
|
||||||
const updatetrayRecord = await this.orm.call("mrp.workorder", "write", [
|
// const updatetrayRecord = await this.orm.call("mrp.workorder", "write", [
|
||||||
[data],
|
// [data],
|
||||||
{
|
// {
|
||||||
tray_id: records[0].values[0].id,
|
// tray_id: records[0].values[0].id,
|
||||||
// tray_id: false,
|
// // tray_id: false,
|
||||||
}]);
|
// }]);
|
||||||
// console.log(updatetrayRecord)
|
// // console.log(updatetrayRecord)
|
||||||
});
|
// });
|
||||||
this.props.update(records[0].code);
|
this.props.update(records[0].code);
|
||||||
$('.o_form_button_save').click();
|
$('.o_form_button_save').click();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
odoo.define('my_module.barcode_handler', function (require) {
|
odoo.define('my_module.barcode_handler', function (require) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var core = require('web.core');
|
// var core = require('web.core');
|
||||||
var registry = require('web.field_registry');
|
var registry = require('web.field_registry');
|
||||||
var session = require('web.session');
|
var session = require('web.session');
|
||||||
var FieldChar = require('web.basic_fields').FieldChar;
|
var FieldChar = require('web.basic_fields').FieldChar;
|
||||||
|
|
||||||
var _t = core._t;
|
// var _t = core._t;
|
||||||
|
|
||||||
var BarcodeHandlerField = FieldChar.extend({
|
var BarcodeHandlerField = FieldChar.extend({
|
||||||
init: function () {
|
init: function () {
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ export class BarcodeHandlerField extends Component {
|
|||||||
// });
|
// });
|
||||||
await this.actionService.doAction(response.result);
|
await this.actionService.doAction(response.result);
|
||||||
} else {
|
} else {
|
||||||
console.error("Barcode not found or RPC call failed.");
|
// console.error("Barcode not found or RPC call failed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
<odoo>
|
<odoo>
|
||||||
<record id="view_tree_mrs_machine_tool_inherited" model="ir.ui.view">
|
<record id="view_tree_mrs_machine_tool_inherited" model="ir.ui.view">
|
||||||
<field name="name">sf_base_extension</field>
|
<field name="name">sf_base_extension</field>
|
||||||
<field name="model">sf.machine_tool</field>
|
<field name="model">maintenance.equipment</field>
|
||||||
<field name="inherit_id" ref="sf_base.sf_machine_tool_form"/>
|
<field name="inherit_id" ref="sf_maintenance.sf_hr_equipment_view_form"/>
|
||||||
<field eval="20" name="priority"/>
|
<field eval="20" name="priority"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<!-- <xpath expr="//field[@name='knife_type']" position="before">-->
|
<!-- <xpath expr="//field[@name='knife_type']" position="before">-->
|
||||||
<xpath expr="//form//notebook//page[1]" position="inside">
|
<xpath expr="//form//notebook//page[1]" position="after">
|
||||||
<!-- <xpath expr="//page[@name='other']" position="before">-->
|
<!-- <xpath expr="//page[@name='other']" position="before">-->
|
||||||
<notebook>
|
<!-- <notebook> -->
|
||||||
<page string="机床监控">
|
<page string="机床监控">
|
||||||
<group string='状态监控'>
|
<group string='状态监控'>
|
||||||
<group>
|
<group>
|
||||||
@@ -256,49 +256,51 @@
|
|||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
</notebook>
|
<!-- </notebook> -->
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="view_cutting_tool_inherited" model="ir.ui.view">
|
|
||||||
<field name="name">sf_cutting_tool_extension</field>
|
|
||||||
<field name="model">sf.cutting_tool.type</field>
|
|
||||||
<field name="inherit_id" ref="sf_base.form_sf_cutting_tool_type"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<xpath expr="//form//group" position="after">
|
|
||||||
<group string='刀具寿命'>
|
|
||||||
<group>
|
|
||||||
<field name="total_cut_time"/>
|
|
||||||
<field name="tool_position"/>
|
|
||||||
|
|
||||||
</group>
|
<!-- 刀具寿命 -->
|
||||||
<group>
|
<!-- <record id="view_cutting_tool_inherited" model="ir.ui.view"> -->
|
||||||
<field name="predict_life_time"/>
|
<!-- <field name="name">sf_cutting_tool_extension</field> -->
|
||||||
|
<!-- <field name="model">sf.cutting_tool.type</field> -->
|
||||||
|
<!-- <field name="inherit_id" ref="sf_base.form_sf_machine_tool_type"/> -->
|
||||||
|
<!-- <field name="arch" type="xml"> -->
|
||||||
|
<!-- <xpath expr="//form//group" position="after"> -->
|
||||||
|
<!-- <group string='刀具寿命'> -->
|
||||||
|
<!-- <group> -->
|
||||||
|
<!-- <field name="total_cut_time"/> -->
|
||||||
|
<!-- <field name="tool_position"/> -->
|
||||||
|
|
||||||
</group>
|
<!-- </group> -->
|
||||||
|
<!-- <group> -->
|
||||||
|
<!-- <field name="predict_life_time"/> -->
|
||||||
|
|
||||||
<div>
|
<!-- </group> -->
|
||||||
|
|
||||||
<div>
|
<!-- <div> -->
|
||||||
<field name='is_connect_tool_position' invisible='1'/>
|
|
||||||
<button string="绑定刀位" name="tool_connect_machine" type="object" confirm="是否确认绑定此刀位"
|
<!-- <div> -->
|
||||||
class="btn-primary"/>
|
<!-- <field name='is_connect_tool_position' invisible='1'/> -->
|
||||||
|
<!-- <button string="绑定刀位" name="tool_connect_machine" type="object" confirm="是否确认绑定此刀位" -->
|
||||||
|
<!-- class="btn-primary"/> -->
|
||||||
<!-- attrs='{"invisible": [("is_connect_tool_position","!=", -->
|
<!-- attrs='{"invisible": [("is_connect_tool_position","!=", -->
|
||||||
<!-- "False")]}' -->
|
<!-- "False")]}' -->
|
||||||
<span> </span>
|
<!-- <span> </span> -->
|
||||||
<button string="解绑刀位" name="tool_unconnect_machine" type="object" confirm="是否解绑此刀位"
|
<!-- <button string="解绑刀位" name="tool_unconnect_machine" type="object" confirm="是否解绑此刀位" -->
|
||||||
class="btn-primary"/>
|
<!-- class="btn-primary"/> -->
|
||||||
<!-- attrs='{"invisible": [("is_connect_tool_position","!=", -->
|
<!-- attrs='{"invisible": [("is_connect_tool_position","!=", -->
|
||||||
<!-- "False")]}' -->
|
<!-- "False")]}' -->
|
||||||
|
|
||||||
</div>
|
<!-- </div> -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
<!-- </div> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
</xpath>
|
<!-- </xpath> -->
|
||||||
</field>
|
<!-- </field> -->
|
||||||
</record>
|
<!-- </record> -->
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -1,3 +1 @@
|
|||||||
from . import models
|
from . import models
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
'views/mrp_views_menus.xml',
|
'views/mrp_views_menus.xml',
|
||||||
'views/mrp_production_addional_change.xml',
|
'views/mrp_production_addional_change.xml',
|
||||||
# 'views/mrp_maintenance_views.xml',
|
|
||||||
'views/mrp_routing_workcenter_view.xml',
|
'views/mrp_routing_workcenter_view.xml',
|
||||||
'views/production_line_view.xml',
|
'views/production_line_view.xml',
|
||||||
'views/mrp_workcenter_views.xml',
|
'views/mrp_workcenter_views.xml',
|
||||||
@@ -25,7 +24,6 @@
|
|||||||
'views/model_type_view.xml',
|
'views/model_type_view.xml',
|
||||||
'views/sf_maintenance_equipment.xml',
|
'views/sf_maintenance_equipment.xml',
|
||||||
|
|
||||||
|
|
||||||
],
|
],
|
||||||
'assets': {
|
'assets': {
|
||||||
|
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ class MrpProduction(models.Model):
|
|||||||
if i == 1 and route.routing_type == '获取CNC加工程序':
|
if i == 1 and route.routing_type == '获取CNC加工程序':
|
||||||
workorders_values.append(
|
workorders_values.append(
|
||||||
self.env['mrp.workorder'].json_workorder_str('', production, route))
|
self.env['mrp.workorder'].json_workorder_str('', production, route))
|
||||||
if route.is_repeat == True:
|
if route.is_repeat is True:
|
||||||
workorders_values.append(
|
workorders_values.append(
|
||||||
self.env['mrp.workorder'].json_workorder_str(k, production, route))
|
self.env['mrp.workorder'].json_workorder_str(k, production, route))
|
||||||
if i == processing_panel_len and route.routing_type == '解除装夹':
|
if i == processing_panel_len and route.routing_type == '解除装夹':
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from odoo import fields, models
|
|
||||||
import logging
|
import logging
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
class ResMrpRoutingWorkcenter(models.Model):
|
class ResMrpRoutingWorkcenter(models.Model):
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from odoo import api, fields, models
|
import datetime
|
||||||
from datetime import datetime
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
from odoo import fields, models
|
||||||
from odoo.addons.resource.models.resource import Intervals
|
from odoo.addons.resource.models.resource import Intervals
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import os
|
import os
|
||||||
import json
|
import base64
|
||||||
import math
|
import math
|
||||||
import requests
|
import requests
|
||||||
import logging
|
import logging
|
||||||
import base64
|
|
||||||
# import subprocess
|
# import subprocess
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
@@ -304,7 +303,7 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
|
|
||||||
# 验证坯料序列号是否正确
|
# 验证坯料序列号是否正确
|
||||||
def pro_code_is_ok(self, barcode):
|
def pro_code_is_ok(self, barcode):
|
||||||
if barcode != False:
|
if barcode is not False:
|
||||||
if barcode != self.pro_code:
|
if barcode != self.pro_code:
|
||||||
raise UserError('坯料序列号错误')
|
raise UserError('坯料序列号错误')
|
||||||
return False
|
return False
|
||||||
@@ -623,7 +622,7 @@ class CNCprocessing(models.Model):
|
|||||||
if os.path.splitext(f)[1] == ".pdf":
|
if os.path.splitext(f)[1] == ".pdf":
|
||||||
full_path = os.path.join(serverdir, root, f)
|
full_path = os.path.join(serverdir, root, f)
|
||||||
logging.info('pdf:%s' % full_path)
|
logging.info('pdf:%s' % full_path)
|
||||||
if full_path != False:
|
if full_path is not False:
|
||||||
if not cnc_processing.workorder_id.cnc_worksheet:
|
if not cnc_processing.workorder_id.cnc_worksheet:
|
||||||
cnc_processing.workorder_id.cnc_worksheet = base64.b64encode(
|
cnc_processing.workorder_id.cnc_worksheet = base64.b64encode(
|
||||||
open(full_path, 'rb').read())
|
open(full_path, 'rb').read())
|
||||||
|
|||||||
@@ -1,16 +1,13 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from odoo import models, fields, api, _
|
|
||||||
from odoo.exceptions import ValidationError
|
|
||||||
from odoo.modules import get_resource_path
|
|
||||||
from odoo.addons.sf_base.commons.common import Common
|
|
||||||
from OCC.Extend.DataExchange import read_step_file
|
|
||||||
from OCC.Extend.DataExchange import write_stl_file
|
|
||||||
import logging
|
import logging
|
||||||
import base64
|
import base64
|
||||||
import hashlib
|
import hashlib
|
||||||
import os
|
import os
|
||||||
import requests
|
from odoo import models, fields, api, _
|
||||||
import json
|
from odoo.exceptions import ValidationError
|
||||||
|
from odoo.modules import get_resource_path
|
||||||
|
from OCC.Extend.DataExchange import read_step_file
|
||||||
|
from OCC.Extend.DataExchange import write_stl_file
|
||||||
|
|
||||||
|
|
||||||
class ResProductMo(models.Model):
|
class ResProductMo(models.Model):
|
||||||
@@ -204,16 +201,6 @@ class ResProductMo(models.Model):
|
|||||||
self.cutting_tool_blade_depth = self.specification_id.blade_depth
|
self.cutting_tool_blade_depth = self.specification_id.blade_depth
|
||||||
self.cutting_tool_cut_depth = self.specification_id.cutting_depth
|
self.cutting_tool_cut_depth = self.specification_id.cutting_depth
|
||||||
self.cutting_speed_ids = self.cutting_tool_model_id.cutting_speed_ids
|
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.
|
|
||||||
# for tooth in self.cutting_tool_model_id.feed_per_tooth_ids:
|
|
||||||
# print(int(tooth.blade_diameter))
|
|
||||||
# print(int(self.specification_id.blade_diameter))
|
|
||||||
# if int(tooth.blade_diameter) == int(self.specification_id.blade_diameter):
|
|
||||||
# self.feed_per_tooth_ids = [(0, 0, {
|
|
||||||
# 'cutting_speed': tooth.cutting_speed,
|
|
||||||
# 'machining_method': tooth.machining_method,
|
|
||||||
# 'blade_diameter': tooth.blade_diameter,
|
|
||||||
# 'materials_type_id': tooth.materials_type_id.id})]
|
|
||||||
self.feed_per_tooth_ids = self.cutting_tool_model_id.feed_per_tooth_ids.filtered(
|
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))
|
lambda r: int(r.blade_diameter) == int(self.specification_id.blade_diameter))
|
||||||
elif self.cutting_tool_type == '夹头':
|
elif self.cutting_tool_type == '夹头':
|
||||||
@@ -298,12 +285,12 @@ class ResProductMo(models.Model):
|
|||||||
self.cutting_tool_flange_length = self.specification_id.flange_shank_length
|
self.cutting_tool_flange_length = self.specification_id.flange_shank_length
|
||||||
self.cutting_tool_shank_outer_diameter = self.specification_id.handle_external_diameter
|
self.cutting_tool_shank_outer_diameter = self.specification_id.handle_external_diameter
|
||||||
self.cutting_tool_shank_inner_diameter = self.specification_id.handle_inside_diameter
|
self.cutting_tool_shank_inner_diameter = self.specification_id.handle_inside_diameter
|
||||||
self.suitable_machining_method_ids = [(6, 0,
|
self.suitable_machining_method_ids = [(6, 0, [])] if not \
|
||||||
[])] if not self.cutting_tool_model_id.suitable_machining_method_ids else [
|
self.cutting_tool_model_id.suitable_machining_method_ids \
|
||||||
(6, 0, self.cutting_tool_model_id.suitable_machining_method_ids.ids)]
|
else [(6, 0, self.cutting_tool_model_id.suitable_machining_method_ids.ids)]
|
||||||
self.blade_tip_characteristics_id = [(6, 0,
|
self.blade_tip_characteristics_id = [(6, 0, [])] if not \
|
||||||
[])] if not self.cutting_tool_model_id.blade_tip_characteristics_id else [
|
self.cutting_tool_model_id.blade_tip_characteristics_id \
|
||||||
(6, 0, self.cutting_tool_model_id.blade_tip_characteristics_id.ids)]
|
else [(6, 0, self.cutting_tool_model_id.blade_tip_characteristics_id.ids)]
|
||||||
|
|
||||||
self.handle_type_ids = [(6, 0,
|
self.handle_type_ids = [(6, 0,
|
||||||
[])] if not self.cutting_tool_model_id.handle_type_ids else [
|
[])] if not self.cutting_tool_model_id.handle_type_ids else [
|
||||||
@@ -358,89 +345,33 @@ class ResProductMo(models.Model):
|
|||||||
self.cutting_speed_ids = False
|
self.cutting_speed_ids = False
|
||||||
self.feed_per_tooth_ids = False
|
self.feed_per_tooth_ids = False
|
||||||
|
|
||||||
# @api.constrains('suitable_machining_method_ids')
|
@api.constrains('fit_blade_shape_id', 'suitable_machining_method_ids', 'blade_tip_characteristics_id',
|
||||||
# def _check_suitable_machining_method_ids(self):
|
'handle_type_ids', 'cutting_direction_ids', 'suitable_coolant_ids', 'compaction_way_ids')
|
||||||
# for record in self:
|
def _check_cutting_tool_ability(self):
|
||||||
# if len(record.suitable_machining_method_ids) == 0 and self.cutting_tool_type == '整体式刀具':
|
if self.cutting_tool_type in ['整体式刀具', '刀片', '刀杆', '刀盘']:
|
||||||
# raise ValidationError("适合加工方式不能为空!")
|
if self.cutting_tool_type in ['刀片', '刀杆', '刀盘']:
|
||||||
#
|
if not self.fit_blade_shape_id:
|
||||||
# @api.constrains('blade_tip_characteristics_ids')
|
raise ValidationError("请选择适配刀片形状")
|
||||||
# def _check_blade_tip_characteristics_ids(self):
|
if self.cutting_tool_type in ['刀杆', '刀盘']:
|
||||||
# for record in self:
|
if not self.compaction_way_ids:
|
||||||
# if len(record.blade_tip_characteristics_ids) == 0 and self.cutting_tool_type == '整体式刀具':
|
raise ValidationError("请选择压紧方式")
|
||||||
# raise ValidationError("刀尖特征不能为空!")
|
if self.cutting_tool_type == '刀片':
|
||||||
# if len(record.blade_tip_characteristics_ids) > 1 and self.cutting_tool_type == '整体式刀具':
|
if not self.suitable_coolant_ids:
|
||||||
# raise ValidationError("刀尖特征只能单选!")
|
raise ValidationError("请选择适合冷却液")
|
||||||
#
|
elif self.cutting_tool_type == '整体式刀具':
|
||||||
# @api.constrains('handle_type_ids')
|
if not self.handle_type_ids:
|
||||||
# def _check_handle_type_ids(self):
|
raise ValidationError("请选择柄部类型")
|
||||||
# for record in self:
|
if not self.suitable_coolant_ids:
|
||||||
# if len(record.handle_type_ids) == 0 and self.cutting_tool_type == '整体式刀具':
|
raise ValidationError("请选择适合冷却液")
|
||||||
# raise ValidationError("柄部类型不能为空!")
|
if not self.suitable_machining_method_ids:
|
||||||
# if len(record.handle_type_ids) > 1 and self.cutting_tool_type == '整体式刀具':
|
raise ValidationError("请选择适合加工方式")
|
||||||
# raise ValidationError("柄部类型只能单选!")
|
if not self.blade_tip_characteristics_id:
|
||||||
#
|
raise ValidationError("请选择刀尖特征")
|
||||||
# @api.constrains('cutting_direction_ids')
|
if not self.cutting_direction_ids:
|
||||||
# def _check_cutting_direction_ids(self):
|
raise ValidationError("请选择走刀方向")
|
||||||
# for record in self:
|
|
||||||
# if len(record.cutting_direction_ids) == 0 and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("走刀方向不能为空!")
|
|
||||||
#
|
|
||||||
# @api.constrains('suitable_coolant_ids')
|
|
||||||
# def _check_suitable_coolant_ids(self):
|
|
||||||
# for record in self:
|
|
||||||
# if not record.suitable_coolant_ids and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("适合冷却液不能为空!")
|
|
||||||
#
|
|
||||||
# @api.constrains('cutting_tool_total_length')
|
|
||||||
# def _check_cutting_tool_total_length(self):
|
|
||||||
# if self.cutting_tool_total_length <= 0 and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("总长度不能为0")
|
|
||||||
#
|
|
||||||
# @api.constrains('cutting_tool_shank_length')
|
|
||||||
# def _check_cutting_tool_shank_length(self):
|
|
||||||
# if self.cutting_tool_shank_length <= 0 and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("柄部长度不能为0")
|
|
||||||
#
|
|
||||||
# @api.constrains('cutting_tool_blade_length')
|
|
||||||
# def _check_cutting_tool_blade_length(self):
|
|
||||||
# if self.cutting_tool_blade_length <= 0 and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("刃部长度不能为0")
|
|
||||||
#
|
|
||||||
# @api.constrains('cutting_tool_blade_number')
|
|
||||||
# def _check_cutting_tool_blade_number(self):
|
|
||||||
# if self.cutting_tool_blade_number <= 0 and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("刃数不能为0")
|
|
||||||
#
|
|
||||||
# @api.constrains('integral_shank_diameter')
|
|
||||||
# def _check_integral_shank_diameter(self):
|
|
||||||
# if self.integral_shank_diameter <= 0 and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("柄部直径不能为0")
|
|
||||||
#
|
|
||||||
# @api.constrains('integral_blade_diameter')
|
|
||||||
# def _check_integral_blade_diameter(self):
|
|
||||||
# if self.integral_blade_diameter <= 0 and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("刃部直径不能为0")
|
|
||||||
#
|
|
||||||
# @api.constrains('integral_run_out_accuracy_min')
|
|
||||||
# def _check_integral_blade_diameter(self):
|
|
||||||
# if self.integral_run_out_accuracy_min <= 0 and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("端跳精度最小(min)不能为0")
|
|
||||||
|
|
||||||
cutting_speed_ids = fields.One2many('sf.cutting.speed', 'product_template_id', string='切削速度Vc')
|
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')
|
feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'product_template_id', string='每齿走刀量fz')
|
||||||
|
|
||||||
# @api.constrains('suitable_machining_method_ids')
|
|
||||||
# def _check_suitable_machining_method_ids(self):
|
|
||||||
# for record in self:
|
|
||||||
# if len(record.suitable_machining_method_ids) == 0 and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("适合加工方式不能为空!")
|
|
||||||
|
|
||||||
# @api.constrains('integral_run_out_accuracy_max')
|
|
||||||
# def _check_integral_run_out_accuracy_max(self):
|
|
||||||
# if self.integral_run_out_accuracy_max <= 0 and self.cutting_tool_type == '整体式刀具':
|
|
||||||
# raise ValidationError("端跳精度最大(max)不能为0")
|
|
||||||
|
|
||||||
cutting_tool_diameter = fields.Float('直径(mm)')
|
cutting_tool_diameter = fields.Float('直径(mm)')
|
||||||
cutting_tool_rear_angle = fields.Integer('后角(°)')
|
cutting_tool_rear_angle = fields.Integer('后角(°)')
|
||||||
cutting_tool_main_included_angle = fields.Integer('主偏角(°)')
|
cutting_tool_main_included_angle = fields.Integer('主偏角(°)')
|
||||||
@@ -758,26 +689,19 @@ class ResProductMo(models.Model):
|
|||||||
'model_file': '' if not item['model_file'] else base64.b64decode(item['model_file']),
|
'model_file': '' if not item['model_file'] else base64.b64decode(item['model_file']),
|
||||||
'model_name': attachment.name,
|
'model_name': attachment.name,
|
||||||
'upload_model_file': [(6, 0, [attachment.id])],
|
'upload_model_file': [(6, 0, [attachment.id])],
|
||||||
# 'tag_ids': [(6, 0, [t.id for t in account_template.tag_ids])],
|
|
||||||
# 'single_manufacturing': True,
|
|
||||||
# 'tracking': 'serial',
|
|
||||||
'list_price': item['price'],
|
'list_price': item['price'],
|
||||||
# 'categ_id': self.env.ref('sf_dlm.product_category_finished_sf').id,
|
|
||||||
'materials_id': self.env['sf.production.materials'].search(
|
'materials_id': self.env['sf.production.materials'].search(
|
||||||
[('materials_no', '=', item['texture_code'])]).id,
|
[('materials_no', '=', item['texture_code'])]).id,
|
||||||
'materials_type_id': self.env['sf.materials.model'].search(
|
'materials_type_id': self.env['sf.materials.model'].search(
|
||||||
[('materials_no', '=', item['texture_type_code'])]).id,
|
[('materials_no', '=', item['texture_type_code'])]).id,
|
||||||
# 'model_surface_process_ids': self.get_production_process_id(item['surface_process_code']),
|
|
||||||
'model_process_parameters_ids': [(6, 0, [])] if not item.get(
|
'model_process_parameters_ids': [(6, 0, [])] if not item.get(
|
||||||
'process_parameters_code') else self.get_process_parameters_id(item['process_parameters_code']),
|
'process_parameters_code') else self.get_process_parameters_id(item['process_parameters_code']),
|
||||||
'model_remark': item['remark'],
|
'model_remark': item['remark'],
|
||||||
'default_code': '%s-%s' % (order_number, i),
|
'default_code': '%s-%s' % (order_number, i),
|
||||||
# 'barcode': item['barcode'],
|
|
||||||
'active': True,
|
'active': True,
|
||||||
# 'route_ids': self._get_routes('')
|
|
||||||
}
|
}
|
||||||
copy_product_id.sudo().write(vals)
|
copy_product_id.sudo().write(vals)
|
||||||
# product_id.product_tmpl_id.active = False
|
product_id.product_tmpl_id.active = False
|
||||||
return copy_product_id
|
return copy_product_id
|
||||||
|
|
||||||
def _get_ids(self, param):
|
def _get_ids(self, param):
|
||||||
@@ -833,12 +757,6 @@ class ResProductMo(models.Model):
|
|||||||
'materials_id': materials_id.id,
|
'materials_id': materials_id.id,
|
||||||
'materials_type_id': materials_type_id.id,
|
'materials_type_id': materials_type_id.id,
|
||||||
'is_bfm': True,
|
'is_bfm': True,
|
||||||
# 'route_ids': self._get_routes(route_type),
|
|
||||||
# 'categ_id': self.env.ref('sf_dlm.product_category_embryo_sf').id,
|
|
||||||
# 'model_surface_process_id': self.env['sf.production.process'].search(
|
|
||||||
# [('process_encode', '=', item['surface_process_code'])]).id,
|
|
||||||
# 'model_process_parameters_id': self.env['sf.processing.technology'].search(
|
|
||||||
# [('process_encode', '=', item['process_parameters_code'])]).id,
|
|
||||||
'active': True
|
'active': True
|
||||||
}
|
}
|
||||||
# 外协和采购生成的坯料需要根据材料型号绑定供应商
|
# 外协和采购生成的坯料需要根据材料型号绑定供应商
|
||||||
@@ -850,8 +768,6 @@ class ResProductMo(models.Model):
|
|||||||
partner = self.env['res.partner'].search([('id', '=', supplier.partner_id.id)])
|
partner = self.env['res.partner'].search([('id', '=', supplier.partner_id.id)])
|
||||||
partner.is_subcontractor = True
|
partner.is_subcontractor = True
|
||||||
no_bom_copy_product_id.write(vals)
|
no_bom_copy_product_id.write(vals)
|
||||||
logging.info('no_bom_copy_product_id-vals:%s' % vals)
|
|
||||||
# product_id.product_tmpl_id.active = False
|
|
||||||
return no_bom_copy_product_id
|
return no_bom_copy_product_id
|
||||||
|
|
||||||
@api.model_create_multi
|
@api.model_create_multi
|
||||||
@@ -956,3 +872,11 @@ class SfMaintenanceEquipmentTool(models.Model):
|
|||||||
alarm_value = fields.Char('报警值')
|
alarm_value = fields.Char('报警值')
|
||||||
used_value = fields.Char('已使用值')
|
used_value = fields.Char('已使用值')
|
||||||
code = fields.Char('机床刀位号')
|
code = fields.Char('机床刀位号')
|
||||||
|
|
||||||
|
name = fields.Char('', compute='_compute_name')
|
||||||
|
|
||||||
|
@api.depends('code')
|
||||||
|
def _compute_name(self):
|
||||||
|
for record in self:
|
||||||
|
if record.code:
|
||||||
|
record.name = record.code
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import base64
|
import base64
|
||||||
|
from collections import defaultdict, namedtuple
|
||||||
import logging
|
import logging
|
||||||
|
import json
|
||||||
|
from re import split as regex_split
|
||||||
from re import findall as regex_findall
|
from re import findall as regex_findall
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from re import split as regex_split
|
|
||||||
import requests
|
import requests
|
||||||
from odoo import SUPERUSER_ID, _, api, fields, models
|
from odoo import SUPERUSER_ID, _, api, fields, models
|
||||||
from odoo.tools import float_compare
|
from odoo.tools import float_compare
|
||||||
from collections import defaultdict, namedtuple
|
|
||||||
from odoo.addons.stock.models.stock_rule import ProcurementException
|
from odoo.addons.stock.models.stock_rule import ProcurementException
|
||||||
from odoo.addons.sf_base.commons.common import Common
|
from odoo.addons.sf_base.commons.common import Common
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
@@ -517,8 +518,8 @@ class ReStockMove(models.Model):
|
|||||||
'inner_diameter': item.product_id.cutting_tool_inner_diameter,
|
'inner_diameter': item.product_id.cutting_tool_inner_diameter,
|
||||||
'cooling_suit_type_ids': item.product_id.cooling_suit_type_ids,
|
'cooling_suit_type_ids': item.product_id.cooling_suit_type_ids,
|
||||||
'er_size_model': item.product_id.cutting_tool_er_size_model,
|
'er_size_model': item.product_id.cutting_tool_er_size_model,
|
||||||
'image': '' if not item.product_id.image_1920 else base64.b64encode(item.product_id.image_1920).decode(
|
'image': '' if not item.product_id.image_1920 else
|
||||||
'utf-8'),
|
base64.b64encode(item.product_id.image_1920).decode('utf-8'),
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
if item.product_id.industry_code:
|
if item.product_id.industry_code:
|
||||||
|
|||||||
@@ -13,15 +13,16 @@ class CustomKanbanController extends KanbanController {
|
|||||||
|
|
||||||
async setup() {
|
async setup() {
|
||||||
super.setup();
|
super.setup();
|
||||||
console.log('99999999111');
|
// console.log('99999999111');
|
||||||
this.workOrders = await this.getAllWorkOrders();
|
this.workOrders = await this.getAllWorkOrders();
|
||||||
this.workOrdersNew = this.workOrders;
|
// this.workOrdersNew = this.workOrders;
|
||||||
// console.log('lines222222222', this.workOrders);
|
// console.log('lines222222222', this.workOrders);
|
||||||
//
|
//
|
||||||
// console.log(typeof this.workOrders);
|
// console.log(typeof this.workOrders);
|
||||||
// console.log(Array.isArray(this.workOrders));
|
// console.log(Array.isArray(this.workOrders));
|
||||||
//
|
//
|
||||||
// console.log(this.workOrders.every(order => typeof order === 'object' && order.id !== undefined));
|
// console.log(this.workOrders.every(order =>
|
||||||
|
// typeof order === 'object' && order.id !== undefined));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -38,14 +39,14 @@ class CustomKanbanController extends KanbanController {
|
|||||||
const id = button.getAttribute('data-id');
|
const id = button.getAttribute('data-id');
|
||||||
|
|
||||||
console.log('true_id', id);
|
console.log('true_id', id);
|
||||||
const context = {production_line_show: 'shengchanxian1'}
|
// const context = {production_line_show: 'shengchanxian1'}
|
||||||
this.env.services.rpc('/web/dataset/call_kw', {
|
this.env.services.rpc('/web/dataset/call_kw', {
|
||||||
model: 'mrp.workcenter',
|
model: 'mrp.workcenter',
|
||||||
method: 'search_read',
|
method: 'search_read',
|
||||||
args: [[], ['id']],
|
args: [[], ['id']],
|
||||||
kwargs: {}
|
kwargs: {}
|
||||||
}).then((records) => {
|
}).then((records) => {
|
||||||
console.log(records)
|
// console.log(records)
|
||||||
const ids = records.map(record => record.id);
|
const ids = records.map(record => record.id);
|
||||||
const context = {production_line_show: id};
|
const context = {production_line_show: id};
|
||||||
this.env.services.rpc('/web/dataset/call_kw', {
|
this.env.services.rpc('/web/dataset/call_kw', {
|
||||||
@@ -54,7 +55,7 @@ class CustomKanbanController extends KanbanController {
|
|||||||
args: [ids, context],
|
args: [ids, context],
|
||||||
kwargs: {}
|
kwargs: {}
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
console.log('response', response);
|
// console.log('response', response);
|
||||||
location.reload();
|
location.reload();
|
||||||
window.onload = function () {
|
window.onload = function () {
|
||||||
button.classList.add('choose')
|
button.classList.add('choose')
|
||||||
@@ -76,7 +77,7 @@ class CustomKanbanController extends KanbanController {
|
|||||||
// args: [],
|
// args: [],
|
||||||
// kwargs: {},
|
// kwargs: {},
|
||||||
// });
|
// });
|
||||||
console.log('response', response);
|
// console.log('response', response);
|
||||||
// console.log('response1', response1);
|
// console.log('response1', response1);
|
||||||
// 你可以在这里处理响应,例如将其存储在控制器的状态中
|
// 你可以在这里处理响应,例如将其存储在控制器的状态中
|
||||||
return response;
|
return response;
|
||||||
|
|||||||
@@ -3,3 +3,4 @@ from . import res_config_setting
|
|||||||
from . import sync_common
|
from . import sync_common
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class FtpController():
|
|||||||
self.ftp.connect(host, port)
|
self.ftp.connect(host, port)
|
||||||
self.ftp.login(username, password)
|
self.ftp.login(username, password)
|
||||||
logging.info("ftp连接成功")
|
logging.info("ftp连接成功")
|
||||||
except:
|
except Exception:
|
||||||
logging.info("ftp连接失败")
|
logging.info("ftp连接失败")
|
||||||
|
|
||||||
# 下载目录下的文件
|
# 下载目录下的文件
|
||||||
@@ -35,7 +35,7 @@ class FtpController():
|
|||||||
server = os.path.join(serverdir, file)
|
server = os.path.join(serverdir, file)
|
||||||
if file.find(".") != -1:
|
if file.find(".") != -1:
|
||||||
self.download_file(server, file)
|
self.download_file(server, file)
|
||||||
except:
|
except Exception:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# 下载指定目录下的指定文件
|
# 下载指定目录下的指定文件
|
||||||
|
|||||||
@@ -1,16 +1,19 @@
|
|||||||
from odoo import models, fields, api
|
|
||||||
from odoo.modules import get_resource_path
|
|
||||||
from OCC.Extend.DataExchange import read_step_file
|
|
||||||
from OCC.Extend.DataExchange import write_stl_file
|
|
||||||
from odoo.exceptions import ValidationError, UserError
|
|
||||||
from odoo.addons.sf_base.commons.common import Common
|
|
||||||
from datetime import datetime
|
|
||||||
import logging
|
import logging
|
||||||
import base64
|
import base64
|
||||||
import hashlib
|
import hashlib
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
|
from datetime import datetime
|
||||||
import requests
|
import requests
|
||||||
|
from OCC.Extend.DataExchange import read_step_file
|
||||||
|
from OCC.Extend.DataExchange import write_stl_file
|
||||||
|
from odoo import models, fields, api
|
||||||
|
from odoo.modules import get_resource_path
|
||||||
|
from odoo.exceptions import ValidationError, UserError
|
||||||
|
from odoo.addons.sf_base.commons.common import Common
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class QuickEasyOrder(models.Model):
|
class QuickEasyOrder(models.Model):
|
||||||
@@ -209,7 +212,7 @@ class QuickEasyOrder(models.Model):
|
|||||||
self_machining_bom = self.env['mrp.bom'].bom_create(self_machining_embryo, 'normal', False)
|
self_machining_bom = self.env['mrp.bom'].bom_create(self_machining_embryo, 'normal', False)
|
||||||
# 创建坯料里bom的组件
|
# 创建坯料里bom的组件
|
||||||
self_machining_bom_line = self_machining_bom.bom_create_line(self_machining_embryo)
|
self_machining_bom_line = self_machining_bom.bom_create_line(self_machining_embryo)
|
||||||
if self_machining_bom_line == False:
|
if self_machining_bom_line is False:
|
||||||
self.cr.rollback()
|
self.cr.rollback()
|
||||||
return UserError('该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配')
|
return UserError('该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配')
|
||||||
# 产品配置bom
|
# 产品配置bom
|
||||||
@@ -225,7 +228,7 @@ class QuickEasyOrder(models.Model):
|
|||||||
# 创建坯料的bom的组件
|
# 创建坯料的bom的组件
|
||||||
outsource_bom_line = outsource_bom.with_user(
|
outsource_bom_line = outsource_bom.with_user(
|
||||||
self.env.ref("base.user_admin")).bom_create_line(outsource_embryo)
|
self.env.ref("base.user_admin")).bom_create_line(outsource_embryo)
|
||||||
if outsource_bom_line == False:
|
if outsource_bom_line is False:
|
||||||
self.cr.rollback()
|
self.cr.rollback()
|
||||||
return UserError('该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配')
|
return UserError('该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配')
|
||||||
# 产品配置bom
|
# 产品配置bom
|
||||||
|
|||||||
@@ -1,23 +1,28 @@
|
|||||||
from odoo import models, fields
|
|
||||||
import datetime
|
import datetime
|
||||||
import base64
|
import base64
|
||||||
import logging
|
from odoo import models, fields
|
||||||
|
|
||||||
|
|
||||||
class ReSaleOrder(models.Model):
|
class ReSaleOrder(models.Model):
|
||||||
_inherit = 'sale.order'
|
_inherit = 'sale.order'
|
||||||
|
|
||||||
deadline_of_delivery = fields.Date('订单交期')
|
deadline_of_delivery = fields.Date('订单交期', tracking=True)
|
||||||
person_of_delivery = fields.Char('交货人')
|
person_of_delivery = fields.Char('交货人')
|
||||||
telephone_of_delivery = fields.Char('交货人电话号码')
|
telephone_of_delivery = fields.Char('交货人电话号码')
|
||||||
address_of_delivery = fields.Char('交货人地址')
|
address_of_delivery = fields.Char('交货人地址')
|
||||||
payments_way = fields.Selection([('现结', '现结'), ('月结', '月结')], '结算方式', default='现结')
|
payments_way = fields.Selection([('现结', '现结'), ('月结', '月结')], '结算方式', default='现结', tracking=True)
|
||||||
pay_way = fields.Selection([('转账', '转账'), ('微信', '微信'), ('支付宝', '支付宝')], '支付方式')
|
pay_way = fields.Selection([('转账', '转账'), ('微信', '微信'), ('支付宝', '支付宝')], '支付方式')
|
||||||
|
|
||||||
|
payment_term_id = fields.Many2one(
|
||||||
|
comodel_name='account.payment.term',
|
||||||
|
string="交付条件",
|
||||||
|
compute='_compute_payment_term_id',
|
||||||
|
store=True, readonly=False, precompute=True, check_company=True, tracking=True,
|
||||||
|
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]")
|
||||||
|
|
||||||
# 业务平台分配工厂后在智能工厂先创建销售订单
|
# 业务平台分配工厂后在智能工厂先创建销售订单
|
||||||
def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address,
|
def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address,
|
||||||
deadline_of_delivery, payments_way, pay_way):
|
deadline_of_delivery, payments_way, pay_way):
|
||||||
logging.info('---------sale_order_create------')
|
|
||||||
now_time = datetime.datetime.now()
|
now_time = datetime.datetime.now()
|
||||||
partner = self.get_customer()
|
partner = self.get_customer()
|
||||||
order_id = self.env['sale.order'].sudo().create({
|
order_id = self.env['sale.order'].sudo().create({
|
||||||
@@ -63,4 +68,3 @@ class ResaleOrderLine(models.Model):
|
|||||||
_inherit = 'sale.order.line'
|
_inherit = 'sale.order.line'
|
||||||
|
|
||||||
model_glb_file = fields.Binary('模型的glb文件')
|
model_glb_file = fields.Binary('模型的glb文件')
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
from odoo import fields, models, api
|
from odoo import fields, models, api
|
||||||
from odoo import SUPERUSER_ID
|
from odoo import SUPERUSER_ID
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
# class FunctionalCuttingToolEntity(models.Model):
|
# class FunctionalCuttingToolEntity(models.Model):
|
||||||
@@ -13,13 +16,42 @@ class FunctionalCuttingToolEntity(models.Model):
|
|||||||
_description = '功能刀具列表'
|
_description = '功能刀具列表'
|
||||||
|
|
||||||
# code = fields.Char('序列号')
|
# code = fields.Char('序列号')
|
||||||
|
name = fields.Char(related='functional_tool_name_id.name')
|
||||||
|
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称', readonly=True)
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
||||||
name = fields.Char(related='barcode_id.name')
|
sf_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号')
|
||||||
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True)
|
sf_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型',
|
||||||
mrs_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号')
|
|
||||||
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型',
|
|
||||||
group_expand='_read_group_mrs_cutting_tool_type_id', compute_sudo=True)
|
group_expand='_read_group_mrs_cutting_tool_type_id', compute_sudo=True)
|
||||||
|
|
||||||
|
functional_tool_diameter = fields.Integer(string='刀具直径(mm)', readonly=True)
|
||||||
|
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True)
|
||||||
|
coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True)
|
||||||
|
new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True)
|
||||||
|
tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True)
|
||||||
|
functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True)
|
||||||
|
effective_length = fields.Float(string='有效长(mm)', readonly=True)
|
||||||
|
tool_room_num = fields.Integer(string='刀具房数量', readonly=True, )
|
||||||
|
line_edge_knife_library_num = fields.Integer(string='线边刀库数量', readonly=True)
|
||||||
|
machine_knife_library_num = fields.Integer(string='机内刀库数量', readonly=True)
|
||||||
|
max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True)
|
||||||
|
alarm_value = fields.Integer(string='报警值(min)', readonly=True)
|
||||||
|
used_value = fields.Integer(string='已使用值(min)', readonly=True)
|
||||||
|
functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')],
|
||||||
|
string='状态', store=True, default='正常')
|
||||||
|
current_location_id = fields.Many2one('stock.location', string='当前位置', readonly=True)
|
||||||
|
image = fields.Binary('图片', readonly=True)
|
||||||
|
|
||||||
|
@api.depends('current_location_id')
|
||||||
|
def _compute_location_num(self):
|
||||||
|
"""
|
||||||
|
计算库存位置数量
|
||||||
|
"""
|
||||||
|
for obj in self:
|
||||||
|
if obj.current_location_id.name in ('组装后', '刀具房'):
|
||||||
|
obj.tool_room_num = 1
|
||||||
|
obj.line_edge_knife_library_num = 0
|
||||||
|
obj.machine_knife_library_num = 0
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _read_group_mrs_cutting_tool_type_id(self, categories, domain, order):
|
def _read_group_mrs_cutting_tool_type_id(self, categories, domain, order):
|
||||||
mrs_cutting_tool_type_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
mrs_cutting_tool_type_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
||||||
@@ -28,64 +60,44 @@ class FunctionalCuttingToolEntity(models.Model):
|
|||||||
# 整体式刀具型号
|
# 整体式刀具型号
|
||||||
cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True,
|
cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '整体式刀具')])
|
domain=[('cutting_tool_material_id', '=', '整体式刀具')])
|
||||||
|
|
||||||
# 刀片型号
|
# 刀片型号
|
||||||
cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True,
|
cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀片')])
|
domain=[('cutting_tool_material_id', '=', '刀片')])
|
||||||
|
|
||||||
# 刀杆型号
|
# 刀杆型号
|
||||||
cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True,
|
cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀杆')])
|
domain=[('cutting_tool_material_id', '=', '刀杆')])
|
||||||
|
|
||||||
# 刀盘型号
|
# 刀盘型号
|
||||||
cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True,
|
cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀盘')])
|
domain=[('cutting_tool_material_id', '=', '刀盘')])
|
||||||
|
|
||||||
# 刀柄型号
|
# 刀柄型号
|
||||||
cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True,
|
cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀柄')])
|
domain=[('cutting_tool_material_id', '=', '刀柄')])
|
||||||
|
|
||||||
# 夹头型号
|
# 夹头型号
|
||||||
cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True,
|
cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '夹头')])
|
domain=[('cutting_tool_material_id', '=', '夹头')])
|
||||||
|
|
||||||
diameter = fields.Float('直径(mm)')
|
whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True)
|
||||||
tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')],
|
L_D_number = fields.Float(string='L/D值(mm)', readonly=True)
|
||||||
string='刀具等级')
|
hiding_length = fields.Float(string='避空长(mm)', readonly=True)
|
||||||
machining_accuracy = fields.Float('加工精度(mm)')
|
cut_time = fields.Integer(string='已切削时间(min)', readonly=True)
|
||||||
tool_length = fields.Float('装刀长(mm)')
|
cut_length = fields.Float(string='已切削长度(mm)', readonly=True)
|
||||||
blade_number = fields.Integer('刃数')
|
cut_number = fields.Integer(string='已切削次数', readonly=True)
|
||||||
integral_blade_length = fields.Float('整体刃长(mm)')
|
|
||||||
effective_blade_length = fields.Float('有效刃长(mm)')
|
|
||||||
max_life = fields.Float('最大寿命值')
|
|
||||||
is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀')
|
|
||||||
applicable_range = fields.Char('适用范围')
|
|
||||||
image = fields.Binary('图片')
|
|
||||||
|
|
||||||
suitable_machining_method_ids = fields.Many2many('maintenance.equipment.image',
|
suitable_machining_method_ids = fields.Many2many(
|
||||||
'rel_machining_product_template_tool_entity', '适合加工方式',
|
'maintenance.equipment.image', 'rel_machining_product_template_tool_entity', '适合加工方式',
|
||||||
domain=[('type', '=', '加工能力')],
|
domain=[('type', '=', '加工能力')], related='cutting_tool_integral_model_id.suitable_machining_method_ids')
|
||||||
related='cutting_tool_integral_model_id.suitable_machining_method_ids')
|
blade_tip_characteristics_id = fields.Many2many(
|
||||||
|
'maintenance.equipment.image', 'rel_blade_tip_product_template_tool_entity', '刀尖特征',
|
||||||
blade_tip_characteristics_id = fields.Many2many('maintenance.equipment.image',
|
domain=[('type', '=', '刀尖特征')], related='cutting_tool_integral_model_id.blade_tip_characteristics_id')
|
||||||
'rel_blade_tip_product_template_tool_entity', '刀尖特征',
|
handle_type_ids = fields.Many2many(
|
||||||
domain=[('type', '=', '刀尖特征')],
|
'maintenance.equipment.image', 'rel_handle_product_template_tool_entity', '柄部类型',
|
||||||
related='cutting_tool_integral_model_id.blade_tip_characteristics_id')
|
domain=[('type', '=', '柄部类型')], related='cutting_tool_integral_model_id.handle_type_ids')
|
||||||
|
cutting_direction_ids = fields.Many2many(
|
||||||
handle_type_ids = fields.Many2many('maintenance.equipment.image',
|
'maintenance.equipment.image', 'rel_cutting_product_template_tool_entity', '走刀方向',
|
||||||
'rel_handle_product_template_tool_entity', '柄部类型',
|
domain=[('type', '=', '走刀方向')], related='cutting_tool_integral_model_id.cutting_direction_ids')
|
||||||
domain=[('type', '=', '柄部类型')],
|
suitable_coolant_ids = fields.Many2many(
|
||||||
related='cutting_tool_integral_model_id.handle_type_ids')
|
'maintenance.equipment.image', 'rel_coolant_product_template_tool_entity', '适合冷却液',
|
||||||
|
domain=[('type', '=', '冷却液')], related='cutting_tool_integral_model_id.suitable_coolant_ids')
|
||||||
cutting_direction_ids = fields.Many2many('maintenance.equipment.image',
|
|
||||||
'rel_cutting_product_template_tool_entity', '走刀方向',
|
|
||||||
domain=[('type', '=', '走刀方向')],
|
|
||||||
related='cutting_tool_integral_model_id.cutting_direction_ids')
|
|
||||||
|
|
||||||
suitable_coolant_ids = fields.Many2many('maintenance.equipment.image',
|
|
||||||
'rel_coolant_product_template_tool_entity', '适合冷却液',
|
|
||||||
domain=[('type', '=', '冷却液')],
|
|
||||||
related='cutting_tool_integral_model_id.suitable_coolant_ids')
|
|
||||||
|
|
||||||
def _get_functional_tool_model_ids(self, functional_tool_model_code):
|
def _get_functional_tool_model_ids(self, functional_tool_model_code):
|
||||||
functional_tool_model_ids = []
|
functional_tool_model_ids = []
|
||||||
@@ -94,110 +106,49 @@ class FunctionalCuttingToolEntity(models.Model):
|
|||||||
functional_tool_model_ids.append(functional_tool_model.id)
|
functional_tool_model_ids.append(functional_tool_model.id)
|
||||||
return [(6, 0, functional_tool_model_ids)]
|
return [(6, 0, functional_tool_model_ids)]
|
||||||
|
|
||||||
|
def open_functional_tool_warning(self):
|
||||||
|
action = self.env.ref('sf_tool_management.action_sf_functional_tool_warning')
|
||||||
|
result = action.read()[0]
|
||||||
|
result['domain'] = [('functional_tool_name_id', '=', self.functional_tool_name_id.id)]
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class FunctionalToolWarning(models.Model):
|
class FunctionalToolWarning(models.Model):
|
||||||
_name = 'sf.functional.tool.warning'
|
_name = 'sf.functional.tool.warning'
|
||||||
_description = '功能刀具预警'
|
_description = '功能刀具预警'
|
||||||
|
|
||||||
functional_cutting_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', '功能刀具', readonly=True)
|
name = fields.Char('名称', invisible=True, readonly=True, related='functional_tool_name_id.name')
|
||||||
functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True)
|
# 机床信息
|
||||||
|
production_line_id = fields.Many2one('sf.production.line', string='生产线',
|
||||||
# code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
|
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True,
|
|
||||||
related='functional_cutting_tool_id.barcode_id')
|
|
||||||
name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name')
|
|
||||||
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True,
|
|
||||||
related='functional_cutting_tool_id.functional_tool_name_id')
|
|
||||||
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True,
|
|
||||||
related='functional_cutting_tool_id.mrs_cutting_tool_type_id')
|
|
||||||
|
|
||||||
# 整体式刀具型号
|
|
||||||
cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True,
|
|
||||||
domain=[('cutting_tool_material_id', '=', '整体式刀具')],
|
|
||||||
related='functional_cutting_tool_id.cutting_tool_integral_model_id')
|
|
||||||
|
|
||||||
# 刀片型号
|
|
||||||
cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True,
|
|
||||||
domain=[('cutting_tool_material_id', '=', '刀片')],
|
|
||||||
related='functional_cutting_tool_id.cutting_tool_blade_model_id')
|
|
||||||
|
|
||||||
# 刀杆型号
|
|
||||||
cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True,
|
|
||||||
domain=[('cutting_tool_material_id', '=', '刀杆')],
|
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id')
|
|
||||||
|
|
||||||
# 刀盘型号
|
|
||||||
cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True,
|
|
||||||
domain=[('cutting_tool_material_id', '=', '刀盘')],
|
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id')
|
|
||||||
|
|
||||||
# 刀柄型号
|
|
||||||
cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True,
|
|
||||||
domain=[('cutting_tool_material_id', '=', '刀柄')],
|
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id')
|
|
||||||
|
|
||||||
# 夹头型号
|
|
||||||
cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True,
|
|
||||||
domain=[('cutting_tool_material_id', '=', '夹头')],
|
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id')
|
|
||||||
|
|
||||||
diameter = fields.Float('直径(mm)', readonly=True, related='functional_cutting_tool_id.diameter')
|
|
||||||
tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')],
|
|
||||||
string='刀具等级', readonly=True, compute='_compute_functional_cutting_tool_id')
|
|
||||||
machining_accuracy = fields.Float('加工精度(mm)', readonly=True,
|
|
||||||
related='functional_cutting_tool_id.machining_accuracy')
|
|
||||||
|
|
||||||
# tool_length = fields.Float('装刀长', readonly=True, related='functional_cutting_tool_id.tool_length')
|
|
||||||
|
|
||||||
tool_length = fields.Float('装刀长(mm)', readonly=True, related='functional_cutting_tool_id.tool_length')
|
|
||||||
blade_number = fields.Integer('刃数', readonly=True, related='functional_cutting_tool_id.blade_number')
|
|
||||||
integral_blade_length = fields.Float('整体刃长(mm)', readonly=True,
|
|
||||||
related='functional_cutting_tool_id.integral_blade_length')
|
|
||||||
effective_blade_length = fields.Float('有效刃长(mm)', readonly=True,
|
|
||||||
related='functional_cutting_tool_id.effective_blade_length')
|
|
||||||
max_life = fields.Float('最大寿命值', readonly=True, related='functional_cutting_tool_id.max_life')
|
|
||||||
is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True,
|
|
||||||
compute='_compute_functional_cutting_tool_id')
|
|
||||||
applicable_range = fields.Char('适用范围', readonly=True, related='functional_cutting_tool_id.applicable_range')
|
|
||||||
|
|
||||||
image = fields.Binary('图片', readonly=True, related='functional_cutting_tool_id.image')
|
|
||||||
install_tool_time = fields.Datetime("装刀时间", readonly=True,
|
|
||||||
related='functional_tool_assembly_id.tool_loading_time')
|
|
||||||
|
|
||||||
@api.depends('functional_cutting_tool_id')
|
|
||||||
def _compute_functional_cutting_tool_id(self):
|
|
||||||
if self.functional_cutting_tool_id:
|
|
||||||
self.tool_grade = self.functional_cutting_tool_id.tool_grade
|
|
||||||
self.is_standard = self.functional_cutting_tool_id.is_standard
|
|
||||||
|
|
||||||
# 功能刀具预警 特有字段
|
|
||||||
outbound_time = fields.Datetime('出库时间', readonly=True, related='functional_tool_assembly_id.receive_time')
|
|
||||||
on_board_time = fields.Datetime('上机时间', readonly=False)
|
|
||||||
machine_table_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True,
|
|
||||||
group_expand='_read_group_machine_table_name_ids')
|
group_expand='_read_group_machine_table_name_ids')
|
||||||
|
maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床')
|
||||||
|
machine_tool_code = fields.Char(string='机台号')
|
||||||
|
machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型')
|
||||||
|
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号',
|
||||||
|
domain="[('equipment_id', '=', maintenance_equipment_id)]")
|
||||||
|
# 功能刀具信息
|
||||||
|
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
|
||||||
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', related='functional_tool_name_id.barcode_id')
|
||||||
|
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
|
||||||
|
diameter = fields.Integer(string='刀具直径(mm)')
|
||||||
|
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)')
|
||||||
|
# 其他信息
|
||||||
|
install_tool_time = fields.Datetime("刀具组装时间")
|
||||||
|
on_board_time = fields.Datetime('上机装刀时间')
|
||||||
|
max_lifetime_value = fields.Integer(string='最大寿命值(min)')
|
||||||
|
alarm_value = fields.Integer(string='报警值(min)')
|
||||||
|
used_value = fields.Integer(string='已使用值(min)')
|
||||||
|
functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')], string='状态')
|
||||||
|
alarm_time = fields.Char('报警时间')
|
||||||
|
dispose_user = fields.Char('处理人')
|
||||||
|
dispose_time = fields.Char('处理时间')
|
||||||
|
dispose_func = fields.Char('处理方法/措施', readonly=False)
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _read_group_machine_table_name_ids(self, categories, domain, order):
|
def _read_group_machine_table_name_ids(self, categories, domain, order):
|
||||||
machine_table_name_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
machine_table_name_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
||||||
return categories.browse(machine_table_name_ids)
|
return categories.browse(machine_table_name_ids)
|
||||||
|
|
||||||
machine_tool_code = fields.Char('机台号', readonly=True, related='functional_tool_assembly_id.machine_tool_code')
|
|
||||||
cutting_tool_code = fields.Char('刀位号', readonly=True, related='functional_tool_assembly_id.cutter_spacing_code')
|
|
||||||
# idle_time = fields.Char('闲置时长', readonly=False)
|
|
||||||
idle_time = fields.Char('闲置时长(h)', readonly=False)
|
|
||||||
alarm_value = fields.Char('报警值', readonly=False)
|
|
||||||
used_value = fields.Char('已使用值', readonly=False)
|
|
||||||
alarm_type = fields.Char('报警类型', readonly=False)
|
|
||||||
dispose_user = fields.Char('处理人', readonly=False)
|
|
||||||
alarm_time = fields.Char('报警时间', readonly=False)
|
|
||||||
dispose_time = fields.Char('处理时间', readonly=False)
|
|
||||||
dispose_func = fields.Char('处理方法/措施', readonly=False)
|
|
||||||
remark = fields.Char('备注', readonly=False)
|
|
||||||
|
|
||||||
@api.onchange('functional_cutting_tool_id')
|
|
||||||
def onchange_functional_cutting_tool_id(self):
|
|
||||||
print(self.functional_cutting_tool_id.name)
|
|
||||||
|
|
||||||
|
|
||||||
class RealTimeDistributionOfFunctionalTools(models.Model):
|
class RealTimeDistributionOfFunctionalTools(models.Model):
|
||||||
_name = 'sf.real.time.distribution.of.functional.tools'
|
_name = 'sf.real.time.distribution.of.functional.tools'
|
||||||
@@ -221,60 +172,61 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
|
|||||||
record.mrs_cutting_tool_type_id = record.functional_cutting_tool_id.mrs_cutting_tool_type_id.id
|
record.mrs_cutting_tool_type_id = record.functional_cutting_tool_id.mrs_cutting_tool_type_id.id
|
||||||
|
|
||||||
# code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
|
# code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True,
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
||||||
related='functional_cutting_tool_id.barcode_id')
|
name = fields.Char('名称', invisible=True, readonly=True)
|
||||||
name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name')
|
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True)
|
||||||
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True,
|
|
||||||
related='functional_cutting_tool_id.functional_tool_name_id')
|
|
||||||
# mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True,
|
# mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True,
|
||||||
# related='functional_cutting_tool_id.mrs_cutting_tool_type_id')
|
# related='functional_cutting_tool_id.mrs_cutting_tool_type_id')
|
||||||
|
|
||||||
# 整体式刀具型号
|
# 整体式刀具型号
|
||||||
cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True,
|
cutting_tool_integral_model_id = fields.Many2one(
|
||||||
|
'product.product', string='整体式刀具型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '整体式刀具')],
|
domain=[('cutting_tool_material_id', '=', '整体式刀具')],
|
||||||
related='functional_cutting_tool_id.cutting_tool_integral_model_id')
|
related='functional_cutting_tool_id.cutting_tool_integral_model_id')
|
||||||
|
|
||||||
# 刀片型号
|
# 刀片型号
|
||||||
cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True,
|
cutting_tool_blade_model_id = fields.Many2one(
|
||||||
|
'product.product', string='刀片型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀片')],
|
domain=[('cutting_tool_material_id', '=', '刀片')],
|
||||||
related='functional_cutting_tool_id.cutting_tool_blade_model_id')
|
related='functional_cutting_tool_id.cutting_tool_blade_model_id')
|
||||||
|
|
||||||
# 刀杆型号
|
# 刀杆型号
|
||||||
cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True,
|
cutting_tool_cutterbar_model_id = fields.Many2one(
|
||||||
|
'product.product', string='刀杆型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀杆')],
|
domain=[('cutting_tool_material_id', '=', '刀杆')],
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id')
|
related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id')
|
||||||
|
|
||||||
# 刀盘型号
|
# 刀盘型号
|
||||||
cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True,
|
cutting_tool_cutterpad_model_id = fields.Many2one(
|
||||||
|
'product.product', string='刀盘型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀盘')],
|
domain=[('cutting_tool_material_id', '=', '刀盘')],
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id')
|
related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id')
|
||||||
|
|
||||||
# 刀柄型号
|
# 刀柄型号
|
||||||
cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True,
|
cutting_tool_cutterhandle_model_id = fields.Many2one(
|
||||||
|
'product.product', string='刀柄型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀柄')],
|
domain=[('cutting_tool_material_id', '=', '刀柄')],
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id')
|
related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id')
|
||||||
|
|
||||||
# 夹头型号
|
# 夹头型号
|
||||||
cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True,
|
cutting_tool_cutterhead_model_id = fields.Many2one(
|
||||||
|
'product.product', string='夹头型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '夹头')],
|
domain=[('cutting_tool_material_id', '=', '夹头')],
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id')
|
related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id')
|
||||||
|
|
||||||
diameter = fields.Float('直径(mm)', readonly=True, related='functional_cutting_tool_id.diameter')
|
diameter = fields.Float('直径(mm)', readonly=True)
|
||||||
tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')],
|
tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')],
|
||||||
string='刀具等级', readonly=True, compute='_compute_functional_cutting_tool_id')
|
string='刀具等级', readonly=True)
|
||||||
machining_accuracy = fields.Float('加工精度(mm)', readonly=True,
|
machining_accuracy = fields.Float('加工精度(mm)', readonly=True)
|
||||||
related='functional_cutting_tool_id.machining_accuracy')
|
tool_length = fields.Float('装刀长(mm)', readonly=True)
|
||||||
tool_length = fields.Float('装刀长(mm)', readonly=True, related='functional_cutting_tool_id.tool_length')
|
blade_number = fields.Integer('刃数', readonly=True)
|
||||||
blade_number = fields.Integer('刃数', readonly=True, related='functional_cutting_tool_id.blade_number')
|
integral_blade_length = fields.Float('整体刃长(mm)', readonly=True)
|
||||||
integral_blade_length = fields.Float('整体刃长(mm)', readonly=True,
|
effective_blade_length = fields.Float('有效刃长(mm)', readonly=True)
|
||||||
related='functional_cutting_tool_id.integral_blade_length')
|
max_life = fields.Float('最大寿命值', readonly=True)
|
||||||
effective_blade_length = fields.Float('有效刃长(mm)', readonly=True,
|
|
||||||
related='functional_cutting_tool_id.effective_blade_length')
|
|
||||||
max_life = fields.Float('最大寿命值', readonly=True, related='functional_cutting_tool_id.max_life')
|
|
||||||
is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True,
|
is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True,
|
||||||
compute='_compute_functional_cutting_tool_id')
|
compute='_compute_functional_cutting_tool_id')
|
||||||
applicable_range = fields.Char('适用范围', readonly=True, related='functional_cutting_tool_id.applicable_range')
|
applicable_range = fields.Char('适用范围', readonly=True)
|
||||||
image = fields.Binary('图片', readonly=True, related='functional_cutting_tool_id.image')
|
image = fields.Binary('图片', readonly=True)
|
||||||
|
|
||||||
@api.depends('functional_cutting_tool_id')
|
@api.depends('functional_cutting_tool_id')
|
||||||
def _compute_functional_cutting_tool_id(self):
|
def _compute_functional_cutting_tool_id(self):
|
||||||
@@ -304,7 +256,8 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
|
|||||||
def _compute_return_total(self):
|
def _compute_return_total(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
if record:
|
if record:
|
||||||
self.return_total = record.return_reuse_num_re + record.return_reuse_num_co + record.return_processing_num
|
self.return_total = (record.return_reuse_num_re + record.return_reuse_num_co +
|
||||||
|
record.return_processing_num)
|
||||||
|
|
||||||
@api.depends('tool_stock_total', 'return_total')
|
@api.depends('tool_stock_total', 'return_total')
|
||||||
def _compute_total(self):
|
def _compute_total(self):
|
||||||
@@ -335,58 +288,47 @@ class InboundAndOutboundRecordsOfFunctionalTools(models.Model):
|
|||||||
record.mrs_cutting_tool_type_id = record.functional_cutting_tool_id.mrs_cutting_tool_type_id.id
|
record.mrs_cutting_tool_type_id = record.functional_cutting_tool_id.mrs_cutting_tool_type_id.id
|
||||||
|
|
||||||
# code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
|
# code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code')
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True,
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
||||||
related='functional_cutting_tool_id.barcode_id')
|
name = fields.Char('名称', invisible=True, readonly=True)
|
||||||
name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name')
|
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True)
|
||||||
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True,
|
|
||||||
related='functional_cutting_tool_id.functional_tool_name_id')
|
|
||||||
|
|
||||||
# 整体式刀具型号
|
# 整体式刀具型号
|
||||||
cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True,
|
cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '整体式刀具')],
|
domain=[('cutting_tool_material_id', '=', '整体式刀具')])
|
||||||
related='functional_cutting_tool_id.cutting_tool_integral_model_id')
|
|
||||||
|
|
||||||
# 刀片型号
|
# 刀片型号
|
||||||
cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True,
|
cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀片')],
|
domain=[('cutting_tool_material_id', '=', '刀片')])
|
||||||
related='functional_cutting_tool_id.cutting_tool_blade_model_id')
|
|
||||||
|
|
||||||
# 刀杆型号
|
# 刀杆型号
|
||||||
cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True,
|
cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀杆')],
|
domain=[('cutting_tool_material_id', '=', '刀杆')])
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id')
|
|
||||||
|
|
||||||
# 刀盘型号
|
# 刀盘型号
|
||||||
cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True,
|
cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀盘')],
|
domain=[('cutting_tool_material_id', '=', '刀盘')])
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id')
|
|
||||||
|
|
||||||
# 刀柄型号
|
# 刀柄型号
|
||||||
cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True,
|
cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '刀柄')],
|
domain=[('cutting_tool_material_id', '=', '刀柄')])
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id')
|
|
||||||
|
|
||||||
# 夹头型号
|
# 夹头型号
|
||||||
cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True,
|
cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True,
|
||||||
domain=[('cutting_tool_material_id', '=', '夹头')],
|
domain=[('cutting_tool_material_id', '=', '夹头')])
|
||||||
related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id')
|
|
||||||
|
|
||||||
diameter = fields.Float('直径(mm)', readonly=True, related='functional_cutting_tool_id.diameter')
|
diameter = fields.Float('直径(mm)', readonly=True)
|
||||||
tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')],
|
tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')],
|
||||||
string='刀具等级', readonly=True, compute='_compute_functional_cutting_tool_id')
|
string='刀具等级', readonly=True, compute='_compute_functional_cutting_tool_id')
|
||||||
machining_accuracy = fields.Float('加工精度(mm)', readonly=True,
|
machining_accuracy = fields.Float('加工精度(mm)', readonly=True)
|
||||||
related='functional_cutting_tool_id.machining_accuracy')
|
tool_length = fields.Float('装刀长(mm)', readonly=True)
|
||||||
tool_length = fields.Float('装刀长(mm)', readonly=True, related='functional_cutting_tool_id.tool_length')
|
blade_number = fields.Integer('刃数', readonly=True)
|
||||||
blade_number = fields.Integer('刃数', readonly=True, related='functional_cutting_tool_id.blade_number')
|
integral_blade_length = fields.Float('整体刃长(mm)', readonly=True)
|
||||||
integral_blade_length = fields.Float('整体刃长(mm)', readonly=True,
|
effective_blade_length = fields.Float('有效刃长(mm)', readonly=True)
|
||||||
related='functional_cutting_tool_id.integral_blade_length')
|
max_life = fields.Float('最大寿命值', readonly=True)
|
||||||
effective_blade_length = fields.Float('有效刃长(mm)', readonly=True,
|
|
||||||
related='functional_cutting_tool_id.effective_blade_length')
|
|
||||||
max_life = fields.Float('最大寿命值', readonly=True, related='functional_cutting_tool_id.max_life')
|
|
||||||
is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True,
|
is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True,
|
||||||
compute='_compute_functional_cutting_tool_id')
|
compute='_compute_functional_cutting_tool_id')
|
||||||
applicable_range = fields.Char('适用范围', readonly=True, related='functional_cutting_tool_id.applicable_range')
|
applicable_range = fields.Char('适用范围', readonly=True)
|
||||||
image = fields.Binary('图片', readonly=True, related='functional_cutting_tool_id.image')
|
image = fields.Binary('图片', readonly=True)
|
||||||
|
|
||||||
@api.depends('functional_cutting_tool_id')
|
@api.depends('functional_cutting_tool_id')
|
||||||
def _compute_functional_cutting_tool_id(self):
|
def _compute_functional_cutting_tool_id(self):
|
||||||
@@ -436,110 +378,135 @@ class InboundAndOutboundRecords(models.Model):
|
|||||||
class MachineTableToolChangingApply(models.Model):
|
class MachineTableToolChangingApply(models.Model):
|
||||||
_name = 'sf.machine.table.tool.changing.apply'
|
_name = 'sf.machine.table.tool.changing.apply'
|
||||||
_description = '机床换刀申请'
|
_description = '机床换刀申请'
|
||||||
|
_order = 'cutter_spacing_code_id'
|
||||||
|
|
||||||
name = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False,
|
name = fields.Char('名称', related='maintenance_equipment_id.name', store=True)
|
||||||
|
maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False,
|
||||||
|
domain=[('category_id.equipment_type', '=', '机床')])
|
||||||
|
production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=True,
|
||||||
group_expand='_read_group_names')
|
group_expand='_read_group_names')
|
||||||
machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True,
|
machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True,
|
||||||
compute='_compute_machine_table_type_id')
|
compute='_compute_machine_table_type_id')
|
||||||
machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True)
|
machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True)
|
||||||
cutter_spacing_code = fields.Char(string='刀位号', readonly=False, required=True)
|
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=False,
|
||||||
|
required=True, domain="[('equipment_id', '=', maintenance_equipment_id)]")
|
||||||
@api.depends('name')
|
|
||||||
def _compute_machine_table_type_id(self):
|
|
||||||
for record in self:
|
|
||||||
if record:
|
|
||||||
record.machine_table_type_id = record.name.category_id.id
|
|
||||||
record.machine_tool_code = record.name.code
|
|
||||||
else:
|
|
||||||
record.machine_table_type_id = None
|
|
||||||
record.machine_tool_code = None
|
|
||||||
|
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号',
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号',
|
||||||
domain=[('product_id.name', '=', '功能刀具')])
|
domain=[('product_id.name', '=', '功能刀具')])
|
||||||
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称',
|
functional_tool_name = fields.Char(string='功能刀具名称')
|
||||||
domain=[('name', '=', '功能刀具')])
|
|
||||||
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
|
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
|
||||||
|
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具',
|
||||||
|
domain=[('name', '=', '功能刀具')])
|
||||||
|
tool_position_interface_type = fields.Selection(
|
||||||
|
[('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'),
|
||||||
|
('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'),
|
||||||
|
('直装固定式', '直装固定式')], string='刀位接口型号', required=True)
|
||||||
|
diameter = fields.Integer(string='刀具直径(mm)', )
|
||||||
|
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)')
|
||||||
|
max_lifetime_value = fields.Integer(string='最大寿命值(min)')
|
||||||
|
alarm_value = fields.Integer(string='报警值(min)')
|
||||||
|
used_value = fields.Integer(string='已使用值(min)')
|
||||||
|
whether_standard_knife = fields.Boolean(string='是否标准刀', default=True)
|
||||||
|
extension_length = fields.Float(string='伸出长(mm)')
|
||||||
|
effective_length = fields.Float(string='有效长(mm)')
|
||||||
|
|
||||||
diameter = fields.Char(string='直径(mm)', readonly=False)
|
functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警')], string='功能刀具状态', store=True,
|
||||||
coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=False)
|
default='正常', compute='_compute_functional_tool_status')
|
||||||
hilt_name = fields.Char(string='刀柄名称', readonly=False)
|
|
||||||
hilt_code = fields.Char(string='刀柄编号', readonly=False)
|
|
||||||
max_lifetime_value = fields.Char(string='最大寿命值', readonly=False)
|
|
||||||
alarm_value = fields.Char(string='报警值', readonly=False)
|
|
||||||
used_value = fields.Char(string='已使用值', readonly=False)
|
|
||||||
functional_tool_status = fields.Selection([('正常', '正常'), ('异常', '异常')], string='功能刀具状态',
|
|
||||||
default='正常', readonly=False)
|
|
||||||
|
|
||||||
# replacement_tool_code = fields.Char(string='待换功能刀具编码', readonly=True)
|
|
||||||
assembly_order_code = fields.Char(string='组装单编码', readonly=True)
|
assembly_order_code = fields.Char(string='组装单编码', readonly=True)
|
||||||
replacement_tool_name_id = fields.Many2one('product.product', string='待换功能刀具名称', readonly=True)
|
|
||||||
replacement_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='待换功能刀具类型',
|
|
||||||
readonly=True)
|
|
||||||
replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')],
|
|
||||||
string='粗/中/精(待换)', readonly=True)
|
|
||||||
new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True)
|
|
||||||
applicant = fields.Char(string='申请人', readonly=True)
|
applicant = fields.Char(string='申请人', readonly=True)
|
||||||
used_tool_time = fields.Datetime(string='用刀时间', readonly=True)
|
|
||||||
reason_for_applying = fields.Char(string='申请原因', readonly=True)
|
reason_for_applying = fields.Char(string='申请原因', readonly=True)
|
||||||
remark = fields.Char(string='备注说明', readonly=False)
|
remark = fields.Char(string='备注说明', readonly=False)
|
||||||
|
|
||||||
status = fields.Selection([('0', '未操作'), ('1', '已换刀申请'), ('2', '已转移'), ('3', '已组装')], string='操作状态', default='0')
|
status = fields.Selection([('0', '未操作'), ('1', '已换刀申请'), ('2', '已转移'), ('3', '已组装')],
|
||||||
|
string='操作状态', default='0')
|
||||||
|
|
||||||
sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True)
|
sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装单', readonly=True)
|
||||||
|
|
||||||
|
@api.depends('alarm_value', 'used_value')
|
||||||
|
def _compute_functional_tool_status(self):
|
||||||
|
for record in self:
|
||||||
|
if record.alarm_value <= record.used_value:
|
||||||
|
record.functional_tool_status = '报警'
|
||||||
|
else:
|
||||||
|
record.functional_tool_status = '正常'
|
||||||
|
|
||||||
|
@api.depends('maintenance_equipment_id')
|
||||||
|
def _compute_machine_table_type_id(self):
|
||||||
|
for record in self:
|
||||||
|
if record:
|
||||||
|
record.production_line_id = record.maintenance_equipment_id.production_line_id.id
|
||||||
|
record.machine_table_type_id = record.maintenance_equipment_id.category_id.id
|
||||||
|
record.machine_tool_code = record.maintenance_equipment_id.code
|
||||||
|
else:
|
||||||
|
record.production_line_id = None
|
||||||
|
record.machine_table_type_id = None
|
||||||
|
record.machine_tool_code = None
|
||||||
|
|
||||||
|
@api.constrains("cutter_spacing_code_id")
|
||||||
|
def _check_cutter_spacing_code_id(self):
|
||||||
|
for obj in self:
|
||||||
|
records = self.env['sf.machine.table.tool.changing.apply'].search([
|
||||||
|
('maintenance_equipment_id', '=', obj.maintenance_equipment_id.id),
|
||||||
|
('cutter_spacing_code_id', '=', obj.cutter_spacing_code_id.id)])
|
||||||
|
if len(records) > 1:
|
||||||
|
raise ValidationError('该刀位号已存在,请重新选择!!!')
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _read_group_names(self, categories, domain, order):
|
def _read_group_names(self, categories, domain, order):
|
||||||
names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
||||||
return categories.browse(names)
|
return categories.browse(names)
|
||||||
|
|
||||||
@api.onchange('functional_tool_status')
|
@api.constrains('functional_tool_status')
|
||||||
def automation_apply_for_tool_change(self):
|
def automation_apply_for_tool_change(self):
|
||||||
"""
|
"""
|
||||||
自动申请换刀
|
自动申请换刀
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
# 更新数据到机台换刀申请界面
|
# 更新数据到机台换刀申请界面
|
||||||
# todo 自动换刀申请条件需补充完善
|
if self.functional_tool_status == '报警' and self.sf_functional_tool_assembly_id == False:
|
||||||
if self.functional_tool_status == '异常':
|
machine_table_tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search(
|
||||||
self.env['sf.machine.table.tool.changing.apply'].search([
|
[('maintenance_equipment_id', '=', self.maintenance_equipment_id.id),
|
||||||
('name', '=', self.name.id)]).write({
|
('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id)
|
||||||
'replacement_tool_name_id': self.functional_tool_name_id.id,
|
])
|
||||||
'replacement_tool_type_id': self.functional_tool_type_id.id,
|
|
||||||
'replacement_tool_coarse_middle_thin': self.coarse_middle_thin,
|
|
||||||
'new_former': '0',
|
|
||||||
'applicant': '自动申请',
|
|
||||||
'used_tool_time': fields.Datetime.now(),
|
|
||||||
'reason_for_applying': '功能刀具状态异常',
|
|
||||||
'remark': None,
|
|
||||||
'status': '1'
|
|
||||||
})
|
|
||||||
|
|
||||||
# 新建组装任务
|
# 新建组装任务
|
||||||
self.env['sf.functional.tool.assembly'].create({
|
sf_functional_tool_assembly = self.env['sf.functional.tool.assembly'].create({
|
||||||
'name': self.functional_tool_name_id,
|
'functional_tool_name': self.functional_tool_name,
|
||||||
'functional_tool_type_id': self.functional_tool_type_id.id,
|
'functional_tool_type_id': self.functional_tool_type_id.id,
|
||||||
'functional_tool_diameter': self.diameter,
|
'functional_tool_diameter': self.diameter,
|
||||||
|
'knife_tip_r_angle': self.knife_tip_r_angle,
|
||||||
|
'coarse_middle_thin': '3',
|
||||||
|
'new_former': '0',
|
||||||
|
'functional_tool_length': self.extension_length,
|
||||||
|
'effective_length': self.effective_length,
|
||||||
'loading_task_source': '1',
|
'loading_task_source': '1',
|
||||||
'applicant': '自动申请',
|
'use_tool_time': fields.Datetime.now() + timedelta(hours=4),
|
||||||
'reason_for_applying': '功能刀具状态异常',
|
'production_line_name_id': self.production_line_id.id,
|
||||||
'use_tool_time': self.used_tool_time,
|
'machine_tool_name_id': self.maintenance_equipment_id.id,
|
||||||
'machine_tool_name': self.CNC_machine_table,
|
'applicant': self.applicant,
|
||||||
'machine_tool_code': self.machine_tool_code,
|
'apply_time': fields.Datetime.now(),
|
||||||
'cutter_spacing_code': self.cutter_spacing_code,
|
'cutter_spacing_code_id': self.cutter_spacing_code_id.id,
|
||||||
|
'whether_standard_knife': self.whether_standard_knife,
|
||||||
|
'reason_for_applying': '机台报警自动换刀',
|
||||||
|
'sf_machine_table_tool_changing_apply_id': self.id
|
||||||
})
|
})
|
||||||
|
|
||||||
def new_assembly_task(self, vals):
|
machine_table_tool_changing_apply.write(
|
||||||
"""
|
{'status': '1',
|
||||||
新建组装任务
|
'sf_functional_tool_assembly_id': sf_functional_tool_assembly})
|
||||||
:param vals:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
# 增加设置直径的值
|
|
||||||
tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search(
|
|
||||||
[('name', '=', vals['name'])])
|
|
||||||
vals['functional_tool_diameter'] = tool_changing_apply.diameter
|
|
||||||
|
|
||||||
self.env['sf.functional.tool.assembly'].create(vals)
|
# def new_assembly_task(self, vals):
|
||||||
|
# """
|
||||||
|
# 新建组装任务
|
||||||
|
# :param vals:
|
||||||
|
# :return:
|
||||||
|
# """
|
||||||
|
# # 增加设置直径的值
|
||||||
|
# tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search(
|
||||||
|
# [('name', '=', vals['name'])])
|
||||||
|
# vals['functional_tool_diameter'] = tool_changing_apply.diameter
|
||||||
|
#
|
||||||
|
# self.env['sf.functional.tool.assembly'].create(vals)
|
||||||
|
|
||||||
def revocation_1(self):
|
def revocation_1(self):
|
||||||
"""
|
"""
|
||||||
@@ -548,21 +515,15 @@ class MachineTableToolChangingApply(models.Model):
|
|||||||
"""
|
"""
|
||||||
# 撤回功能刀具组装创建的任务
|
# 撤回功能刀具组装创建的任务
|
||||||
self.env['sf.functional.tool.assembly'].search(
|
self.env['sf.functional.tool.assembly'].search(
|
||||||
[('assembly_order_code', '=', self.assembly_order_code),
|
[('id', '=', self.sf_functional_tool_assembly_id.id),
|
||||||
('loading_task_source', '=', '1')]).unlink()
|
('loading_task_source', '=', '1')]).unlink()
|
||||||
|
|
||||||
# 撤回数据更新
|
# 撤回数据更新
|
||||||
self.env['sf.machine.table.tool.changing.apply'].search([('name', '=', self.name.id)]).write({
|
self.env['sf.machine.table.tool.changing.apply'].search(
|
||||||
'replacement_tool_name_id': None,
|
[('maintenance_equipment_id', '=', self.maintenance_equipment_id.id),
|
||||||
'replacement_tool_type_id': None,
|
('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id)]).write(
|
||||||
'replacement_tool_coarse_middle_thin': None,
|
{'status': '0',
|
||||||
'new_former': None,
|
'sf_functional_tool_assembly_id': None
|
||||||
'applicant': None,
|
|
||||||
'used_tool_time': None,
|
|
||||||
'reason_for_applying': None,
|
|
||||||
'remark': None,
|
|
||||||
'status': '0',
|
|
||||||
'sf_functional_tool_assembly_id': None,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
def revocation_2(self):
|
def revocation_2(self):
|
||||||
@@ -571,9 +532,7 @@ class MachineTableToolChangingApply(models.Model):
|
|||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
self.env['sf.machine.table.tool.changing.apply'].search(
|
self.env['sf.machine.table.tool.changing.apply'].search(
|
||||||
[('name', '=', self.name.id)]).write({
|
[('name', '=', self.name.id)]).write({'status': '0'})
|
||||||
'status': '0'
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
class CAMWorkOrderProgramKnifePlan(models.Model):
|
class CAMWorkOrderProgramKnifePlan(models.Model):
|
||||||
@@ -669,12 +628,41 @@ class FunctionalToolAssembly(models.Model):
|
|||||||
_description = '功能刀具组装单'
|
_description = '功能刀具组装单'
|
||||||
_order = 'use_tool_time asc'
|
_order = 'use_tool_time asc'
|
||||||
|
|
||||||
|
@api.depends('functional_tool_name')
|
||||||
|
def _compute_name(self):
|
||||||
|
for obj in self:
|
||||||
|
obj.name = obj.after_assembly_functional_tool_name
|
||||||
|
|
||||||
|
name = fields.Char(string='名称', readonly=True, compute='_compute_name')
|
||||||
assembly_order_code = fields.Char(string='编码', readonly=True)
|
assembly_order_code = fields.Char(string='编码', readonly=True)
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
|
||||||
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True)
|
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True)
|
||||||
name = fields.Char(string='名称', readonly=True)
|
functional_tool_name = fields.Char(string='功能刀具名称', readonly=True)
|
||||||
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True,
|
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True,
|
||||||
group_expand='_read_group_functional_tool_type_ids')
|
group_expand='_read_group_functional_tool_type_ids')
|
||||||
|
functional_tool_diameter = fields.Integer(string='功能刀具直径(mm)', readonly=True)
|
||||||
|
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True)
|
||||||
|
coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True)
|
||||||
|
new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True)
|
||||||
|
tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True)
|
||||||
|
functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True)
|
||||||
|
effective_length = fields.Float(string='有效长(mm)', readonly=True)
|
||||||
|
loading_task_source = fields.Selection([('0', 'CAM装刀'), ('1', '机台换刀'), ('2', '按库存组装')],
|
||||||
|
string='装刀任务来源', readonly=True)
|
||||||
|
use_tool_time = fields.Datetime(string='用刀时间', readonly=True)
|
||||||
|
production_line_name_id = fields.Many2one('sf.production.line', string='申请产线', readonly=True)
|
||||||
|
machine_tool_name_id = fields.Many2one('maintenance.equipment', string='申请机台', readonly=True)
|
||||||
|
machine_tool_code = fields.Char(string='机台号', readonly=True)
|
||||||
|
applicant = fields.Char(string='申请人', readonly=True)
|
||||||
|
apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now(), readonly=True)
|
||||||
|
assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态', default='0',
|
||||||
|
readonly=True)
|
||||||
|
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True)
|
||||||
|
whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True)
|
||||||
|
reason_for_applying = fields.Char(string='申请原因', readonly=True)
|
||||||
|
max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True)
|
||||||
|
alarm_value = fields.Integer(string='报警值(min)', readonly=True)
|
||||||
|
used_value = fields.Integer(string='已使用值(min)', readonly=True)
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _read_group_functional_tool_type_ids(self, categories, domain, order):
|
def _read_group_functional_tool_type_ids(self, categories, domain, order):
|
||||||
@@ -682,43 +670,40 @@ class FunctionalToolAssembly(models.Model):
|
|||||||
functional_tool_type_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
functional_tool_type_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
||||||
return categories.browse(functional_tool_type_ids)
|
return categories.browse(functional_tool_type_ids)
|
||||||
|
|
||||||
functional_tool_diameter = fields.Char(string='功能刀具直径(mm)', readonly=True)
|
# 刀具物料信息
|
||||||
functional_tool_length = fields.Char(string='功能刀具伸出长(mm)', readonly=True)
|
|
||||||
functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False)
|
|
||||||
|
|
||||||
# 整体式刀具型号
|
# 整体式刀具型号
|
||||||
integral_code_id = fields.Many2one('stock.lot', string='整体式刀具序列号', readonly=True)
|
integral_code_id = fields.Many2one('stock.lot', string='整体式刀具序列号', readonly=True)
|
||||||
cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', readonly=True)
|
cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号',
|
||||||
|
readonly=True)
|
||||||
integral_name = fields.Char('整体式刀具名称', readonly=True, compute='_compute_auto_fill')
|
integral_name = fields.Char('整体式刀具名称', readonly=True, compute='_compute_auto_fill')
|
||||||
sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌', readonly=True)
|
sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌', readonly=True)
|
||||||
|
|
||||||
# 刀片型号
|
# 刀片型号
|
||||||
blade_code_id = fields.Many2one('stock.lot', '刀片序列号', readonly=True)
|
blade_code_id = fields.Many2one('stock.lot', '刀片序列号', readonly=True)
|
||||||
cutting_tool_blade_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀片型号', readonly=True)
|
cutting_tool_blade_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀片型号', readonly=True)
|
||||||
blade_name = fields.Char('刀片名称', readonly=True, compute='_compute_auto_fill')
|
blade_name = fields.Char('刀片名称', readonly=True, compute='_compute_auto_fill')
|
||||||
sf_tool_brand_id_2 = fields.Many2one('sf.machine.brand', '刀片品牌', readonly=True)
|
sf_tool_brand_id_2 = fields.Many2one('sf.machine.brand', '刀片品牌', readonly=True)
|
||||||
|
|
||||||
# 刀杆型号
|
# 刀杆型号
|
||||||
bar_code_id = fields.Many2one('stock.lot', '刀杆序列号', readonly=True)
|
bar_code_id = fields.Many2one('stock.lot', '刀杆序列号', readonly=True)
|
||||||
cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', readonly=True)
|
cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号',
|
||||||
|
readonly=True)
|
||||||
bar_name = fields.Char('刀杆名称', readonly=True, compute='_compute_auto_fill')
|
bar_name = fields.Char('刀杆名称', readonly=True, compute='_compute_auto_fill')
|
||||||
sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True)
|
sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True)
|
||||||
|
|
||||||
# 刀盘型号
|
# 刀盘型号
|
||||||
pad_code_id = fields.Many2one('stock.lot', '刀盘序列号', readonly=True)
|
pad_code_id = fields.Many2one('stock.lot', '刀盘序列号', readonly=True)
|
||||||
cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', readonly=True)
|
cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号',
|
||||||
|
readonly=True)
|
||||||
pad_name = fields.Char('刀盘名称', readonly=True, compute='_compute_auto_fill')
|
pad_name = fields.Char('刀盘名称', readonly=True, compute='_compute_auto_fill')
|
||||||
sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True)
|
sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True)
|
||||||
|
|
||||||
# 刀柄型号
|
# 刀柄型号
|
||||||
handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', readonly=True)
|
handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', readonly=True)
|
||||||
cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', readonly=True)
|
cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号',
|
||||||
|
readonly=True)
|
||||||
handle_name = fields.Char('刀柄名称', readonly=True, compute='_compute_auto_fill')
|
handle_name = fields.Char('刀柄名称', readonly=True, compute='_compute_auto_fill')
|
||||||
sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True)
|
sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True)
|
||||||
|
|
||||||
# 夹头型号
|
# 夹头型号
|
||||||
chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', readonly=True)
|
chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', readonly=True)
|
||||||
cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', readonly=True)
|
cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号',
|
||||||
|
readonly=True)
|
||||||
chuck_name = fields.Char('夹头名称', readonly=True, compute='_compute_auto_fill')
|
chuck_name = fields.Char('夹头名称', readonly=True, compute='_compute_auto_fill')
|
||||||
sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', readonly=True)
|
sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', readonly=True)
|
||||||
|
|
||||||
@@ -775,35 +760,38 @@ class FunctionalToolAssembly(models.Model):
|
|||||||
record.chuck_name = None
|
record.chuck_name = None
|
||||||
record.sf_tool_brand_id_6 = None
|
record.sf_tool_brand_id_6 = None
|
||||||
|
|
||||||
coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True)
|
# 组装功能刀具参数信息
|
||||||
tool_loading_length = fields.Char(string='装刀长(mm)', readonly=True)
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
||||||
new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True)
|
after_assembly_functional_tool_name = fields.Char(string='组装后功能刀具名称', readonly=True)
|
||||||
reference_length = fields.Char(string='参考伸出长(mm)', readonly=True)
|
after_assembly_functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model',
|
||||||
cut_time = fields.Char(string='已切削时间', readonly=True)
|
string='组装后功能刀具类型', readonly=True)
|
||||||
cut_length = fields.Char(string='已切削长度(mm)', readonly=True)
|
after_assembly_functional_tool_diameter = fields.Integer(string='组装后功能刀具直径(mm)', readonly=True)
|
||||||
cut_number = fields.Char(string='已切削次数', readonly=True)
|
after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)', readonly=True)
|
||||||
|
after_assembly_new_former = fields.Selection([('0', '新'), ('1', '旧')], string='组装后新/旧', readonly=True)
|
||||||
|
cut_time = fields.Integer(string='已切削时间(min)', readonly=True)
|
||||||
|
cut_length = fields.Float(string='已切削长度(mm)', readonly=True)
|
||||||
|
cut_number = fields.Integer(string='已切削次数', readonly=True)
|
||||||
|
|
||||||
loading_task_source = fields.Selection([('0', 'CAM装刀'), ('1', '机台换刀'), ('2', '按库存组装')],
|
after_assembly_whether_standard_knife = fields.Boolean(string='组装后是否标准刀', default=True, readonly=True)
|
||||||
string='装刀任务来源', readonly=True)
|
after_assembly_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')],
|
||||||
applicant = fields.Char(string='申请人', readonly=True)
|
string='组装后粗/中/精', readonly=True)
|
||||||
reason_for_applying = fields.Char(string='申请原因', readonly=True)
|
after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)', readonly=True)
|
||||||
apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now(), readonly=True)
|
after_assembly_alarm_value = fields.Integer(string='组装后报警值(min)', readonly=True)
|
||||||
assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态',
|
after_assembly_used_value = fields.Integer(string='组装后已使用值(min)', readonly=True)
|
||||||
default='0', readonly=True)
|
after_assembly_tool_loading_length = fields.Float(string='组装后装刀长(mm)', readonly=True)
|
||||||
use_tool_time = fields.Datetime(string='用刀时间', readonly=True)
|
after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)', readonly=True)
|
||||||
production_line_name_id = fields.Many2one('sf.production.line', string='产线名称', readonly=False)
|
after_assembly_effective_length = fields.Float(string='组装后有效长(mm)', readonly=True)
|
||||||
machine_tool_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True)
|
L_D_number = fields.Float(string='L/D值(mm)', readonly=True)
|
||||||
machine_tool_code = fields.Char(string='机台号', readonly=True)
|
hiding_length = fields.Float(string='避空长(mm)', readonly=True)
|
||||||
cutter_spacing_code = fields.Char(string='刀位号', readonly=True)
|
|
||||||
|
|
||||||
|
functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False)
|
||||||
tool_loading_person = fields.Char(string='装刀人', readonly=True)
|
tool_loading_person = fields.Char(string='装刀人', readonly=True)
|
||||||
tool_loading_time = fields.Datetime(string='装刀时间', readonly=True)
|
tool_loading_time = fields.Datetime(string='装刀时间', readonly=True)
|
||||||
receive_person = fields.Char(string='领用人', readonly=True)
|
|
||||||
receive_time = fields.Datetime(string='领用出库时间', readonly=True)
|
|
||||||
remark = fields.Char(string='备注说明', readonly=True)
|
remark = fields.Char(string='备注说明', readonly=True)
|
||||||
|
|
||||||
check_box_1 = fields.Boolean(string='复选框', default=False, readonly=False)
|
check_box_1 = fields.Boolean(string='复选框', default=False, readonly=False)
|
||||||
sf_machine_table_tool_changing_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', '机床换刀申请', readonly=True)
|
sf_machine_table_tool_changing_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', '机床换刀申请',
|
||||||
|
readonly=True)
|
||||||
sf_cam_work_order_program_knife_plan_id = fields.Many2one('sf.cam.work.order.program.knife.plan',
|
sf_cam_work_order_program_knife_plan_id = fields.Many2one('sf.cam.work.order.program.knife.plan',
|
||||||
'CAM工单程序用刀计划', readonly=True, )
|
'CAM工单程序用刀计划', readonly=True, )
|
||||||
|
|
||||||
@@ -855,5 +843,4 @@ class FunctionalToolAssembly(models.Model):
|
|||||||
if obj.loading_task_source:
|
if obj.loading_task_source:
|
||||||
code = self._get_code(obj.loading_task_source)
|
code = self._get_code(obj.loading_task_source)
|
||||||
obj.assembly_order_code = code
|
obj.assembly_order_code = code
|
||||||
obj.name = code
|
|
||||||
return obj
|
return obj
|
||||||
@@ -71,6 +71,5 @@
|
|||||||
parent="menu_sf_tool_manage"
|
parent="menu_sf_tool_manage"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,5 @@
|
|||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
from odoo import fields, models, api
|
from odoo import fields, models, api
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
@@ -6,75 +8,90 @@ class ToolChangeRequirementInformation(models.TransientModel):
|
|||||||
_name = 'sf.tool.change.requirement.information'
|
_name = 'sf.tool.change.requirement.information'
|
||||||
_description = '换刀需求信息'
|
_description = '换刀需求信息'
|
||||||
|
|
||||||
# tool_change_to_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', string='机床换刀申请')
|
name = fields.Char('名称', related='maintenance_equipment_id.name', store=True, readonly=True)
|
||||||
|
maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True)
|
||||||
|
production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=True)
|
||||||
|
machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True)
|
||||||
|
machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True)
|
||||||
|
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True)
|
||||||
|
|
||||||
name = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True)
|
|
||||||
machine_tool_code = fields.Char(string='机台号', readonly=True)
|
|
||||||
cutter_spacing_code = fields.Char(string='刀位号', readonly=True)
|
|
||||||
# functional_tool_code = fields.Char(string='功能刀具编码', readonly=True)
|
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
||||||
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True)
|
functional_tool_name = fields.Char(string='功能刀具名称', readonly=True)
|
||||||
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True)
|
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True)
|
||||||
|
tool_position_interface_type = fields.Selection(
|
||||||
|
[('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'),
|
||||||
|
('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'),
|
||||||
|
('直装固定式', '直装固定式')], string='刀位接口型号', readonly=True)
|
||||||
|
diameter = fields.Integer(string='刀具直径(mm)', readonly=True)
|
||||||
|
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True)
|
||||||
|
max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True)
|
||||||
|
alarm_value = fields.Integer(string='报警值(min)', readonly=True)
|
||||||
|
used_value = fields.Integer(string='已使用值(min)', readonly=True)
|
||||||
|
whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True)
|
||||||
|
extension_length = fields.Float(string='伸出长(mm)', readonly=True)
|
||||||
|
effective_length = fields.Float(string='有效长(mm)', readonly=True)
|
||||||
|
|
||||||
# replacement_tool_code = fields.Char(string='待换功能刀具编码', readonly=True)
|
# 待换功能刀具信息
|
||||||
replacement_tool_name_id = fields.Many2one('product.product', string='待换功能刀具名称',
|
replacement_tool_name = fields.Char(string='待换功能刀具名称', required=True)
|
||||||
domain=[('name', '=', '功能刀具')])
|
|
||||||
replacement_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='待换功能刀具类型')
|
replacement_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='待换功能刀具类型')
|
||||||
|
replacement_diameter = fields.Integer(string='待换刀具直径(mm)')
|
||||||
|
replacement_knife_tip_r_angle = fields.Float(string='待换刀具刀尖R角(mm)')
|
||||||
|
replacement_tool_setting_length = fields.Float(string='待换刀具装刀长(mm)')
|
||||||
|
replacement_extension_length = fields.Float(string='待换刀具伸出长(mm)')
|
||||||
|
replacement_effective_length = fields.Float(string='待换刀具有效长(mm)')
|
||||||
replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')],
|
replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')],
|
||||||
string='粗/中/精')
|
string='待换刀具粗/中/精', default='3')
|
||||||
new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧')
|
|
||||||
applicant = fields.Char(string='申请人', default=lambda self: self.env.user.name, readonly=True)
|
|
||||||
used_tool_time = fields.Datetime(string='用刀时间')
|
|
||||||
reason_for_applying = fields.Char(string='申请原因')
|
|
||||||
remark = fields.Char(string='备注说明')
|
|
||||||
|
|
||||||
|
replacement_max_lifetime_value = fields.Integer(string='待换刀具最大寿命值(min)')
|
||||||
|
replacement_alarm_value = fields.Integer(string='待换刀具报警值(min)')
|
||||||
|
replacement_used_value = fields.Integer(string='待换刀具已使用值(min)')
|
||||||
|
new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', default='0')
|
||||||
|
replacement_whether_standard_knife = fields.Boolean(string='待换刀具是否标准刀', default=True)
|
||||||
|
used_tool_time = fields.Datetime(string='用刀时间',
|
||||||
|
default=lambda self: fields.Datetime.now() + timedelta(hours=4))
|
||||||
|
applicant = fields.Char(string='申请人', default=lambda self: self.env.user.name, readonly=True)
|
||||||
|
reason_for_applying = fields.Char(string='申请原因')
|
||||||
|
|
||||||
def tool_changing_apply(self):
|
def tool_changing_apply(self):
|
||||||
"""
|
"""
|
||||||
确认换刀申请(按键)
|
确认换刀申请(按键)
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
# 将数据更新到机台换刀申请界面
|
|
||||||
print('已运行')
|
print('已运行')
|
||||||
record = self.env['sf.machine.table.tool.changing.apply'].search(
|
record = self.env['sf.machine.table.tool.changing.apply'].search(
|
||||||
[('name', '=', self.name.id),
|
[('maintenance_equipment_id', '=', self.maintenance_equipment_id.id),
|
||||||
('machine_tool_code', '=', self.machine_tool_code),
|
('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id)
|
||||||
('cutter_spacing_code', '=', self.cutter_spacing_code),
|
|
||||||
])
|
])
|
||||||
print('运行record_1')
|
print('运行record_1')
|
||||||
|
|
||||||
# 功能刀具组装创建新任务(new_assembly_task)
|
# 功能刀具组装创建新任务(new_assembly_task)
|
||||||
record_1 = self.env['sf.functional.tool.assembly'].sudo().create({
|
sf_functional_tool_assembly = self.env['sf.functional.tool.assembly'].sudo().create({
|
||||||
'functional_tool_name_id': self.replacement_tool_name_id.id,
|
'functional_tool_name': self.replacement_tool_name,
|
||||||
'functional_tool_type_id': self.replacement_tool_type_id.id,
|
'functional_tool_type_id': self.replacement_tool_type_id.id,
|
||||||
'loading_task_source': '1',
|
'functional_tool_diameter': self.replacement_diameter,
|
||||||
'applicant': self.applicant,
|
'knife_tip_r_angle': self.replacement_knife_tip_r_angle,
|
||||||
'reason_for_applying': self.reason_for_applying,
|
'coarse_middle_thin': self.replacement_tool_coarse_middle_thin,
|
||||||
'use_tool_time': self.used_tool_time,
|
|
||||||
'machine_tool_name_id': self.name.id,
|
|
||||||
'machine_tool_code': self.machine_tool_code,
|
|
||||||
'cutter_spacing_code': self.cutter_spacing_code,
|
|
||||||
'sf_machine_table_tool_changing_apply_id': record.id,
|
|
||||||
})
|
|
||||||
print('record_1:', record_1)
|
|
||||||
# 封装数据
|
|
||||||
desc = {
|
|
||||||
'name': self.name.id,
|
|
||||||
'assembly_order_code': record_1.assembly_order_code,
|
|
||||||
'machine_tool_code': self.machine_tool_code,
|
|
||||||
'cutter_spacing_code': self.cutter_spacing_code,
|
|
||||||
'replacement_tool_name_id': self.replacement_tool_name_id.id,
|
|
||||||
'replacement_tool_type_id': self.replacement_tool_type_id.id,
|
|
||||||
'replacement_tool_coarse_middle_thin': self.replacement_tool_coarse_middle_thin,
|
|
||||||
'new_former': self.new_former,
|
'new_former': self.new_former,
|
||||||
|
'tool_loading_length': self.replacement_tool_setting_length,
|
||||||
|
'functional_tool_length': self.replacement_extension_length,
|
||||||
|
'effective_length': self.replacement_effective_length,
|
||||||
|
'loading_task_source': '1',
|
||||||
|
'use_tool_time': self.used_tool_time,
|
||||||
|
'production_line_name_id': self.production_line_id.id,
|
||||||
|
'machine_tool_name_id': self.maintenance_equipment_id.id,
|
||||||
'applicant': self.applicant,
|
'applicant': self.applicant,
|
||||||
'used_tool_time': self.used_tool_time,
|
'apply_time': fields.Datetime.now(),
|
||||||
|
'cutter_spacing_code_id': self.cutter_spacing_code_id.id,
|
||||||
|
'whether_standard_knife': self.whether_standard_knife,
|
||||||
'reason_for_applying': self.reason_for_applying,
|
'reason_for_applying': self.reason_for_applying,
|
||||||
'remark': self.new_former,
|
'sf_machine_table_tool_changing_apply_id': record.id
|
||||||
|
})
|
||||||
|
print('sf_functional_tool_assembly:', sf_functional_tool_assembly)
|
||||||
|
# 修改机床换刀申请状态
|
||||||
|
record.write({
|
||||||
'status': '1',
|
'status': '1',
|
||||||
'sf_functional_tool_assembly_id': record_1.id,
|
'sf_functional_tool_assembly_id': sf_functional_tool_assembly
|
||||||
}
|
})
|
||||||
print('运行record.write(desc):')
|
|
||||||
record.write(desc)
|
|
||||||
print('运行成功')
|
print('运行成功')
|
||||||
|
|
||||||
# 关闭弹出窗口
|
# 关闭弹出窗口
|
||||||
@@ -85,18 +102,35 @@ class ToolTransferRequestInformation(models.TransientModel):
|
|||||||
_name = 'sf.tool.transfer.request.information'
|
_name = 'sf.tool.transfer.request.information'
|
||||||
_description = '刀具转移申请信息'
|
_description = '刀具转移申请信息'
|
||||||
|
|
||||||
CNC_machine_table_id = fields.Many2one('sf.machine_tool', string='CNC机床', readonly=True)
|
name = fields.Char('名称', related='maintenance_equipment_id.name', store=True, readonly=True)
|
||||||
machine_tool_code = fields.Char(string='机台号', readonly=True)
|
maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True)
|
||||||
cutter_spacing_code = fields.Char(string='刀位号', readonly=True)
|
production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=True)
|
||||||
# functional_tool_code = fields.Char(string='功能刀具编码', readonly=True)
|
machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True)
|
||||||
|
machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True)
|
||||||
|
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True)
|
||||||
|
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
||||||
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True)
|
functional_tool_name = fields.Char(string='功能刀具名称', readonly=True)
|
||||||
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True)
|
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True)
|
||||||
|
tool_position_interface_type = fields.Selection(
|
||||||
|
[('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'),
|
||||||
|
('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'),
|
||||||
|
('直装固定式', '直装固定式')], string='刀位接口型号', readonly=True)
|
||||||
|
diameter = fields.Integer(string='刀具直径(mm)', readonly=True)
|
||||||
|
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True)
|
||||||
|
max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True)
|
||||||
|
alarm_value = fields.Integer(string='报警值(min)', readonly=True)
|
||||||
|
used_value = fields.Integer(string='已使用值(min)', readonly=True)
|
||||||
|
whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True)
|
||||||
|
extension_length = fields.Float(string='伸出长(mm)', readonly=True)
|
||||||
|
effective_length = fields.Float(string='有效长(mm)', readonly=True)
|
||||||
|
|
||||||
|
# 转移刀具信息
|
||||||
transfer_target = fields.Selection([('机台', '机台'),
|
transfer_target = fields.Selection([('机台', '机台'),
|
||||||
('线边刀库', '线边刀库'),
|
('线边刀库', '线边刀库'),
|
||||||
('刀具房', '刀具房')], string='转移到:', default='线边刀库')
|
('刀具房', '刀具房')], string='转移到:', default='线边刀库')
|
||||||
|
|
||||||
new_cnc_machine_table_id = fields.Many2one('sf.machine_tool', string='机床名称')
|
new_cnc_machine_table_id = fields.Many2one('sf.machine_tool', string='机床名称')
|
||||||
|
new_production_line_id = fields.Many2one('sf.production.line', string='目标生产线')
|
||||||
new_machine_tool_code = fields.Char(string='机床号')
|
new_machine_tool_code = fields.Char(string='机床号')
|
||||||
new_cutter_spacing_code = fields.Char(string='目标刀位号')
|
new_cutter_spacing_code = fields.Char(string='目标刀位号')
|
||||||
|
|
||||||
@@ -120,27 +154,41 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
|
|||||||
_inherit = ["barcodes.barcode_events_mixin"]
|
_inherit = ["barcodes.barcode_events_mixin"]
|
||||||
_description = '功能刀具组装单'
|
_description = '功能刀具组装单'
|
||||||
|
|
||||||
# 功能刀具申请信息
|
assembly_order_code = fields.Char(string='编码', readonly=True)
|
||||||
machine_tool_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True)
|
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True)
|
||||||
|
functional_tool_name = fields.Char(string='功能刀具名称', readonly=True)
|
||||||
|
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True,
|
||||||
|
group_expand='_read_group_functional_tool_type_ids')
|
||||||
|
functional_tool_diameter = fields.Integer(string='功能刀具直径(mm)', readonly=True)
|
||||||
|
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True)
|
||||||
|
coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True)
|
||||||
|
new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True)
|
||||||
|
tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True)
|
||||||
|
functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True)
|
||||||
|
effective_length = fields.Float(string='有效长(mm)', readonly=True)
|
||||||
|
loading_task_source = fields.Selection([('0', 'CAM装刀'), ('1', '机台换刀'), ('2', '按库存组装')],
|
||||||
|
string='装刀任务来源', readonly=True)
|
||||||
|
use_tool_time = fields.Datetime(string='用刀时间', readonly=True)
|
||||||
|
production_line_name_id = fields.Many2one('sf.production.line', string='申请产线', readonly=True)
|
||||||
|
machine_tool_name_id = fields.Many2one('maintenance.equipment', string='申请机台', readonly=True)
|
||||||
machine_tool_code = fields.Char(string='机台号', readonly=True)
|
machine_tool_code = fields.Char(string='机台号', readonly=True)
|
||||||
cutter_spacing_code = fields.Char(string='刀位号', readonly=True)
|
applicant = fields.Char(string='申请人', readonly=True)
|
||||||
# code = fields.Char(string='功能刀具编码', readonly=True)
|
apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now(), readonly=True)
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
|
assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态', default='0',
|
||||||
functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True)
|
readonly=True)
|
||||||
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True)
|
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True)
|
||||||
functional_tool_length = fields.Char(string='功能刀具伸出长(mm)', readonly=True)
|
whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True)
|
||||||
effective_length = fields.Char(string='有效长(mm)', readonly=True)
|
reason_for_applying = fields.Char(string='申请原因', readonly=True)
|
||||||
functional_tool_diameter = fields.Char(string='功能刀具直径(mm)', readonly=True)
|
max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True)
|
||||||
tool_included_angle = fields.Char(string='刀尖角(R角)', readonly=True)
|
alarm_value = fields.Integer(string='报警值(min)', readonly=True)
|
||||||
functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=True)
|
used_value = fields.Integer(string='已使用值(min)', readonly=True)
|
||||||
required_cutting_time = fields.Char(string='需切削时长', readonly=True)
|
|
||||||
whether_standard_tool = fields.Boolean(string='是否标准刀', readonly=True)
|
|
||||||
|
|
||||||
# 功能刀具组装信息
|
# 功能刀具组装信息
|
||||||
# 整体式刀具型号
|
# 整体式刀具型号
|
||||||
integral_code_id = fields.Many2one('stock.lot', string='整体式刀具序列号',
|
integral_code_id = fields.Many2one('stock.lot', string='整体式刀具序列号',
|
||||||
domain=[('product_id.cutting_tool_material_id.name', '=', '整体式刀具')])
|
domain=[('product_id.cutting_tool_material_id.name', '=', '整体式刀具')])
|
||||||
cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', readonly=True)
|
cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号',
|
||||||
|
readonly=True)
|
||||||
integral_name = fields.Char('整体式刀具名称', readonly=True)
|
integral_name = fields.Char('整体式刀具名称', readonly=True)
|
||||||
sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌', readonly=True)
|
sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌', readonly=True)
|
||||||
|
|
||||||
@@ -154,28 +202,32 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
|
|||||||
# 刀杆型号
|
# 刀杆型号
|
||||||
bar_code_id = fields.Many2one('stock.lot', '刀杆序列号',
|
bar_code_id = fields.Many2one('stock.lot', '刀杆序列号',
|
||||||
domain=[('product_id.cutting_tool_material_id.name', '=', '刀杆')])
|
domain=[('product_id.cutting_tool_material_id.name', '=', '刀杆')])
|
||||||
cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', readonly=True)
|
cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号',
|
||||||
|
readonly=True)
|
||||||
bar_name = fields.Char('刀杆名称', readonly=True)
|
bar_name = fields.Char('刀杆名称', readonly=True)
|
||||||
sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True)
|
sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True)
|
||||||
|
|
||||||
# 刀盘型号
|
# 刀盘型号
|
||||||
pad_code_id = fields.Many2one('stock.lot', '刀盘序列号',
|
pad_code_id = fields.Many2one('stock.lot', '刀盘序列号',
|
||||||
domain=[('product_id.cutting_tool_material_id.name', '=', '刀盘')])
|
domain=[('product_id.cutting_tool_material_id.name', '=', '刀盘')])
|
||||||
cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', readonly=True)
|
cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号',
|
||||||
|
readonly=True)
|
||||||
pad_name = fields.Char('刀盘名称', readonly=True)
|
pad_name = fields.Char('刀盘名称', readonly=True)
|
||||||
sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True)
|
sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True)
|
||||||
|
|
||||||
# 刀柄型号
|
# 刀柄型号
|
||||||
handle_code_id = fields.Many2one('stock.lot', '刀柄序列号',
|
handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', required=True,
|
||||||
domain=[('product_id.cutting_tool_material_id.name', '=', '刀柄')])
|
domain=[('product_id.cutting_tool_material_id.name', '=', '刀柄')])
|
||||||
cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', readonly=True)
|
cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号',
|
||||||
|
readonly=True)
|
||||||
handle_name = fields.Char('刀柄名称', readonly=True)
|
handle_name = fields.Char('刀柄名称', readonly=True)
|
||||||
sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True)
|
sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True)
|
||||||
|
|
||||||
# 夹头型号
|
# 夹头型号
|
||||||
chuck_code_id = fields.Many2one('stock.lot', '夹头序列号',
|
chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', required=True,
|
||||||
domain=[('product_id.cutting_tool_material_id.name', '=', '夹头')])
|
domain=[('product_id.cutting_tool_material_id.name', '=', '夹头')])
|
||||||
cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', readonly=True)
|
cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号',
|
||||||
|
readonly=True)
|
||||||
chuck_name = fields.Char('夹头名称', readonly=True, compute='_compute_auto_fill')
|
chuck_name = fields.Char('夹头名称', readonly=True, compute='_compute_auto_fill')
|
||||||
sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', readonly=True)
|
sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', readonly=True)
|
||||||
|
|
||||||
@@ -256,86 +308,72 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
|
|||||||
record.chuck_name = None
|
record.chuck_name = None
|
||||||
record.sf_tool_brand_id_6 = None
|
record.sf_tool_brand_id_6 = None
|
||||||
|
|
||||||
coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', default='1')
|
# 组装功能刀具参数信息
|
||||||
tool_loading_length = fields.Char(string='装刀长')
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号')
|
||||||
new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', required=True, default='0')
|
after_assembly_functional_tool_name = fields.Char(string='组装后功能刀具名称', required=True)
|
||||||
reference_length = fields.Char(string='参考伸出长')
|
after_assembly_functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model',
|
||||||
cut_time = fields.Char(string='已切削时间')
|
string='组装后功能刀具类型')
|
||||||
cut_length = fields.Char(string='已切削长度')
|
after_assembly_functional_tool_diameter = fields.Integer(string='组装后功能刀具直径(mm)')
|
||||||
cut_number = fields.Char(string='已切削次数')
|
after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)')
|
||||||
|
after_assembly_new_former = fields.Selection([('0', '新'), ('1', '旧')], string='组装后新/旧')
|
||||||
|
cut_time = fields.Integer(string='已切削时间(min)')
|
||||||
|
cut_length = fields.Float(string='已切削长度(mm)')
|
||||||
|
cut_number = fields.Integer(string='已切削次数')
|
||||||
|
|
||||||
|
after_assembly_whether_standard_knife = fields.Boolean(string='组装后是否标准刀', default=True)
|
||||||
|
after_assembly_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')],
|
||||||
|
string='组装后粗/中/精')
|
||||||
|
after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)')
|
||||||
|
after_assembly_alarm_value = fields.Integer(string='组装后报警值(min)')
|
||||||
|
after_assembly_used_value = fields.Integer(string='组装后已使用值(min)')
|
||||||
|
after_assembly_tool_loading_length = fields.Float(string='组装后装刀长(mm)')
|
||||||
|
after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)')
|
||||||
|
after_assembly_effective_length = fields.Float(string='组装后有效长(mm)')
|
||||||
|
L_D_number = fields.Float(string='L/D值(mm)')
|
||||||
|
hiding_length = fields.Float(string='避空长(mm)')
|
||||||
|
|
||||||
|
functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False)
|
||||||
|
|
||||||
def functional_tool_assembly(self):
|
def functional_tool_assembly(self):
|
||||||
"""
|
"""
|
||||||
功能刀具组装
|
功能刀具组装
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
# 对物料做必填判断
|
||||||
|
self.materials_must_be_judged()
|
||||||
|
|
||||||
# 创建组装入库单
|
# 创建组装入库单
|
||||||
# 创建功能刀具批次/序列号记录
|
# 创建功能刀具批次/序列号记录
|
||||||
stock_lot = self.create_assemble_warehouse_receipt()
|
stock_lot = self.create_assemble_warehouse_receipt()
|
||||||
# 创建刀具组装入库单
|
# 创建刀具组装入库单
|
||||||
self.create_stocking_picking(stock_lot)
|
self.create_stocking_picking(stock_lot)
|
||||||
desc_1 = {
|
# 封装功能刀具数据
|
||||||
'barcode_id': stock_lot.id,
|
desc_1 = self.get_desc_1(stock_lot)
|
||||||
'integral_code_id': self.integral_code_id.id,
|
|
||||||
'blade_code_id': self.blade_code_id.id,
|
|
||||||
'bar_code_id': self.bar_code_id.id,
|
|
||||||
'pad_code_id': self.pad_code_id.id,
|
|
||||||
'handle_code_id': self.handle_code_id.id,
|
|
||||||
'chuck_code_id': self.chuck_code_id.id,
|
|
||||||
'coarse_middle_thin': self.coarse_middle_thin,
|
|
||||||
'tool_loading_length': self.tool_loading_length,
|
|
||||||
'new_former': self.new_former,
|
|
||||||
'reference_length': self.reference_length,
|
|
||||||
'cut_time': self.cut_time,
|
|
||||||
'cut_length': self.cut_length,
|
|
||||||
'cut_number': self.cut_number,
|
|
||||||
'assemble_status': '1',
|
|
||||||
'tool_loading_person': self.env.user.name,
|
|
||||||
'tool_loading_time': fields.Datetime.now()
|
|
||||||
}
|
|
||||||
functional_tool_assembly = self.env['sf.functional.tool.assembly'].search([
|
functional_tool_assembly = self.env['sf.functional.tool.assembly'].search([
|
||||||
|
('assembly_order_code', '=', self.assembly_order_code),
|
||||||
('machine_tool_name_id', '=', self.machine_tool_name_id.id),
|
('machine_tool_name_id', '=', self.machine_tool_name_id.id),
|
||||||
('cutter_spacing_code', '=', self.cutter_spacing_code),
|
('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id),
|
||||||
('assemble_status', '=', '0'),
|
('assemble_status', '=', '0'),
|
||||||
])
|
])
|
||||||
|
|
||||||
|
# 创建功能刀具列表记录
|
||||||
# 封装功能刀具数据
|
# 封装功能刀具数据
|
||||||
desc_2 = {
|
desc_2 = self.get_desc_2(stock_lot, functional_tool_assembly)
|
||||||
'barcode_id': stock_lot.id,
|
|
||||||
'functional_tool_name_id': self.functional_tool_name_id.id,
|
|
||||||
'mrs_cutting_tool_type_id': self.functional_tool_type_id.id,
|
|
||||||
'cutting_tool_integral_model_id': self.integral_code_id.product_id.id,
|
|
||||||
'cutting_tool_blade_model_id': self.blade_code_id.product_id.id,
|
|
||||||
'cutting_tool_cutterbar_model_id': self.bar_code_id.product_id.id,
|
|
||||||
'cutting_tool_cutterpad_model_id': self.pad_code_id.product_id.id,
|
|
||||||
'cutting_tool_cutterhandle_model_id': self.handle_code_id.product_id.id,
|
|
||||||
'cutting_tool_cutterhead_model_id': self.chuck_code_id.product_id.id,
|
|
||||||
'diameter': self.functional_tool_diameter,
|
|
||||||
'tool_grade': None,
|
|
||||||
'machining_accuracy': None,
|
|
||||||
'tool_length': self.tool_loading_length,
|
|
||||||
'blade_number': None,
|
|
||||||
'integral_blade_length': None,
|
|
||||||
'effective_blade_length': self.effective_length,
|
|
||||||
'max_life': None,
|
|
||||||
'is_standard': self.whether_standard_tool,
|
|
||||||
'applicable_range': None,
|
|
||||||
'image': None,
|
|
||||||
}
|
|
||||||
# 创建功能刀具列表、功能刀具预警、功能刀具实时分布、功能刀具出入库记录
|
# 创建功能刀具列表、功能刀具预警、功能刀具实时分布、功能刀具出入库记录
|
||||||
record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2)
|
record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2)
|
||||||
self.env['sf.functional.tool.warning'].create({
|
# self.env['sf.functional.tool.warning'].create({
|
||||||
'functional_cutting_tool_id': record_1.id,
|
# 'functional_cutting_tool_id': record_1.id,
|
||||||
'functional_tool_assembly_id': functional_tool_assembly.id,
|
# 'functional_tool_assembly_id': functional_tool_assembly.id,
|
||||||
'machine_table_name_id': self.machine_tool_name_id.id,
|
# 'machine_table_name_id': self.machine_tool_name_id.id,
|
||||||
})
|
# })
|
||||||
self.env['sf.real.time.distribution.of.functional.tools'].create({
|
# self.env['sf.real.time.distribution.of.functional.tools'].create({
|
||||||
'functional_cutting_tool_id': record_1.id
|
# 'functional_cutting_tool_id': record_1.id
|
||||||
})
|
# })
|
||||||
self.env['sf.inbound.and.outbound.records.of.functional.tools'].create({
|
# self.env['sf.inbound.and.outbound.records.of.functional.tools'].create({
|
||||||
'functional_cutting_tool_id': record_1.id
|
# 'functional_cutting_tool_id': record_1.id
|
||||||
})
|
# })
|
||||||
|
|
||||||
# 修改功能刀具组装信息
|
# 修改功能刀具组装单信息
|
||||||
functional_tool_assembly.write(desc_1)
|
functional_tool_assembly.write(desc_1)
|
||||||
|
|
||||||
if functional_tool_assembly.sf_machine_table_tool_changing_apply_id:
|
if functional_tool_assembly.sf_machine_table_tool_changing_apply_id:
|
||||||
@@ -352,6 +390,16 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
|
|||||||
# 关闭弹出窗口
|
# 关闭弹出窗口
|
||||||
return {'type': 'ir.actions.act_window_close'}
|
return {'type': 'ir.actions.act_window_close'}
|
||||||
|
|
||||||
|
def materials_must_be_judged(self):
|
||||||
|
"""
|
||||||
|
功能刀具组装物料必填判断
|
||||||
|
"""
|
||||||
|
if not self.integral_code_id and not self.blade_code_id:
|
||||||
|
raise ValidationError('【整体式刀具】和【刀片】必须填写一个!')
|
||||||
|
if self.blade_code_id:
|
||||||
|
if not self.bar_code_id and not self.pad_code_id:
|
||||||
|
raise ValidationError('【刀盘】和【刀杆】必须填写一个!')
|
||||||
|
|
||||||
def create_stocking_picking(self, stock_lot):
|
def create_stocking_picking(self, stock_lot):
|
||||||
"""
|
"""
|
||||||
创建刀具组装入库单
|
创建刀具组装入库单
|
||||||
@@ -413,7 +461,6 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
|
|||||||
'qty_done': 1.0,
|
'qty_done': 1.0,
|
||||||
'state': 'done'
|
'state': 'done'
|
||||||
})
|
})
|
||||||
|
|
||||||
return stock_move_id, stock_move_line_id
|
return stock_move_id, stock_move_line_id
|
||||||
|
|
||||||
def get_stock_lot_name(self):
|
def get_stock_lot_name(self):
|
||||||
@@ -434,3 +481,68 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
|
|||||||
m = int(stock_lot_id.name[-3:]) + 1
|
m = int(stock_lot_id.name[-3:]) + 1
|
||||||
num = "%03d" % m
|
num = "%03d" % m
|
||||||
return code + str(num)
|
return code + str(num)
|
||||||
|
|
||||||
|
def get_desc_1(self, stock_lot):
|
||||||
|
return {
|
||||||
|
'barcode_id': stock_lot.id,
|
||||||
|
'integral_code_id': self.integral_code_id.id,
|
||||||
|
'blade_code_id': self.blade_code_id.id,
|
||||||
|
'bar_code_id': self.bar_code_id.id,
|
||||||
|
'pad_code_id': self.pad_code_id.id,
|
||||||
|
'handle_code_id': self.handle_code_id.id,
|
||||||
|
'chuck_code_id': self.chuck_code_id.id,
|
||||||
|
|
||||||
|
'after_assembly_functional_tool_name': self.after_assembly_functional_tool_name,
|
||||||
|
'after_assembly_functional_tool_type_id': self.after_assembly_functional_tool_type_id.id,
|
||||||
|
'after_assembly_functional_tool_diameter': self.after_assembly_functional_tool_diameter,
|
||||||
|
'after_assembly_knife_tip_r_angle': self.after_assembly_knife_tip_r_angle,
|
||||||
|
'after_assembly_new_former': self.after_assembly_new_former,
|
||||||
|
'cut_time': self.cut_time,
|
||||||
|
'cut_length': self.cut_length,
|
||||||
|
'cut_number': self.cut_number,
|
||||||
|
'after_assembly_whether_standard_knife': self.after_assembly_whether_standard_knife,
|
||||||
|
'after_assembly_coarse_middle_thin': self.after_assembly_coarse_middle_thin,
|
||||||
|
'after_assembly_max_lifetime_value': self.after_assembly_max_lifetime_value,
|
||||||
|
'after_assembly_alarm_value': self.after_assembly_alarm_value,
|
||||||
|
'after_assembly_used_value': self.after_assembly_used_value,
|
||||||
|
'after_assembly_tool_loading_length': self.after_assembly_tool_loading_length,
|
||||||
|
'after_assembly_functional_tool_length': self.after_assembly_functional_tool_length,
|
||||||
|
'after_assembly_effective_length': self.after_assembly_effective_length,
|
||||||
|
'L_D_number': self.L_D_number,
|
||||||
|
'hiding_length': self.hiding_length,
|
||||||
|
'assemble_status': '1',
|
||||||
|
'tool_loading_person': self.env.user.name,
|
||||||
|
'tool_loading_time': fields.Datetime.now()
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_desc_2(self, stock_lot, functional_tool_assembly_id):
|
||||||
|
return {
|
||||||
|
'barcode_id': stock_lot.id,
|
||||||
|
'functional_tool_name_id': functional_tool_assembly_id.id,
|
||||||
|
'sf_cutting_tool_type_id': self.after_assembly_functional_tool_type_id.id,
|
||||||
|
'cutting_tool_integral_model_id': self.integral_code_id.product_id.id,
|
||||||
|
'cutting_tool_blade_model_id': self.blade_code_id.product_id.id,
|
||||||
|
'cutting_tool_cutterbar_model_id': self.bar_code_id.product_id.id,
|
||||||
|
'cutting_tool_cutterpad_model_id': self.pad_code_id.product_id.id,
|
||||||
|
'cutting_tool_cutterhandle_model_id': self.handle_code_id.product_id.id,
|
||||||
|
'cutting_tool_cutterhead_model_id': self.chuck_code_id.product_id.id,
|
||||||
|
|
||||||
|
'functional_tool_diameter': self.after_assembly_functional_tool_diameter,
|
||||||
|
'knife_tip_r_angle': self.after_assembly_knife_tip_r_angle,
|
||||||
|
'coarse_middle_thin': self.after_assembly_coarse_middle_thin,
|
||||||
|
'new_former': self.after_assembly_new_former,
|
||||||
|
'tool_loading_length': self.after_assembly_tool_loading_length,
|
||||||
|
'functional_tool_length': self.after_assembly_functional_tool_length,
|
||||||
|
'effective_length': self.after_assembly_effective_length,
|
||||||
|
|
||||||
|
'max_lifetime_value': self.after_assembly_max_lifetime_value,
|
||||||
|
'alarm_value': self.after_assembly_alarm_value,
|
||||||
|
'used_value': self.after_assembly_used_value,
|
||||||
|
'whether_standard_knife': self.after_assembly_whether_standard_knife,
|
||||||
|
'L_D_number': self.L_D_number,
|
||||||
|
'hiding_length': self.hiding_length,
|
||||||
|
'cut_time': self.cut_time,
|
||||||
|
'cut_length': self.cut_length,
|
||||||
|
'cut_number': self.cut_number,
|
||||||
|
'current_location_id': stock_lot.quant_ids.location_id.ids[-1],
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,42 +1,64 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<!--================================================换刀需求信息================================================-->
|
<!--================================================换刀需求信息================================================-->
|
||||||
<record id="sf_tool_change_requirement_information_form" model="ir.ui.view">
|
<record id="sf_tool_change_requirement_information_form" model="ir.ui.view">
|
||||||
<field name="name">换刀需求信息</field>
|
<field name="name">换刀需求信息</field>
|
||||||
<field name="model">sf.tool.change.requirement.information</field>
|
<field name="model">sf.tool.change.requirement.information</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="换刀需求信息">
|
<form string="换刀需求信息">
|
||||||
<sheet>
|
<sheet>
|
||||||
<group string="机床信息" col="3">
|
<div class="oe_title">
|
||||||
|
<h1>
|
||||||
|
<field name="maintenance_equipment_id"/>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="production_line_id"/>
|
||||||
|
<field name="machine_table_type_id"/>
|
||||||
|
<field name="cutter_spacing_code_id"/>
|
||||||
|
<field name="tool_position_interface_type"/>
|
||||||
|
<field name="max_lifetime_value"/>
|
||||||
|
<field name="alarm_value"/>
|
||||||
|
<field name="used_value"/>
|
||||||
|
<field name="whether_standard_knife"/>
|
||||||
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="name"/>
|
|
||||||
<field name="barcode_id"/>
|
<field name="barcode_id"/>
|
||||||
</group>
|
<field name="functional_tool_name"/>
|
||||||
<group>
|
|
||||||
<field name="machine_tool_code"/>
|
|
||||||
<field name="functional_tool_name_id"/>
|
|
||||||
</group>
|
|
||||||
<group>
|
|
||||||
<field name="cutter_spacing_code"/>
|
|
||||||
<field name="functional_tool_type_id"/>
|
<field name="functional_tool_type_id"/>
|
||||||
|
<field name="diameter"/>
|
||||||
|
<field name="knife_tip_r_angle"/>
|
||||||
|
<field name="extension_length"/>
|
||||||
|
<field name="effective_length"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group string="功能刀具信息">
|
<group string="待换功能刀具信息">
|
||||||
<group>
|
<group>
|
||||||
<field name="replacement_tool_name_id" placeholder="请选择"/>
|
<field name="replacement_tool_name" string="功能刀具名称"/>
|
||||||
<field name="replacement_tool_type_id"/>
|
<field name="replacement_tool_type_id" string="功能刀具类型"/>
|
||||||
<field name="replacement_tool_coarse_middle_thin" placeholder="请选择"/>
|
<field name="replacement_diameter" string="刀具直径(mm)"/>
|
||||||
|
<field name="replacement_knife_tip_r_angle" string="刀尖R角(mm)"/>
|
||||||
|
<field name="replacement_tool_setting_length" string="装刀长(mm)"/>
|
||||||
|
<field name="replacement_extension_length" string="伸出长(mm)"/>
|
||||||
|
<field name="replacement_effective_length" string="有效长(mm)"/>
|
||||||
|
<field name="replacement_tool_coarse_middle_thin" string="粗/中/精"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="replacement_max_lifetime_value" string="最大寿命值(min)"/>
|
||||||
|
<field name="replacement_alarm_value" string="报警值(min)"/>
|
||||||
|
<field name="replacement_used_value" string="已使用值(min)"/>
|
||||||
|
<field name="new_former"/>
|
||||||
|
<field name="replacement_whether_standard_knife" string="是否标准刀"/>
|
||||||
|
<field name="used_tool_time"/>
|
||||||
<field name="applicant"/>
|
<field name="applicant"/>
|
||||||
</group>
|
|
||||||
<group>
|
|
||||||
<field name="used_tool_time" placeholder="请选择"/>
|
|
||||||
<field name="new_former" placeholder="请选择"/>
|
|
||||||
<field name="reason_for_applying"/>
|
<field name="reason_for_applying"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</sheet>
|
</sheet>
|
||||||
<footer>
|
<footer>
|
||||||
<button string="确定" name="tool_changing_apply" type="object" class="btn-primary" confirm="是否确认申请换刀"/>
|
<button string="确定" name="tool_changing_apply" type="object" class="btn-primary"
|
||||||
|
confirm="是否确认申请换刀"/>
|
||||||
<button string="取消" class="btn-secondary" special="cancel"/>
|
<button string="取消" class="btn-secondary" special="cancel"/>
|
||||||
</footer>
|
</footer>
|
||||||
</form>
|
</form>
|
||||||
@@ -53,29 +75,37 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
||||||
<!--================================================刀具转移申请信息================================================-->
|
<!--================================================刀具转移申请信息================================================-->
|
||||||
<record id="sf_tool_transfer_request_information_form" model="ir.ui.view">
|
<record id="sf_tool_transfer_request_information_form" model="ir.ui.view">
|
||||||
<field name="name">刀具转移申请信息</field>
|
<field name="name">刀具转移申请信息</field>
|
||||||
<field name="model">sf.tool.transfer.request.information</field>
|
<field name="model">sf.tool.transfer.request.information</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="刀具转移申请信息">
|
<form string="刀具转移申请信息">
|
||||||
<sheet>
|
<sheet>
|
||||||
<group string="机床信息">
|
<div class="oe_title">
|
||||||
|
<h1>
|
||||||
|
<field name="maintenance_equipment_id"/>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
<group>
|
<group>
|
||||||
<field name="CNC_machine_table_id"/>
|
<group>
|
||||||
<field name="cutter_spacing_code"/>
|
<field name="production_line_id"/>
|
||||||
|
<field name="machine_table_type_id"/>
|
||||||
|
<field name="cutter_spacing_code_id"/>
|
||||||
|
<field name="tool_position_interface_type"/>
|
||||||
|
<field name="max_lifetime_value"/>
|
||||||
|
<field name="alarm_value"/>
|
||||||
|
<field name="alarm_value"/>
|
||||||
|
<field name="whether_standard_knife"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="machine_tool_code"/>
|
<field name="barcode_id"/>
|
||||||
</group>
|
<field name="functional_tool_name"/>
|
||||||
</group>
|
<field name="functional_tool_type_id"/>
|
||||||
<group string="功能刀具信息">
|
<field name="diameter"/>
|
||||||
<group>
|
<field name="knife_tip_r_angle"/>
|
||||||
<field name="functional_tool_name_id" string="功能刀具名称"/>
|
<field name="effective_length"/>
|
||||||
<field name="functional_tool_type_id" string="功能刀具类型"/>
|
<field name="effective_length"/>
|
||||||
</group>
|
|
||||||
<group>
|
|
||||||
<field name="barcode_id" string="功能刀具编码"/>
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group string="刀具转移">
|
<group string="刀具转移">
|
||||||
@@ -85,18 +115,27 @@
|
|||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="new_cnc_machine_table_id" attrs="{'invisible': [('transfer_target', '!=', '机台')]}"/>
|
<!-- <field name="new_cnc_machine_table_id" attrs="{'invisible': [('transfer_target', '!=', '机台')]}"/>-->
|
||||||
<field name="new_machine_tool_code" attrs="{'invisible': [('transfer_target', '!=', '机台')]}"/>
|
<field name="new_production_line_id"
|
||||||
<field name="new_cutter_spacing_code" string="刀位号" attrs="{'invisible': [('transfer_target', '!=', '机台')]}"/>
|
attrs="{'invisible': [('transfer_target', '!=', '机台')]}"/>
|
||||||
<field name="magazine_tool_warehouse_district" attrs="{'invisible': [('transfer_target', '!=', '线边刀库')]}"/>
|
<field name="new_machine_tool_code"
|
||||||
<field name="magazine_tool_warehouse_position" attrs="{'invisible': [('transfer_target', '!=', '线边刀库')]}"/>
|
attrs="{'invisible': [('transfer_target', '!=', '机台')]}"/>
|
||||||
<field name="tool_room_warehouse_district" attrs="{'invisible': [('transfer_target', '!=', '刀具房')]}"/>
|
<field name="new_cutter_spacing_code" string="刀位号"
|
||||||
<field name="tool_room_warehouse_position" attrs="{'invisible': [('transfer_target', '!=', '刀具房')]}"/>
|
attrs="{'invisible': [('transfer_target', '!=', '机台')]}"/>
|
||||||
|
<field name="magazine_tool_warehouse_district"
|
||||||
|
attrs="{'invisible': [('transfer_target', '!=', '线边刀库')]}"/>
|
||||||
|
<field name="magazine_tool_warehouse_position"
|
||||||
|
attrs="{'invisible': [('transfer_target', '!=', '线边刀库')]}"/>
|
||||||
|
<field name="tool_room_warehouse_district"
|
||||||
|
attrs="{'invisible': [('transfer_target', '!=', '刀具房')]}"/>
|
||||||
|
<field name="tool_room_warehouse_position"
|
||||||
|
attrs="{'invisible': [('transfer_target', '!=', '刀具房')]}"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</sheet>
|
</sheet>
|
||||||
<footer>
|
<footer>
|
||||||
<button string="确定" name="tool_transfer_apply" type="object" class="btn-primary" confirm="是否确认刀具转移申请"/>
|
<button string="确定" name="tool_transfer_apply" type="object" class="btn-primary"
|
||||||
|
confirm="是否确认刀具转移申请"/>
|
||||||
<button string="取消" class="btn-secondary" special="cancel"/>
|
<button string="取消" class="btn-secondary" special="cancel"/>
|
||||||
</footer>
|
</footer>
|
||||||
</form>
|
</form>
|
||||||
@@ -113,34 +152,47 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
||||||
<!--================================================功能刀具组装单================================================-->
|
<!--================================================功能刀具组装单================================================-->
|
||||||
<record id="sf_functional_tool_assembly_order_form" model="ir.ui.view">
|
<record id="sf_functional_tool_assembly_order_form" model="ir.ui.view">
|
||||||
<field name="name">功能刀具组装单</field>
|
<field name="name">功能刀具组装单</field>
|
||||||
<field name="model">sf.functional.tool.assembly.order</field>
|
<field name="model">sf.functional.tool.assembly.order</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="功能刀具组装单">
|
<form string="功能刀具组装单">
|
||||||
<sheet>
|
<sheet>
|
||||||
<group string="功能刀具申请信息">
|
<div class="oe_title">
|
||||||
|
<h1>
|
||||||
|
<field name="production_line_name_id"/>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="machine_tool_name_id"/>
|
<field name="machine_tool_name_id"/>
|
||||||
<field name="barcode_id"/>
|
<field name="cutter_spacing_code_id"/>
|
||||||
<field name="functional_tool_name_id"/>
|
</group>
|
||||||
|
</group>
|
||||||
|
<group string="功能刀具申请信息">
|
||||||
|
<group>
|
||||||
|
<field name="functional_tool_name"/>
|
||||||
|
<field name="functional_tool_type_id"/>
|
||||||
|
<field name="functional_tool_diameter" string="刀具直径(mm)"/>
|
||||||
|
<field name="knife_tip_r_angle"/>
|
||||||
|
<field name="tool_loading_length"/>
|
||||||
<field name="functional_tool_length"/>
|
<field name="functional_tool_length"/>
|
||||||
<field name="effective_length"/>
|
<field name="effective_length"/>
|
||||||
<field name="functional_tool_cutting_type"/>
|
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="cutter_spacing_code"/>
|
<field name="whether_standard_knife"/>
|
||||||
<field name="functional_tool_type_id"/>
|
<field name="coarse_middle_thin"/>
|
||||||
<field name="functional_tool_diameter"/>
|
<field name="new_former"/>
|
||||||
<field name="tool_included_angle"/>
|
<field name="use_tool_time"/>
|
||||||
<field name="whether_standard_tool"/>
|
<field name="reason_for_applying"/>
|
||||||
<field name="required_cutting_time"/>
|
<field name="functional_tool_cutting_type"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group string="组装物料信息" col="1">
|
<group string="组装物料信息" col="1">
|
||||||
<field name="_barcode_scanned" widget="barcode_handler"/>
|
<field name="_barcode_scanned" widget="barcode_handler"/>
|
||||||
<group col="1" attrs="{'invisible': ['|','|',('blade_code_id', '!=', False),('bar_code_id', '!=', False),('pad_code_id', '!=', False)]}">
|
<group col="1"
|
||||||
|
attrs="{'invisible': ['|','|',('blade_code_id', '!=', False),('bar_code_id', '!=', False),('pad_code_id', '!=', False)]}">
|
||||||
<div>
|
<div>
|
||||||
<separator string="整体式刀具:" style="font-size: 13px;"/>
|
<separator string="整体式刀具:" style="font-size: 13px;"/>
|
||||||
</div>
|
</div>
|
||||||
@@ -184,7 +236,8 @@
|
|||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group col="1" attrs="{'invisible': ['|',('integral_code_id', '!=', False),('pad_code_id', '!=', False)]}">
|
<group col="1"
|
||||||
|
attrs="{'invisible': ['|',('integral_code_id', '!=', False),('pad_code_id', '!=', False)]}">
|
||||||
<div>
|
<div>
|
||||||
<separator string="刀杆:" style="font-size: 13px;"/>
|
<separator string="刀杆:" style="font-size: 13px;"/>
|
||||||
</div>
|
</div>
|
||||||
@@ -206,7 +259,8 @@
|
|||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group col="1" attrs="{'invisible': ['|',('integral_code_id', '!=', False),('bar_code_id', '!=', False)]}">
|
<group col="1"
|
||||||
|
attrs="{'invisible': ['|',('integral_code_id', '!=', False),('bar_code_id', '!=', False)]}">
|
||||||
<div>
|
<div>
|
||||||
<separator string="刀盘:" style="font-size: 13px;"/>
|
<separator string="刀盘:" style="font-size: 13px;"/>
|
||||||
</div>
|
</div>
|
||||||
@@ -276,20 +330,33 @@
|
|||||||
|
|
||||||
<group string="组装参数信息">
|
<group string="组装参数信息">
|
||||||
<group>
|
<group>
|
||||||
<field name="coarse_middle_thin"/>
|
<field name="barcode_id" readonly="True"/>
|
||||||
<field name="new_former"/>
|
<field name="after_assembly_functional_tool_name" string="功能刀具名称"/>
|
||||||
<field name="tool_loading_length"/>
|
<field name="after_assembly_functional_tool_type_id" string="功能刀具类型"/>
|
||||||
<field name="reference_length"/>
|
<field name="after_assembly_functional_tool_diameter" string="刀具直径(mm)"/>
|
||||||
</group>
|
<field name="after_assembly_knife_tip_r_angle" string="刀尖R角(mm)"/>
|
||||||
<group>
|
<field name="after_assembly_new_former" string="新/旧"/>
|
||||||
<field name="cut_time"/>
|
<field name="cut_time"/>
|
||||||
<field name="cut_length"/>
|
<field name="cut_length"/>
|
||||||
<field name="cut_number"/>
|
<field name="cut_number"/>
|
||||||
</group>
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="after_assembly_whether_standard_knife" string="是否标准刀"/>
|
||||||
|
<field name="after_assembly_coarse_middle_thin" string="粗/中/精"/>
|
||||||
|
<field name="after_assembly_max_lifetime_value" string="最大寿命值(min)"/>
|
||||||
|
<field name="after_assembly_alarm_value" string="报警值(min)"/>
|
||||||
|
<field name="after_assembly_used_value" string="已使用值(min)"/>
|
||||||
|
<field name="after_assembly_tool_loading_length" string="装刀长(mm)"/>
|
||||||
|
<field name="after_assembly_functional_tool_length" string="伸出长(mm)"/>
|
||||||
|
<field name="after_assembly_effective_length" string="有效长(mm)"/>
|
||||||
|
<field name="L_D_number"/>
|
||||||
|
<field name="hiding_length"/>
|
||||||
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</sheet>
|
</sheet>
|
||||||
<footer>
|
<footer>
|
||||||
<button string="确定" name="functional_tool_assembly" type="object" class="btn-primary" confirm="是否确认申请组装"/>
|
<button string="确定" name="functional_tool_assembly" type="object" class="btn-primary"
|
||||||
|
confirm="是否确认申请组装"/>
|
||||||
<button string="取消" class="btn-secondary" special="cancel"/>
|
<button string="取消" class="btn-secondary" special="cancel"/>
|
||||||
</footer>
|
</footer>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -1,3 +1,2 @@
|
|||||||
# -*-coding:utf-8-*-
|
# -*-coding:utf-8-*-
|
||||||
from . import models
|
from . import models
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class CustomChar extends CharField {
|
|||||||
|
|
||||||
onMounted() {
|
onMounted() {
|
||||||
super.onMounted();
|
super.onMounted();
|
||||||
console.log('CustomChar.onMounted1');
|
// console.log('CustomChar.onMounted1');
|
||||||
// 当光标聚焦于输入框时,选中输入框内容
|
// 当光标聚焦于输入框时,选中输入框内容
|
||||||
this.input.el.addEventListener('focus', function () {
|
this.input.el.addEventListener('focus', function () {
|
||||||
this.select();
|
this.select();
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ class CustomMany2One extends Many2OneField {
|
|||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
setup() {
|
setup() {
|
||||||
console.log('CustomMany2One.setup11111111111111');
|
// console.log('CustomMany2One.setup11111111111111');
|
||||||
super.setup();
|
super.setup();
|
||||||
}
|
}
|
||||||
onMounted() {
|
onMounted() {
|
||||||
console.log('CustomMany2One.onMounted1');
|
// console.log('CustomMany2One.onMounted1');
|
||||||
// 当光标聚焦于输入框时,选中输入框内容
|
// 当光标聚焦于输入框时,选中输入框内容
|
||||||
this.input.el.addEventListener('focus', function () {
|
this.input.el.addEventListener('focus', function () {
|
||||||
this.select();
|
this.select();
|
||||||
|
|||||||
@@ -1,25 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import ast
|
import logging
|
||||||
import base64
|
|
||||||
import io
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import random
|
|
||||||
import time
|
|
||||||
|
|
||||||
import re
|
|
||||||
|
|
||||||
from stl import mesh
|
|
||||||
from werkzeug import urls
|
|
||||||
|
|
||||||
import odoo
|
|
||||||
from odoo.exceptions import ValidationError
|
|
||||||
import requests
|
import requests
|
||||||
from odoo import http
|
from odoo import http
|
||||||
from odoo.http import request, Response
|
from odoo.http import request
|
||||||
from odoo.modules import get_resource_path
|
|
||||||
from odoo.tools.translate import _
|
|
||||||
import logging
|
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -52,7 +36,8 @@ class WechatAuthController(http.Controller):
|
|||||||
|
|
||||||
if not user:
|
if not user:
|
||||||
# 获取企业微信用户详细信息
|
# 获取企业微信用户详细信息
|
||||||
user_detail_url = f'https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={access_token}&userid={user_id}'
|
user_detail_url = \
|
||||||
|
f'https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={access_token}&userid={user_id}'
|
||||||
user_detail_response = requests.get(user_detail_url).json()
|
user_detail_response = requests.get(user_detail_url).json()
|
||||||
|
|
||||||
# 创建 Odoo 用户
|
# 创建 Odoo 用户
|
||||||
|
|||||||
@@ -6,6 +6,5 @@ from . import wxwork_settings
|
|||||||
from . import wxwork_approval_template_summary
|
from . import wxwork_approval_template_summary
|
||||||
from . import we_approval_record
|
from . import we_approval_record
|
||||||
from . import wx_work_api
|
from . import wx_work_api
|
||||||
|
|
||||||
from . import wxwork_approval
|
from . import wxwork_approval
|
||||||
# from . import res_config_setting
|
|
||||||
|
|||||||
@@ -1,17 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import re
|
|
||||||
import logging
|
import logging
|
||||||
import time
|
from odoo import fields, models
|
||||||
import requests
|
|
||||||
from datetime import datetime
|
|
||||||
import base64
|
|
||||||
import hashlib
|
|
||||||
from odoo import fields, models, api
|
|
||||||
import json
|
|
||||||
import requests
|
|
||||||
from odoo.http import request
|
|
||||||
from odoo.exceptions import ValidationError
|
|
||||||
from odoo.exceptions import UserError
|
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|||||||
@@ -39,5 +39,3 @@ class WxWorkApprovalTemplate(models.Model):
|
|||||||
def _compute_related_records_count(self):
|
def _compute_related_records_count(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
record.related_records_count = len(record.summary_info_ids)
|
record.related_records_count = len(record.summary_info_ids)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,20 +3,14 @@
|
|||||||
import {registry} from "@web/core/registry";
|
import {registry} from "@web/core/registry";
|
||||||
import {_lt} from "@web/core/l10n/translation";
|
import {_lt} from "@web/core/l10n/translation";
|
||||||
import {standardFieldProps} from "@web/views/fields/standard_field_props";
|
import {standardFieldProps} from "@web/views/fields/standard_field_props";
|
||||||
import {useInputField} from "@web/views/fields/input_field_hook";
|
|
||||||
import {FileUploader} from "@web/views/fields/file_handler";
|
|
||||||
import {session} from "@web/session";
|
import {session} from "@web/session";
|
||||||
import {useService} from "@web/core/utils/hooks";
|
|
||||||
import {isBinarySize} from "@web/core/utils/binary";
|
|
||||||
import {download} from "@web/core/network/download";
|
|
||||||
import utils from 'web.utils';
|
|
||||||
|
|
||||||
import core from 'web.core';
|
// import core from 'web.core';
|
||||||
import rpc from 'web.rpc';
|
|
||||||
|
|
||||||
var QWeb = core.qweb;
|
|
||||||
|
|
||||||
import {Component, onWillUpdateProps, useState, useRef, useEffect} from "@odoo/owl";
|
// var QWeb = core.qweb;
|
||||||
|
|
||||||
|
import {Component} from "@odoo/owl";
|
||||||
|
|
||||||
export class StepViewer extends Component {
|
export class StepViewer extends Component {
|
||||||
setup() {
|
setup() {
|
||||||
@@ -35,11 +29,11 @@ export class StepViewer extends Component {
|
|||||||
}
|
}
|
||||||
url = url_props['base_url'].replace('http://', 'https://') + '/web/content/' + url_props['model'] + '/' + url_props['id'] + '/' + url_props['field'] + '?download=true'
|
url = url_props['base_url'].replace('http://', 'https://') + '/web/content/' + url_props['model'] + '/' + url_props['id'] + '/' + url_props['field'] + '?download=true'
|
||||||
// url = 'http://localhost:8069'+'/web/content/'+url_props['model']+'/'+url_props['id']+'/'+url_props['field']+'?download=true'
|
// url = 'http://localhost:8069'+'/web/content/'+url_props['model']+'/'+url_props['id']+'/'+url_props['field']+'?download=true'
|
||||||
console.log('url111111', url)
|
// console.log('url111111', url)
|
||||||
return url
|
return url
|
||||||
} else {
|
} else {
|
||||||
url = "data:model/gltf-binary;base64," + this.props.value;
|
url = "data:model/gltf-binary;base64," + this.props.value;
|
||||||
console.log('url2', url)
|
// console.log('url2', url)
|
||||||
return url
|
return url
|
||||||
// localStorage.setItem('url',url)
|
// localStorage.setItem('url',url)
|
||||||
// let new_url = localStorage.getItem(('url'))
|
// let new_url = localStorage.getItem(('url'))
|
||||||
@@ -48,8 +42,8 @@ export class StepViewer extends Component {
|
|||||||
// url = "web_widget_model_viewer/static/src/images/not_model.png";
|
// url = "web_widget_model_viewer/static/src/images/not_model.png";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var oImg = document.getElementsByClassName('test')[0]
|
// var oImg = document.getElementsByClassName('test')[0]
|
||||||
console.log(oImg)
|
// console.log(oImg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user