From 56f1ba0f2578edafbe1715c367aa7084f151abd3 Mon Sep 17 00:00:00 2001 From: guanhuan Date: Fri, 20 Sep 2024 14:24:50 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_hr/__manifest__.py | 3 ++- sf_hr/models/__init__.py | 1 + sf_hr/models/hr_employee.py | 6 ++++-- sf_hr/models/res_users.py | 12 ++++++++++++ sf_hr/views/res_users_view.xml | 20 ++++++++++++++++++++ sf_plan/static/description/计划.png | Bin 0 -> 673 bytes sf_plan/views/view.xml | 1 + 7 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 sf_hr/models/res_users.py create mode 100644 sf_hr/views/res_users_view.xml create mode 100644 sf_plan/static/description/计划.png diff --git a/sf_hr/__manifest__.py b/sf_hr/__manifest__.py index c0bd63ef..b3e21ab3 100644 --- a/sf_hr/__manifest__.py +++ b/sf_hr/__manifest__.py @@ -7,10 +7,11 @@ 'sequence': 1, 'category': 'sf', 'website': 'https://www.sf.jikimo.com', - 'depends': ['hr'], + 'depends': ['base', 'hr'], 'data': [ 'views/hr_employee.xml', 'views/res_config_settings_views.xml', + 'views/res_users_view.xml', 'data/cron_data.xml', ], 'demo': [ diff --git a/sf_hr/models/__init__.py b/sf_hr/models/__init__.py index ffe76391..9744f0cc 100644 --- a/sf_hr/models/__init__.py +++ b/sf_hr/models/__init__.py @@ -2,3 +2,4 @@ from . import hr_employee from . import res_config_setting +from . import res_users diff --git a/sf_hr/models/hr_employee.py b/sf_hr/models/hr_employee.py index 8cf5595d..e9826f29 100644 --- a/sf_hr/models/hr_employee.py +++ b/sf_hr/models/hr_employee.py @@ -20,7 +20,9 @@ class JkmPracticeEmployee(models.Model): if result['employee_list']: for employee_info in result['employee_list']: if employee_info['work_email']: - self.sudo().search([('work_email', '=', employee_info['work_email'])]).write( - {'we_id': employee_info['we_id']}) + hr_employee = self.sudo().search([('work_email', '=', employee_info['work_email'])]) + hr_employee.write({'we_id': employee_info['we_id']}) + if hr_employee.user_id: + hr_employee.user_id.write({'we_employee_id': employee_info['we_id']}) else: logging.info('_employee_info_sync error:%s' % result['message']) diff --git a/sf_hr/models/res_users.py b/sf_hr/models/res_users.py new file mode 100644 index 00000000..392c297a --- /dev/null +++ b/sf_hr/models/res_users.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + +import logging + +_logger = logging.getLogger(__name__) + + +class ResUsers(models.Model): + _inherit = 'res.users' + + we_employee_id = fields.Char(string=u'企业微信账号', default="") diff --git a/sf_hr/views/res_users_view.xml b/sf_hr/views/res_users_view.xml new file mode 100644 index 00000000..c65d8e46 --- /dev/null +++ b/sf_hr/views/res_users_view.xml @@ -0,0 +1,20 @@ + + + + + res.users.account.form + res.users + + + + + + + + + + + + + + diff --git a/sf_plan/static/description/计划.png b/sf_plan/static/description/计划.png new file mode 100644 index 0000000000000000000000000000000000000000..e4efa9f9988c818eccaf683366c07ecc4bfbcccf GIT binary patch literal 673 zcmV;S0$%-zP)Bal#n4ZG+?BP0*P9y$me_2O*}B075L5=p2m)GgP@V;u?vj}aY0B`6G6 zNX>QK=XdfuFg)I$*(bf{4?gU?o%zjt-~4_%^IOBVZNq~U7zdp`WBf?#`1?(8&px$} zAq9-m|AXH+%Q&?J5bY+P8{j(I9qfZ#!!-0v`1i1V#o;fhi%t_ND){UJDTjbO$nd-E z5CXjX--9Yxa_P&!~c|j>E4g%g@?m&}QyAdSd4sXCO;0722uay1?@%v@_4OpfCJK)4^ zDlg0?HIItSr9H#ecc%)54`%EaRrmGqY%Ou>;34ye?#Luea%=JLjH)1nx0sAsE zG6a_y&qfRXe!`lq~Pr5=31?o>QcOt+5p17*eA!q`y00000NkvXX Hu0mjf(0?lB literal 0 HcmV?d00001 diff --git a/sf_plan/views/view.xml b/sf_plan/views/view.xml index 10992f4a..09fa7b02 100644 --- a/sf_plan/views/view.xml +++ b/sf_plan/views/view.xml @@ -278,6 +278,7 @@ sequence="150" action="sf_production_plan_action" groups="sf_base.group_plan_dispatch" + web_icon="sf_plan,static/description/计划.png" /> From 8706e25b0de44a8fafc9ac6959301f434d78ecda Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Fri, 20 Sep 2024 16:33:56 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E5=A2=9E=E5=8A=A024h=E4=B8=8E=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=97=A5=E5=BF=97=E7=9A=84=E6=95=B0=E6=8D=AE=E6=8B=BF?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_maintenance/models/sf_maintenance_oee.py | 153 +++++++++++++++++- .../views/maintenance_equipment_oee_views.xml | 45 ++++-- 2 files changed, 183 insertions(+), 15 deletions(-) diff --git a/sf_maintenance/models/sf_maintenance_oee.py b/sf_maintenance/models/sf_maintenance_oee.py index 9a6aaba8..1a2e4f10 100644 --- a/sf_maintenance/models/sf_maintenance_oee.py +++ b/sf_maintenance/models/sf_maintenance_oee.py @@ -1,5 +1,9 @@ # -*- coding: utf-8 -*- +import json +import datetime +import requests from odoo import api, fields, models, _ +from odoo.exceptions import UserError class SfMaintenanceEquipmentOEE(models.Model): @@ -9,6 +13,9 @@ class SfMaintenanceEquipmentOEE(models.Model): name = fields.Char('设备oee') equipment_id = fields.Many2one('maintenance.equipment', '机台号', domain="[('category_id.equipment_type', '=', '机床'),('state_zc', '=', '已注册')]") + + equipment_code = fields.Char('设备编码', related='equipment_id.code', store=True) + type_id = fields.Many2one('sf.machine_tool.type', '型号', related='equipment_id.type_id') machine_tool_picture = fields.Binary('设备图片', related='equipment_id.machine_tool_picture') state = fields.Selection( @@ -28,6 +35,151 @@ class SfMaintenanceEquipmentOEE(models.Model): related='equipment_id.sf_maintenance_logs_ids') oee_logs = fields.One2many('maintenance.equipment.oee.logs', 'equipment_oee_id', string='运行日志') + day_logs_detail = fields.Html('日运行日志详情') + history_logs_detail = fields.Html('历史运行日志详情') + begin_time = fields.Date('开始时间') + end_time = fields.Date('结束时间') + + # 获取日志详情 + def get_day_logs(self): + config = self.env['ir.config_parameter'].sudo() + url = 'http://172.16.10.112:8069/api/logs/list' + machine_list = [self.equipment_code] + begin_time = datetime.datetime.now().strftime('%Y-%m-%d') + ' 00:00:00' + end_time = datetime.datetime.now().strftime('%Y-%m-%d') + ' 23:59:59' + + # 请求的数据 + data = { + "machine_list": str(machine_list), + "begin_time": begin_time, + "end_time": end_time + } + + print(data) + + # 发送POST请求 + response = requests.post(url, json={}, data=data) + print(response.json()) # 输出服务器返回的响应 + if response.status_code == 200: + result = response.json() + print('============', result) + if result['status'] == 1: + logs_list = result['data'][self.equipment_code] + logs_detail = '' + for log in logs_list: + print('loooooooooooooooooooogs', log) + production_name = log['production_name'] if log['production_name'] else ' ' + logs_detail += '' + log['time'] + '' + log[ + 'state'] + '' + production_name + '' + # self.day_logs_detail = '' + logs_detail + '
时间事件/状态加工工单
' + self.day_logs_detail = ''' + + + + + + + {logs_detail} +
时间事件/状态加工工单
+ '''.format(logs_detail=logs_detail) + + else: + self.day_logs_detail = '获取日志失败' + else: + self.day_logs_detail = '获取日志失败' + + # 获取历史日志详情 + def get_history_logs(self): + config = self.env['ir.config_parameter'].sudo() + url = 'http://172.16.10.112:8069/api/logs/list' + machine_list = [self.equipment_code] + if not self.begin_time: + raise UserError('请选择开始时间') + if not self.end_time: + raise UserError('请选择结束时间') + + begin_time = self.begin_time.strftime('%Y-%m-%d') + ' 00:00:00' + end_time = self.end_time.strftime('%Y-%m-%d') + ' 23:59:59' + + # 请求的数据 + data = { + "machine_list": str(machine_list), + "begin_time": begin_time, + "end_time": end_time + } + + print(data) + + # 发送POST请求 + response = requests.post(url, json={}, data=data) + print(response.json()) # 输出服务器返回的响应 + if response.status_code == 200: + result = response.json() + print('============', result) + if result['status'] == 1: + logs_list = result['data'][self.equipment_code] + logs_detail = '' + for log in logs_list: + production_name = log['production_name'] if log['production_name'] else ' ' + logs_detail += '' + log['time'] + '' + log[ + 'state'] + '' + production_name + '' + # self.day_logs_detail = '' + logs_detail + '
时间事件/状态加工工单
' + self.history_logs_detail = ''' + + + + + + + {logs_detail} +
时间事件/状态加工工单
+ '''.format(logs_detail=logs_detail) + + else: + self.history_logs_detail = '获取日志失败' + else: + self.history_logs_detail = '获取日志失败' + + # 下载历史日志 + def download_history_logs(self): + config = self.env['ir.config_parameter'].sudo() + url = 'http://172.16.10.112:8069/api/logs/list' + machine_list = [self.equipment_code] + if not self.begin_time: + raise UserError('请选择开始时间') + if not self.end_time: + raise UserError('请选择结束时间') + + begin_time = self.begin_time.strftime('%Y-%m-%d') + ' 00:00:00' + end_time = self.end_time.strftime('%Y-%m-%d') + ' 23:59:59' + + # 请求的数据 + data = { + "machine_list": str(machine_list), + "begin_time": begin_time, + "end_time": end_time + } + + print(data) + + # 发送POST请求 + response = requests.post(url, json={}, data=data) + print(response.json()) # 输出服务器返回的响应 + if response.status_code == 200: + result = response.json() + print('============', result) + if result['status'] == 1: + logs_list = result['data'][self.equipment_code] + logs_detail = '' + for log in logs_list: + production_name = log['production_name'] if log['production_name'] else ' ' + # todo 下载日志 + + else: + self.history_logs_detail = '下载日志失败' + else: + self.history_logs_detail = '下载日志失败' + def name_get(self): result = [] for parameter in self: @@ -95,4 +247,3 @@ class SfMaintenanceEquipmentOEELogDetail(models.Model): log_id = fields.Many2one('maintenance.equipment.oee.logs', '日志') # equipment_code = fields.Char('设备编码', related='log_id.equipment_code') equipment_code = fields.Char('设备编码', readonly='True') - diff --git a/sf_maintenance/views/maintenance_equipment_oee_views.xml b/sf_maintenance/views/maintenance_equipment_oee_views.xml index 9370fbbc..33749809 100644 --- a/sf_maintenance/views/maintenance_equipment_oee_views.xml +++ b/sf_maintenance/views/maintenance_equipment_oee_views.xml @@ -38,6 +38,7 @@ + @@ -48,21 +49,37 @@ - - - - - - - - - - - - - - + + + +