Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/页面展示优化

This commit is contained in:
jinling.yang
2023-07-17 16:48:44 +08:00
25 changed files with 2392 additions and 870 deletions

File diff suppressed because one or more lines are too long

View File

@@ -18,8 +18,6 @@
'views/common_view.xml',
'views/fixture_view.xml',
'views/functional_fixture_view.xml',
'wizard/workpiece_clamping_wizard_view.xml',
'wizard/stock_removal_wizard_view.xml',
'views/menu_view.xml',
"views/tool_views.xml",
"views/tool_menu.xml",

View File

@@ -24,8 +24,6 @@ access_sf_multi_mounting_type,sf_multi_mounting_type,model_sf_multi_mounting_typ
access_sf_fixture_model,sf_fixture_model,model_sf_fixture_model,base.group_user,1,1,1,1
access_sf_functional_fixture_type,sf_functional_fixture_type,model_sf_functional_fixture_type,base.group_user,1,1,1,1
access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,base.group_user,1,1,1,1
access_sf_workpiece_clamping_wizard,sf_workpiece_clamping_wizard,model_sf_workpiece_clamping_wizard,base.group_user,1,1,1,1
access_sf_stock_removal_wizard,sf_stock_removal_wizard,model_sf_stock_removal_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
24 access_sf_fixture_model sf_fixture_model model_sf_fixture_model base.group_user 1 1 1 1
25 access_sf_functional_fixture_type sf_functional_fixture_type model_sf_functional_fixture_type base.group_user 1 1 1 1
26 access_sf_functional_fixture sf_functional_fixture model_sf_functional_fixture base.group_user 1 1 1 1
access_sf_workpiece_clamping_wizard sf_workpiece_clamping_wizard model_sf_workpiece_clamping_wizard base.group_user 1 1 1 1
access_sf_stock_removal_wizard sf_stock_removal_wizard model_sf_stock_removal_wizard base.group_user 1 1 1 1
27
28
29

View File

@@ -1,4 +0,0 @@
# -*- coding: utf-8 -*-
from . import workpiece_clamping_wizard
from . import stock_removal_wizard

View File

@@ -1,21 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
import logging
_logger = logging.getLogger(__name__)
class StockRemovalWizard(models.Model):
_name = 'sf.stock.removal.wizard'
_description = "出库"
code = fields.Char(string="功能夹具编码", size=25, required=True)
name = fields.Char(string="功能夹具名称", size=25, required=True)
type = fields.Char(string="功能夹具类型", required=True)
production_line = fields.Char(string="生产线", required=True)
machine_tool = fields.Many2one('sf.machine_tool', string="机床", required=True)
def submit(self):
return 1

View File

@@ -1,36 +0,0 @@
<openerp>
<data>
<record model="ir.ui.view" id="stock_removal_wizard_form_view">
<field name="name">sf.stock.removal.wizard.form.view</field>
<field name="model">sf.stock.removal.wizard</field>
<field name="arch" type="xml">
<form string="装夹">
<sheet>
<group>
<group>
<field name="code" string="功能夹具编码"></field>
<field name="type" string="类型"></field>
<field name="machine_tool" string="机台"></field>
</group>
<group>
<field name="name" string="功能夹具名称"></field>
<field name="production_line"></field>
</group>
</group>
<footer>
<button string="确定" name="submit" type="object" class="oe_highlight"/>
<button string="取消" class="btn btn-secondary" special="cancel"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="action_stock_removal_wizard" model="ir.actions.act_window">
<field name="name">出库</field>
<field name="res_model">sf.stock.removal.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</openerp>

View File

@@ -1,56 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
import logging
_logger = logging.getLogger(__name__)
class WorkpieceClampingWizard(models.Model):
_name = 'sf.workpiece.clamping.wizard'
_description = "工件装夹"
# 以下为坯料(工件)申请信息
apply_code = fields.Char(string="申请坯料编码", size=25, required=True)
apply_name = fields.Char(string="申请坯料名称", size=25, required=True)
material_id = fields.Many2one('sf.production.materials', string="坯料材料", required=True)
apply_width = fields.Float(string="申请宽度", required=True)
apply_length = fields.Float(string="申请长度", required=True)
apply_height = fields.Float(string="申请高度", required=True)
apply_weight = fields.Float(string="申请重量", required=True)
apply_diameter = fields.Float(string="申请直径", required=True)
surface_accuracy = fields.Char(string="表面精度", required=True)
# 以下为坯料(工件)装夹信息
chuck_name = fields.Char(string="卡盘名称", required=True)
chuck_brand_id = fields.Many2one('sf.machine.brand', string="卡盘品牌", required=True)
chuck_type_id = fields.Char(string="卡盘类型", required=True)
chuck_model_id = fields.Char(string="卡盘型号", required=True)
tray_name = fields.Char(string="托盘名称", required=True)
tray_brand_id = fields.Many2one('sf.machine.brand', string="托盘品牌", required=True)
tray_type_id = fields.Char(string="托盘类型", required=True)
tray_model_id = fields.Char(string="托盘型号", required=True)
real_code = fields.Char(string="真实坯料编码", size=25, required=True)
real_name = fields.Char(string="真实坯料名称", size=25, required=True)
real_width = fields.Float(string="真实宽度", required=True)
real_length = fields.Float(string="真实长度", required=True)
real_height = fields.Float(string="真实高度", required=True)
real_diameter = fields.Float(string="真实直径", required=True)
# 以下为坯料(工件)预调信息
# hole_site = fields.Char(string="孔位", required=True)
# curve = fields.Char(string="曲线", required=True)
# straight_line = fields.Char(string="直线", required=True)
# x_axis = fields.Float(string="X轴", required=True)
# y_axis = fields.Float(string="Y轴", required=True)
# z_axis = fields.Float(string="Z轴", required=True)
# tool_radius = fields.Float(string="刀具半径", required=True)
# tool_length = fields.Float(string="刀具长度", required=True)
# tool_offset_point = fields.Float(string="刀具偏移点", required=True)
# tool_compensation_value = fields.Float(string="刀具补偿值", required=True)
# cutting_spindle_speed = fields.Float(string="切削主轴转速", required=True)
# cutting_feed_rate = fields.Float(string="切削进给速度", required=True)
# depth_of_cutting = fields.Float(string="切削深度", required=True)
# cutting_direction = fields.Char(string="切削方向", required=True)
preset_program_information = fields.Char(string="预调程序信息", required=True)
def submit(self):
return 1

