|
|
|
@@ -82,13 +82,12 @@ class HrAttendanceDetail(models.Model):
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 传参按一个人打卡一次传参
|
|
|
|
|
# @api.model_create_multi
|
|
|
|
|
# def create(self, vals_list):
|
|
|
|
|
# res = super(HrAttendanceDetail, self).create(vals_list)
|
|
|
|
|
# for attendance_obj in res:
|
|
|
|
|
# self.sudo()._do_save_wx_attendance_data(attendance_obj.employee_id.user_id, attendance_obj.create_date.date())
|
|
|
|
|
# self.sudo()._do_plan_save_wx_attendance_data(attendance_obj.employee_id.user_id, attendance_obj.create_date.date())
|
|
|
|
|
# return res
|
|
|
|
|
@api.model_create_multi
|
|
|
|
|
def create(self, vals_list):
|
|
|
|
|
res = super(HrAttendanceDetail, self).create(vals_list)
|
|
|
|
|
employee_id = self.env['hr.employee'].search([('id', '=', vals_list[0]['employee_id'])])
|
|
|
|
|
self.get_hr_attendance_time(employee_id)
|
|
|
|
|
return res
|
|
|
|
|
#
|
|
|
|
|
# def write(self, vals):
|
|
|
|
|
# res = super(HrAttendanceDetail, self).write(vals)
|
|
|
|
@@ -257,52 +256,53 @@ class HrAttendanceDetail(models.Model):
|
|
|
|
|
_logger.error('检查保存之前的数据分析出想要的数据失败,异常:{0},数据信息{1},异常详情:{2}'.format(str(e), str(data),
|
|
|
|
|
str(traceback.format_exc())))
|
|
|
|
|
|
|
|
|
|
def get_hr_attendance_time(self):
|
|
|
|
|
def get_hr_attendance_time(self, employee_id):
|
|
|
|
|
"""
|
|
|
|
|
获取企业微信打卡数据的核心逻辑
|
|
|
|
|
:return: 处理结果
|
|
|
|
|
"""
|
|
|
|
|
# 从用户列表里获取企业微信的用户
|
|
|
|
|
user_list = self._get_wx_attendance_user_list()
|
|
|
|
|
# user_list = self._get_wx_attendance_user_list()
|
|
|
|
|
now_time = datetime.now() + timedelta(hours=8)
|
|
|
|
|
start_time = now_time - timedelta(days=30)
|
|
|
|
|
start_time = now_time - timedelta(days=1)
|
|
|
|
|
|
|
|
|
|
# 企业微信获取打卡数据,要求用户分组100,分批获取打卡记录
|
|
|
|
|
for userid_limit in self.utils_list_page(user_list, 100):
|
|
|
|
|
# 获取企业微信的打卡信息
|
|
|
|
|
try:
|
|
|
|
|
attendance_data = self._get_wx_attendance_data(userid_limit, now_time, start_time)
|
|
|
|
|
attendance_result, response = self.sudo().env["wecom.apps"].sync_checkin_data(attendance_data)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
_logger.error('获取企业微信的打卡信息失败,异常:{0},用户列表{1},异常详情:{2}'.format(str(e), str(userid_limit), str(traceback.format_exc())))
|
|
|
|
|
continue
|
|
|
|
|
# 检查请求返回的信息是否正确
|
|
|
|
|
try:
|
|
|
|
|
checkin_data = self._check_wx_attendance_data(response, userid_limit)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
_logger.error('检查请求返回的信息失败,异常:{0},用户列表{1},异常详情:{2}'.format(str(e), str(userid_limit), str(traceback.format_exc())))
|
|
|
|
|
continue
|
|
|
|
|
# 将原始数据存储
|
|
|
|
|
for data in checkin_data:
|
|
|
|
|
# 检查保存之前的数据是否准确,并且分析出想要的打卡时间
|
|
|
|
|
try:
|
|
|
|
|
checkin_time, sch_checkin_time = self._check_wx_attendance_time(data, userid_limit)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
_logger.error(
|
|
|
|
|
'检查保存之前的数据分析出想要的数据失败,异常:{0},数据信息{1},异常详情:{2}'.format(str(e), str(data), str(traceback.format_exc())))
|
|
|
|
|
continue
|
|
|
|
|
# 保存相关的企业微信的原始打卡信息
|
|
|
|
|
try:
|
|
|
|
|
self._save_wx_attendance_detail_data(data, checkin_time, sch_checkin_time)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
_logger.error(
|
|
|
|
|
'保存相关的企业微信的原始打卡信息失败,异常:{0},数据信息{1},异常详情:{2}'.format(str(e), str(data), str(traceback.format_exc())))
|
|
|
|
|
# for userid_limit in self.utils_list_page(user_list, 100):
|
|
|
|
|
# # 获取企业微信的打卡信息
|
|
|
|
|
# try:
|
|
|
|
|
# attendance_data = self._get_wx_attendance_data(userid_limit, now_time, start_time)
|
|
|
|
|
# attendance_result, response = self.sudo().env["wecom.apps"].sync_checkin_data(attendance_data)
|
|
|
|
|
# except Exception as e:
|
|
|
|
|
# _logger.error('获取企业微信的打卡信息失败,异常:{0},用户列表{1},异常详情:{2}'.format(str(e), str(userid_limit), str(traceback.format_exc())))
|
|
|
|
|
# continue
|
|
|
|
|
# # 检查请求返回的信息是否正确
|
|
|
|
|
# try:
|
|
|
|
|
# checkin_data = self._check_wx_attendance_data(response, userid_limit)
|
|
|
|
|
# except Exception as e:
|
|
|
|
|
# _logger.error('检查请求返回的信息失败,异常:{0},用户列表{1},异常详情:{2}'.format(str(e), str(userid_limit), str(traceback.format_exc())))
|
|
|
|
|
# continue
|
|
|
|
|
# # 将原始数据存储
|
|
|
|
|
# for data in checkin_data:
|
|
|
|
|
# # 检查保存之前的数据是否准确,并且分析出想要的打卡时间
|
|
|
|
|
# try:
|
|
|
|
|
# checkin_time, sch_checkin_time = self._check_wx_attendance_time(data, userid_limit)
|
|
|
|
|
# except Exception as e:
|
|
|
|
|
# _logger.error(
|
|
|
|
|
# '检查保存之前的数据分析出想要的数据失败,异常:{0},数据信息{1},异常详情:{2}'.format(str(e), str(data), str(traceback.format_exc())))
|
|
|
|
|
# continue
|
|
|
|
|
# # 保存相关的企业微信的原始打卡信息
|
|
|
|
|
# try:
|
|
|
|
|
# self._save_wx_attendance_detail_data(data, checkin_time, sch_checkin_time)
|
|
|
|
|
# except Exception as e:
|
|
|
|
|
# _logger.error(
|
|
|
|
|
# '保存相关的企业微信的原始打卡信息失败,异常:{0},数据信息{1},异常详情:{2}'.format(str(e), str(data), str(traceback.format_exc())))
|
|
|
|
|
|
|
|
|
|
# 将取回来的数据进行组织整理写入到考勤表中
|
|
|
|
|
employee_ids = self.sudo().env['hr.employee'].search([('use_user_type', '=', 'labor')])
|
|
|
|
|
employee_list = [emp.name for emp in employee_ids]
|
|
|
|
|
user_obj = self.sudo().env['res.users'].search([('name', 'not in', ['Administrator', '李鹏宇'] + employee_list),
|
|
|
|
|
('employee_id.contract_id', '!=', False)]).sorted('id')
|
|
|
|
|
# employee_ids = self.sudo().env['hr.employee'].search([('id', '=', employee_id.id)])
|
|
|
|
|
# employee_list = [emp.name for emp in employee_ids]
|
|
|
|
|
# user_obj = self.sudo().env['res.users'].search([('name', 'not in', ['Administrator', '李鹏宇'] + employee_list),
|
|
|
|
|
# ('employee_id.contract_id', '!=', False)]).sorted('id')
|
|
|
|
|
user_obj = self.sudo().env['res.users'].search([('id', '=', employee_id.user_id.id)])
|
|
|
|
|
# 暂时先用for循环,如果后期加大频率,需改成并发
|
|
|
|
|
total_users = len(user_obj)
|
|
|
|
|
remaining_users = total_users
|
|
|
|
@@ -314,10 +314,6 @@ class HrAttendanceDetail(models.Model):
|
|
|
|
|
for current_date in self.sudo().divide_time_range_fixed(start_time, now_time):
|
|
|
|
|
self.sudo()._do_save_wx_attendance_data(user, current_date)
|
|
|
|
|
self.sudo()._do_plan_save_wx_attendance_data(user, current_date)
|
|
|
|
|
# attendance_records = self.env['hr.attendance'].search([], limit=1)
|
|
|
|
|
# if attendance_records:
|
|
|
|
|
# attendance_records[0].labor_update()
|
|
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def _do_save_wx_attendance_data(self, user, current_date):
|
|
|
|
|