diff --git a/sf_manufacturing/models/agv_setting.py b/sf_manufacturing/models/agv_setting.py
index a6724e25..a0a14d3d 100644
--- a/sf_manufacturing/models/agv_setting.py
+++ b/sf_manufacturing/models/agv_setting.py
@@ -26,20 +26,28 @@ class AgvSetting(models.Model):
timestamp = int(time.time())
center_control_url += str(timestamp)
logging.info('工件配送-请求中控地址:%s' % center_control_url)
- center_control_r = requests.get(center_control_url, params={}, headers=headers)
- ret = center_control_r.json()
- logging.info('工件配送-请求中控站点信息:%s' % ret)
- self.env['center_control.interface.log'].sudo().create(
- {'content': ret, 'name': 'AutoDeviceApi/GetAgvStationState?date=%s' % str(timestamp)})
- if ret['Succeed'] is True:
- datas = ret['Datas']
- for item in self:
- for da in datas:
- if da['DeviceId'] == item.name:
- if da['AtHome'] is True:
- item.state = '占用'
- else:
- item.state = '空闲'
+ try:
+ center_control_r = requests.get(center_control_url, headers=headers, timeout=60) # 设置超时为60秒
+ ret = center_control_r.json()
+ logging.info('工件配送-请求中控站点信息:%s' % ret)
+ self.env['center_control.interface.log'].sudo().create(
+ {'content': ret, 'name': 'AutoDeviceApi/GetAgvStationState?date=%s' % str(timestamp)})
+ if ret['Succeed'] is True:
+ datas = ret['Datas']
+ for item in self:
+ for da in datas:
+ if da['DeviceId'] == item.name:
+ if da['AtHome'] is True:
+ item.state = '占用'
+ else:
+ item.state = '空闲'
+ return True
+ except requests.exceptions.Timeout:
+ logging.error('工件配送-请求中控接口超时')
+ return False
+ except requests.exceptions.RequestException as e:
+ logging.error('工件配送-请求中控接口错误: %s', e)
+ return False
class AgvTaskRoute(models.Model):
diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py
index 0f37c8f0..d8e6fe02 100644
--- a/sf_manufacturing/models/mrp_workorder.py
+++ b/sf_manufacturing/models/mrp_workorder.py
@@ -159,7 +159,7 @@ class ResMrpWorkOrder(models.Model):
('已完工', '已完工'),
], string='工序状态', default='待装夹', readonly='True')
# 加工图纸
- processing_drawing = fields.Binary(string='加工图纸', related='production_id.part_drawing')
+ processing_drawing = fields.Binary(string='加工图纸')
@api.depends('production_id')
def _compute_save_name(self):
@@ -1229,15 +1229,25 @@ class WorkPieceDelivery(models.Model):
status = fields.Selection(
[('待下发', '待下发'), ('待配送', '待配送'), ('已配送', '已配送')], string='状态', default='待下发')
is_cnc_program_down = fields.Boolean('程序是否下发', default=False)
+ is_manual_work = fields.Boolean('人工操作', default=False)
active = fields.Boolean(string="有效", default=True)
@api.model
def create(self, vals):
if vals.get('name', '/') == '/' or vals.get('name', '/') is False:
vals['name'] = self.env['ir.sequence'].next_by_code('sf.workpiece.delivery') or '/'
+ else:
+ vals['type'] = '运送空料架'
obj = super(WorkPieceDelivery, self).create(vals)
return obj
+ @api.constrains('name')
+ def _check_name(self):
+ if self.type == '运送空料架':
+ wd = self.sudo().search([('name', '=', self.name), ('id', '!=', self.id)])
+ if wd:
+ raise UserError("该名称已存在")
+
def action_delivery_history(self):
return {
'name': _('配送历史'),
@@ -1287,6 +1297,8 @@ class WorkPieceDelivery(models.Model):
is_not_route += 1
# else:
# raise UserError('请选择【任务路线】再进行配送')
+ # if item.production_id.production_line_state == '已下产线' and item.state == '待下发' and item.type == '下产线':
+ # raise UserError('该制造订单已下产线,无需配送')
if production_type != item.type:
raise UserError('请选择类型为%s的制造订单进行配送' % production_type)
if down_status != item.status:
@@ -1340,22 +1352,25 @@ class WorkPieceDelivery(models.Model):
is_free = False
agv_site = self.env['sf.agv.site'].search([])
if agv_site:
- agv_site.update_site_state()
- for item in self:
- logging.info('工件配送-起点状态:%s-%s' % (
- item.feeder_station_start_id.name, item.feeder_station_start_id.state))
- logging.info('工件配送-终点状态:%s-%s' % (
- item.feeder_station_destination_id.name, item.feeder_station_destination_id.state))
- if item.type in ['上产线', '下产线']:
- if (
- item.feeder_station_start_id.state == '占用' and item.feeder_station_destination_id.state == '空闲') or (
- item.feeder_station_start_id.state == '空闲' and item.feeder_station_destination_id.state == '空闲'):
- is_free = True
+ has_site = agv_site.update_site_state()
+ if has_site is True:
+ for item in self:
+ if item.type in ['上产线', '下产线']:
+ logging.info('工件配送-起点状态:%s-%s' % (
+ item.feeder_station_start_id.name, item.feeder_station_start_id.state))
+ logging.info('工件配送-终点状态:%s-%s' % (
+ item.feeder_station_destination_id.name, item.feeder_station_destination_id.state))
+ if (
+ item.feeder_station_start_id.state == '占用' and item.feeder_station_destination_id.state == '空闲') or (
+ item.feeder_station_start_id.state == '空闲' and item.feeder_station_destination_id.state == '空闲'):
+ is_free = True
+ else:
+ if item.feeder_station_destination_id.state == '空闲':
+ is_free = True
+ logging.info('is_free:%s' % is_free)
+ return is_free
else:
- if item.feeder_station_destination_id.state == '空闲':
- is_free = True
- logging.info('is_free:%s' % is_free)
- return is_free
+ raise UserError("接驳站暂未反馈站点实时状态,请稍后再试")
# 配送至avg小车
def _delivery_avg(self):
diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml
index 94f469ea..bc1d4bfe 100644
--- a/sf_manufacturing/views/mrp_workorder_view.xml
+++ b/sf_manufacturing/views/mrp_workorder_view.xml
@@ -659,7 +659,9 @@
{'search_default_on_up':1}
tree,search
- [('type','in',['上产线','下产线']),('workorder_state','=','done')]
+
+ [('type','in',['上产线','下产线']),('workorder_state','=','done'),('is_manual_work','=',false)]
+
@@ -668,14 +670,18 @@
空料架配送
sf.workpiece.delivery
-
+
-
-
-
-
+
+
+
+
+
diff --git a/sf_mrs_connect/controllers/controllers.py b/sf_mrs_connect/controllers/controllers.py
index 08d6d9b4..7498ec75 100644
--- a/sf_mrs_connect/controllers/controllers.py
+++ b/sf_mrs_connect/controllers/controllers.py
@@ -67,6 +67,9 @@ class Sf_Mrs_Connect(http.Controller):
logging.info('cnc_processing_arr:%s' % cnc_processing_arr)
if cnc_program and cnc_processing_arr:
cnc_program.write({'programming_state': '已编程', 'work_state': '已编程'})
+ cnc_program.workorder_ids.filtered(lambda b1: b1.routing_type == '装夹预调').write(
+ {'processing_drawing': cnc_production.workorder_ids.filtered(
+ lambda b1: b1.routing_type == 'CNC加工').cnc_worksheet})
cnc_program.workorder_ids.filtered(lambda b: b.routing_type == 'CNC加工').write(
{'cnc_ids': cnc_processing_arr, 'cnc_worksheet': cnc_production.workorder_ids.filtered(
lambda b: b.routing_type == 'CNC加工').cnc_worksheet})