View File

@@ -1,87 +0,0 @@
<openerp>
<data>
<record model="ir.ui.view" id="workpiece_clamping_wizard_form_view">
<field name="name">sf.workpiece.clamping.wizard.form.view</field>
<field name="model">sf.workpiece.clamping.wizard</field>
<field name="arch" type="xml">
<form string="装夹">
<sheet>
<group string="坯料(工件)申请信息">
<group>
<field name="apply_code" string="坯料编码"></field>
<field name="material_id" string="坯料材质"></field>
</group>
<group>
<field name="apply_name" string="坯料名称"></field>
<label for="apply_length" string="尺寸[mm]"/>
<div class="o_address_format">
<label for="apply_length" string="长"/>
<field name="apply_length" class="o_address_zip"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="apply_width" string="宽"/>
<field name="apply_width" class="o_address_zip"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="apply_height" string="高"/>
<field name="apply_height" class="o_address_zip"
options="{'format': false}"/>
</div>
<field name="apply_diameter" string="直径[mm]"></field>
</group>
</group>
<group string="坯料(工件)装夹信息">
<group string="卡盘">
<field name="chuck_type_id"></field>
<field name="chuck_name"></field>
<field name="chuck_brand_id"></field>
<field name="chuck_model_id"></field>
</group>
<group string="托盘">
<field name="tray_type_id"></field>
<field name="tray_name"></field>
<field name="tray_brand_id"></field>
<field name="tray_model_id"></field>
</group>
<group string="坯料">
<field name="real_code" string="坯料编码"></field>
<field name="real_name" string="坯料名称"></field>
<label for="real_length" string="尺寸[mm]"/>
<div class="o_address_format">
<label for="real_length" string="长"/>
<field name="real_length" class="o_address_zip"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="real_width" string="宽"/>
<field name="real_width" class="o_address_zip"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="real_height" string="高"/>
<field name="real_height" class="o_address_zip"
options="{'format': false}"/>
</div>
<field name="real_diameter" string="直径[mm]"></field>
</group>
</group>
<group>
<group>
<field name="preset_program_information"></field>
</group>
</group>
<footer>
<button string="确定" name="submit" type="object" class="oe_highlight"/>
<button string="取消" class="btn btn-secondary" special="cancel"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="action_workpiece_clamping_wizard" model="ir.actions.act_window">
<field name="name">装夹</field>
<field name="res_model">sf.workpiece.clamping.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</openerp>

View File

@@ -23,7 +23,13 @@ class SfEquipmentSaintenanceStandards(models.Model):
name = fields.Char(string='名称')
created_user_id = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user)
maintenance_equipment_category_id = fields.Many2one('maintenance.equipment.category', string='设备类别')
maintenance_equipment_ids = fields.Many2many('maintenance.equipment', 'sf_maintenance_equipment_ids', string='设备')
maintenance_equipment_ids = fields.Many2many(
'maintenance.equipment',
'sf_maintenance_equipment_ids',
string='设备',
domain="[('category_id', '=', maintenance_equipment_category_id)]"
)
maintenance_standards_ids = fields.One2many('maintenance.standards', 'equipment_maintenance_standards_id', string='维保项目')
eq_maintenance_ids = fields.One2many('maintenance.equipment', 'eq_maintenance_id', string='保养设备')
overhaul_ids = fields.One2many('maintenance.equipment', 'overhaul_id', string='检修设备')

View File

