批量员工更新
This commit is contained in:
@@ -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 +1,2 @@
|
||||
from . import models
|
||||
from . import wizard
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,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>
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+4
-4
@@ -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>
|
||||
Reference in New Issue
Block a user