871 lines
46 KiB
C#
871 lines
46 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Configuration;
|
||
using System.Data;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
using System.Xml;
|
||
using SuperMap.RealEstate.ServiceModel;
|
||
using Business = SuperMap.RealEstate.Personnel.Storage.Business;
|
||
using HZQR.Common.Common;
|
||
using HZQR.Common;
|
||
|
||
namespace Personnel.WebSite.Shanxi
|
||
{
|
||
public class ThirdParty
|
||
{
|
||
#region 山西OA平台用户同步参数配置
|
||
/// <summary>
|
||
/// 山西OA平台用户同步地址
|
||
/// </summary>
|
||
protected static string sxWebServiceUrl = ConfigurationManager.AppSettings["sxWebServiceUrl"].ToString();
|
||
/// <summary>
|
||
/// 山西OA平台用户同步方法
|
||
/// </summary>
|
||
protected static string sxWebServiceMethod = ConfigurationManager.AppSettings["sxWebServiceMethod"].ToString();
|
||
/// <summary>
|
||
/// 山西OA平台用户同步安全认证标识
|
||
/// </summary>
|
||
protected static string key = "73D08BF08604E2B805166C45D323522E";//CommonHelper.Create32MD5("whir.2011");
|
||
/// <summary>
|
||
/// 山西OA平台用户同步serviceKey
|
||
/// </summary>
|
||
protected static string serviceKey = "evoserviceKey";
|
||
/// <summary>
|
||
/// 山西OA平台用户同步【验证类型,0-不依赖OA帐号登入验证的系统,1-依赖OA认证的登入系统;默认0】
|
||
/// </summary>
|
||
protected static string verificationType = "0";
|
||
/// <summary>
|
||
/// 山西OA平台用户同步【标识userKey类型,对应关系为:0-帐号,1-userId ,2-身份证号,3-用户简码】
|
||
/// </summary>
|
||
protected static string userKeyType = "0";
|
||
/// <summary>
|
||
/// 山西OA平台用户同步组织ID
|
||
/// </summary>
|
||
protected static int orgid = 78;
|
||
#endregion
|
||
|
||
#region 山西交研、视频系统用户同步方法
|
||
public static void SysncUserToThird(int cmd, string userName, string passPort, string userPwd,
|
||
string userPhone, int userState, string pageName = "")
|
||
{
|
||
Task task = Task.Factory.StartNew(() =>
|
||
{
|
||
#region 同步到安全管控平台
|
||
try
|
||
{
|
||
Shanxi.Models.Result result = Shanxi.sxjsHelper.SyncUser(cmd.ToString(), userName, passPort,
|
||
userPwd, userPhone, userState.ToString());
|
||
if (result.success == false)
|
||
{
|
||
if (result.errorCode == "200102")
|
||
{
|
||
//同步用户信息失败,用户不存在
|
||
cmd = 1;//对于对方来说是新增用户
|
||
result = Shanxi.sxjsHelper.SyncUser(cmd.ToString(), userName, passPort, userPwd, userPhone, userState.ToString());
|
||
if (result.success == false)
|
||
{
|
||
LogUtil.WriteLog(null, "更新用户信息出错:" + result.msg + ",页面" +
|
||
pageName, DateTime.Now.ToString("yyyyMMdd_") + "sxjsEx");//山西交研接口请求出错
|
||
}
|
||
}
|
||
else
|
||
{
|
||
LogUtil.WriteLog(null, "同步账号失败:" + result.msg + ",页面" +
|
||
pageName, DateTime.Now.ToString("yyyyMMdd_") + "sxjsEx");//山西交研接口请求出错
|
||
}
|
||
}
|
||
else
|
||
{
|
||
LogUtil.WriteLog(null, "同步账号成功:" + passPort,
|
||
DateTime.Now.ToString("yyyyMMdd_") + "sxjs");//山西交研接口请求成功
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
SuperMap.RealEstate.Utility.ErrorLogHelper.Write(ex, "同步登录账号",
|
||
"同步到安全管控平台passPort=" + passPort + ",页面" + pageName);
|
||
}
|
||
#endregion
|
||
|
||
#region 同步到视频系统
|
||
try
|
||
{
|
||
Shanxi.Models.VideoResult result = videoHelper.SyncUser(cmd, userName, passPort, userPwd, userPhone, userState.ToString());
|
||
if (result.code == 301)
|
||
{
|
||
//同步用户信息失败,用户已存在
|
||
cmd = 2;//对于对方来说是更新
|
||
result = videoHelper.SyncUser(cmd, userName, passPort, userPwd, userPhone, userState.ToString());
|
||
if (result.code != 200)
|
||
{
|
||
LogUtil.WriteLog(null, "更新用户信息出错:" + result.msg + ",页面" + pageName,
|
||
DateTime.Now.ToString("yyyyMMdd_") + "sxvideoEx");//视频系统接口请求出错
|
||
}
|
||
}
|
||
if (result.code == 302)
|
||
{
|
||
//同步用户信息失败,用户不存在
|
||
cmd = 1;//对于对方来说是新增
|
||
result = videoHelper.SyncUser(cmd, userName, passPort, userPwd, userPhone, userState.ToString());
|
||
if (result.code != 200)
|
||
{
|
||
LogUtil.WriteLog(null, "新增用户信息出错:" + result.msg + ",页面" + pageName,
|
||
DateTime.Now.ToString("yyyyMMdd_") + "sxvideoEx");//视频系统接口请求出错
|
||
}
|
||
}
|
||
else if (result.code == 200)
|
||
{
|
||
LogUtil.WriteLog(null, "同步账号成功:" + result.msg + ",页面:" + pageName,
|
||
DateTime.Now.ToString("yyyyMMdd_") + "sxvideo");//视频系统接口请求出错
|
||
}
|
||
else
|
||
{
|
||
LogUtil.WriteLog(null, "同步账号失败:" + passPort,
|
||
DateTime.Now.ToString("yyyyMMdd_") + "sxvideoEx");//视频系统接口请求成功
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
SuperMap.RealEstate.Utility.ErrorLogHelper.Write(ex, "同步登录账号", "同步到视频系统passPort=" + passPort + ",页面" + pageName);
|
||
}
|
||
#endregion
|
||
});
|
||
}
|
||
#endregion
|
||
|
||
#region 工资相关计算规则
|
||
|
||
#region 岗位工资计算规则
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="radio">岗位薪资系数</param>
|
||
/// <returns></returns>
|
||
public static double PostCalculate(double radio)
|
||
{
|
||
double post_base = ConfigurationManager.AppSettings["Post_Base"].ToString().TryParseToDouble();
|
||
return Math.Round(radio * post_base, 2);
|
||
}
|
||
#endregion
|
||
|
||
#region 加班计算规则
|
||
/// <summary>
|
||
/// 加班计算规则
|
||
/// </summary>
|
||
/// <param name="regularEarn">固定工资(基础工资、职级工资、年工工资、学历职称工资)</param>
|
||
/// <param name="type">加班类型:1工作日 2双休日 3节假日 </param>
|
||
/// <param name="workTime">加班时间</param>
|
||
/// <returns></returns>
|
||
public static double OverTimeCalculate(double regularEarn, int type, double workTime)
|
||
{
|
||
workTime = workTime * 60;
|
||
double dateSalary = regularEarn / 21.75 / 7.5 / 60;
|
||
|
||
if (type == 1)
|
||
dateSalary = dateSalary * workTime * 1.5;
|
||
else if (type == 2)
|
||
dateSalary = dateSalary * workTime * 2;
|
||
else if (type == 3)
|
||
dateSalary = dateSalary * workTime * 3;
|
||
return Math.Round(dateSalary, 2);
|
||
}
|
||
#endregion
|
||
|
||
#region 病假、事假、旷工计算规则
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="regularEarn">固定工资(基础工资、职级工资、年工工资、学历职称工资)</param>
|
||
/// <param name="performance">月绩效工资</param>
|
||
/// <param name="postSalary">岗位工资</param>
|
||
/// <param name="type">请假类型:1事假 2病假</param>
|
||
/// <param name="leaveDay">请假时间</param>
|
||
/// <param name="workYear">工作年限</param>
|
||
/// <returns></returns>
|
||
public static double LeaveCalculate(double regularEarn, double performance, double postSalary, int type, double leaveDay, int workYear)
|
||
{
|
||
double salary = 0;
|
||
leaveDay = leaveDay * 60;
|
||
regularEarn = regularEarn / 21.75 / 7.5 / 60;
|
||
//(月绩效工资+岗位工资)/21.75/7.5工作时/60分钟*(请假时间*60分钟)
|
||
double commonValue = (performance + postSalary) / 21.75 / 7.5 / 60 * leaveDay;
|
||
if (type == 1)
|
||
{
|
||
//事假:固定薪资(工资明细前4项相加)/ 21.75 * 0.5*天数 +(月绩效工资+岗位工资)/21.75*天数
|
||
salary = regularEarn * 0.5 * leaveDay + commonValue;
|
||
}
|
||
else if (type == 2)
|
||
{
|
||
//病假:固定薪资(工资明细前4项相加)/ 21.75 * (根据工作年限系数不同)* 天数+(月绩效工资+岗位工资)/21.75*天数
|
||
if (workYear < 5)
|
||
salary = regularEarn * 0.4 * leaveDay + commonValue;
|
||
else if (workYear >= 5 && workYear < 10)
|
||
salary = regularEarn * 0.3 * leaveDay + commonValue;
|
||
else if (workYear >= 10 && workYear < 15)
|
||
salary = regularEarn * 0.2 * leaveDay + commonValue;
|
||
else if (workYear >= 15)
|
||
salary = commonValue;
|
||
}
|
||
return Math.Round(salary, 2);
|
||
}
|
||
#endregion
|
||
|
||
#region 月绩效计算规则
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="postSalary">岗位工资</param>
|
||
/// <param name="ratio">月绩效系数</param>
|
||
/// <returns></returns>
|
||
public static double PerformanceCalculate(double postSalary)
|
||
{
|
||
return Math.Round(postSalary * 1.5, 2);
|
||
}
|
||
#endregion
|
||
|
||
#endregion
|
||
|
||
#region 计算员工薪资
|
||
public static bool SalaryCalculate(string sqlWhereStaff, string orderBySql, string payDate, int CREATE_STAFF_ID, string staffName, int pageSize, Transaction _Transaction)
|
||
{
|
||
#region 算薪月份统计
|
||
DateTime now = DateTime.Now;
|
||
string sqlWhereDate = " TO_CHAR(B.PAID_DATE,'yyyy-MM')='" + payDate + "'";
|
||
if ((payDate + "-01").TryParseToDateTime() >= (now.ToString("yyyy-MM") + "-01").TryParseToDateTime())
|
||
{
|
||
return true;
|
||
}
|
||
#endregion
|
||
|
||
#region 查询数据
|
||
string sqlRowNum = pageSize > 0 ? "WHERE ROWNUM<=" + pageSize : "";
|
||
string sql = string.Format(@" SELECT * FROM(
|
||
SELECT A.STAFF_ID,A.STAFF_SEX,A.SERVERPART_ID,A.STAFF_RANK,A.CURRENT_POSITION,A.FIRST_DEGREE,A.HIGHEST_EDUCATION,
|
||
A.SKILL_GRADE,A.WORKING_YEARS,A.ISONLY_CHILD,NVL(A.ISLEAD,0) AS ISLEAD,B.PAID_DATE
|
||
FROM PERSONNEL_STORAGE.T_STAFF A LEFT JOIN PERSONNEL_STORAGE.T_STAFFSALARY B ON (A.STAFF_ID=B.STAFF_ID AND {0})
|
||
WHERE {1}
|
||
ORDER BY {2}) {3}", sqlWhereDate, sqlWhereStaff, orderBySql, sqlRowNum);
|
||
DataTable dt = new Business.STAFF(_Transaction).ExecuteDataTable(sql);
|
||
if (dt.Rows.Count == 0)
|
||
{
|
||
return true;
|
||
}
|
||
DataRow[] dr = dt.Select("PAID_DATE is null");
|
||
if (dr.Length == 0)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
//员工-月汇总考核数据
|
||
sql = string.Format(@"SELECT STAFF_ID,ATTENDANCE_NUM,ABSENTEEISM_NUM,PERSONAL_LEAVE,SICK_LEAVE,REST,OVERTIME,COMPENSATORY,
|
||
NVL(PERSONAL_LEAVE,0)+NVL(SICK_LEAVE,0)+NVL(MARITAL_LEAVE,0)+NVL(MATERNITY_LEAVE,0)+
|
||
NVL(ACCOM_MATERNITY_LEAVE,0)+NVL(FUNERAL_LEAVE,0)+NVL(ANNUAL_LEAVE,0)+NVL(PUBLIC_AFFAIRS_LEAVE,0) AS LEAVE_NUM,
|
||
WORKDAY_OVERTIME,WEEKEND_OVERTIME,HOLIDAY_OVERTIME
|
||
FROM PERSONNEL_STORAGE.T_ATTENDANCEMONTH
|
||
WHERE STATISTICS_MONTH='{0}' AND STAFF_ID IN
|
||
(SELECT A.STAFF_ID
|
||
FROM PERSONNEL_STORAGE.T_STAFF A LEFT JOIN PERSONNEL_STORAGE.T_STAFFSALARY B ON (A.STAFF_ID=B.STAFF_ID AND {1})
|
||
WHERE {2})", payDate, sqlWhereDate, sqlWhereStaff);
|
||
DataTable dtMonthStatistic = new Business.STAFF(_Transaction).ExecuteDataTable(sql);
|
||
#endregion
|
||
|
||
#region 计算员工薪资
|
||
//查询基础工资配置信息
|
||
Business.SALARYBASE _SALARYBASE = new Business.SALARYBASE(_Transaction);
|
||
_SALARYBASE.SALARYBASE_ID = 1;
|
||
bool isExist = _SALARYBASE.Select();
|
||
//工资系数模板
|
||
Business.SALARYTEMPLATE _SALARYTEMPLATE = new Business.SALARYTEMPLATE(_Transaction);
|
||
List<Business.SALARYTEMPLATE> list = _SALARYTEMPLATE.FillCollection("WHERE 1=1");
|
||
int STAFF_ID = 0;
|
||
for (int i = 0; i < dr.Length; i++)
|
||
{
|
||
STAFF_ID = dr[i]["STAFF_ID"].TryParseToInt();
|
||
int workDateYear = 0;
|
||
Business.STAFFSALARY _STAFFSALARY = new Business.STAFFSALARY(_Transaction);
|
||
#region 计算工资
|
||
_STAFFSALARY.STAFF_ID = STAFF_ID;
|
||
_STAFFSALARY.CURRENT_POSITION = dr[i]["CURRENT_POSITION"].TryParseToInt();
|
||
_STAFFSALARY.STAFF_RANK = dr[i]["STAFF_RANK"].TryParseToInt();
|
||
if (isExist)
|
||
{
|
||
//查询当前工资标识是否存在对应岗位薪资标准,若存在则绑定相应信息,否则初始化展示内容
|
||
#region 基本工资
|
||
double minimumSalary = _SALARYBASE.MINIMUM_SALARY.TryParseToDouble();
|
||
//第一学历系数模板(小于等于3,为本科及以下)
|
||
int staffEducation = dr[i]["FIRST_DEGREE"].TryParseToInt() >= 3 ? 3 : dr[i]["FIRST_DEGREE"].TryParseToInt();
|
||
Business.SALARYTEMPLATE educationTemplate = list.Where(o => o.SALARYTEMPLATE_TYPE == 1000 &&
|
||
o.SALARYTEMPLATE_VALUE == staffEducation).FirstOrDefault();
|
||
if (educationTemplate != null)
|
||
{
|
||
//员工学历对应的系数
|
||
double educationRatio = educationTemplate.SALARYTEMPLATE_RATIO.TryParseToDouble();
|
||
//基础工资:1700(需要可以手动调整)*系数(本科及以下:1.2 ,硕士:1.5 ,博士 2.0)
|
||
_STAFFSALARY.MINIMUM_SALARY = Math.Round(minimumSalary * educationRatio, 2);
|
||
}
|
||
#endregion
|
||
|
||
#region 职级系数模板
|
||
Business.SALARYTEMPLATE rankLevelTemplate = list.Where(o => o.SALARYTEMPLATE_TYPE == 2000 &&
|
||
o.SALARYTEMPLATE_VALUE == dr[i]["STAFF_RANK"].TryParseToInt()).FirstOrDefault();
|
||
if (rankLevelTemplate != null)
|
||
{
|
||
//职称工资
|
||
double baseSalary = _STAFFSALARY.MINIMUM_SALARY.TryParseToDouble();//基础工资
|
||
//职级工资:基础工资 * 系数
|
||
_STAFFSALARY.RANKLEVEL_SALARY = baseSalary * rankLevelTemplate.SALARYTEMPLATE_RATIO.TryParseToDouble();
|
||
}
|
||
#endregion
|
||
|
||
#region 工龄(工资/年)
|
||
workDateYear = dr[i]["WORKING_YEARS"].TryParseToInt();//工龄
|
||
_STAFFSALARY.SENIORITY_SALARY = _SALARYBASE.SENIORITY_SALARY.TryParseToDouble() * workDateYear;//工龄工资/年
|
||
#endregion
|
||
|
||
#region 职称工资模板
|
||
double skillLevelSalary = 0;
|
||
Business.SALARYTEMPLATE skillLevelTemplate = list.Where(o => o.SALARYTEMPLATE_TYPE == 5000 &&
|
||
o.SALARYTEMPLATE_VALUE == dr[i]["SKILL_GRADE"].TryParseToInt()).FirstOrDefault();
|
||
if (skillLevelTemplate != null)
|
||
{
|
||
//职称工资
|
||
skillLevelSalary = skillLevelTemplate.SALARYTEMPLATE_RATIO.TryParseToDouble();
|
||
}
|
||
#endregion
|
||
|
||
#region 学历工资模板
|
||
double educationSalary = 0;
|
||
Business.SALARYTEMPLATE educationSalaryTemp = list.Where(o => o.SALARYTEMPLATE_TYPE == 6000 &&
|
||
o.SALARYTEMPLATE_VALUE == dr[i]["HIGHEST_EDUCATION"].TryParseToInt()).FirstOrDefault();
|
||
if (educationSalaryTemp != null)
|
||
{
|
||
//学历工资
|
||
educationSalary = educationSalaryTemp.SALARYTEMPLATE_RATIO.TryParseToDouble();
|
||
}
|
||
//最高学历职称工资哪个高取哪个
|
||
_STAFFSALARY.SKILLLEVEL_SALARY = skillLevelSalary >= educationSalary ? skillLevelSalary : educationSalary;//学历职称工资
|
||
#endregion
|
||
|
||
#region 岗位工资系数模板
|
||
Business.SALARYTEMPLATE positionRatio = list.Where(o => o.SALARYTEMPLATE_TYPE == 4000 &&
|
||
o.SALARYTEMPLATE_VALUE == dr[i]["CURRENT_POSITION"].TryParseToInt()).FirstOrDefault();
|
||
if (positionRatio != null)
|
||
{
|
||
//岗位工资
|
||
_STAFFSALARY.POSITION_SALARY = PostCalculate(positionRatio.SALARYTEMPLATE_RATIO.TryParseToDouble());
|
||
}
|
||
#endregion
|
||
|
||
#region 代扣伙食费
|
||
//代扣伙食费根据实际出勤天数 * 每日伙食费
|
||
double DailyMealExpense = _SALARYBASE.MEAL_EXPENSE.TryParseToDouble();
|
||
int workDay = 0;
|
||
//查询出勤天数:CLOCKIN_RESULT,上班打卡结果(1000:正常考勤;2000:迟到;3000:未打卡))
|
||
sql = string.Format(@"
|
||
SELECT COUNT(0) WORKDAY FROM
|
||
PERSONNEL_STORAGE.T_WORKTIME A
|
||
WHERE
|
||
A.CLOCKIN_RESULT <> 3000 AND A.CLOCKOUT_RESULT <> 3000
|
||
AND STAFF_ID = {0}
|
||
AND TO_CHAR(A.CLOCK_DATE,'YYYY-MM') = '{1}'", STAFF_ID, payDate);
|
||
DataTable dtWork = _SALARYBASE.ExecuteDataTable(sql);
|
||
if (dtWork.Rows.Count > 0)
|
||
{
|
||
workDay = dtWork.Rows[0]["WORKDAY"].TryParseToInt();
|
||
}
|
||
_STAFFSALARY.MEAL_EXPENSE = DailyMealExpense * workDay;
|
||
#endregion
|
||
}
|
||
|
||
#region 月绩效
|
||
|
||
//string kpiLevel = "A";//默认A级
|
||
// //月绩效
|
||
//sql = string.Format(@"
|
||
//SELECT ASSESSMENT_LEVEL
|
||
//FROM PERSONNEL_STORAGE.T_ASSESSMENTSCORE A
|
||
//WHERE STAFF_ID = {0} AND
|
||
// TO_CHAR(A.ASSESSMENT_DATE,'YYYY-MM') = '{1}'", STAFF_ID, payDate);
|
||
//DataTable dtMonth = new Business.ASSESSMENTSCORE(_Transaction).ExecuteDataTable(sql);
|
||
//if (dtMonth.Rows.Count > 0)
|
||
//{
|
||
// kpiLevel = dtMonth.Rows[0]["ASSESSMENT_LEVEL"].ToString();
|
||
//}
|
||
//考核等级系数模板
|
||
//DataTable dtSalaryMonth = new Business.STAFF(_Transaction).ExecuteDataTable(@"
|
||
// SELECT A.SALARYTEMPLATE_RATIO FROM PERSONNEL_STORAGE.T_SALARYTEMPLATE A,
|
||
// PERSONNEL_STORAGE.T_KPILEVELSCORE B
|
||
// WHERE A.SALARYTEMPLATE_TYPE=3000 AND A.SALARYTEMPLATE_VALUE=B.KPILEVEL_VALUE AND
|
||
// B.KPILEVEL_NAME='" + kpiLevel + "'");
|
||
////Business.SALARYTEMPLATE _TEMPLATE = list.Where(o => o.SALARYTEMPLATE_TYPE == 3000 && o.SALARYTEMPLATE_NAME == kpiLevel).FirstOrDefault();
|
||
//if (dtSalaryMonth.Rows.Count > 0)
|
||
//{
|
||
//月绩效=岗位工资*考核等级系数
|
||
_STAFFSALARY.KPI_SALARY_MONTH = PerformanceCalculate(_STAFFSALARY.POSITION_SALARY.TryParseToDouble());
|
||
//}
|
||
#endregion
|
||
|
||
//固定工资(基础工资、职级工资、年工工资、学历职称工资)
|
||
double regularEarn = _STAFFSALARY.MINIMUM_SALARY.TryParseToDouble() + _STAFFSALARY.RANKLEVEL_SALARY.TryParseToDouble() +
|
||
_STAFFSALARY.SENIORITY_SALARY.TryParseToDouble() + _STAFFSALARY.SKILLLEVEL_SALARY.TryParseToDouble();
|
||
|
||
#region 女工卫生费
|
||
//性别1:男;2:女
|
||
if (dr[i]["STAFF_SEX"].ToString() == "2")
|
||
{
|
||
_STAFFSALARY.FEMALE_WORKERS_SALARY = 30.00;//女工卫生费30元
|
||
}
|
||
#endregion
|
||
|
||
#region 独生子女费
|
||
//是否独生子女:1是 0否
|
||
if (dr[i]["ISONLY_CHILD"].ToString() == "1")
|
||
{
|
||
_STAFFSALARY.ONLYCHILD_SALARY = 50.00;//独生子女50元
|
||
}
|
||
#endregion
|
||
|
||
#region 应扣工资
|
||
DataRow[] drMonth = dtMonthStatistic.Select("STAFF_ID=" + STAFF_ID);
|
||
if (drMonth.Length > 0)
|
||
{
|
||
//实际出勤少于应出勤天数时,无请假事项的,按旷工扣除全部岗位工资和月绩效工资
|
||
if (drMonth[0]["ABSENTEEISM_NUM"].TryParseToDouble() > 0)
|
||
{
|
||
_STAFFSALARY.DEDUCTION_SALARY = _STAFFSALARY.KPI_SALARY_MONTH + _STAFFSALARY.POSITION_SALARY.TryParseToDouble();
|
||
}
|
||
else
|
||
{
|
||
//事假
|
||
double personalLeave = ThirdParty.LeaveCalculate(regularEarn, _STAFFSALARY.KPI_SALARY_MONTH.TryParseToDouble(), _STAFFSALARY.POSITION_SALARY.TryParseToDouble(), 1,
|
||
drMonth[0]["PERSONAL_LEAVE"].TryParseToDouble(), workDateYear);
|
||
//病假
|
||
double sickLeave = ThirdParty.LeaveCalculate(regularEarn, _STAFFSALARY.KPI_SALARY_MONTH.TryParseToDouble(), _STAFFSALARY.POSITION_SALARY.TryParseToDouble(), 2,
|
||
drMonth[0]["SICK_LEAVE"].TryParseToDouble(), workDateYear);
|
||
_STAFFSALARY.DEDUCTION_SALARY = sickLeave + personalLeave;
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
////值班费
|
||
//_STAFFSALARY.DUTY_FEE = 0;
|
||
|
||
#region 加班费
|
||
//固定工资(基础工资、职级工资、年工工资、学历职称工资)
|
||
if (drMonth.Length > 0)
|
||
{
|
||
_STAFFSALARY.OVERTIME_PAY = ThirdParty.OverTimeCalculate(regularEarn, 1, drMonth[0]["WORKDAY_OVERTIME"].TryParseToDouble()) +
|
||
ThirdParty.OverTimeCalculate(regularEarn, 2, drMonth[0]["WEEKEND_OVERTIME"].TryParseToDouble()) +
|
||
ThirdParty.OverTimeCalculate(regularEarn, 3, drMonth[0]["HOLIDAY_OVERTIME"].TryParseToDouble());
|
||
}
|
||
#endregion
|
||
|
||
//其他
|
||
//_STAFFSALARY.OTHER_PAY = 0;
|
||
//年绩效(女工卫生费+独生子女费+出车补助+值班费+加班工资)
|
||
_STAFFSALARY.KPI_SALARY_YEAR = _STAFFSALARY.FEMALE_WORKERS_SALARY.TryParseToDouble() +
|
||
_STAFFSALARY.ONLYCHILD_SALARY.TryParseToDouble() +
|
||
_STAFFSALARY.DRIVER_SUBSIDY.TryParseToDouble() +
|
||
_STAFFSALARY.DUTY_FEE.TryParseToDouble() +
|
||
_STAFFSALARY.OVERTIME_PAY.TryParseToDouble();
|
||
|
||
//应发工资
|
||
_STAFFSALARY.WAGES_PAYABLE = _STAFFSALARY.MINIMUM_SALARY.TryParseToDouble() +
|
||
_STAFFSALARY.RANKLEVEL_SALARY.TryParseToDouble() +
|
||
_STAFFSALARY.SENIORITY_SALARY.TryParseToDouble() +
|
||
_STAFFSALARY.SKILLLEVEL_SALARY.TryParseToDouble() +
|
||
_STAFFSALARY.POSITION_SALARY.TryParseToDouble() +
|
||
_STAFFSALARY.KPI_SALARY_MONTH.TryParseToDouble() +
|
||
_STAFFSALARY.KPI_SALARY_YEAR +
|
||
_STAFFSALARY.OTHER_PAY.TryParseToDouble() -
|
||
_STAFFSALARY.DEDUCTION_SALARY.TryParseToDouble();
|
||
////五险一金
|
||
//double socialInsurance = _STAFFSALARY.ENDOWMENT_INSURANCE.TryParseToDouble() + _STAFFSALARY.MEDICAL_INSURANCE.TryParseToDouble()
|
||
// + _STAFFSALARY.UNEMPLOYMENT_INSURANCE.TryParseToDouble() + _STAFFSALARY.HOUSING_PROVIDENT_FUND.TryParseToDouble();
|
||
//实发工资
|
||
_STAFFSALARY.FINAL_WAGES = _STAFFSALARY.WAGES_PAYABLE;//+socialInsurance
|
||
//实领工资
|
||
_STAFFSALARY.TAKE_WAGES = _STAFFSALARY.FINAL_WAGES - _STAFFSALARY.DEDUCTION_TAX.TryParseToDouble() - _STAFFSALARY.MEAL_EXPENSE.TryParseToDouble();
|
||
_STAFFSALARY.PAID_STATE = 0;//发放状态(0:未发放;1:已发放)
|
||
_STAFFSALARY.CREATE_STAFF_ID = CREATE_STAFF_ID.TryParseToInt();//创建人ID
|
||
_STAFFSALARY.CREATE_STAFF_NAME = staffName;//创建人名称
|
||
_STAFFSALARY.CREATE_DATE = now;//创建时间
|
||
//算薪时间-即计算几月份工资
|
||
_STAFFSALARY.PAID_DATE = (payDate + "-01").TryParseToDateTime();
|
||
//发放时间
|
||
_STAFFSALARY.UPDATE_DATE = (now.Day > 15 ? now.ToString("yyyy-MM") + "-15" : now.ToString("yyyy-MM-dd")).TryParseToDateTime();
|
||
_STAFFSALARY.Insert();
|
||
#endregion
|
||
}
|
||
#endregion
|
||
return true;
|
||
}
|
||
#endregion
|
||
|
||
#region 获取令牌
|
||
public static string GetServiceToken(string userKey)
|
||
{
|
||
LogUtil.WriteLog(null, "开始获取令牌", "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
try
|
||
{
|
||
string ServiceToken = "";
|
||
System.Text.StringBuilder XmlString = new System.Text.StringBuilder();
|
||
|
||
XmlString.AppendLine($"<input>");
|
||
XmlString.AppendLine($"<key>{key}</key>");
|
||
XmlString.AppendLine($"<cmd>getServiceToken</cmd>");
|
||
XmlString.AppendLine($"<domain>0</domain>");
|
||
XmlString.AppendLine($"<serviceKey>{serviceKey}</serviceKey>");
|
||
XmlString.AppendLine($"<verificationType>{verificationType}</verificationType>");
|
||
XmlString.AppendLine($"<userKey>{userKey}</userKey>");
|
||
XmlString.AppendLine($"<userKeyType>{userKeyType}</userKeyType>");
|
||
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||
string time = Convert.ToInt64(ts.TotalMilliseconds).ToString();
|
||
XmlString.AppendLine($"<time>{time}</time>");
|
||
XmlString.AppendLine($"<md5key>{CommonHelper.Create32MD5(serviceKey + verificationType + userKey + userKeyType + time + "evo")}</md5key>");
|
||
XmlString.AppendLine($"</input>");
|
||
Hashtable ht = new Hashtable();
|
||
ht.Add("input", XmlString.ToString());
|
||
//ht.Add("cmd", "getServiceToken");
|
||
//ht.Add("domain", "0");
|
||
//ht.Add("serviceKey", serviceKey);
|
||
//ht.Add("verificationType", verificationType);
|
||
//ht.Add("userKey", userKey);
|
||
//ht.Add("userKeyType", userKeyType);
|
||
|
||
//ht.Add("time", time);
|
||
//ht.Add("md5key", CommonHelper.Create32MD5(serviceKey + verificationType + userKey + userKeyType + time + "evo"));
|
||
//LogUtil.WriteLog(null, "令牌获取:" + ServiceToken + ";返回值:" + WSHelper.InvokeWebService(sxWebServiceUrl, sxWebServiceMethod, new object[] { XmlString.ToString() }).ToString(),
|
||
// "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd")); ;
|
||
XmlDocument xml = WebServiceCaller.QuerySoapWebService(sxWebServiceUrl, sxWebServiceMethod, ht);
|
||
XmlNode node = xml.SelectSingleNode("/output");
|
||
string result = "0";
|
||
foreach (XmlNode child in node.ChildNodes)
|
||
{
|
||
if (child.Name == "message")
|
||
{
|
||
XmlNodeList element = ((XmlElement)child).GetElementsByTagName("result");
|
||
if (element.Count > 0)
|
||
{
|
||
result = element[0].InnerText;
|
||
}
|
||
if (result == "0")
|
||
break;
|
||
}
|
||
else if (child.Name == "data")
|
||
{
|
||
XmlNodeList element = ((XmlElement)child).GetElementsByTagName("ServiceToken");
|
||
if (element.Count > 0)
|
||
{
|
||
ServiceToken = element[0].InnerText;
|
||
}
|
||
}
|
||
}
|
||
LogUtil.WriteLog(null, "令牌获取成功:" + ServiceToken + ";返回值:" + xml.ToString(),
|
||
"同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
return ServiceToken;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
//ex.InnerException.Data.
|
||
var stack = ex.StackTrace.Trim();
|
||
LogUtil.WriteLog(ex, "令牌获取失败:" + stack, "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
return "";
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 添加用户信息时同步数据
|
||
public static bool SysDataAddUser(string STAFF_NAME, string STAFF_SEX,
|
||
string User_Passport, string User_PassWord, string ServiceToken = "")
|
||
{
|
||
try
|
||
{
|
||
string result = "0";
|
||
if (string.IsNullOrWhiteSpace(ServiceToken))
|
||
{
|
||
ServiceToken = GetServiceToken(User_Passport);
|
||
}
|
||
if (!string.IsNullOrWhiteSpace(ServiceToken))
|
||
{
|
||
#region 生成入参报文
|
||
System.Text.StringBuilder XmlString = new System.Text.StringBuilder();
|
||
XmlString.AppendLine($"<input>");
|
||
XmlString.AppendLine($"<key>{key}</key>");
|
||
XmlString.AppendLine($"<cmd>addUser</cmd>");
|
||
XmlString.AppendLine($"<domain>0</domain>");
|
||
XmlString.AppendLine($"<ServiceToken>{ServiceToken}</ServiceToken>");
|
||
XmlString.AppendLine($"<serviceKey>{serviceKey}</serviceKey>");
|
||
XmlString.AppendLine($"<verificationType>{verificationType}</verificationType>");
|
||
XmlString.AppendLine($"<userKey>{User_Passport}</userKey>");
|
||
XmlString.AppendLine($"<userKeyType>{userKeyType}</userKeyType>");
|
||
XmlString.AppendLine($"<name>{STAFF_NAME}</name>");
|
||
XmlString.AppendLine($"<englishname></englishname>");
|
||
XmlString.AppendLine($"<accounts>{User_Passport}</accounts>");
|
||
XmlString.AppendLine($"<password>{User_PassWord}</password>");
|
||
XmlString.AppendLine($"<sex>{STAFF_SEX}</sex>");
|
||
XmlString.AppendLine($"<empnumber></empnumber>");
|
||
XmlString.AppendLine($"<birthdate></birthdate>");
|
||
XmlString.AppendLine($"<email></email>");
|
||
XmlString.AppendLine($"<mobilephone></mobilephone>");
|
||
XmlString.AppendLine($"<orgid>{orgid}</orgid>");
|
||
XmlString.AppendLine($"<rightType></rightType>");
|
||
XmlString.AppendLine($"<orgserial></orgserial>");
|
||
XmlString.AppendLine($"<empIdCard></empIdCard>");
|
||
XmlString.AppendLine($"<empLeaderId></empLeaderId>");
|
||
XmlString.AppendLine($"<duty></duty>");
|
||
XmlString.AppendLine($"<mobileUserFlag></mobileUserFlag>");
|
||
XmlString.AppendLine($"<sidelineorg></sidelineorg>");
|
||
XmlString.AppendLine($"<empBusinessPhone></empBusinessPhone>");
|
||
XmlString.AppendLine($"<usersimplename></usersimplename>");
|
||
XmlString.AppendLine($"<dutyLevel></dutyLevel>");
|
||
XmlString.AppendLine($"<chargeLeaderAccounts></chargeLeaderAccounts>");
|
||
XmlString.AppendLine($"<deptLeaderAccounts></deptLeaderAccounts>");
|
||
XmlString.AppendLine($"<userisactive></userisactive>");
|
||
XmlString.AppendLine($"<empdisduty></empdisduty>");
|
||
XmlString.AppendLine($"</input>");
|
||
#endregion
|
||
|
||
LogUtil.WriteLog(null, "RequestXml:" + XmlString, "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
|
||
Hashtable ht = new Hashtable();
|
||
ht.Add("input", XmlString.ToString());
|
||
|
||
XmlDocument xml = WebServiceCaller.QuerySoapWebService(sxWebServiceUrl, sxWebServiceMethod, ht);
|
||
XmlNode node = xml.SelectSingleNode("/output");
|
||
foreach (XmlNode child in node.ChildNodes)
|
||
{
|
||
if (child.Name == "message")
|
||
{
|
||
XmlNodeList element = ((XmlElement)child).GetElementsByTagName("result");
|
||
if (element.Count > 0)
|
||
{
|
||
result = element[0].InnerText;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
LogUtil.WriteLog(null, "添加用户信息时同步数据结果:" + (result == "0" ? "失败" : "成功"),
|
||
"同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
}
|
||
return result == "0" ? false : true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogUtil.WriteLog(ex, "添加用户信息时同步数据失败", "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
return false;
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 修改用户信息时同步数据
|
||
public static bool SysDataUpdateUser(string STAFF_NAME, string STAFF_SEX, string User_Passport, string User_PassWord, string User_Status)
|
||
{
|
||
try
|
||
{
|
||
string result = "0";
|
||
string ServiceToken = GetServiceToken(User_Passport);
|
||
|
||
#region 生成入参报文
|
||
System.Text.StringBuilder XmlString = new System.Text.StringBuilder();
|
||
|
||
XmlString.AppendLine($"<input>");
|
||
XmlString.AppendLine($"<key>{key}</key>");
|
||
XmlString.AppendLine($"<cmd>updateUser</cmd>");
|
||
XmlString.AppendLine($"<domain>0</domain>");
|
||
XmlString.AppendLine($"<ServiceToken>{ServiceToken}</ServiceToken>");
|
||
XmlString.AppendLine($"<serviceKey>{serviceKey}</serviceKey>");
|
||
XmlString.AppendLine($"<verificationType>{verificationType}</verificationType>");
|
||
XmlString.AppendLine($"<userKey>{User_Passport}</userKey>");
|
||
XmlString.AppendLine($"<userKeyType>{userKeyType}</userKeyType>");
|
||
XmlString.AppendLine($"<id></id>");
|
||
XmlString.AppendLine($"<name>{STAFF_NAME}</name>");
|
||
XmlString.AppendLine("<englishname></englishname>");
|
||
XmlString.AppendLine($"<accounts>{User_Passport}</accounts>");
|
||
XmlString.AppendLine($"<password>{User_PassWord}</password>");
|
||
XmlString.AppendLine($"<sex>{STAFF_SEX}</sex>");
|
||
XmlString.AppendLine($"<empnumber></empnumber>");
|
||
XmlString.AppendLine($"<birthdate></birthdate>");
|
||
XmlString.AppendLine($"<email></email>");
|
||
XmlString.AppendLine($"<mobilephone></mobilephone>");
|
||
XmlString.AppendLine($"<orgid>{orgid}</orgid>");//组织班子
|
||
XmlString.AppendLine($"<orgserial></orgserial>");
|
||
XmlString.AppendLine($"<empIdCard></empIdCard>");
|
||
XmlString.AppendLine($"<empLeaderId></empLeaderId>");
|
||
XmlString.AppendLine($"<duty></duty>");
|
||
XmlString.AppendLine($"<mobileUserFlag></mobileUserFlag>");
|
||
XmlString.AppendLine($"<sidelineorg></sidelineorg>");
|
||
XmlString.AppendLine($"<empBusinessPhone></empBusinessPhone>");
|
||
XmlString.AppendLine($"<userisactive>{User_Status}</userisactive>");
|
||
XmlString.AppendLine($"<dutyLevel></dutyLevel>");
|
||
XmlString.AppendLine($"<chargeLeaderAccounts></chargeLeaderAccounts>");
|
||
XmlString.AppendLine($"<deptLeaderAccounts></deptLeaderAccounts>");
|
||
XmlString.AppendLine($"<userisactive></userisactive>");
|
||
XmlString.AppendLine($"<empdisduty></empdisduty>");
|
||
XmlString.AppendLine($"</input>");
|
||
#endregion
|
||
|
||
LogUtil.WriteLog(null, "RequestXml:" + XmlString, "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
|
||
if (!string.IsNullOrWhiteSpace(ServiceToken))
|
||
{
|
||
Hashtable ht = new Hashtable();
|
||
ht.Add("input", XmlString.ToString());
|
||
|
||
XmlDocument xml = WebServiceCaller.QuerySoapWebService(sxWebServiceUrl, sxWebServiceMethod, ht);
|
||
XmlNode node = xml.SelectSingleNode("/output");
|
||
foreach (XmlNode child in node.ChildNodes)
|
||
{
|
||
if (child.Name == "message")
|
||
{
|
||
XmlNodeList element = ((XmlElement)child).GetElementsByTagName("result");
|
||
if (element.Count > 0)
|
||
{
|
||
result = element[0].InnerText;
|
||
|
||
if (result == "0")
|
||
{
|
||
SysDataAddUser(STAFF_NAME, STAFF_SEX, User_Passport, User_PassWord, ServiceToken);
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
LogUtil.WriteLog(null, "修改用户信息时同步数据结果:" + (result == "0" ? "失败" : "成功"),
|
||
"同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
}
|
||
return result == "0" ? false : true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogUtil.WriteLog(ex, "修改用户信息时同步数据失败", "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
return false;
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 删除用户信息时同步数据
|
||
public static bool SysDataDeleteUser(string userKey)
|
||
{
|
||
try
|
||
{
|
||
string result = "0";
|
||
string ServiceToken = GetServiceToken(userKey);
|
||
if (!string.IsNullOrWhiteSpace(ServiceToken))
|
||
{
|
||
string id = SysDataGetUserID(userKey, ServiceToken);
|
||
if (id == "")
|
||
{
|
||
return false;
|
||
}
|
||
|
||
#region 生成入参报文
|
||
System.Text.StringBuilder XmlString = new System.Text.StringBuilder();
|
||
|
||
XmlString.AppendLine($"<input>");
|
||
XmlString.AppendLine($"<key>{key}</key>");
|
||
XmlString.AppendLine($"<cmd>deleteUserByUserId</cmd>");
|
||
XmlString.AppendLine($"<domain>0</domain>");
|
||
XmlString.AppendLine($"<ServiceToken>{ServiceToken}</ServiceToken>");
|
||
XmlString.AppendLine($"<serviceKey>{serviceKey}</serviceKey>");
|
||
XmlString.AppendLine($"<verificationType>{verificationType}</verificationType>");
|
||
XmlString.AppendLine($"<userKey>{userKey}</userKey>");
|
||
XmlString.AppendLine($"<userKeyType>{userKeyType}</userKeyType>");
|
||
XmlString.AppendLine($"<id>{id}</id>");
|
||
XmlString.AppendLine($"</input>");
|
||
#endregion
|
||
|
||
LogUtil.WriteLog(null, "RequestXml:" + XmlString, "删除用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
|
||
Hashtable ht = new Hashtable();
|
||
ht.Add("input", XmlString.ToString());
|
||
|
||
XmlDocument xml = WebServiceCaller.QuerySoapWebService(sxWebServiceUrl, sxWebServiceMethod, ht);
|
||
XmlNode node = xml.SelectSingleNode("/output");
|
||
foreach (XmlNode child in node.ChildNodes)
|
||
{
|
||
if (child.Name == "message")
|
||
{
|
||
XmlNodeList element = ((XmlElement)child).GetElementsByTagName("result");
|
||
if (element.Count > 0)
|
||
{
|
||
result = element[0].InnerText;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
LogUtil.WriteLog(null, "删除用户信息时同步数据结果:" + (result == "0" ? "失败" : "成功"),
|
||
"删除用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
}
|
||
return result == "0" ? false : true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogUtil.WriteLog(ex, "删除用户信息时同步数据失败", "删除用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
return false;
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 获取用户ID
|
||
public static string SysDataGetUserID(string userKey, string ServiceToken)
|
||
{
|
||
try
|
||
{
|
||
string id = "";
|
||
|
||
if (!string.IsNullOrWhiteSpace(ServiceToken))
|
||
{
|
||
#region 生成入参报文
|
||
System.Text.StringBuilder XmlString = new System.Text.StringBuilder();
|
||
|
||
XmlString.AppendLine($"<input>");
|
||
XmlString.AppendLine($"<key>{key}</key>");
|
||
XmlString.AppendLine($"<cmd>getUserInfoByUserAccounts</cmd>");
|
||
XmlString.AppendLine($"<domain>0</domain>");
|
||
XmlString.AppendLine($"<ServiceToken>{ServiceToken}</ServiceToken>");
|
||
XmlString.AppendLine($"<serviceKey>{serviceKey}</serviceKey>");
|
||
XmlString.AppendLine($"<verificationType>{verificationType}</verificationType>");
|
||
XmlString.AppendLine($"<userKey>{userKey}</userKey>");
|
||
XmlString.AppendLine($"<userKeyType>{userKeyType}</userKeyType>");
|
||
XmlString.AppendLine($"<accounts>{userKey}</accounts>");
|
||
XmlString.AppendLine($"</input>");
|
||
#endregion
|
||
|
||
LogUtil.WriteLog(null, "RequestXml:" + XmlString, "获取用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
|
||
if (!string.IsNullOrWhiteSpace(ServiceToken))
|
||
{
|
||
Hashtable ht = new Hashtable();
|
||
ht.Add("input", XmlString.ToString());
|
||
|
||
XmlDocument xml = WebServiceCaller.QuerySoapWebService(sxWebServiceUrl, sxWebServiceMethod, ht);
|
||
XmlNode node = xml.SelectSingleNode("/output");
|
||
foreach (XmlNode child in node.ChildNodes)
|
||
{
|
||
if (child.Name == "data")
|
||
{
|
||
XmlNodeList childElement = ((XmlElement)child).GetElementsByTagName("id");
|
||
if (childElement.Count > 0)
|
||
{
|
||
id = childElement[0].InnerText;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
LogUtil.WriteLog(null, "获取用户ID:" + id, "获取用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
}
|
||
}
|
||
return id;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogUtil.WriteLog(ex, "获取用户ID失败", "获取用户信息" + DateTime.Now.ToString("yyyy-MM-dd"));
|
||
return "";
|
||
}
|
||
}
|
||
#endregion
|
||
}
|
||
} |