@@ -39,7 +39,7 @@
</record>
<record id="hr_equipment_request_action" model="ir.actions.act_window">
<record id="hr_equipment_request_action1" model="ir.actions.act_window">
<field name="name">维保计划</field>
<field name="res_model">maintenance.request</field>
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
@@ -47,22 +47,26 @@
<field name="context">{'default_user_id': uid}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a new maintenance request
添加维保计划
</p>
<p>
Follow the process of the request and communicate with the collaborator.
跟进请求的处理,并且和合作者沟通。
</p>
</field>
</record>
<menuitem
id="menu_m_request_form"
id="menu_m_request_form1"
name="维保计划"
parent="maintenance.menu_m_request"
action="hr_equipment_request_action"
action="hr_equipment_request_action1"
groups="maintenance.group_equipment_manager,base.group_user"
sequence="1"/>
<record id="maintenance.menu_m_request_form" model="ir.ui.menu">
<field name="active" eval="False"/>
</record>
</odoo>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<odoo>
<!-- 设备类别 -->
<!-- 设备类别 -->
<record id="sf_maintenance_equipment_category" model="ir.ui.view">
<field name="name">sf.maintenance.equipment.category</field>
<field name="model">maintenance.equipment.category</field>
@@ -19,49 +19,58 @@
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='maintenance_team_id']" position="before">
<field name="machine_tool_picture" widget="image" />
<field name="machine_tool_picture" widget="image"/>
</xpath>
<xpath expr="//field[@name='category_id']" position="after">
<field name="code" readonly="1"/>
<field name="equipment_type"/>
<field name="brand_id"/>
<field name="type_id" attrs="{'invisible': [('equipment_type', '!=', '机床')]}"/>
<field name="machine_tool_category" readonly="1" attrs="{'invisible': [('type_id', '=', False)]}" force_save="1"/>
<field name="machine_tool_category" readonly="1" attrs="{'invisible': [('type_id', '=', False)]}"
force_save="1"/>
</xpath>
<xpath expr="//page[@name='maintenance']" position="after">
<page string="设备参数" name="sf_equipment" attrs="{'invisible': [('type_id', '=', False)]}">
<group string="参数">
<group>
<field name="control_system_id" required="1" options="{'no_create': True}"/>
<field name="workbench_L" required="1"/>
<field name="workbench_W" required="1"/>
<field name="machine_tool_L" required="1"/>
<field name="machine_tool_W" required="1"/>
<field name="machine_tool_H" required="1"/>
<field name="knife_type" required="1"/>
<field name="workpiece_load" required="1"/>
<field name="lead_screw" required="1"/>
<field name="taper" required="1"/>
<field name="torque" required="1"/>
<field name="motor_power" required="1"/>
<field name="knife_type" />
<field name="workpiece_load"/>
<field name="lead_screw"/>
<field name="workbench_L"/>
<field name="taper"/>
<field name="torque"/>
<field name="motor_power"/>
<field name="tool_quality_max"/>
<field name="tool_long_max"/>
<field name="number_of_knife_library" required="1" options="{'format': false}"/>
<field name="number_of_axles" widget="radio" options="{'horizontal': true}"/>
<field name="number_of_axles" required="1" widget="radio"
options="{'horizontal': true}"/>
<label for="x_axis" string="加工行程(mm)"
attrs="{'invisible': [('number_of_axles', '=', False)]}"/>
<div class="o_address_format"
<div class="test_model"
attrs="{'invisible': [('number_of_axles', '=', False)]}">
<label for="x_axis" string="x"/>
<field name="x_axis" class="o_address_city" required="1"
<field name="x_axis" class="o_address_zip" required="1"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="y_axis" string="y"/>
<field name="y_axis" class="o_address_zip" required="1"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="z_axis" string="z"/>
<field name="z_axis" class="o_address_zip" required="1"
options="{'format': false}"/>
<br></br>
<label for="b_axis" string="b"
attrs="{'invisible': [('number_of_axles', '=', '三轴')]}"/>
<field name="b_axis" class="o_address_city" required="1"
<field name="b_axis" class="o_address_zip" required="1"
attrs="{'invisible': [('number_of_axles', '=', '三轴')]}"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="c_axis" string="c"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"/>
<field name="c_axis" class="o_address_zip" required="1"
@@ -70,21 +79,24 @@
</div>
</group>
<group>
<field name="heightened_way" required="1"/>
<field name="tool_quality_max" required="1"/>
<field name="tool_long_max" required="1"/>
<field name="tool_diameter_max" required="1"/>
<field name="guide_rail" required="1"/>
<field name="feed_speed" required="1"/>
<field name="tool_speed" required="1"/>
<field name="distance" required="1"/>
<field name="rotate_speed" string="主轴转速(min)" required="1"
options="{'format': false}"/>
<field name="precision" required="1" string="X轴定位精度(mm)(mm)"/>
<field name="workbench_W"/>
<field name="guide_rail"/>
<field name="machine_tool_L"/>
<field name="machine_tool_W"/>
<field name="machine_tool_H"/>
<field name="feed_speed"/>
<field name="tool_speed"/>
<field name="distance"/>
<field name="rotate_speed" required="1" string="转速(min)" options="{'format': false}"/>
<field name="precision" required="1" string="加工精度(mm)"/>
<field name="control_system_id" required="1" options="{'no_create': True}"/>
<field name="state" widget="selection"/>
</group>
</group>
<group string="其它">
<field name="remark"/>
</group>
</page>
<page string="其他">
<group string="其他">
@@ -118,7 +130,7 @@
<field name="overhaul_duration"/>
hours
</div>
<field name='equipment_maintenance_standards_ids' widget="many2many_tags"/>
<field name='equipment_maintenance_standards_ids' widget="many2many_tags" invisible="1"/>
</xpath>
</data>
@@ -153,8 +165,26 @@
</field>
</record>
<!-- <menuitem-->
<!-- id="menu_maintenance_title_sf"-->
<!-- name="设备管理"-->
<!-- web_icon="maintenance,static/description/icon.svg"-->
<!-- sequence="160"/>-->
<record id="maintenance.menu_maintenance_title" model="ir.ui.menu">
<field name="name">设备管理</field>
</record>
<record id="maintenance.menu_m_request" model="ir.ui.menu">
<field name="name">设备管理</field>
</record>
<!-- <menuitem-->
<!-- id="menu_m_request"-->
<!-- name="设备管理"-->
<!-- parent="menu_maintenance_title_sf"-->
<!-- groups="maintenance.group_equipment_manager,base.group_user"-->
<!-- sequence="1"/>-->
</odoo>

View File

