diff --git a/yuthon_approval/wizard/approval_notice_wizard_views.xml b/yuthon_approval/wizard/approval_notice_wizard_views.xml index 073ea490e..dfa93a4ad 100644 --- a/yuthon_approval/wizard/approval_notice_wizard_views.xml +++ b/yuthon_approval/wizard/approval_notice_wizard_views.xml @@ -12,6 +12,7 @@ diff --git a/yuthon_hr_employee/__init__.py b/yuthon_hr_employee/__init__.py index 0650744f6..9b4296142 100644 --- a/yuthon_hr_employee/__init__.py +++ b/yuthon_hr_employee/__init__.py @@ -1 +1,2 @@ from . import models +from . import wizard diff --git a/yuthon_hr_employee/__manifest__.py b/yuthon_hr_employee/__manifest__.py index c04a2039e..8e05f7523 100644 --- a/yuthon_hr_employee/__manifest__.py +++ b/yuthon_hr_employee/__manifest__.py @@ -22,7 +22,7 @@ 'views/yuthon_job_lv_views.xml', 'views/yuthon_user_role_views.xml', 'views/inherit_res_user_views.xml', - 'views/yuthon_hr_employee_write_views.xml', + 'wizard/hr_employee_wizard_views.xml', ], 'installable': True, 'application': False, diff --git a/yuthon_hr_employee/models/__init__.py b/yuthon_hr_employee/models/__init__.py index 4ca59c644..1af45361c 100644 --- a/yuthon_hr_employee/models/__init__.py +++ b/yuthon_hr_employee/models/__init__.py @@ -3,4 +3,3 @@ from . import yuthon_job_lv from . import yuthon_user_role from . import yuthon_hr_department from . import inherit_res_user -from . import yuthon_hr_employee_write diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index b0000335a..49834998d 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -33,6 +33,7 @@ class YuthonHrEmployee(models.Model): entry_time = fields.Datetime(string="入职时间") confirmation_time = fields.Datetime(string="转正时间") company_old = fields.Integer(string="司龄") + user_sex = fields.Selection([('girl', '女'), ('boy', '男')], string="性别") user_number_start_time = fields.Date(string="身份中有效开始时间") user_number_end_time = fields.Date(string="身份证有效到期时间") nation = fields.Selection(nation_list, string="民族") @@ -93,7 +94,7 @@ class YuthonHrEmployee(models.Model): return { "type": "ir.actions.act_window", "name": "批量更新员工", - "res_model": "yuthon.hr.employee.write", + "res_model": "yuthon.hr.employee.wizard", "view_mode": "form", "target": "new", } diff --git a/yuthon_hr_employee/models/yuthon_hr_employee_write.py b/yuthon_hr_employee/models/yuthon_hr_employee_write.py deleted file mode 100644 index cf3b04185..000000000 --- a/yuthon_hr_employee/models/yuthon_hr_employee_write.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -import base64 -import pandas as pd -from odoo import api, fields, models, tools, _ -from odoo.exceptions import UserError - -class YuthonHrEmployeeWrite(models.Model): - _name = 'yuthon.hr.employee.write' - - excel_file = fields.Binary(string="上传Excel表") - excel_name = fields.Char(string="文件名") - - def write_employee(self): - text = self.env['hr.employee'].search() - - def employee_excel_write(self): - if not self.excel_file or not ('.xls' in self.excel_name or '.xlsx' in self.excel_name): - raise UserError("请上传Excel文件或有效excel文件") - else: - # 解码文件 - file_content = base64.b64decode(self.excel_file) - # 获取字段 - current_model_fields = self.env['hr.employee'].fields_get() - model_field_strings = {v['string']: k for k, v in current_model_fields.items()} - # 使用pandas读取Excel文件 - - excel_data = pd.read_excel(file_content, engine='openpyxl') - - excel_columns = excel_data.columns.tolist() - - # 检查Excel列名是否在模型字段中 - missing_fields = [col for col in excel_columns if col not in model_field_strings] - if missing_fields: - raise UserError(f"以下列在模型字段中不存在: {', '.join(missing_fields)}") - return {'type': 'ir.actions.client', 'tag': 'reload'} - - # 获取勾选的记录 - selected_employee_ids = self.env.context.get('active_ids', []) - - employees = self.env['hr.employee'].browse(selected_employee_ids) - name_to_employee = {emp.name: emp for emp in employees} - - for _, row in excel_data.iterrows(): - employee_name = row['员工姓名'] - try: - if employee_name in name_to_employee: - employee = name_to_employee[employee_name] - update_vals = {model_field_strings[col]: row[col] for col in excel_columns if col in model_field_strings} - employee.write(update_vals) - else: - raise UserError(f"在选中的记录中找不到员工姓名为 '{employee_name}' 的记录") - except ValueError: - raise ValueError("字段值错误或字段不存在") - - - return {'type': 'ir.actions.client', 'tag': 'reload'} - - - diff --git a/yuthon_hr_employee/security/ir.model.access.csv b/yuthon_hr_employee/security/ir.model.access.csv index c8e3ec8a4..ecca149d2 100644 --- a/yuthon_hr_employee/security/ir.model.access.csv +++ b/yuthon_hr_employee/security/ir.model.access.csv @@ -1,4 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_yuthon_job_lv,yuthon_job_lv,model_yuthon_job_lv,base.group_user,1,1,1,1 access_yuthon_user_role,yuthon_user_role,model_yuthon_user_role,base.group_user,1,1,1,1 -access_yuthon_hr_employee_write,yuthon.hr.employee.write,model_yuthon_hr_employee_write,base.group_user,1,1,1,1 \ No newline at end of file +access_yuthon_hr_employee_wizard,yuthon_hr_employee_wizard,model_yuthon_hr_employee_wizard,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml index d9d537672..b17629308 100644 --- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml +++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml @@ -1,12 +1,5 @@ - - 批量更新员工 - - - code - action = model.action_hr_employee() - hr.employee.inherit.del.form hr.employee @@ -51,6 +44,7 @@ + @@ -162,4 +156,12 @@ + + + 批量更新员工 + + + code + action = model.action_hr_employee() + \ No newline at end of file diff --git a/yuthon_hr_employee/wizard/__init__.py b/yuthon_hr_employee/wizard/__init__.py new file mode 100644 index 000000000..2581ba60e --- /dev/null +++ b/yuthon_hr_employee/wizard/__init__.py @@ -0,0 +1 @@ +from . import hr_employee_wizard \ No newline at end of file diff --git a/yuthon_hr_employee/wizard/hr_employee_wizard.py b/yuthon_hr_employee/wizard/hr_employee_wizard.py new file mode 100644 index 000000000..ee078b23e --- /dev/null +++ b/yuthon_hr_employee/wizard/hr_employee_wizard.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api, _, SUPERUSER_ID +from odoo.exceptions import ValidationError, UserError +import xlrd +import base64 +import datetime +from datetime import datetime + + +class YuthonHrEmployeeWizard(models.Model): + _name = 'yuthon.hr.employee.wizard' + + excel_file = fields.Binary(string="上传Excel表") + excel_name = fields.Char(string="文件名") + + def confirm(self): + """ + 导入excel文件,按行读取数据并处理 + :return: 导入员工信息表并更新 + """ + if not self.excel_file: + raise ValidationError('请上传文件。') + book = xlrd.open_workbook(file_contents=base64.decodebytes(self.excel_file)) + sh = book.sheet_by_index(0) + for rx in range(1, sh.nrows): + row = sh.row(rx) + self.employee_user_data(row) + return { + 'name': '批量更新员工', + 'type': 'ir.actions.act_window', + 'view_mode': 'tree', + 'res_model': 'hr.employee', + } + + def employee_user_data(self, row): + employee_name = self.env['hr.employee'].search([('name', '=', row[0].value)]) + department_id = self.env['hr.department'].search([('name', '=', row[1].value.split('\\')[-1])]) + role_data = row[4].value + role_list_ids = [] + user_role = self.env['yuthon.user.role'] + if len(role_data.split(',')) == 1: + if not user_role.search([('name', '=', role_data)]): + raise UserError('该角色未在系统中%s,请添加角色后重试' % role_data) + else: + role_list_ids.append(user_role.search([('name', '=', role_data)]).id) + else: + for i in range(1, len(role_data.split(','))): + if not user_role.search([('name', '=', role_data)]): + raise UserError('该角色未在系统中%s,请添加角色后重试' % role_data) + else: + role_list_ids.append(user_role.search([('name', '=', role_data.split(',')[i])])) + employee_data = { + 'name': employee_name.name, + 'department_id': department_id.id, + 'user_sex': 'boy' if row[2].value == '男' else 'girl', + 'birthday': datetime.strptime(row[3].value, '%Y-%m-%d').date(), + 'main_user_role': role_list_ids, + 'mobile_phone': row[5].value, + 'work_phone': row[6].value, + 'work_email': row[7].value, + } + if len(employee_name) != 1: + raise UserError('重名请手动更新') + elif employee_name: + employee_name.write(employee_data) + else: + employee_name.create(employee_data) + + + + + + + diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_write_views.xml b/yuthon_hr_employee/wizard/hr_employee_wizard_views.xml similarity index 58% rename from yuthon_hr_employee/views/yuthon_hr_employee_write_views.xml rename to yuthon_hr_employee/wizard/hr_employee_wizard_views.xml index 390e8df3e..97946a28f 100644 --- a/yuthon_hr_employee/views/yuthon_hr_employee_write_views.xml +++ b/yuthon_hr_employee/wizard/hr_employee_wizard_views.xml @@ -1,17 +1,17 @@ - + 审批意见弹窗 - yuthon.hr.employee.write + yuthon.hr.employee.wizard
-