薪酬项目取值云函数
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2020/1/14 9:53 # @Author : Aries # @Site : # @File : salary_item_scale.py # @Software: PyCharm import datetime import logging import time import dateutil import errors from apps.salary.formula.formula import BaseSalaryFormulaObject from core.extend.dynamic_plugin.customer_util import CustomerUtil from core.ds.plugins import BaseModelPlugIn from apps.time.service_base_dynamic import LeaveStandardCalcDynamicBase from core.extend.sync_outer.services_base import BaseSyncOuterService class salary_item_scale(BaseSalaryFormulaObject): """ 多个薪酬项目的话都要计算出来,薪酬计算从缓存取数据,不然会报错。 薪酬计算从薪级薪档变更明细取薪酬项目数据:基本工资取本月,奖金应去上个月。 取数模型:SalaryScaleDetail """ def execute(self, field): _cache_key = 'salary_item_scale_zcl' # 缓存key值自定义唯一key值 _cache = self.executor.context.get(_cache_key) if _cache is None:#缓存为空计算 employee_ids = [_p.get('employee_id') for _p in self.context['profile_list']] logging.info("salary_item_scale|field|{}".format(field)) if not self.context['month']: raise errors.DATA_RULE_ERROR.description("薪酬期间不能为空") # 你的取数逻辑 salary_month = "{}-01".format(self.context["month"]) logging.info("salary_item_scale|salary_month|{}|".format(salary_month)) bonus_month = (datetime.datetime.strptime(salary_month, "%Y-%m-%d") + dateutil.relativedelta.relativedelta( months=-1)).strftime("%Y-%m-%d") logging.info("salary_item_scale|bonus_month|{}|".format(bonus_month)) self.executor.context[_cache_key] = _cache result = {} # 基本工资 职等名称 salary_data_list = self.get_SalaryScaleDetail_data(employee_ids=employee_ids, month=salary_month) for item in salary_data_list: result[item.get("employee_id")] = { "basic_salary": item.get("base_salary"), "job_grade": item.get("job_grade").get("name") } # 奖金 bonus_data_list = self.get_SalaryScaleDetail_data(employee_ids, month=bonus_month) for item in bonus_data_list: result.get(item.get("employee_id"),{"basic_salary":0,"job_grade":""})["bonus_salary"]=item.get("bonus_salary") logging.info("salary_item_scale|result|{}|".format(result)) _cache = result self.executor.context[_cache_key] = _cache _result = _cache.get(self.context['profile']['employee_id'], {}).get(field, 0) or 0 logging.info("salary_item_scale|_result|{}|".format(_result)) return _result def get_SalaryScaleDetail_data(self, employee_ids, month): """ 获取 SalaryScaleDetail 数据 :param employee_ids: :param month: :return: """ logging.info("salary_item_scale|data|{}|{}".format(employee_ids, month)) return CustomerUtil.call_open_api( name="hcm.model.list", param={ "model": "SalaryScaleDetail", "page_index": 1, "page_size": 9999, "filter_dict": { "employee_id": employee_ids, "effect_date": {"lte": month}, "end_date": {"gt": month} }, "extra_property": { "state": "search_zcl", "sorts": [{"key": "effect_date", "type": "desc"}], "fields": [ {"field": ["employee_id"], "key": "employee_id"}, {"field": ["bonus_salary"], "key": "bonus_salary"}, {"field": ["base_salary"], "key": "base_salary"}, {"field": ["annual_salary"], "key": "annual_salary"}, {"field": ["job_grade", "name"], "key": "job_grade_name"} ] } } )["list"]