@@ -61,7 +61,7 @@ class ResWorkcenter(models.Model):
AND equipment_id IS NOT NULL
AND maintenance_equipment.workcenter_id IS NOT NULL
AND maintenance_equipment.workcenter_id IN %s
AND (schedule_date, schedule_date + INT ERVAL '1h' * duration) OVERLAPS (%s, %s)
AND (schedule_date, schedule_date + INTERVAL '1 hour') OVERLAPS (%s, %s)
GROUP BY maintenance_equipment.workcenter_id;
"""
self.env.cr.execute(sql, [tuple(self.ids), fields.Datetime.to_string(start_datetime.astimezone()),

View File

@@ -16,6 +16,7 @@
# 'security/ir.model.access.csv',
'views/plan_base_view.xml',
'views/menu_view.xml',
'views/operations_rename_menu.xml',
],
'demo': [
],

View File

@@ -49,7 +49,7 @@ class ProcedureEquipmentResourceSetting(models.Model):
@api.depends('working_calendar_id')
def _onchange_working_calendar_id(self):
for record in self:
record.working_shift_id = record.working_calendar_id.working_shift_id
record.working_shift_ids = record.working_calendar_id.working_shift_ids

View File

@@ -1,19 +1,5 @@
from datetime import datetime, timedelta, date
from datetime import datetime, timedelta
from odoo import models, fields, api
import re
def time_H_selection():
return [('00', '00'), ('01', '01'), ('02', '02'), ('03', '03'), ('04', '04'), ('05', '05'),
('06', '06'), ('07', '07'), ('08', '08'), ('09', '09'), ('10', '10'), ('11', '11'),
('12', '12'), ('13', '13'), ('14', '14'), ('15', '15'), ('16', '16'), ('17', '17'),
('18', '18'), ('19', '19'), ('20', '20'), ('21', '21'), ('22', '22'), ('23', '23')]
def time_M_or_S_selection():
return [('00', '00'), ('05', '05'), ('10', '10'), ('15', '15'), ('20', '20'), ('25', '25'),
('30', '30'), ('35', '35'), ('40', '40'), ('45', '45'), ('50', '50'), ('55', '55')]
class WorkLogSetting(models.Model):
@@ -36,20 +22,15 @@ class WorkLogSetting(models.Model):
num = "%03d" % m
return num
code = fields.Char(string='序号', default=_get_code, readonly=True)
name = fields.Char(string='工作日历名称', required=True)
code = fields.Char(string='序号', default=_get_code)
name = fields.Char(string='工作日历名称', required=True, size=15, length=30)
start_time = fields.Char(string='日开始时间', readonly=True, compute='_compute_start_time')
start_time_H = fields.Selection(time_H_selection(), '', required=True)
start_time_M = fields.Selection(time_M_or_S_selection(), '', required=True)
end_time = fields.Char(string='日结束时间', readonly=True, compute='_compute_end_time')
end_time_H = fields.Selection(time_H_selection(), '', required=True)
end_time_M = fields.Selection(time_M_or_S_selection(), '', required=True)
working_shift_ids = fields.Many2many('sf.working.shift', string='班次')
start_time = fields.Datetime(string='日开始时间', readonly=True, compute='_compute_working_shift_ids')
end_time = fields.Datetime(string='日结束时间', readonly=True, compute='_compute_working_shift_ids')
duration = fields.Char(string='时长', readonly=True, compute='_compute_working_shift_ids')
duration = fields.Char(string='时长', readonly=True, compute='_compute_duration')
day_off_id = fields.Many2many('sf.day.off', string='休息日', required=True)
working_shift_id = fields.Many2many('sf.working.shift', string='班次')
day_off_ids = fields.Many2many('sf.day.off', string='休息日', required=True)
status = fields.Boolean(string='状态', default=True)
update_person = fields.Char(string='更新人', default=lambda self: self.env.user.name)
@@ -57,48 +38,28 @@ class WorkLogSetting(models.Model):
setting_to_calendar_ids = fields.One2many('sf.work.schedule.calendar', 'name_id', '工作日历')
# @api.model
# def create(self, vals):
# vals['setting_to_calendar_ids'] = [(4, child.id)]
# return super(WorkLogSetting, self).create(vals)
@api.depends('start_time_H', 'start_time_M')
def _compute_start_time(self):
@api.depends('working_shift_ids')
def _compute_working_shift_ids(self):
"""
设置输入日开始时间
根据所选班次自动生成开始时间和结束时间,同时计算出工作时长
:return:
"""
for record in self:
record.start_time = f"{record.start_time_H}:{record.start_time_M}:00"
if record:
for working_shift_id in record.working_shift_ids:
if not record.start_time:
record.start_time = working_shift_id.start_time
record.end_time = working_shift_id.end_time
else:
if (working_shift_id.start_time - record.start_time).total_seconds() < 0:
record.start_time = working_shift_id.start_time
if (working_shift_id.end_time - record.end_time).total_seconds() > 0:
record.end_time = working_shift_id.end_time
@api.depends('end_time_H', 'end_time_M')
def _compute_end_time(self):
"""
设置输入日结束时间
:return:
"""
for record in self:
record.end_time = f"{record.end_time_H}:{record.end_time_M}:00"
record.duration = record.end_time - record.start_time
@api.depends('start_time_H', 'start_time_M', 'end_time_H', 'end_time_M')
def _compute_duration(self):
"""
根据日开始时间和日结束时间计算每日工作时长
:return:
"""
for record in self:
st_h = float(record.start_time_H)
st_m = float(record.start_time_M)
end_h = float(record.end_time_H)
end_m = float(record.end_time_M)
# 日开始时间小于日结束时间
if st_h < end_h:
record.duration = str(round(end_h - st_h + (end_m - st_m) / 60, 2))
else:
record.duration = str(round(end_h - st_h + (end_m - st_m) / 60 + 24, 2))
# @api.onchange('day_off_id')
# def _onchange_day_off_id(self):
# @api.onchange('day_off_ids')
# def _onchange_day_off_ids(self):
# # 先删除之前创建的工作日历事件记录
# self.env['sf.work.schedule.calendar'].search([('calendar_code', '=', self.code)]).unlink()
#
@@ -174,16 +135,16 @@ class WorkLogSetting(models.Model):
start_date = datetime.now().replace(month=1, day=1).date()
end_date = datetime.now().replace(month=12, day=31).date()
# 休息日列表
rest_days = self.day_off_id.mapped('name')
rest_days = self.day_off_ids.mapped('name')
for single_date in self.daterange(start_date, end_date):
is_workday = single_date.strftime("%A")
if is_workday in rest_days:
print('is_workday in rest_days', is_workday)
self.env['sf.work.schedule.calendar'].create({
self.env['sf.work.schedule.calendar'].sudo().create({
'name': '休息日',
'name_id': self.id,
'calendar_code': self.code,
'date_time': single_date})
@staticmethod
def daterange(start_date, end_date):
"""
@@ -193,6 +154,12 @@ class WorkLogSetting(models.Model):
for n in range(int((end_date - start_date).days)):
yield start_date + timedelta(n)
def open_work_schedule_calendar(self):
action = self.env.ref('sf_plan_management.sf_work_schedule_calendar_act')
result = action.read()[0]
result['domain'] = [('name_id', '=', self.id)]
return result
class WorkingShift(models.Model):
_name = 'sf.working.shift'
@@ -242,7 +209,7 @@ class WorkScheduleCalendar(models.Model):
name = fields.Selection([('休息日', '休息日'), ('计划停机', '计划停机'), ('工作日', '工作日')], '日历事件名称')
date_time = fields.Date('休息时间')
name_id = fields.Many2one('sf.work.log.setting', '工作日历名称')
calendar_code = fields.Char('工作日历编码')
calendar_code = fields.Char('工作日历编码', readonly=True, compute='_compute_name_id')
day_off_id = fields.Many2many('sf.day.off', string='休息日')
scheduled_outage = fields.Char('计划停机')
@@ -250,3 +217,9 @@ class WorkScheduleCalendar(models.Model):
annual_rest_days = fields.Char('年休息天数', readonly=True)
monthly_planned_downtime = fields.Char('月计划停机时长', readonly=True)
annual_planned_downtime = fields.Char('年计划停机时长', readonly=True)
@api.depends('name_id')
def _compute_name_id(self):
for record in self:
if record:
record.calendar_code = record.name_id.code

