diff --git a/sf_dlm/models/product_supplierinfo.py b/sf_dlm/models/product_supplierinfo.py
index f8055e1a..0e04c1d2 100644
--- a/sf_dlm/models/product_supplierinfo.py
+++ b/sf_dlm/models/product_supplierinfo.py
@@ -95,7 +95,7 @@ class ResMrpBomMo(models.Model):
limit=1,
order='volume desc'
)
- logging.info('get_bom-vals:%s' % embryo_has)
+ # logging.info('get_bom-vals:%s' % embryo_has)
if embryo_has:
rate_of_waste = ((embryo_has.volume - product.model_volume) % embryo_has.volume) * 100
if rate_of_waste <= 20:
diff --git a/sf_plan/models/custom_plan.py b/sf_plan/models/custom_plan.py
index 858b1036..7603b4fd 100644
--- a/sf_plan/models/custom_plan.py
+++ b/sf_plan/models/custom_plan.py
@@ -162,6 +162,86 @@ class sf_production_plan(models.Model):
# delivery_date = fields.Datetime(string='交货日期', related='plan_end_time', readonly=False, store=True)
# 当不设置计划结束时间时,增加计算计划结束时间的方法,根据采购周期加缓冲期两个值来算就可以了
+ # def do_production_schedule(self):
+ # """
+ # 排程方法
+ # """
+ # if not self.production_line_id:
+ # raise ValidationError("未选择生产线")
+ # else:
+ # aa = self.env['mrp.production'].sudo().search([('name', '=', self.name)])
+ # workorder_time = 0
+ # workorder_id_list = self.production_id.workorder_ids.ids
+ # print(workorder_id_list)
+ # print(type(self.production_id.workorder_ids))
+ # if self.production_id.workorder_ids:
+ # for item in self.production_id.workorder_ids:
+ # if item.name == 'CNC加工':
+ # item.date_planned_start = self.date_planned_start
+ # item.date_planned_finished = item.date_planned_start + timedelta(
+ # minutes=self.env['mrp.routing.workcenter'].sudo().search(
+ # [('name', '=', 'CNC加工')]).time_cycle)
+ # item.duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
+ # [('name', '=', 'CNC加工')]).time_cycle
+ # # print(item.id)
+ # sequence = workorder_id_list.index(item.id) - 1
+ # # print('sequence', sequence)
+ # # print('total', len(workorder_id_list))
+ # # 计算CNC加工之前工单的开始结束时间
+ # for i in range(sequence):
+ # current_workorder_id = (item.id - (i + 1))
+ # current_workorder_obj = self.env['mrp.workorder'].sudo().search(
+ # [('id', '=', current_workorder_id)])
+ # old_workorder_obj = self.env['mrp.workorder'].sudo().search(
+ # [('id', '=', (current_workorder_id + 1))])
+ # work_order = self.env['mrp.workorder'].sudo().search(
+ # [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)])
+ # work_order.date_planned_finished = old_workorder_obj.date_planned_start
+ # work_order.date_planned_start = old_workorder_obj.date_planned_start - timedelta(
+ # minutes=self.env['mrp.routing.workcenter'].sudo().search(
+ # [('name', '=', current_workorder_obj.name)]).time_cycle)
+ # work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
+ # [('name', '=', current_workorder_obj.name)]).time_cycle
+ # # 计算CNC加工之后工单的开始结束时间
+ # for j in range(len(workorder_id_list) - sequence - 2):
+ # current_workorder_id = (item.id + (j + 1))
+ # current_workorder_obj = self.env['mrp.workorder'].sudo().search(
+ # [('id', '=', current_workorder_id)])
+ # old_workorder_obj = self.env['mrp.workorder'].sudo().search(
+ # [('id', '=', (current_workorder_id - 1))])
+ # work_order = self.env['mrp.workorder'].sudo().search(
+ # [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)])
+ # try:
+ # work_order.date_planned_start = old_workorder_obj.date_planned_finished
+ # print('work_order.data_start', work_order.date_planned_start)
+ # work_order.date_planned_finished = old_workorder_obj.date_planned_finished + timedelta(
+ # minutes=self.env['mrp.routing.workcenter'].sudo().search(
+ # [('name', '=', current_workorder_obj.name)]).time_cycle)
+ # work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
+ # [('name', '=', current_workorder_obj.name)]).time_cycle
+ # except ValueError as e:
+ # print('时间设置失败,请检查是否为工序分配工作中心,%s' % e)
+ #
+ # current_workorder = self.env['mrp.workorder'].sudo().search([('id', '=', item.id)])
+ # workorder_time += current_workorder.duration_expected
+ # print('workorder_time', workorder_time)
+ # self.date_planned_finished = self.date_planned_start + timedelta(minutes=workorder_time)
+ # self.state = 'done'
+ # self.production_id.schedule_state = '已排'
+ # # self.production_id.date_planned_start = self.date_planned_start
+ # # self.production_id.date_planned_finished = self.date_planned_finished
+ # else:
+ # raise ValidationError("未找到工单")
+ # # self.date_planned_finished = self.date_planned_start + timedelta(days=3)
+ # # self.state = 'done'
+ # return {
+ # 'name': '排程甘特图',
+ # 'type': 'ir.actions.act_window',
+ # 'res_model': 'sf.production.plan', # 要跳转的模型名称
+ # 'view_mode': 'gantt,tree,form', # 要显示的视图类型,可以是'form', 'tree', 'kanban', 'graph', 'calendar', 'pivot'等
+ # 'target': 'current', # 跳转的目标窗口,可以是'current'或'new'
+ # }
+
def do_production_schedule(self):
"""
排程方法
@@ -169,60 +249,20 @@ class sf_production_plan(models.Model):
if not self.production_line_id:
raise ValidationError("未选择生产线")
else:
- aa = self.env['mrp.production'].sudo().search([('name', '=', self.name)])
- workorder_time = 0
workorder_id_list = self.production_id.workorder_ids.ids
- print(workorder_id_list)
- print(type(self.production_id.workorder_ids))
if self.production_id.workorder_ids:
for item in self.production_id.workorder_ids:
if item.name == 'CNC加工':
+ item.date_planned_finished = datetime.now() + timedelta(days=100)
item.date_planned_start = self.date_planned_start
item.date_planned_finished = item.date_planned_start + timedelta(
minutes=self.env['mrp.routing.workcenter'].sudo().search(
[('name', '=', 'CNC加工')]).time_cycle)
item.duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
[('name', '=', 'CNC加工')]).time_cycle
- # print(item.id)
- sequence = workorder_id_list.index(item.id) - 1
- # print('sequence', sequence)
- # print('total', len(workorder_id_list))
- # 计算CNC加工之前工单的开始结束时间
- for i in range(sequence):
- current_workorder_id = (item.id - (i + 1))
- current_workorder_obj = self.env['mrp.workorder'].sudo().search(
- [('id', '=', current_workorder_id)])
- old_workorder_obj = self.env['mrp.workorder'].sudo().search(
- [('id', '=', (current_workorder_id + 1))])
- work_order = self.env['mrp.workorder'].sudo().search(
- [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)])
- work_order.date_planned_finished = old_workorder_obj.date_planned_start
- work_order.date_planned_start = old_workorder_obj.date_planned_start - timedelta(
- minutes=self.env['mrp.routing.workcenter'].sudo().search(
- [('name', '=', current_workorder_obj.name)]).time_cycle)
- # work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search([('name', '=', current_workorder_obj.name)]).time_cycle
- # 计算CNC加工之后工单的开始结束时间
- for j in range(len(workorder_id_list) - sequence - 2):
- current_workorder_id = (item.id + (j + 1))
- current_workorder_obj = self.env['mrp.workorder'].sudo().search(
- [('id', '=', current_workorder_id)])
- old_workorder_obj = self.env['mrp.workorder'].sudo().search(
- [('id', '=', (current_workorder_id - 1))])
- work_order = self.env['mrp.workorder'].sudo().search(
- [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)])
- try:
- work_order.date_planned_start = old_workorder_obj.date_planned_finished
- print('work_order.data_start', work_order.date_planned_start)
- work_order.date_planned_finished = old_workorder_obj.date_planned_finished + timedelta(
- minutes=self.env['mrp.routing.workcenter'].sudo().search(
- [('name', '=', current_workorder_obj.name)]).time_cycle)
- except ValueError as e:
- print('时间设置失败,请检查是否为工序分配工作中心,%s' % e)
-
- current_workorder = self.env['mrp.workorder'].sudo().search([('id', '=', item.id)])
- workorder_time += current_workorder.duration_expected
- print('workorder_time', workorder_time)
- self.date_planned_finished = self.date_planned_start + timedelta(minutes=workorder_time)
+ self.calculate_plan_time_before(item, workorder_id_list)
+ self.calculate_plan_time_after(item, workorder_id_list)
+ self.date_planned_start, self.date_planned_finished = item.date_planned_start, item.date_planned_finished
self.state = 'done'
self.production_id.schedule_state = '已排'
# self.production_id.date_planned_start = self.date_planned_start
@@ -238,36 +278,62 @@ class sf_production_plan(models.Model):
'view_mode': 'gantt,tree,form', # 要显示的视图类型,可以是'form', 'tree', 'kanban', 'graph', 'calendar', 'pivot'等
'target': 'current', # 跳转的目标窗口,可以是'current'或'new'
}
- # if self.production_line_id:
- # if self.plan_start_time and self.plan_end_time:
- # return None
- # elif self.plan_start_time and not self.plan_end_time:
- # # 如果没有给出计划结束时间,则计划结束时间为计划开始时间+采购周期+缓冲期
- # # 采购周期
- # purchase_cycle = 3
- # # 缓冲期
- # buffer_period = 1
- # # 计划结束时间 = 计划开始时间 + 采购周期 + 缓冲期
- # self.plan_end_time = self.plan_start_time + timedelta(days=purchase_cycle) + timedelta(
- # days=buffer_period)
- # self.state = 'produce'
- # return self.plan_end_time
- # else:
- # return None
- # # 后面要补充计划开始时间的计算方法
- # # # 坯料预制时间
- # # # pl_time = 0.5
- # # # 采购周期
- # # purchase_cycle = 3
- # # # 缓冲期
- # # buffer_period = 1
- # # # 计划结束时间 = 计划开始时间 + 坯料预制时间 + 采购周期 + 缓冲期
- # # # plan_end_time = plan_start_time + pl_time + purchase_cycle + buffer_period
- # # # 计划结束时间 = 计划开始时间(是一个datatime) + 采购周期(Float) + 缓冲期(Float)
- # # self.plan_end_time = self.plan_start_time + timedelta(days=purchase_cycle) + timedelta(days=buffer_period)
- # # return self.plan_end_time
- # else:
- # raise ValidationError('生产线为空!')
+
+ def calculate_plan_time_before(self, item, workorder_id_list):
+ """
+ 根据CNC工单的时间去计算之前的其他工单的开始结束时间
+ """
+ sequence = workorder_id_list.index(item.id) - 1
+ # 计算CNC加工之前工单的开始结束时间
+ for i in range(sequence):
+ current_workorder_id = (item.id - (i + 1))
+ current_workorder_obj = self.env['mrp.workorder'].sudo().search(
+ [('id', '=', current_workorder_id)])
+ old_workorder_obj = self.env['mrp.workorder'].sudo().search(
+ [('id', '=', (current_workorder_id + 1))])
+ work_order = self.env['mrp.workorder'].sudo().search(
+ [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)])
+ work_order.date_planned_finished = datetime.now() + timedelta(days=100)
+ work_order.date_planned_start = old_workorder_obj.date_planned_start - timedelta(
+ minutes=self.env['mrp.routing.workcenter'].sudo().search(
+ [('name', '=', current_workorder_obj.name)]).time_cycle)
+ work_order.date_planned_finished = old_workorder_obj.date_planned_start
+ work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
+ [('name', '=', current_workorder_obj.name)]).time_cycle
+ first_workorder = self.env['mrp.workorder'].sudo().search([('id', '=', workorder_id_list[0])])
+ second_workorder = self.env['mrp.workorder'].sudo().search([('id', '=', workorder_id_list[1])])
+ if second_workorder.date_planned_start < first_workorder.date_planned_finished:
+ item.date_planned_start += timedelta(minutes=60)
+ item.date_planned_finished += timedelta(minutes=60)
+ item.duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
+ [('name', '=', 'CNC加工')]).time_cycle
+ self.calculate_plan_time_before(item, workorder_id_list)
+
+ def calculate_plan_time_after(self, item, workorder_id_list):
+ """
+ 计算CNC加工之后工单的开始结束时间
+ """
+ sequence = workorder_id_list.index(item.id) - 1
+ # 计算CNC加工之后工单的开始结束时间
+ for j in range(len(workorder_id_list) - sequence - 2):
+ current_workorder_id = (item.id + (j + 1))
+ current_workorder_obj = self.env['mrp.workorder'].sudo().search(
+ [('id', '=', current_workorder_id)])
+ old_workorder_obj = self.env['mrp.workorder'].sudo().search(
+ [('id', '=', (current_workorder_id - 1))])
+ work_order = self.env['mrp.workorder'].sudo().search(
+ [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)])
+ try:
+ work_order.date_planned_finished = datetime.now() + timedelta(days=100)
+ work_order.date_planned_start = old_workorder_obj.date_planned_finished
+ print('work_order.data_start', work_order.date_planned_start)
+ work_order.date_planned_finished = old_workorder_obj.date_planned_finished + timedelta(
+ minutes=self.env['mrp.routing.workcenter'].sudo().search(
+ [('name', '=', current_workorder_obj.name)]).time_cycle)
+ work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
+ [('name', '=', current_workorder_obj.name)]).time_cycle
+ except ValueError as e:
+ print('时间设置失败,请检查是否为工序分配工作中心,%s' % e)
def cancel_production_schedule(self):
self.date_planned_finished = False
diff --git a/web_gantt/static/src/xml/web_gantt.xml b/web_gantt/static/src/xml/web_gantt.xml
index 5af631a8..76910940 100644
--- a/web_gantt/static/src/xml/web_gantt.xml
+++ b/web_gantt/static/src/xml/web_gantt.xml
@@ -77,13 +77,13 @@
- 夜班
+ 夜班(00:00-08:00)
- 早班
+ 早班(08:00-16:00)
- 晚班
+ 晚班(16:00-00:00)