批量员工更新

This commit is contained in:
pengyuthon
2024-05-22 18:59:02 +08:00
parent be2e9940a6
commit ed8dec72ee
11 changed files with 94 additions and 74 deletions
@@ -12,6 +12,7 @@
</group>
<footer>
<button name="confirm" string="确认" type="object" class="oe_highlight"/>
<button string="返回" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
+1
View File
@@ -1 +1,2 @@
from . import models
from . import wizard
+1 -1
View File
@@ -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,
-1
View File
@@ -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
@@ -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",
}
@@ -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'}
@@ -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
access_yuthon_hr_employee_wizard,yuthon_hr_employee_wizard,model_yuthon_hr_employee_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_yuthon_job_lv yuthon_job_lv model_yuthon_job_lv base.group_user 1 1 1 1
3 access_yuthon_user_role yuthon_user_role model_yuthon_user_role base.group_user 1 1 1 1
4 access_yuthon_hr_employee_write access_yuthon_hr_employee_wizard yuthon.hr.employee.write yuthon_hr_employee_wizard model_yuthon_hr_employee_write model_yuthon_hr_employee_wizard base.group_user 1 1 1 1
@@ -1,12 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="all_data_write_user" model="ir.actions.server">
<field name="name">批量更新员工</field>
<field name="model_id" ref="hr.model_hr_employee"/>
<field name="binding_model_id" ref="hr.model_hr_employee"/>
<field name="state">code</field>
<field name="code">action = model.action_hr_employee()</field>
</record>
<record id="view_employee_inherit_del_form" model="ir.ui.view">
<field name="name">hr.employee.inherit.del.form</field>
<field name="model">hr.employee</field>
@@ -51,6 +44,7 @@
</group>
<group string="基本信息">
<field name="identification_id"/>
<field name="user_sex"/>
<field name="user_number_start_time"/>
<field name="user_number_end_time"/>
<field name="nation"/>
@@ -162,4 +156,12 @@
</xpath>
</field>
</record>
<record id="all_data_write_user" model="ir.actions.server">
<field name="name">批量更新员工</field>
<field name="model_id" ref="hr.model_hr_employee"/>
<field name="binding_model_id" ref="hr.model_hr_employee"/>
<field name="state">code</field>
<field name="code">action = model.action_hr_employee()</field>
</record>
</odoo>
+1
View File
@@ -0,0 +1 @@
from . import hr_employee_wizard
@@ -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)
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="yuthon_hr_employee_write_form" model="ir.ui.view">
<record id="hr_employee_wizard_form" model="ir.ui.view">
<field name="name">审批意见弹窗</field>
<field name="model">yuthon.hr.employee.write</field>
<field name="model">yuthon.hr.employee.wizard</field>
<field name="arch" type="xml">
<form>
<group>
<field name="excel_file" filename="excel_name"/>
<field name="excel_name" invisible="1"/>
</group>
<!-- 这个标签表示页脚部分-->
<footer>
<button name="employee_excel_write" string="确认" type="object" class="oe_highlight"/>
<button name="confirm" string="确认" type="object" class="oe_highlight"/>
<button string="返回" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>