View File

@@ -1,15 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<menuitem id="menu_sf_plan_manage"
name="计划管理"
parent="mrp.menu_mrp_root"
sequence="22"
/>
<menuitem id="menu_sf_basic_setting"
name="基础设置"
parent="menu_sf_plan_manage"
sequence="0"
parent="mrp.menu_mrp_manufacturing"
sequence="599"
/>
<menuitem id="menu_sf_work_log_setting"
@@ -40,10 +35,10 @@
sequence="15"
/>
<menuitem id="menu_sf_work_schedule_calendar"
name="工作日历"
parent="menu_sf_basic_setting"
action="sf_work_schedule_calendar_act"
sequence="15"
/>
<!-- <menuitem id="menu_sf_work_schedule_calendar"-->
<!-- name="工作日历"-->
<!-- parent="menu_sf_basic_setting"-->
<!-- action="sf_work_schedule_calendar_act"-->
<!-- sequence="15"-->
<!-- />-->
</odoo>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<record id="mrp.menu_mrp_manufacturing" model="ir.ui.menu">
<field name="name">计划管理</field>
</record>
<record id="mrp_workorder.mrp_workorder_menu_planning" model="ir.ui.menu">
<field name="name">工单计划</field>
<field name="sequence" eval="300"/>
<field name="parent_id" ref="mrp.menu_mrp_manufacturing"/>
</record>
<record id="mrp.mrp_planning_menu_root" model="ir.ui.menu">
<field name="active" eval="False"/>
</record>
</data>
</odoo>

View File

@@ -11,12 +11,16 @@
<field name="start_time"/>
<field name="end_time"/>
<field name="duration"/>
<field name="day_off_id" widget="many2many_tags"/>
<field name="working_shift_id" widget="many2many_tags"/>
<field name="day_off_ids" widget="many2many_tags"/>
<field name="working_shift_ids" widget="many2many_tags"/>
<field name="status"/>
<field name="update_person"/>
<field name="update_time"/>
<!-- <button string="查看日历" type="object" name="sf_work_schedule_calendar_act"/>-->
<button string="查看日历"
type="object"
name="open_work_schedule_calendar"
class="oe_highlight"
/>
</tree>
</field>
</record>
@@ -36,37 +40,27 @@
</group>
</group>
<group string="选择班次">
<field name="working_shift_id"/>
<field name="working_shift_ids"/>
</group>
<group string="工作时间">
<group>
<group>
<field name="start_time"/>
<field name="end_time"/>
</group>
<group>
<field name="start_time_H"/>
<field name="end_time_H"/>
</group>
<field name="start_time"/>
</group>
<group>
<group>
<field name="start_time_M"/>
<field name="end_time_M"/>
</group>
<field name="end_time"/>
</group>
</group>
<group>
<group>
<field name="duration"/>
<field name="day_off_id"
<field name="day_off_ids"
widget="many2many_tags"
options="{'no_create': True, 'no_quick_create': True}"/>
</group>
</group>
<group string="日历状态">
<field name="status"/>
<field name="setting_to_calendar_ids"/>
<field name="setting_to_calendar_ids" invisible="True"/>
</group>
</sheet>
</form>
@@ -171,12 +165,6 @@
<field name="calendar_code"/>
</group>
</group>
<group string="其他">
<field name="monthly_rest_days"/>
<field name="annual_rest_days"/>
<field name="monthly_planned_downtime"/>
<field name="annual_planned_downtime"/>
</group>
</sheet>
</form>
</field>
@@ -200,6 +188,7 @@
<field name="arch" type="xml">
<calendar string="工作日历" mode="year" date_start="date_time">
<field name="name"/>
<!-- <field name="monthly_rest_days" widget="char" position="right_bottom"/>-->
</calendar>
</field>
</record>

