diff --git a/attendance_iot/controllers/kaoqin_test.py b/attendance_iot/controllers/kaoqin_test.py index 5fef97b99..4a93f02c7 100644 --- a/attendance_iot/controllers/kaoqin_test.py +++ b/attendance_iot/controllers/kaoqin_test.py @@ -54,7 +54,6 @@ class BusController(Controller): data = request.httprequest.json user_id = data.get('logs')[0].get('user_id') employee_id = request.env(user=SUPERUSER_ID)["hr.employee"].search([('mobile_phone', '=', user_id)]) - recog_time_str = data.get('logs')[0].get("recog_time") attendance_iot_id = request.env(user=SUPERUSER_ID)["attendance.iot"].search([('name', '=', data.get('sn'))]) if employee_id: request.env(user=SUPERUSER_ID)["hr.attendance.detail"].create({ diff --git a/yuthon_hr_attendance/controllers/applet_attendance.py b/yuthon_hr_attendance/controllers/applet_attendance.py index c47cd2807..0fcfc75ba 100644 --- a/yuthon_hr_attendance/controllers/applet_attendance.py +++ b/yuthon_hr_attendance/controllers/applet_attendance.py @@ -96,12 +96,10 @@ class AppletAttendance(Controller): check_out_str = check_out.strftime('%H:%M:%S') if check_out else ' ' check_in_html = f'
{check_in_str}
' if check_in_status in ['迟到', '早退', '缺卡'] else f'{check_in_str}
' check_out_html = f'{check_out_str}
' if check_out_status in ['迟到', '早退', '缺卡'] else f'{check_out_str}
' - state = "no" message = "超出范围,不允许打卡" address_ids = request.env(user=SUPERUSER_ID)["applet.address"].search([('address_name', '=', employee_id.company_id.name)]) self_address = self.get_address_from_coords(kw['att_latitude'], kw['att_longitude']) - for address_id in address_ids: wifi_name_list = address_id.wifi_name_ids.mapped('name') card_rice = address_id.card_rice * 0.001 # 打卡范围 @@ -112,22 +110,17 @@ class AppletAttendance(Controller): if self.is_within_radius_geopy(kw['att_latitude'], kw['att_longitude'], address_id.latitude, address_id.longitude, card_rice) and kw['wifi_name'] in wifi_name_list: message = '可以打卡' state = 'yes' - _logger.info(f"\n可打卡") break - else: - _logger.info(f"\n不可打卡 ") else: if self.is_within_radius_geopy(kw['att_latitude'], kw['att_longitude'], address_id.latitude, address_id.longitude, card_rice): message = '可以打卡' state = 'yes' - _logger.info(f"\n可打卡") break - else: - _logger.info(f"\n不可打卡 ") if self.is_workday(current_date): attendance_id_class = f"{attendance_id.shift_name} {start_time_str}-{end_time_str}" else: attendance_id_class = f"{attendance_id.shift_name}休息" + _logger.info(f"当前班次: {attendance_id_class}") data = { 'location': self_address['formatted_address'], 'user_id': user_id.id, diff --git a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py index b33e3276c..ba8d47559 100644 --- a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py +++ b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py @@ -257,55 +257,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, login): + def get_hr_attendance_time(self): """ 获取企业微信打卡数据的核心逻辑 :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) # 企业微信获取打卡数据,要求用户分组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([('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') # 暂时先用for循环,如果后期加大频率,需改成并发 - user_obj = self.sudo().env['res.users'].search([('login', '=', login)]) - _logger.info("{} 即将计算人员,login是{}".format(user_obj.name, user_obj.login)) total_users = len(user_obj) remaining_users = total_users for user in user_obj: @@ -332,8 +330,8 @@ class HrAttendanceDetail(models.Model): # 同步整理当天出勤数据 attendance_obj = self.env['hr.attendance'].search([("userid", "=", user.oauth_uid), ("current_data", "=", current_date)], limit=1) hr_employee_obj = self.env['hr.employee'].sudo().search([("user_id", "=", user.id)], limit=1) - # current_datetime_start = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.min.time()) - # current_datetime_end = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.max.time()) + current_datetime_start = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.min.time()) + current_datetime_end = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.max.time()) if not attendance_obj: # 判断是否是 普通打卡 if not hr_employee_obj.default_planning_role_id: @@ -367,7 +365,6 @@ class HrAttendanceDetail(models.Model): :return: """ # 同步整理当天出勤数据 - current_date = str(current_date) hr_employee_obj = self.env['hr.employee'].sudo().search([("user_id", "=", user.id)], limit=1) current_datetime_start = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.min.time()) current_datetime_end = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.max.time()) @@ -407,7 +404,6 @@ class HrAttendanceDetail(models.Model): :param attendance_obj: 判断的时刻的考勤集合 :return: """ - current_date = str(current_date) current_datetime_start = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.min.time()) current_datetime_end = datetime.combine(datetime.strptime(current_date, '%Y-%m-%d'), datetime.max.time()) hr_employee_obj = self.env['hr.employee'].sudo().search([("user_id", "=", user.id)], limit=1)