Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/新增工件装夹
# Conflicts: # sf_maintenance/__manifest__.py
This commit is contained in:
@@ -3,4 +3,3 @@ from . import sf_maintenance
|
||||
from . import sf_maintenance_logs
|
||||
from . import sf_equipment_maintenance_standards
|
||||
from . import sf_maintenance_requests
|
||||
from . import production_line_base
|
||||
|
||||
@@ -4,6 +4,6 @@ access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,base.gr
|
||||
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,base.group_user,1,1,1,1
|
||||
access_maintenance_standards,maintenance_standards,model_maintenance_standards,base.group_user,1,1,1,1
|
||||
|
||||
access_sf_production_line,sf.production.line,model_sf_production_line,base.group_user,1,1,1,1
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -20,6 +20,7 @@
|
||||
'views/mrp_routing_workcenter_view.xml',
|
||||
'views/mrp_workcenter_views.xml',
|
||||
'views/mrp_workorder_view.xml',
|
||||
'views/production_line_view.xml',
|
||||
'views/tray_view.xml',
|
||||
'views/model_type_view.xml',
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ from . import mrp_maintenance
|
||||
from . import mrp_routing_workcenter
|
||||
from . import stock
|
||||
from . import res_user
|
||||
from . import production_line_base
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ access_sf_product_model_type_routing_sort,sf_product_model_type_routing_sort,mod
|
||||
access_sf_embryo_model_type_routing_sort,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,base.group_user,1,1,1,1
|
||||
access_sf_surface_technics_model_type_routing_sort,sf_surface_technics_model_type_routing_sort,model_sf_surface_technics_model_type_routing_sort,base.group_user,1,1,1,1
|
||||
|
||||
|
||||
access_sf_production_line,sf.production.line,model_sf_production_line,base.group_user,1,1,1,1
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -10,11 +10,11 @@
|
||||
""",
|
||||
'category': 'sf',
|
||||
'website': 'https://www.sf.jikimo.com',
|
||||
'depends': ['sf_maintenance'],
|
||||
'depends': ['sf_manufacturing'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
# 'security/ir.model.access.csv',
|
||||
'views/paln_base_view.xml',
|
||||
'views/plan_base_view.xml',
|
||||
'views/menu_view.xml',
|
||||
],
|
||||
'demo': [
|
||||
|
||||
@@ -19,7 +19,7 @@ class ProcedureEquipmentResourceSetting(models.Model):
|
||||
working_procedure = fields.Char(string='工序', readonly=True)
|
||||
production_capacity = fields.Float(string='产能', required=True, digits=(4, 1))
|
||||
working_calendar_id = fields.Many2one('sf.work.log.setting', string='工作日历')
|
||||
working_shift = fields.Char(string='班次', readonly=True, compute='_onchange_working_calendar_id')
|
||||
working_shift_id = fields.Many2many('sf.working.shift', string='班次', readonly=True, compute='_onchange_working_calendar_id')
|
||||
create_time = fields.Datetime(string='新增时间', default=lambda self: fields.Datetime.now(), readonly=True)
|
||||
status = fields.Selection([('正常', '正常'), ('1', '故障停机'), ('2', '计划停机')],
|
||||
string='设备状态',
|
||||
@@ -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 = record.working_calendar_id.working_shift
|
||||
record.working_shift_id = record.working_calendar_id.working_shift_id
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from odoo import models, fields, api
|
||||
import re
|
||||
|
||||
@@ -45,29 +47,21 @@ class WorkLogSetting(models.Model):
|
||||
end_time_M = fields.Selection(time_M_or_S_selection(), '分', required=True)
|
||||
|
||||
duration = fields.Char(string='时长', readonly=True, compute='_compute_duration')
|
||||
day_off = fields.Char(string='休息日', required=True)
|
||||
day_off_id = fields.Many2many('sf.day.off', string='休息日', required=True)
|
||||
|
||||
user_defined_working_shift_status = fields.Boolean(string='自定义班次', default=False)
|
||||
working_shift = fields.Char(string='班次')
|
||||
working_shift_char = fields.Char(string='班次', readonly=True, compute='_compute_working_shift_time')
|
||||
working_shift_select = fields.Selection([('早班00:00-08:00', '早班00:00-08:00'),
|
||||
('白班08:00-16:00', '白班08:00-16:00'),
|
||||
('晚班16:00-24:00', '晚班16:00-24:00'),
|
||||
('长白班08:00-20:00', '长白班08:00-20:00'),
|
||||
('长晚班20:00-08:00', '长晚班20:00-08:00')], string='班次')
|
||||
working_shift_start_time_H = fields.Selection(time_H_selection(), '班次开始时间:时',
|
||||
attr={'required': [('user_defined_working_shift_status', '=', 'True')]})
|
||||
working_shift_start_time_M = fields.Selection(time_M_or_S_selection(), '分',
|
||||
attr={'required': [('user_defined_working_shift_status', '=', 'True')]})
|
||||
working_shift_end_time_H = fields.Selection(time_H_selection(), '班次结束时间:时',
|
||||
attr={'required': [('user_defined_working_shift_status', '=', 'True')]})
|
||||
working_shift_end_time_M = fields.Selection(time_M_or_S_selection(), '分',
|
||||
attr={'required': [('user_defined_working_shift_status', '=', 'True')]})
|
||||
working_shift_id = fields.Many2many('sf.working.shift', string='班次')
|
||||
|
||||
status = fields.Boolean(string='状态', default=True)
|
||||
update_person = fields.Char(string='更新人', default=lambda self: self.env.user.name)
|
||||
update_time = fields.Datetime(string='更新时间', default=lambda self: fields.Datetime.now())
|
||||
|
||||
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):
|
||||
"""
|
||||
@@ -86,27 +80,7 @@ class WorkLogSetting(models.Model):
|
||||
for record in self:
|
||||
record.end_time = f"{record.end_time_H}:{record.end_time_M}:00"
|
||||
|
||||
@api.onchange('working_shift_char', 'working_shift_select')
|
||||
def _onchange_working_shift(self):
|
||||
"""
|
||||
对班次是否手动输入是进行不同的展示
|
||||
:return:
|
||||
"""
|
||||
for record in self:
|
||||
if record.working_shift_select:
|
||||
record.working_shift = record.working_shift_select
|
||||
else:
|
||||
record.working_shift = record.working_shift_char
|
||||
|
||||
@api.depends(
|
||||
'working_shift_start_time_H', 'working_shift_start_time_M',
|
||||
'working_shift_end_time_H', 'working_shift_end_time_M')
|
||||
def _compute_working_shift_time(self):
|
||||
start_time = f"{self.working_shift_start_time_H}:{self.working_shift_start_time_M}:00"
|
||||
end_time = f"{self.working_shift_end_time_H}:{self.working_shift_end_time_M}:00"
|
||||
self.working_shift_char = f"自定义班次{start_time}-{end_time}"
|
||||
|
||||
@api.depends('start_time_H', 'start_time_M', 'end_time_H', 'end_time_M')
|
||||
@api.depends('start_time_H', 'start_time_M', 'end_time_H', 'end_time_M')
|
||||
def _compute_duration(self):
|
||||
"""
|
||||
根据日开始时间和日结束时间计算每日工作时长
|
||||
@@ -119,6 +93,114 @@ class WorkLogSetting(models.Model):
|
||||
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))
|
||||
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))
|
||||
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):
|
||||
# 先删除之前创建的工作日历事件记录
|
||||
# self.env['sf.work.schedule.calendar'].search([('calendar_code', '=', self.code)]).unlink()
|
||||
|
||||
# 获取当年的一月一号的日期
|
||||
year = fields.Datetime.now().year # 2023
|
||||
first_day = datetime(year, 1, 1).date() # 2023-01-01
|
||||
day_of_week = first_day.strftime("%A") # 星期日
|
||||
|
||||
# 根据day_of_week,将其设置为起始0,循环周一到周日,按循环顺序设置为0-6
|
||||
# 列:{'星期日': 0, '星期一': 1, '星期二': 2, '星期三': 3, '星期四': 4, '星期五': 5, '星期六': 6}
|
||||
desc = {}
|
||||
desc_weekdays = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
|
||||
status = False
|
||||
ints = 0
|
||||
while len(desc) < 7:
|
||||
if len(desc) != 0:
|
||||
for week in desc_weekdays:
|
||||
if len(desc) < 7:
|
||||
desc.update({week: ints})
|
||||
ints += 1
|
||||
else:
|
||||
for week in desc_weekdays:
|
||||
if status:
|
||||
desc.update({week: ints})
|
||||
ints += 1
|
||||
if day_of_week == week:
|
||||
desc.update({week: ints})
|
||||
status = True
|
||||
ints += 1
|
||||
|
||||
# 创建工作日历的休息日事件
|
||||
day_off_ids = self.day_off_id.mapped('name')
|
||||
record = self.env['sf.work.log.setting'].search([('code', '=', self.code)])
|
||||
# record.setting_to_calendar_ids.unlink()
|
||||
# self.env.cr.commit()
|
||||
for week in day_off_ids:
|
||||
num = desc[week]
|
||||
while num <= 30:
|
||||
target_date = first_day + timedelta(days=num)
|
||||
num += 7
|
||||
self.env['sf.work.schedule.calendar'].create({'name': '休息日',
|
||||
'name_id': record.id,
|
||||
'calendar_code': self.code,
|
||||
'date_time': target_date})
|
||||
|
||||
|
||||
class WorkingShift(models.Model):
|
||||
_name = 'sf.working.shift'
|
||||
_description = '班次'
|
||||
|
||||
def _get_code(self):
|
||||
"""
|
||||
自动生成编码
|
||||
:return:
|
||||
"""
|
||||
fixture_material = self.env['sf.working.shift'].sudo().search(
|
||||
[('code', '!=', '')],
|
||||
limit=1,
|
||||
order="id desc")
|
||||
if not fixture_material:
|
||||
num = "%03d" % 1
|
||||
else:
|
||||
m = int(fixture_material.code) + 1
|
||||
num = "%03d" % m
|
||||
return num
|
||||
|
||||
code = fields.Char('编码', default=_get_code, readonly=True)
|
||||
name = fields.Char('名称', required=True)
|
||||
start_time = fields.Datetime('班次开始时间')
|
||||
end_time = fields.Datetime('班次结束时间')
|
||||
remark = fields.Char('备注')
|
||||
|
||||
|
||||
class DayOff(models.Model):
|
||||
_name = 'sf.day.off'
|
||||
_description = '休息日'
|
||||
|
||||
name = fields.Selection([
|
||||
('星期一', '星期一'),
|
||||
('星期二', '星期二'),
|
||||
('星期三', '星期三'),
|
||||
('星期四', '星期四'),
|
||||
('星期五', '星期五'),
|
||||
('星期六', '星期六'),
|
||||
('星期日', '星期日')], '休息日名称')
|
||||
|
||||
|
||||
class WorkScheduleCalendar(models.Model):
|
||||
_name = 'sf.work.schedule.calendar'
|
||||
_description = '工作日历'
|
||||
|
||||
name = fields.Selection([('休息日', '休息日'), ('计划停机', '计划停机')], '日历事件名称')
|
||||
date_time = fields.Date('休息时间')
|
||||
name_id = fields.Many2one('sf.work.log.setting', '工作日历名称')
|
||||
calendar_code = fields.Char('工作日历编码')
|
||||
|
||||
day_off_id = fields.Many2many('sf.day.off', string='休息日')
|
||||
scheduled_outage = fields.Char('计划停机')
|
||||
monthly_rest_days = fields.Char('月休息天数', readonly=True)
|
||||
annual_rest_days = fields.Char('年休息天数', readonly=True)
|
||||
monthly_planned_downtime = fields.Char('月计划停机时长', readonly=True)
|
||||
annual_planned_downtime = fields.Char('年计划停机时长', readonly=True)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,10 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_sf_work_log_setting,sf.work.log.setting,model_sf_work_log_setting,base.group_user,1,1,1,1
|
||||
access_sf_procedure_equipment_resource_setting,sf.procedure.equipment.resource.setting,model_sf_procedure_equipment_resource_setting,base.group_user,1,1,1,1
|
||||
|
||||
access_sf_day_off,sf.day.off,model_sf_day_off,base.group_user,1,1,1,1
|
||||
access_sf_working_shift,sf.working.shift,model_sf_working_shift,base.group_user,1,1,1,1
|
||||
access_sf_work_schedule_calendar,sf.work.schedule.calendar,model_sf_work_schedule_calendar,base.group_user,1,1,1,1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -25,4 +25,25 @@
|
||||
action="sf_procedure_equipment_resource_setting_act"
|
||||
sequence="10"
|
||||
/>
|
||||
|
||||
<menuitem id="menu_sf_working_shift"
|
||||
name="班次"
|
||||
parent="menu_sf_basic_setting"
|
||||
action="sf_working_shift_act"
|
||||
sequence="12"
|
||||
/>
|
||||
|
||||
<menuitem id="menu_sf_day_off"
|
||||
name="休息日"
|
||||
parent="menu_sf_basic_setting"
|
||||
action="sf_day_off_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>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<!--========================================工作日历设置========================================-->
|
||||
<!--================================================工作日历设置================================================-->
|
||||
<record id="sf_work_log_setting_tree" model="ir.ui.view">
|
||||
<field name="name">工作日历设置</field>
|
||||
<field name="model">sf.work.log.setting</field>
|
||||
@@ -11,11 +11,12 @@
|
||||
<field name="start_time"/>
|
||||
<field name="end_time"/>
|
||||
<field name="duration"/>
|
||||
<field name="day_off"/>
|
||||
<field name="working_shift"/>
|
||||
<field name="day_off_id" widget="many2many_tags"/>
|
||||
<field name="working_shift_id" widget="many2many_tags"/>
|
||||
<field name="status"/>
|
||||
<field name="update_person"/>
|
||||
<field name="update_time"/>
|
||||
<!-- <button string="查看日历" type="object" name="sf_work_schedule_calendar_act"/>-->
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
@@ -35,29 +36,7 @@
|
||||
</group>
|
||||
</group>
|
||||
<group string="选择班次">
|
||||
<group>
|
||||
<group>
|
||||
<field name="working_shift_char" attrs="{'invisible': [('user_defined_working_shift_status', '=', False)]}"/>
|
||||
<field name="working_shift_select" attrs="{'invisible': [('user_defined_working_shift_status', '!=', False)]}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="user_defined_working_shift_status"/>
|
||||
<field name="working_shift" invisible="True"/>
|
||||
</group>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<group>
|
||||
<group>
|
||||
<field name="working_shift_start_time_H" attrs="{'invisible': [('user_defined_working_shift_status', '=', False)]}"/>
|
||||
<field name="working_shift_end_time_H" attrs="{'invisible': [('user_defined_working_shift_status', '=', False)]}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="working_shift_start_time_M" attrs="{'invisible': [('user_defined_working_shift_status', '=', False)]}"/>
|
||||
<field name="working_shift_end_time_M" attrs="{'invisible': [('user_defined_working_shift_status', '=', False)]}"/>
|
||||
</group>
|
||||
</group>
|
||||
|
||||
<field name="working_shift_id"/>
|
||||
</group>
|
||||
<group string="工作时间">
|
||||
<group>
|
||||
@@ -80,13 +59,14 @@
|
||||
<group>
|
||||
<group>
|
||||
<field name="duration"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="day_off"/>
|
||||
<field name="day_off_id"
|
||||
widget="many2many_tags"
|
||||
options="{'no_create': True, 'no_quick_create': True}"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="日历状态">
|
||||
<field name="status"/>
|
||||
<field name="setting_to_calendar_ids"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
@@ -100,7 +80,138 @@
|
||||
</record>
|
||||
|
||||
|
||||
<!--========================================产线设备资源设置========================================-->
|
||||
<!--================================================休息日================================================-->
|
||||
<record id="sf_day_off_tree" model="ir.ui.view">
|
||||
<field name="name">休息日</field>
|
||||
<field name="model">sf.day.off</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_day_off_act" model="ir.actions.act_window">
|
||||
<field name="name">休息日</field>
|
||||
<field name="res_model">sf.day.off</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!--================================================班次================================================-->
|
||||
<record id="sf_working_shift_tree" model="ir.ui.view">
|
||||
<field name="name">班次</field>
|
||||
<field name="model">sf.working.shift</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="code"/>
|
||||
<field name="name"/>
|
||||
<field name="start_time"/>
|
||||
<field name="end_time"/>
|
||||
<field name="remark"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_working_shift_form" model="ir.ui.view">
|
||||
<field name="name">班次</field>
|
||||
<field name="model">sf.working.shift</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="start_time"/>
|
||||
<field name="end_time"/>
|
||||
<field name="remark"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="code"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_working_shift_act" model="ir.actions.act_window">
|
||||
<field name="name">班次</field>
|
||||
<field name="res_model">sf.working.shift</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!--================================================工作日历================================================-->
|
||||
<record id="sf_work_schedule_calendar_tree" model="ir.ui.view">
|
||||
<field name="name">工作日历</field>
|
||||
<field name="model">sf.work.schedule.calendar</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="name_id" invisible="True"/>
|
||||
<field name="name"/>
|
||||
<field name="date_time"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_work_schedule_calendar_form" model="ir.ui.view">
|
||||
<field name="name">工作日历</field>
|
||||
<field name="model">sf.work.schedule.calendar</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group string="日历基本信息">
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="date_time"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="name_id"/>
|
||||
<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>
|
||||
</record>
|
||||
|
||||
<record id="sf_work_schedule_calendar_search" model="ir.ui.view">
|
||||
<field name="name">工作日历</field>
|
||||
<field name="model">sf.work.schedule.calendar</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<searchpanel>
|
||||
<field name="name_id" icon="fa-building" enable_counters="1"/>
|
||||
</searchpanel>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_work_schedule_calendar_calendar" model="ir.ui.view">
|
||||
<field name="name">工作日历</field>
|
||||
<field name="model">sf.work.schedule.calendar</field>
|
||||
<field name="arch" type="xml">
|
||||
<calendar string="工作日历" mode="year" date_start="date_time">
|
||||
<field name="name"/>
|
||||
</calendar>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_work_schedule_calendar_act" model="ir.actions.act_window">
|
||||
<field name="name">工作日历</field>
|
||||
<field name="res_model">sf.work.schedule.calendar</field>
|
||||
<field name="view_mode">calendar,search,tree,form</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!--================================================产线设备资源设置================================================-->
|
||||
<record id="sf_procedure_equipment_resource_setting_tree" model="ir.ui.view">
|
||||
<field name="name">产线设备资源设置</field>
|
||||
<field name="model">sf.procedure.equipment.resource.setting</field>
|
||||
@@ -114,7 +225,7 @@
|
||||
<field name="working_procedure"/>
|
||||
<field name="production_capacity"/>
|
||||
<field name="working_calendar_id"/>
|
||||
<field name="working_shift"/>
|
||||
<field name="working_shift_id" widget="many2many_tags"/>
|
||||
<field name="create_time"/>
|
||||
<field name="status"/>
|
||||
<field name="participate_in_scheduling"/>
|
||||
@@ -161,7 +272,7 @@
|
||||
<field name="create_time"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="working_shift"/>
|
||||
<field name="working_shift_id" widget="many2many_tags"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
@@ -182,7 +293,7 @@
|
||||
<field name="working_procedure"/>
|
||||
<field name="production_capacity"/>
|
||||
<field name="working_calendar_id"/>
|
||||
<field name="working_shift"/>
|
||||
<field name="working_shift_id"/>
|
||||
<field name="create_time"/>
|
||||
<field name="status"/>
|
||||
<field name="participate_in_scheduling"/>
|
||||
@@ -23,7 +23,11 @@
|
||||
'web.assets_qweb': [
|
||||
],
|
||||
'web.assets_backend':[
|
||||
'sf_warehouse/static/src/kanban_color_change.scss'
|
||||
# 'sf_warehouse/static/src/js/vanilla-masker.min.js',
|
||||
'sf_warehouse/static/src/css/kanban_color_change.scss',
|
||||
'sf_warehouse/static/src/js/custom_kanban_controller.js',
|
||||
'sf_warehouse/static/src/xml/custom_kanban_controller.xml',
|
||||
|
||||
]
|
||||
|
||||
|
||||
|
||||
@@ -10,22 +10,12 @@ class SfLocation(models.Model):
|
||||
name = fields.Char('Location Name', required=True, size=20)
|
||||
barcode = fields.Char('Barcode', copy=False, required=True, size=15)
|
||||
|
||||
# 仓库类别(selection:仓库、库区、库位、货位)
|
||||
# 仓库类别(selection:库区、库位、货位)
|
||||
location_type = fields.Selection([
|
||||
('仓库', '仓库'),
|
||||
('库区', '库区'),
|
||||
('货架', '货架'),
|
||||
('货位', '货位')
|
||||
], string='仓库类别')
|
||||
# 仓库类型(分类:成品库、坯料库、原材料库、刀具库、线边料库、线边刀库)
|
||||
location_category = fields.Selection([
|
||||
('成品库', '成品库'),
|
||||
('坯料库', '坯料库'),
|
||||
('原材料库', '原材料库'),
|
||||
('刀具库', '刀具库'),
|
||||
('线边料库', '线边料库'),
|
||||
('线边刀库', '线边刀库')
|
||||
], string='仓库类型')
|
||||
# 库区类型(selection:拣货区、存货区、收货区、退货区、次品区)
|
||||
area_type = fields.Selection([
|
||||
('拣货区', '拣货区'),
|
||||
@@ -34,6 +24,13 @@ class SfLocation(models.Model):
|
||||
('退货区', '退货区'),
|
||||
('次品区', '次品区')
|
||||
], string='库区类型')
|
||||
# 存储类型(selection:库区、货架)
|
||||
storage_type = fields.Selection([
|
||||
('库区', '库区'),
|
||||
('货架', '货架')
|
||||
], string='存储类型')
|
||||
# 产品类别 (关联:product.category)
|
||||
product_type = fields.Many2many('product.category', string='产品类别')
|
||||
# 货架独有字段:通道、方向、货架高度(m)、货架层数、层数容量
|
||||
channel = fields.Char(string='通道', required=True)
|
||||
direction = fields.Selection([
|
||||
@@ -64,6 +61,27 @@ 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.constrains('shelf_height')
|
||||
# def _check_shelf_height(self):
|
||||
# for record in self:
|
||||
@@ -84,6 +102,9 @@ class SfLocation(models.Model):
|
||||
|
||||
@api.depends('product_sn_id')
|
||||
def _compute_product_id(self):
|
||||
"""
|
||||
根据产品序列号,获取产品
|
||||
"""
|
||||
for record in self:
|
||||
if record.product_sn_id:
|
||||
record.product_id = record.product_sn_id.product_id
|
||||
@@ -153,6 +174,9 @@ class SfLocation(models.Model):
|
||||
|
||||
# 生成货位
|
||||
def create_location(self):
|
||||
"""
|
||||
当仓库类型为货架时,自动生成其下面的货位,数量为货架层数*层数容量
|
||||
"""
|
||||
if self.location_type == '货架':
|
||||
for i in range(self.shelf_layer):
|
||||
for j in range(self.layer_capacity):
|
||||
@@ -165,8 +189,12 @@ class SfLocation(models.Model):
|
||||
})
|
||||
|
||||
def generate_barcode(self, i, j):
|
||||
"""
|
||||
生成货位条码
|
||||
"""
|
||||
# 这里是你生成barcode的代码
|
||||
area_type_barcode = self.location_id.barcode
|
||||
# area_type_barcode = self.location_id.barcode
|
||||
area_type_barcode = self.barcode
|
||||
i_str = str(i + 1).zfill(3) # 确保是两位数,如果不足两位,左侧补0
|
||||
j_str = str(j + 1).zfill(3) # 确保是两位数,如果不足两位,左侧补0
|
||||
return area_type_barcode + self.channel + self.direction + '-' + self.barcode + '-' + i_str + '-' + j_str
|
||||
|
||||
25
sf_warehouse/static/src/css/kanban_color_change.scss
Normal file
25
sf_warehouse/static/src/css/kanban_color_change.scss
Normal file
@@ -0,0 +1,25 @@
|
||||
.oe_kanban_card.kanban_color_1 {
|
||||
background-color: #73b9a2 !important;
|
||||
}
|
||||
|
||||
.oe_kanban_card.kanban_color_2 {
|
||||
background-color: #ac6767 !important;
|
||||
}
|
||||
|
||||
.oe_kanban_card.kanban_color_3 {
|
||||
background-color: #77787b !important;
|
||||
}
|
||||
|
||||
.color-guide {
|
||||
border: 1px solid #ccc;
|
||||
background-color: #f9f9f9;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.color-guide-item {
|
||||
display: inline-block;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
margin-right: 10px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
21
sf_warehouse/static/src/js/custom_kanban_controller.js
Normal file
21
sf_warehouse/static/src/js/custom_kanban_controller.js
Normal file
@@ -0,0 +1,21 @@
|
||||
/** @odoo-module */
|
||||
|
||||
import { KanbanController } from "@web/views/kanban/kanban_controller";
|
||||
import { kanbanView } from "@web/views/kanban/kanban_view";
|
||||
import { registry } from "@web/core/registry";
|
||||
|
||||
// the controller usually contains the Layout and the renderer.
|
||||
class CustomKanbanController extends KanbanController {
|
||||
// Your logic here, override or insert new methods...
|
||||
// if you override setup(), don't forget to call super.setup()
|
||||
}
|
||||
|
||||
CustomKanbanController.template = "sf_warehouse.CustomKanbanView";
|
||||
|
||||
export const customKanbanView = {
|
||||
...kanbanView, // contains the default Renderer/Controller/Model
|
||||
Controller: CustomKanbanController,
|
||||
};
|
||||
|
||||
// Register it to the views registry
|
||||
registry.category("views").add("custom_kanban", customKanbanView);
|
||||
@@ -1,11 +0,0 @@
|
||||
.oe_kanban_card.kanban_color_1 {
|
||||
background-color: red !important;
|
||||
}
|
||||
|
||||
.oe_kanban_card.kanban_color_2 {
|
||||
background-color: blue !important;
|
||||
}
|
||||
|
||||
.oe_kanban_card.kanban_color_3 {
|
||||
background-color: green !important;
|
||||
}
|
||||
16
sf_warehouse/static/src/xml/custom_kanban_controller.xml
Normal file
16
sf_warehouse/static/src/xml/custom_kanban_controller.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<templates>
|
||||
<t t-name="sf_warehouse.CustomKanbanView" t-inherit="web.KanbanView" owl="1">
|
||||
<!-- <xpath expr="//Layout" position="before"> -->
|
||||
<!-- <div> -->
|
||||
<!-- Hello world ! -->
|
||||
<!-- </div> -->
|
||||
<!-- </xpath> -->
|
||||
<xpath expr="//t[@t-component='props.Renderer']" position="before">
|
||||
<div>
|
||||
Hello world !
|
||||
</div>
|
||||
</xpath>
|
||||
|
||||
</t>
|
||||
</templates>
|
||||
@@ -30,11 +30,13 @@
|
||||
<field name="channel" attrs="{'invisible': [('hide_shelf', '=', False)], 'required': [('hide_shelf', '!=', False)]}"/>
|
||||
<field name="direction" attrs="{'invisible': [('hide_shelf', '=', False)], 'required': [('hide_shelf', '!=', False)]}"/>
|
||||
<field name="product_sn_id" attrs="{'invisible': [('hide_location', '=', False)], 'required': [('hide_location', '!=', False), ('location_status', '=', '空闲')]}"/>
|
||||
<field name="area_type" attrs="{'invisible': [('hide_area', '=', False)], 'required': [('hide_area', '!=', False)]}"/>
|
||||
|
||||
|
||||
</group>
|
||||
<group>
|
||||
<field name="location_category" attrs="{'invisible': [('hide_location_type', '=', False)], 'required': [('hide_location_type', '!=', False)]}"/>
|
||||
<field name="area_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)]}"/>
|
||||
<field name="layer_capacity" attrs="{'invisible': [('hide_shelf', '=', False)], 'required': [('hide_shelf', '!=', False)]}"/>
|
||||
@@ -53,7 +55,13 @@
|
||||
<button string="生成货位" name="create_location" type="object" class="oe_highlight" attrs="{'invisible': [('hide_shelf', '=', False)]}"/>
|
||||
</header>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//form/sheet/group[last()]">
|
||||
<notebook position="after" attrs="{'invisible': [('hide_area', '=', False)]}">
|
||||
<page string="库存信息">
|
||||
<field name="quant_ids" widget="one2many_list" context="{'location': active_id}"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -74,7 +82,7 @@
|
||||
<field name="name">example.kanban</field>
|
||||
<field name="model">stock.location</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban class="o_kanban_mobile">
|
||||
<kanban class="o_kanban_mobile" js_class="custom_kanban">
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="oe_kanban_card oe_kanban_global_click
|
||||
|
||||
Reference in New Issue
Block a user