View File

@@ -110,7 +110,7 @@ class MachineTableToolChangingApply(models.Model):
# string='换刀需求信息',
# attrs="{'invisible': 1}")
CNC_machine_table = fields.Char(string='CNC机床')
name = fields.Char(string='CNC机床')
# todo 机床类型和刀位号 为 Many2one
machine_table_type = fields.Char(string='机床类型')
machine_tool_code = fields.Char(string='机台号', attrs="{'invisible': 1}")
@@ -151,7 +151,7 @@ class MachineTableToolChangingApply(models.Model):
# todo 自动换刀申请条件需补充完善
if(self.functional_tool_status == '异常'):
self.env['sf.machine.table.tool.changing.apply'].search([
('CNC_machine_table', '=', self.CNC_machine_table)]).write({
('name', '=', self.name)]).write({
'replacement_tool_code': self.functional_tool_code,
'replacement_tool_name': self.functional_tool_name,
'replacement_tool_type': self.functional_tool_type,
@@ -167,7 +167,7 @@ class MachineTableToolChangingApply(models.Model):
# 新建组装任务
self.env['sf.functional.tool.assembly'].create({
'functional_tool_code': self.functional_tool_code,
'functional_tool_name': self.functional_tool_name,
'name': self.functional_tool_name,
'functional_tool_type': self.functional_tool_type,
'functional_tool_diameter': self.diameter,
'loading_task_source': '1',
@@ -189,7 +189,7 @@ class MachineTableToolChangingApply(models.Model):
"""
# 增加设置直径的值
tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search(
[('CNC_machine_table', '=', vals['machine_tool_name'])])
[('name', '=', vals['name'])])
vals['functional_tool_diameter'] = tool_changing_apply.diameter
self.env['sf.functional.tool.assembly'].create(vals)
@@ -201,7 +201,7 @@ class MachineTableToolChangingApply(models.Model):
:return:
"""
# 撤回数据更新
self.env['sf.machine.table.tool.changing.apply'].search([('CNC_machine_table', '=', self.CNC_machine_table)]).write({
self.env['sf.machine.table.tool.changing.apply'].search([('name', '=', self.name)]).write({
'replacement_tool_code': None,
'replacement_tool_name': None,
'replacement_tool_type': None,
@@ -225,7 +225,7 @@ class MachineTableToolChangingApply(models.Model):
:return:
"""
self.env['sf.machine.table.tool.changing.apply'].search(
[('CNC_machine_table', '=', self.CNC_machine_table)]).write({
[('name', '=', self.name)]).write({
'status': '0'
})
@@ -234,7 +234,7 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
_name = 'sf.cam.work.order.program.knife.plan'
_description = 'CAM工单程序用刀计划'
ticket_task_code = fields.Char(string='工单任务编号')
name = fields.Char(string='工单任务编号')
cam_procedure_code = fields.Char(string='CAM程序编号')
cam_cutter_spacing_code = fields.Char(string='CAM刀位号')
functional_tool_code = fields.Char(string='功能刀具编码')
@@ -263,7 +263,7 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
"""
self.env['sf.functional.tool.assembly'].create({
'functional_tool_code': self.functional_tool_code,
'functional_tool_name': self.functional_tool_name,
'name': self.functional_tool_name,
'functional_tool_type': self.functional_tool_type,
'functional_tool_diameter': self.diameter,
'functional_tool_length': self.tool_loading_length,
@@ -304,7 +304,7 @@ class FunctionalToolAssembly(models.Model):
_order = 'use_tool_time asc'
functional_tool_code = fields.Char(string='功能刀具编码')
functional_tool_name = fields.Char(string='功能刀具名称')
name = fields.Char(string='功能刀具名称')
functional_tool_type = fields.Char(string='功能刀具类型')
functional_tool_diameter = fields.Char(string='功能刀具直径')
functional_tool_length = fields.Char(string='功能刀具伸出长')
@@ -389,7 +389,7 @@ class FunctionalToolAssembly(models.Model):
for val in vals:
self.env['sf.delivery.of.cargo.from.storage'].create({
'functional_tool_code': val.functional_tool_code,
'functional_tool_name': val.functional_tool_name,
'name': val.name,
'functional_tool_type': val.functional_tool_type,
'production_line_name': val.production_line_name,
'machine_tool_code': val.machine_tool_code,
@@ -399,7 +399,7 @@ class FunctionalToolAssembly(models.Model):
else:
self.env['sf.delivery.of.cargo.from.storage'].create({
'functional_tool_code': self.functional_tool_code,
'functional_tool_name': self.functional_tool_name,
'name': self.name,
'functional_tool_type': self.functional_tool_type,
'production_line_name': self.production_line_name,
'machine_tool_code': self.machine_tool_code,

View File

@@ -169,7 +169,7 @@
<field name="model">sf.machine.table.tool.changing.apply</field>
<field name="arch" type="xml">
<tree>
<field name="CNC_machine_table"/>
<field name="name"/>
<field name="machine_tool_code" invisible="1"/>
<field name="machine_table_type"/>
<field name="cutter_spacing_code"/>
@@ -189,7 +189,7 @@
<button string="换刀申请"
name="%(sf_tool_management.sf_tool_change_requirement_information_act)d"
type="action"
context="{ 'default_CNC_machine_table':CNC_machine_table,
context="{ 'default_name':name,
'default_machine_tool_code': machine_tool_code,
'default_cutter_spacing_code': cutter_spacing_code,
'default_replacement_tool_code': functional_tool_code,
@@ -204,11 +204,11 @@
<button string="转移"
name="%(sf_tool_management.sf_tool_transfer_request_information_act)d"
type="action"
context="{ 'default_CNC_machine_table':CNC_machine_table,
context="{ 'default_name':name,
'default_machine_tool_code': machine_tool_code,
'default_cutter_spacing_code': cutter_spacing_code,
'default_functional_tool_code': functional_tool_code,
'default_functional_tool_name': functional_tool_name,
'default_name': functional_tool_name,
'default_functional_tool_type': functional_tool_type}"
class="btn-primary"
attrs="{'invisible': [('status', '!=', '0')]}"
@@ -235,7 +235,7 @@
<field name="model">sf.machine.table.tool.changing.apply</field>
<field name="arch" type="xml">
<search>
<field name="CNC_machine_table"/>
<field name="name"/>
<field name="machine_tool_code" invisible="1"/>
<field name="machine_table_type"/>
<field name="cutter_spacing_code"/>
@@ -279,7 +279,7 @@
<field name="model">sf.cam.work.order.program.knife.plan</field>
<field name="arch" type="xml">
<tree>
<field name="ticket_task_code"/>
<field name="name"/>
<field name="cam_procedure_code"/>
<field name="cam_cutter_spacing_code"/>
<field name="functional_tool_code"/>
@@ -303,12 +303,12 @@
<button string="装刀申请"
name="%(sf_tool_management.sf_apply_for_tooling_act)d"
type="action"
context="{ 'default_ticket_task_code':ticket_task_code,
context="{ 'default_name':name,
'default_cam_procedure_code': cam_procedure_code,
'default_machine_table_name': machine_table_name,
'default_cam_cutter_spacing_code': cam_cutter_spacing_code,
'default_functional_tool_code': functional_tool_code,
'default_functional_tool_name': functional_tool_name,
'default_name': functional_tool_name,
'default_functional_tool_type': functional_tool_type,
'default_diameter': diameter,
'default_tool_loading_length': tool_loading_length,
@@ -335,7 +335,7 @@
<field name="model">sf.cam.work.order.program.knife.plan</field>
<field name="arch" type="xml">
<search>
<field name="ticket_task_code"/>
<field name="name"/>
<field name="cam_procedure_code"/>
<field name="cam_cutter_spacing_code"/>
<field name="functional_tool_code"/>
@@ -375,7 +375,7 @@
<field name="arch" type="xml">
<tree>
<field name="functional_tool_code"/>
<field name="functional_tool_name"/>
<field name="name"/>
<field name="functional_tool_type"/>
<field name="functional_tool_diameter"/>
<field name="functional_tool_length"/>
@@ -404,7 +404,7 @@
context="{
'default_machine_tool_name': machine_tool_name,
'default_cutter_spacing_code': cutter_spacing_code,
'default_functional_tool_name': functional_tool_name,
'default_name': name,
'default_functional_tool_type': functional_tool_type,
'default_functional_tool_length': functional_tool_length,
'default_effective_length': None,
@@ -449,7 +449,7 @@
<field name="arch" type="xml">
<search>
<field name="functional_tool_code"/>
<field name="functional_tool_name"/>
<field name="name"/>
<field name="functional_tool_type"/>
<field name="functional_tool_diameter"/>
<field name="functional_tool_length"/>

View File

@@ -7,7 +7,7 @@ class ToolChangeRequirementInformation(models.TransientModel):
# tool_change_to_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', string='机床换刀申请')
CNC_machine_table = fields.Char(string='CNC机床', readonly=True)
name = fields.Char(string='CNC机床', readonly=True)
machine_tool_code = fields.Char(string='机台号', readonly=True)
cutter_spacing_code = fields.Char(string='刀位号', readonly=True)
@@ -29,7 +29,7 @@ class ToolChangeRequirementInformation(models.TransientModel):
"""
# 封装数据
desc = {
'CNC_machine_table': self.CNC_machine_table,
'name': self.name,
'machine_tool_code': self.machine_tool_code,
'cutter_spacing_code': self.cutter_spacing_code,
'replacement_tool_code': self.replacement_tool_code,
@@ -46,18 +46,18 @@ class ToolChangeRequirementInformation(models.TransientModel):
print('desc:', desc)
# 将数据更新到机台换刀申请界面
self.env['sf.machine.table.tool.changing.apply'].search(
[('CNC_machine_table', '=', desc.get('CNC_machine_table'))]).write(desc)
[('name', '=', desc.get('name'))]).write(desc)
# 功能刀具组装创建新任务
self.env['sf.machine.table.tool.changing.apply'].new_assembly_task({
'functional_tool_code': self.replacement_tool_code,
'functional_tool_name': self.replacement_tool_name,
'name': self.replacement_tool_name,
'functional_tool_type': self.replacement_tool_type,
'loading_task_source': '1',
'applicant': self.applicant,
'reason_for_applying': self.reason_for_applying,
'use_tool_time': self.used_tool_time,
'machine_tool_name': self.CNC_machine_table,
'machine_tool_name': self.name,
'machine_tool_code': self.machine_tool_code,
'cutter_spacing_code': self.cutter_spacing_code
})
@@ -133,7 +133,7 @@ class ApplyForTooling(models.TransientModel):
"""
self.env['sf.functional.tool.assembly'].create({
'functional_tool_code': self.functional_tool_code,
'functional_tool_name': self.functional_tool_name,
'name': self.functional_tool_name,
'functional_tool_type': self.functional_tool_type,
'functional_tool_diameter': self.diameter,
'functional_tool_length': self.tool_loading_length,
@@ -227,7 +227,7 @@ class DeliveryOfCargoFromStorage(models.TransientModel):
order = fields.Integer(string='')
functional_tool_code = fields.Char(string='功能刀具编码')
functional_tool_name = fields.Char(string='功能刀具名称')
name = fields.Char(string='功能刀具名称')
functional_tool_type = fields.Char(string='功能刀具类型')
production_line_name = fields.Char(string='产线名称')
machine_tool_code = fields.Char(string='机台号')
@@ -244,7 +244,7 @@ class DeliveryOfCargoFromStorage(models.TransientModel):
for val in vals:
self.env['sf.functional.tool.assembly'].search([
('functional_tool_code', '=', val.functional_tool_code),
('functional_tool_name', '=', val.functional_tool_name)
('name', '=', val.name)
]).write({
'assemble_status': '2',
'receive_person': self.env.user.name,
@@ -253,13 +253,13 @@ class DeliveryOfCargoFromStorage(models.TransientModel):
tool_assembly = self.env['sf.functional.tool.assembly'].search([
('functional_tool_code', '=', val.functional_tool_code),
('functional_tool_name', '=', val.functional_tool_name)
('name', '=', val.name)
])
# 判断装刀任务来源如果来源于CAM装刀则修改CAM装刀的计划执行状态
if tool_assembly.loading_task_source == '0':
self.env['sf.cam.work.order.program.knife.plan'].search([
('functional_tool_code', '=', val.functional_tool_code),
('functional_tool_name', '=', val.functional_tool_name)
('functional_tool_name', '=', val.name)
]).write({
'plan_execute_status': '2'
})

View File

@@ -10,7 +10,7 @@
<group>
<group>
<group>
<field name="CNC_machine_table"/>
<field name="name"/>
</group>
<group>
<field name="machine_tool_code"/>
@@ -275,7 +275,7 @@
<tree>
<field name="order"/>
<field name="functional_tool_code"/>
<field name="functional_tool_name"/>
<field name="name"/>
<field name="functional_tool_type"/>
<field name="production_line_name"/>
<field name="machine_tool_code"/>

View File

@@ -15,7 +15,7 @@ class SfLocation(models.Model):
('库区', '库区'),
('货架', '货架'),
('货位', '货位')
], string='仓库类别')
], string='存储类型')
# 库区类型selection拣货区、存货区、收货区、退货区、次品区
area_type = fields.Selection([
('拣货区', '拣货区'),
@@ -25,10 +25,10 @@ class SfLocation(models.Model):
('次品区', '次品区')
], string='库区类型')
# 存储类型selection库区、货架
storage_type = fields.Selection([
('库区', '库区'),
('货架', '货架')
], string='存储类型')
# storage_type = fields.Selection([
# ('库区', '库区'),
# ('货架', '货架')
# ], string='存储类型')
# 产品类别 关联product.category
product_type = fields.Many2many('product.category', string='产品类别')
# 货架独有字段通道、方向、货架高度m、货架层数、层数容量
@@ -61,26 +61,26 @@ class SfLocation(models.Model):
hide_shelf = fields.Boolean(compute='_compute_hide_what', string='隐藏货架')
hide_location = fields.Boolean(compute='_compute_hide_what', string='隐藏货位')
@api.model
def create(self, vals):
"""
重写create方法添加自定义的约束
"""
print('create', vals)
if vals.get('location_id'):
location = self.env['stock.location'].browse(vals.get('location_id'))
if location.storage_type == '库区':
raise UserError('库区不能作为父级仓库')
return super().create(vals)
@api.onchange('location_id')
def _onchange_location_id(self):
"""
重写onchange方法添加自定义的约束
"""
if self.location_id:
if self.location_id.storage_type == '库区':
raise UserError('库区不能作为父级仓库')
# @api.model
# def create(self, vals):
# """
# 重写create方法添加自定义的约束
# """
# print('create', vals)
# if vals.get('location_id'):
# location = self.env['stock.location'].browse(vals.get('location_id'))
# if location.storage_type == '库区':
# raise UserError('库区不能作为父级仓库')
# return super().create(vals)
#
# @api.onchange('location_id')
# def _onchange_location_id(self):
# """
# 重写onchange方法添加自定义的约束
# """
# if self.location_id:
# if self.location_id.storage_type == '库区':
# raise UserError('库区不能作为父级仓库')
# @api.constrains('shelf_height')
# def _check_shelf_height(self):

View File

@@ -35,7 +35,7 @@
</group>
<group>
<field name="storage_type" attrs="{'invisible': [('hide_area', '=', False)], 'required': [('hide_area', '!=', False)]}"/>
<!-- <field name="storage_type" attrs="{'invisible': [('hide_area', '=', False)], 'required': [('hide_area', '!=', False)]}"/> -->
<field name="product_type" widget="many2many_tags" attrs="{'invisible': [('hide_area', '=', False)], 'required': [('hide_area', '!=', False)]}"/>
<field name="shelf_height" attrs="{'invisible': [('hide_shelf', '=', False)], 'required': [('hide_shelf', '!=', False)]}"/>
<field name="shelf_layer" attrs="{'invisible': [('hide_shelf', '=', False)], 'required': [('hide_shelf', '!=', False)]}"/>

File diff suppressed because it is too large Load Diff