You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1133 lines
60 KiB
1133 lines
60 KiB
using EasyBL.WebApi.Message;
|
|
using EasyNet;
|
|
using Entity.Sugar;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using SqlSugar;
|
|
using SqlSugar.Base;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace EasyBL.WEBAPP.EIP
|
|
{
|
|
public class Leave_UpdService : ServiceBase
|
|
{
|
|
|
|
#region 請假單提交簽核
|
|
|
|
/// <summary>
|
|
/// 請假單提交簽核
|
|
/// </summary>
|
|
/// <param name="i_crm">todo: describe i_crm parameter on LeaveToAudit</param>
|
|
/// <returns></returns>
|
|
public ResponseMessage LeaveToAudit(RequestMessage i_crm)
|
|
{
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
try
|
|
{
|
|
rm = SugarBase.ExecTran(db =>
|
|
{
|
|
do
|
|
{
|
|
var sId = _fetchString(i_crm, EasyNetGlobalConstWord.GUID);
|
|
var sLeaveSetGuid = _fetchString(i_crm, @"LeaveSetGuid");
|
|
var sTotalTime = _fetchString(i_crm, @"TotalTime");
|
|
var sHolidayCategory = _fetchString(i_crm, @"HolidayCategory");
|
|
var sLeaveSetInfo = _fetchString(i_crm, @"LeaveSetInfo");
|
|
var sOrgID = _fetchString(i_crm, @"OrgID");
|
|
var strCreateUser = _fetchString(i_crm, @"CreateUser");
|
|
var strStartDate = _fetchString(i_crm, @"StartDate");
|
|
var strEndDate = _fetchString(i_crm, @"EndDate");
|
|
var sDaysOfLeaves = _fetchString(i_crm, @"DaysOfLeaves");
|
|
var sLeaveRequestUsing = _fetchString(i_crm, @"LeaveRequestUsing");
|
|
var sRoundToInterger = _fetchString(i_crm, @"RoundToInterger");
|
|
var ListDaysOfLeaves = new List<string>();
|
|
var UsingDateTimeFormate = "yyyy-MM-dd";
|
|
var AnnualLeaveMemoInfo = new List<Tuple<string,decimal>>();
|
|
var NormalLeaveMemoInfo = new List<Tuple<string, decimal>>();
|
|
var NormalRequestGuid = ",";
|
|
var LeaveMemo = "";
|
|
//轉換物件
|
|
var JaDaysOfLeaves = (JArray)JsonConvert.DeserializeObject(sDaysOfLeaves);
|
|
foreach (var bill in JaDaysOfLeaves)
|
|
{
|
|
var asklof = bill.ToString().Split(new char[] { ':', '|' }, StringSplitOptions.RemoveEmptyEntries);
|
|
ListDaysOfLeaves.Add(bill.ToString());
|
|
}
|
|
|
|
var JaLeaveRequestUsings = (JArray)JsonConvert.DeserializeObject(sLeaveRequestUsing);
|
|
foreach (var lr in JaLeaveRequestUsings)
|
|
{
|
|
NormalRequestGuid += "," + lr["Guid"].ToString();
|
|
decimal.TryParse(lr["UsedHours"].ToString(), out var Result);
|
|
NormalLeaveMemoInfo.Add(new Tuple<string, decimal>(lr["Guid"].ToString(), Result));
|
|
}
|
|
|
|
//檢查傳進的ListDaysOfLeaves,一定會有請假資料。
|
|
if (!ListDaysOfLeaves.Any())
|
|
{
|
|
sMsg = "請求錯誤,請重新整理。";
|
|
break;
|
|
}
|
|
|
|
//取得請假天數
|
|
var oMonthLeaveDay = db.Queryable<OTB_EIP_Leave>()
|
|
.Where(a => a.AskTheDummy == strCreateUser && a.OrgID == sOrgID && a.StartDate >= DateTime.Parse(strStartDate) && a.EndDate <= DateTime.Parse(strEndDate) && (a.Status != "C-O" && a.Status != "D-O" && a.Status != "X" && a.Status != "A"))
|
|
.Count();
|
|
//判斷請假時間是否已於系統上申請過
|
|
if (oMonthLeaveDay >= 1) //因會找到自己本身的資料,所以需額外+1
|
|
{
|
|
sMsg = "請假人已經在這段時間申請休假,請重新選擇日期";
|
|
break;
|
|
}
|
|
var sdb = new SimpleClient<OTB_EIP_Leave>(db);
|
|
var oEip = sdb.GetById(sId);
|
|
|
|
if (oEip == null)
|
|
{
|
|
sMsg = @"系統找不到對應的請假資料,請核查!";
|
|
break;
|
|
}
|
|
|
|
if (sHolidayCategory == @"09")
|
|
{
|
|
//取的當年度的特休
|
|
var ApplyAnnualleaveInfo = GetAnnualRange(db, i_crm.ORIGID, strCreateUser, strStartDate, strEndDate);
|
|
if (!ApplyAnnualleaveInfo.Item1)
|
|
{
|
|
sMsg = ApplyAnnualleaveInfo.Item2;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
decimal? iLeaveHours = Convert.ToDecimal(sTotalTime);
|
|
var ApplyWZ = ApplyAnnualleaveInfo.Item3;
|
|
var CheckTheSameYear = ApplyWZ.Count;
|
|
var UpdateWZData = new List<OTB_EIP_WenZhong>();
|
|
switch (CheckTheSameYear)
|
|
{
|
|
//同年度
|
|
case 1:
|
|
{
|
|
var UsingWZ = ApplyWZ.First();
|
|
//檢查時數是否超過,扣除相對應
|
|
if (UsingWZ.RemainHours < iLeaveHours)
|
|
sMsg = $"{UsingWZ.EnableDate.Value.ToString(UsingDateTimeFormate) + " ~ " +UsingWZ.ExpirationDate.Value.ToString(UsingDateTimeFormate)}" +
|
|
$"特休剩餘時數不足夠,無法請假。";
|
|
else
|
|
{
|
|
var oWenZhongUpd = new OTB_EIP_WenZhong()
|
|
{
|
|
Guid = UsingWZ.Guid,
|
|
DelFlag = false,
|
|
RemainHours = UsingWZ.RemainHours - iLeaveHours,
|
|
UsedHours = UsingWZ.UsedHours + iLeaveHours
|
|
};
|
|
UpdateWZData.Add(oWenZhongUpd);
|
|
AnnualLeaveMemoInfo.Add(new Tuple<string, decimal>(UsingWZ.Guid, iLeaveHours.Value));
|
|
}
|
|
|
|
}
|
|
break;
|
|
//跨年度
|
|
case 2:
|
|
{
|
|
//檢查兩個時數是否超過,扣除相對應
|
|
var TotalALHours = ApplyWZ.Sum(c => c.RemainHours);
|
|
if (TotalALHours < iLeaveHours)
|
|
sMsg = "上年度與今年度特休剩餘時數不足夠,無法請假。";
|
|
else
|
|
{
|
|
var DefaultWorkingHours = 8.0m;
|
|
#region 開始請假~上年度結束時間。
|
|
var LastYearWZ = ApplyWZ[0];
|
|
var StartDate = Convert.ToDateTime(strStartDate).Date;
|
|
var WZExpiredDay = LastYearWZ.ExpirationDate.Value.Date;
|
|
var LastYearEstimateUse = 0.0m;
|
|
var NowYearEstimateUse = 0.0m;
|
|
while (StartDate <= WZExpiredDay)
|
|
{
|
|
var StartDtDay = StartDate.ToString(UsingDateTimeFormate);
|
|
var FoundDayOfLeave = ListDaysOfLeaves.Where(c => c.Contains(StartDtDay));
|
|
if (FoundDayOfLeave.Any())
|
|
{
|
|
var UsedLeaveInfo = FoundDayOfLeave.First().Split(new char[] { ':', '|' });
|
|
var UsedDay = Convert.ToDecimal(UsedLeaveInfo[1]) * DefaultWorkingHours;
|
|
var UsedHour = Convert.ToDecimal(UsedLeaveInfo[2]);
|
|
LastYearEstimateUse += UsedDay + UsedHour;
|
|
}
|
|
StartDate = StartDate.AddDays(1);
|
|
}
|
|
if (LastYearWZ.RemainHours < LastYearEstimateUse)
|
|
{
|
|
sMsg += $"{LastYearWZ.EnableDate.Value.ToString(UsingDateTimeFormate) + " ~ " + LastYearWZ.ExpirationDate.Value.ToString(UsingDateTimeFormate)}" +
|
|
"特休剩餘時數不足夠,無法請假。";
|
|
}
|
|
else
|
|
{
|
|
var oWenZhongUpd = new OTB_EIP_WenZhong()
|
|
{
|
|
Guid = LastYearWZ.Guid,
|
|
DelFlag = false,
|
|
RemainHours = LastYearWZ.RemainHours - LastYearEstimateUse,
|
|
UsedHours = LastYearWZ.UsedHours + LastYearEstimateUse
|
|
};
|
|
AnnualLeaveMemoInfo.Add(new Tuple<string, decimal>(LastYearWZ.Guid, LastYearEstimateUse));
|
|
UpdateWZData.Add(oWenZhongUpd);
|
|
}
|
|
#endregion
|
|
|
|
#region MyRegion
|
|
//上年度開始時間~結束請假時間
|
|
var NowYearWZ = ApplyWZ[1];
|
|
var EndDate = Convert.ToDateTime(strEndDate).Date;
|
|
var WZEnabledDay = NowYearWZ.EnableDate.Value.Date;
|
|
|
|
while (WZEnabledDay <= EndDate)
|
|
{
|
|
var EnabledDay = WZEnabledDay.ToString(UsingDateTimeFormate);
|
|
var FoundDayOfLeave = ListDaysOfLeaves.Where(c => c.Contains(EnabledDay));
|
|
if (FoundDayOfLeave.Any())
|
|
{
|
|
var UsedLeaveInfo = FoundDayOfLeave.First().Split(new char[] { ':', '|' });
|
|
var UsedDay = Convert.ToDecimal(UsedLeaveInfo[1]) * DefaultWorkingHours;
|
|
var UsedHour = Convert.ToDecimal(UsedLeaveInfo[2]);
|
|
NowYearEstimateUse += UsedDay + UsedHour;
|
|
}
|
|
WZEnabledDay = WZEnabledDay.AddDays(1);
|
|
}
|
|
if (NowYearWZ.RemainHours < NowYearEstimateUse)
|
|
{
|
|
sMsg += $"{NowYearWZ.EnableDate.Value.ToString(UsingDateTimeFormate) + " ~ " + NowYearWZ.ExpirationDate.Value.ToString(UsingDateTimeFormate)}" +
|
|
"特休剩餘時數不足夠,無法請假。";
|
|
}
|
|
else
|
|
{
|
|
var oWenZhongUpd = new OTB_EIP_WenZhong()
|
|
{
|
|
Guid = NowYearWZ.Guid,
|
|
DelFlag = false,
|
|
RemainHours = NowYearWZ.RemainHours - NowYearEstimateUse,
|
|
UsedHours = NowYearWZ.UsedHours + NowYearEstimateUse
|
|
};
|
|
AnnualLeaveMemoInfo.Add(new Tuple<string, decimal>(NowYearWZ.Guid, NowYearEstimateUse));
|
|
UpdateWZData.Add(oWenZhongUpd);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(sMsg) && UpdateWZData.Any())
|
|
{
|
|
db.Updateable(UpdateWZData).UpdateColumns(it => new { it.UsedHours, it.RemainHours, it.DelFlag }).ExecuteCommand();
|
|
var AnnualLeaveMemoJson = from d in AnnualLeaveMemoInfo
|
|
select new { Guid = d.Item1, Hours = d.Item2 };
|
|
LeaveMemo = JsonToString(AnnualLeaveMemoJson);
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
var UsingLeaveRequest = db.Queryable<OTB_EIP_LeaveRequest>().Where(t1 => NormalRequestGuid.Contains(t1.guid)).ToList();
|
|
foreach (var NLMI in NormalLeaveMemoInfo)
|
|
{
|
|
var LeaveRequest = UsingLeaveRequest.Where(t1 => t1.guid == NLMI.Item1).Single();
|
|
LeaveRequest.UsedHours += NLMI.Item2;
|
|
LeaveRequest.RemainHours = LeaveRequest.PaymentHours - LeaveRequest.UsedHours;
|
|
}
|
|
if(UsingLeaveRequest.Any())
|
|
db.Updateable(UsingLeaveRequest).UpdateColumns(it => new { it.PaymentHours, it.RemainHours, it.UsedHours }).ExecuteCommand();
|
|
//.Where(it => it.Guid == sLeaveSetGuid).ExecuteCommand();
|
|
|
|
var oLeaveSetUpd = new OTB_EIP_LeaveSet
|
|
{
|
|
SetInfo = sLeaveSetInfo
|
|
};
|
|
db.Updateable(oLeaveSetUpd).UpdateColumns(it => new { it.SetInfo })
|
|
.Where(it => it.Guid == sLeaveSetGuid).ExecuteCommand();
|
|
|
|
var NormalLeaveMemoJson = from d in NormalLeaveMemoInfo
|
|
select new { Guid = d.Item1, Hours = d.Item2 };
|
|
LeaveMemo = JsonToString(NormalLeaveMemoJson);
|
|
|
|
}
|
|
var oLeaveUpd = new OTB_EIP_Leave
|
|
{
|
|
AnnualLeaveMemo = LeaveMemo,
|
|
Status = @"B",
|
|
ModifyUser = i_crm.USERID,
|
|
ModifyDate = DateTime.Now
|
|
};
|
|
db.Updateable(oLeaveUpd).UpdateColumns(it => new { it.Status, it.ModifyDate, it.ModifyUser, it.AnnualLeaveMemo })
|
|
.Where(it => it.Guid == sId).ExecuteCommand();
|
|
|
|
SYS.Task_QryService.TaskStatusUpd(db, i_crm.ORIGID, sId);
|
|
|
|
|
|
if (!string.IsNullOrEmpty(oEip.Agent_Person))
|
|
{
|
|
var oAskTheDummy = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == i_crm.ORIGID && it.MemberID == oEip.AskTheDummy);
|
|
|
|
var sTitle = oAskTheDummy.MemberName + @"的請假單申請「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber;
|
|
if (i_crm.LANG == @"zh")
|
|
{
|
|
sTitle = ChineseStringUtility.ToSimplified(sTitle);
|
|
}
|
|
//添加提醒消息
|
|
var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle, oEip.Agent_Person, @"Leave_View" + @"|?Action=Upd&Guid=" + oEip.Guid, WebAppGlobalConstWord.BELL);
|
|
db.Insertable(oTipsAdd).ExecuteCommand();
|
|
//添加代辦
|
|
var oTaskAdd = SYS.Task_QryService.TaskAdd(i_crm, oEip.Guid, oEip.Agent_Person, sTitle, @"Leave_View", @"?Action=Upd&Guid=" + oEip.Guid, @"B");
|
|
db.Insertable(oTaskAdd).ExecuteCommand();
|
|
}
|
|
|
|
//檢核未打卡提示中有沒有提醒資料,如果有的話就刪除
|
|
var saClockTips = db.Queryable<OTB_SYS_ClockTips>()
|
|
.Where(x => x.OrgID == i_crm.ORIGID && x.Owner == oEip.AskTheDummy && x.TipsDate <= oEip.EndDate && x.TipsDate >= oEip.StartDate)
|
|
.ToList();
|
|
if (saClockTips.Count > 0)
|
|
{
|
|
db.Deleteable(saClockTips).ExecuteCommand();
|
|
}
|
|
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, oEip.Agent_Person);
|
|
} while (false);
|
|
return rm;
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), @"請假單管理", @"LeaveToAudit(請假單提交簽核)", @"", @"", @"");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
|
|
|
|
#endregion 請假單提交簽核
|
|
|
|
/// <summary>
|
|
/// 取得請假當下的區間
|
|
/// </summary>
|
|
/// <param name="db"></param>
|
|
/// <param name="OrgID"></param>
|
|
/// <param name="UserID"></param>
|
|
/// <param name="strStartDate"></param>
|
|
/// <param name="strEndDate"></param>
|
|
/// <returns>依序:是否成功、訊息、資料</returns>
|
|
private Tuple<bool,string,List<OTB_EIP_WenZhong>> GetAnnualRange( SqlSugarClient db,string OrgID, string UserID ,string strStartDate, string strEndDate)
|
|
{
|
|
var AllMatchedWenZhong = db.Queryable<OTB_EIP_WenZhong>()
|
|
.Where(it => it.OrgID == OrgID && it.UserID == UserID ).OrderBy(it => it.EnableDate).ToList();
|
|
if (AllMatchedWenZhong.Count == 0)
|
|
{
|
|
return new Tuple<bool, string, List<OTB_EIP_WenZhong>>(false, "系統找不到對應的文中特休假設定,請核查!", new List<OTB_EIP_WenZhong>());
|
|
}
|
|
else
|
|
{
|
|
var saWZLastYear = AllMatchedWenZhong.Where(it => it.EnableDate <= DateTime.Parse(strStartDate).Date && it.ExpirationDate >= DateTime.Parse(strStartDate).Date).First();
|
|
var saWZThisYear = AllMatchedWenZhong.Where(it => it.EnableDate <= DateTime.Parse(strEndDate).Date && it.ExpirationDate >= DateTime.Parse(strEndDate).Date).First();
|
|
var CheckEmptyWZ = saWZThisYear == null && saWZLastYear == null;
|
|
if (CheckEmptyWZ)
|
|
{
|
|
return new Tuple<bool, string, List<OTB_EIP_WenZhong>>(false, "系統找不到對應的文中特休假設定,請核查!", new List<OTB_EIP_WenZhong>());
|
|
}
|
|
//在同個年度內。
|
|
else if(saWZLastYear.Equals(saWZThisYear))
|
|
{
|
|
return new Tuple<bool, string, List<OTB_EIP_WenZhong>>(true, "請假區間在同文中年度內", new List<OTB_EIP_WenZhong>() { saWZLastYear });
|
|
}
|
|
//在不同年度內
|
|
else
|
|
{
|
|
return new Tuple<bool, string, List<OTB_EIP_WenZhong>>(true, "請假區間在不同文中年度內。", new List<OTB_EIP_WenZhong>() { saWZLastYear, saWZThisYear });
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 檢查請假是否為小數
|
|
/// </summary>
|
|
/// <param name="db"></param>
|
|
/// <param name="LeaveType"></param>
|
|
/// <param name="sLeaveType"></param>
|
|
/// <param name="OrgID"></param>
|
|
/// <returns></returns>
|
|
public bool CheckLeaveHourInterger(SqlSugarClient db, string sLeaveType, string OrgID)
|
|
{
|
|
var Default = false;
|
|
try
|
|
{
|
|
do
|
|
{
|
|
//取得出勤設定資料
|
|
var oLeaveRuelsSetting = db.Queryable<OTB_SYS_Arguments, OTB_SYS_ArgumentsRelated>
|
|
((t1, t2) =>
|
|
new object[] {
|
|
JoinType.Left, t1.ArgumentID == t2.ArgumentID
|
|
}
|
|
)
|
|
.Where((t1, t2) => t1.ArgumentClassID == "LeaveType" && t1.ArgumentID == sLeaveType && t1.OrgID == OrgID && t2.OrgID == OrgID)
|
|
.Select((t1, t2) => new { t1.Correlation, t2.ExFeild4 })
|
|
.Single();
|
|
if (oLeaveRuelsSetting.ExFeild4 == "Y")
|
|
return true;
|
|
else
|
|
return Default;
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogAndSendEmail(@"Param:" , ex, OrgID, " ", nameof(Leave_UpdService), @"請假單管理", @"CheckInterger(檢查請假是否為小數)", @"", @"", @"");
|
|
}
|
|
return Default;
|
|
}
|
|
|
|
#region 請假單簽核|签辦
|
|
|
|
/// <summary>
|
|
/// 請假單簽核|签辦
|
|
/// </summary>
|
|
/// <param name="i_crm">todo: describe i_crm parameter on LeaveAudit</param>
|
|
/// <returns></returns>
|
|
public ResponseMessage LeaveAudit(RequestMessage i_crm)
|
|
{
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
try
|
|
{
|
|
rm = SugarBase.ExecTran(db =>
|
|
{
|
|
do
|
|
{
|
|
var sId = _fetchString(i_crm, @"Guid");
|
|
var sAction = _fetchString(i_crm, @"Action");
|
|
var sGoNext = _fetchString(i_crm, @"GoNext");
|
|
var sHandlePerson = _fetchString(i_crm, @"HandlePerson");
|
|
var sNextSignedWays = _fetchString(i_crm, @"NextSignedWays");
|
|
var sNextUsers = _fetchString(i_crm, @"NextUsers");
|
|
var sTipsUsers = _fetchString(i_crm, @"TipsUsers");
|
|
var sCheckFlows = _fetchString(i_crm, @"CheckFlows");
|
|
var sHandleFlows = _fetchString(i_crm, @"HandleFlows");
|
|
var sSignedDecision = _fetchString(i_crm, @"SignedDecision");
|
|
var sHandleDecision = _fetchString(i_crm, @"HandleDecision");
|
|
var sdb = new SimpleClient<OTB_EIP_Leave>(db);
|
|
var oEip = sdb.GetById(sId);
|
|
var TipsType = WebAppGlobalConstWord.CHECK;
|
|
if (oEip == null)
|
|
{
|
|
sMsg = @"系統找不到對應的請假資料,請核查!";
|
|
break;
|
|
}
|
|
|
|
var saNextSignedWays = (JArray)JsonConvert.DeserializeObject(sNextSignedWays);
|
|
var saNextUsers = (JArray)JsonConvert.DeserializeObject(sNextUsers);
|
|
var saTipsUsers = (JArray)JsonConvert.DeserializeObject(sTipsUsers);
|
|
|
|
var oUser_Self = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == i_crm.ORIGID && it.MemberID == i_crm.USERID);
|
|
var oAskTheDummy = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == i_crm.ORIGID && it.MemberID == oEip.AskTheDummy);
|
|
var sTitle_Self = @"";
|
|
var sTitle_Handle = oUser_Self.MemberName + @"審批了" + oAskTheDummy.MemberName + @"的請假單「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber;
|
|
var sTitle_Next = oAskTheDummy.MemberName + @"的請假單申請「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber;
|
|
var sTitle_Notice = @"";
|
|
var sStatus = @"B";
|
|
|
|
if (sAction == @"Signed")
|
|
{
|
|
sTitle_Self = oUser_Self.MemberName + @"審批了您的請假單「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber;
|
|
sTitle_Notice = oAskTheDummy.MemberName + @"的請假單申請「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber + @",請點擊查看...";
|
|
switch (sSignedDecision)
|
|
{
|
|
case @"Y":
|
|
sTitle_Self += @",審批結果:同意";
|
|
if (sHandlePerson != @"")
|
|
{
|
|
sStatus = @"E";
|
|
}
|
|
|
|
break;
|
|
|
|
case @"N":
|
|
sTitle_Self += @",審批結果:不同意";
|
|
sStatus = @"D-O";
|
|
TipsType = WebAppGlobalConstWord.FAIL;
|
|
break;
|
|
|
|
case @"O":
|
|
sTitle_Self += @",審批結果:先加簽";
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sTitle_Self = oUser_Self.MemberName + @"签辦了您的請假單「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber;
|
|
if (sHandleDecision == @"Y")
|
|
{
|
|
sTitle_Self += @"簽辦結果:同意";
|
|
sStatus = @"H-O";
|
|
}
|
|
else if (sHandleDecision == @"O")
|
|
{
|
|
sTitle_Self += @"簽辦結果:先轉呈其他主管審批";
|
|
}
|
|
}
|
|
if (i_crm.LANG == @"zh")
|
|
{
|
|
sTitle_Self = ChineseStringUtility.ToSimplified(sTitle_Self);
|
|
sTitle_Next = ChineseStringUtility.ToSimplified(sTitle_Next);
|
|
sTitle_Notice = ChineseStringUtility.ToSimplified(sTitle_Notice);
|
|
}
|
|
|
|
var oLeaveUpd = new OTB_EIP_Leave
|
|
{
|
|
Status = sStatus,
|
|
CheckFlows = sCheckFlows,
|
|
HandleFlows = sHandleFlows,
|
|
ModifyUser = i_crm.USERID,
|
|
ModifyDate = DateTime.Now
|
|
};
|
|
db.Updateable(oLeaveUpd)
|
|
.UpdateColumns(it => new { it.Status, it.CheckFlows, it.HandleFlows, it.ModifyDate, it.ModifyUser })
|
|
.Where(it => it.Guid == sId).ExecuteCommand();
|
|
|
|
var sOwner = @"";
|
|
if (sSignedDecision == @"Y" && sGoNext == @"N")
|
|
{
|
|
sOwner = i_crm.USERID;
|
|
}
|
|
|
|
SYS.Task_QryService.TaskStatusUpd(db, i_crm.ORIGID, sId, sOwner);
|
|
|
|
var listTips = new List<OTB_SYS_Tips>();
|
|
var listTask = new List<OTB_SYS_Task>();
|
|
var listToTips = new List<string>();
|
|
|
|
if (sStatus != @"D-O")
|
|
{
|
|
foreach (string flow in saNextSignedWays)
|
|
{
|
|
if (sGoNext == @"Y")
|
|
{
|
|
if (flow == @"flow4")//添加通知和提醒給下個流程所有要通知的人
|
|
{
|
|
foreach (string user in saTipsUsers)
|
|
{
|
|
//添加提醒消息
|
|
var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle_Notice, user, @"Leave_View" + @"|?Action=Upd&Guid=" + oEip.Guid, WebAppGlobalConstWord.BELL);
|
|
listTips.Add(oTipsAdd);
|
|
listToTips.Add(user);
|
|
}
|
|
}
|
|
else if (flow == @"flow5")//添加通知和提醒給經辦人
|
|
{
|
|
if (sHandlePerson != @"")
|
|
{
|
|
if (sHandleDecision != @"N")
|
|
{
|
|
//添加代辦
|
|
var oTaskAdd = SYS.Task_QryService.TaskAdd(i_crm, oEip.Guid, sHandlePerson, sTitle_Handle, @"Leave_View", @"?Action=Upd&Guid=" + oEip.Guid, @"E");
|
|
listTask.Add(oTaskAdd);
|
|
//添加提醒消息
|
|
var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle_Handle, sHandlePerson, @"Leave_View" + @"|?Action=Upd&Guid=" + oEip.Guid, WebAppGlobalConstWord.BELL);
|
|
listTips.Add(oTipsAdd);
|
|
listToTips.Add(sHandlePerson);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach (string user in saNextUsers)//添加通知和提醒給下一個審核的人
|
|
{
|
|
if (sSignedDecision == @"Y" || sSignedDecision == @"O")
|
|
{
|
|
//添加代辦
|
|
var oTaskAdd = SYS.Task_QryService.TaskAdd(i_crm, oEip.Guid, user, sTitle_Next, @"Leave_View", @"?Action=Upd&Guid=" + oEip.Guid, @"G");
|
|
listTask.Add(oTaskAdd);
|
|
//添加提醒消息
|
|
var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle_Next, user, @"Leave_View" + @"|?Action=Upd&Guid=" + oEip.Guid, WebAppGlobalConstWord.BELL);
|
|
listTips.Add(oTipsAdd);
|
|
listToTips.Add(user);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//添加提醒消息(給請假的人)
|
|
var oTips_AskTheDummy = SYS.Task_QryService.TipsAdd(i_crm, sTitle_Self, oEip.AskTheDummy, @"Leave_View" + @"|?Action=Upd&Guid=" + oEip.Guid, TipsType);
|
|
listTips.Add(oTips_AskTheDummy);
|
|
listToTips.Add(oEip.AskTheDummy);
|
|
|
|
if (listTips.Count > 0)
|
|
{
|
|
db.Insertable(listTips).ExecuteCommand();
|
|
}
|
|
if (listTask.Count > 0)
|
|
{
|
|
db.Insertable(listTask).ExecuteCommand();
|
|
}
|
|
|
|
if (sStatus == @"D-O")
|
|
{
|
|
if (oEip.HolidayCategory == @"09")
|
|
{
|
|
var iYear = oEip.StartDate.Value.Year;
|
|
var saWenZhong = db.Queryable<OTB_EIP_WenZhong>()
|
|
.Where(it => it.OrgID == i_crm.ORIGID && it.UserID == oEip.AskTheDummy && (it.EnableDate.Value.Year == iYear || it.ExpirationDate.Value.Year == iYear)).ToList();
|
|
if (saWenZhong.Count > 0)
|
|
{
|
|
foreach (OTB_EIP_WenZhong wz in saWenZhong)
|
|
{
|
|
if ((DateTime)oEip.StartDate >= (DateTime)wz.EnableDate && (DateTime)oEip.StartDate <= (DateTime)wz.ExpirationDate)
|
|
{
|
|
var oWenZhongUpd = new OTB_EIP_WenZhong
|
|
{
|
|
UsedHours = (wz.UsedHours ?? 0) - oEip.TotalTime
|
|
};
|
|
oWenZhongUpd.RemainHours = (wz.PaymentHours ?? 0) - oWenZhongUpd.UsedHours;
|
|
oWenZhongUpd.DelFlag = false;
|
|
db.Updateable(oWenZhongUpd).UpdateColumns(it => new { it.UsedHours, it.RemainHours, it.DelFlag })
|
|
.Where(it => it.Guid == wz.Guid).ExecuteCommand();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var sYear = ((DateTime)oEip.StartDate).ToString(@"yyyy");
|
|
var oLeaveSet = db.Queryable<OTB_EIP_LeaveSet>().Single(it => it.OrgID == i_crm.ORIGID && it.UserID == oEip.AskTheDummy && it.TYear == sYear);
|
|
if (oLeaveSet != null)
|
|
{
|
|
var jaSetInfo = (JArray)JsonConvert.DeserializeObject(oLeaveSet.SetInfo);
|
|
foreach (JObject jo in jaSetInfo)
|
|
{
|
|
if (jo[@"Id"].ToString() == oEip.HolidayCategory)
|
|
{
|
|
var sUsedHours = jo[@"UsedHours"] == null ? @"0" : jo[@"UsedHours"].ToString();
|
|
var sPaymentHours = jo[@"PaymentHours"] == null ? @"0" : jo[@"PaymentHours"].ToString();
|
|
jo[@"UsedHours"] = Convert.ToDecimal(sUsedHours) - oEip.TotalTime;
|
|
if (sPaymentHours != @"")
|
|
{
|
|
jo[@"RemainHours"] = Convert.ToDecimal(sPaymentHours) - Convert.ToDecimal(jo[@"UsedHours"].ToString());
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
var oLeaveSetUpd = new OTB_EIP_LeaveSet
|
|
{
|
|
SetInfo = JsonToString(jaSetInfo)
|
|
};
|
|
db.Updateable(oLeaveSetUpd).UpdateColumns(it => new { it.SetInfo })
|
|
.Where(it => it.Guid == oLeaveSet.Guid).ExecuteCommand();
|
|
}
|
|
}
|
|
}
|
|
db.Ado.CommitTran();
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add("Status", sStatus);
|
|
rm.DATA.Add(BLWording.REL, listToTips);
|
|
} while (false);
|
|
return rm;
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), @"請假單管理", @"LeaveAudit(請假單簽核|签辦)", @"", @"", @"");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion 請假單簽核|签辦
|
|
|
|
#region 作廢
|
|
|
|
/// <summary>
|
|
/// 作廢
|
|
/// </summary>
|
|
/// <param name="i_crm">todo: describe i_crm parameter on SetVoid</param>
|
|
/// <returns></returns>
|
|
public ResponseMessage SetVoid(RequestMessage i_crm)
|
|
{
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
try
|
|
{
|
|
rm = SugarBase.ExecTran(db =>
|
|
{
|
|
do
|
|
{
|
|
var sId = _fetchString(i_crm, EasyNetGlobalConstWord.GUID);
|
|
var sVoidReason = _fetchString(i_crm, @"VoidReason");
|
|
|
|
var sdb = new SimpleClient<OTB_EIP_Leave>(db);
|
|
var oEip = sdb.GetById(sId);
|
|
var iYear = oEip.StartDate.Value.Year;
|
|
|
|
if (oEip == null)
|
|
{
|
|
sMsg = @"系統找不到對應的請假資料,請核查!";
|
|
break;
|
|
}
|
|
if (oEip.HolidayCategory == @"09" && string.IsNullOrWhiteSpace(oEip.AnnualLeaveMemo))
|
|
{
|
|
sMsg = @"請假的特休資訊遺失,請資訊人員核查!";
|
|
break;
|
|
|
|
}
|
|
var AnnualLeaveMemos = (JArray)JsonConvert.DeserializeObject(oEip.AnnualLeaveMemo);
|
|
|
|
var oLeaveUpd = new OTB_EIP_Leave
|
|
{
|
|
Status = @"X",
|
|
VoidReason = sVoidReason,
|
|
ModifyUser = i_crm.USERID,
|
|
ModifyDate = DateTime.Now
|
|
};
|
|
db.Updateable(oLeaveUpd).UpdateColumns(it => new { it.Status, it.VoidReason, it.ModifyDate, it.ModifyUser })
|
|
.Where(it => it.Guid == sId).ExecuteCommand();
|
|
|
|
db.Deleteable<OTB_SYS_Task>()
|
|
.Where(it => it.OrgID == i_crm.ORIGID && it.SourceID == sId).ExecuteCommand();
|
|
new CalendarService().DeleteCalendar(i_crm.ORIGID, "", oEip.Guid);
|
|
if (oEip.HolidayCategory == @"09")
|
|
{
|
|
UpddateWenZhongAnnualLeave(db, i_crm.ORIGID, oEip.AskTheDummy, AnnualLeaveMemos);
|
|
}
|
|
else
|
|
{
|
|
var TotalRecoveryHours = oEip.TotalTime;
|
|
var RecoverLeaveRequestResult = UpddateNormalRequestLeave(db, i_crm.ORIGID, oEip.AskTheDummy, AnnualLeaveMemos);
|
|
TotalRecoveryHours -= RecoverLeaveRequestResult.Item3;
|
|
if(TotalRecoveryHours >0)
|
|
{
|
|
var sYear = iYear.ToString();
|
|
var oLeaveSet = db.Queryable<OTB_EIP_LeaveSet>().Single(it => it.OrgID == i_crm.ORIGID && it.UserID == oEip.AskTheDummy && it.TYear == sYear);
|
|
if (oLeaveSet != null)
|
|
{
|
|
var jaSetInfo = (JArray)JsonConvert.DeserializeObject(oLeaveSet.SetInfo);
|
|
foreach (JObject jo in jaSetInfo)
|
|
{
|
|
if (jo[@"Id"].ToString() == oEip.HolidayCategory)
|
|
{
|
|
jo[@"UsedHours"] = Convert.ToDecimal(jo[@"UsedHours"].ToString()) - oEip.TotalTime;
|
|
jo[@"RemainHours"] = Convert.ToDecimal(jo[@"PaymentHours"].ToString()) - Convert.ToDecimal(jo[@"UsedHours"].ToString());
|
|
break;
|
|
}
|
|
}
|
|
var oLeaveSetUpd = new OTB_EIP_LeaveSet
|
|
{
|
|
SetInfo = JsonToString(jaSetInfo)
|
|
};
|
|
db.Updateable(oLeaveSetUpd).UpdateColumns(it => new { it.SetInfo })
|
|
.Where(it => it.Guid == oLeaveSet.Guid).ExecuteCommand();
|
|
}
|
|
}
|
|
|
|
}
|
|
db.Ado.CommitTran();
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
} while (false);
|
|
return rm;
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), @"請假單管理", @"SetVoid(作廢)", @"", @"", @"");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion 作廢
|
|
|
|
#region 抽單
|
|
|
|
/// <summary>
|
|
/// 抽單動作
|
|
/// </summary>
|
|
/// <param name="i_crm">todo: describe i_crm parameter on SetReEdit</param>
|
|
/// <returns></returns>
|
|
public ResponseMessage SetReEdit(RequestMessage i_crm)
|
|
{
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
try
|
|
{
|
|
rm = SugarBase.ExecTran(db =>
|
|
{
|
|
do
|
|
{
|
|
var sId = _fetchString(i_crm, EasyNetGlobalConstWord.GUID);
|
|
|
|
var sdb = new SimpleClient<OTB_EIP_Leave>(db);
|
|
var oEip = sdb.GetById(sId);
|
|
var iYear = oEip.StartDate.Value.Year;
|
|
if (oEip == null)
|
|
{
|
|
sMsg = @"系統找不到對應的請假資料,請核查!";
|
|
break;
|
|
}
|
|
|
|
if (oEip.HolidayCategory == @"09" && string.IsNullOrWhiteSpace(oEip.AnnualLeaveMemo) )
|
|
{
|
|
sMsg = @"請假的特休資訊遺失,請資訊人員核查!";
|
|
break;
|
|
|
|
}
|
|
var AnnualLeaveMemos = (JArray)JsonConvert.DeserializeObject(oEip.AnnualLeaveMemo);
|
|
|
|
var oLeaveUpd = new OTB_EIP_Leave
|
|
{
|
|
Status = @"C-O",
|
|
ModifyUser = i_crm.USERID,
|
|
ModifyDate = DateTime.Now
|
|
};
|
|
db.Updateable(oLeaveUpd).UpdateColumns(it => new { it.Status, it.ModifyDate, it.ModifyUser })
|
|
.Where(it => it.Guid == sId).ExecuteCommand();
|
|
|
|
db.Deleteable<OTB_SYS_Task>()
|
|
.Where(it => it.OrgID == i_crm.ORIGID && it.SourceID == sId).ExecuteCommand();
|
|
new CalendarService().DeleteCalendar(i_crm.ORIGID,"", oEip.Guid);
|
|
if (oEip.HolidayCategory == @"09")
|
|
{
|
|
UpddateWenZhongAnnualLeave(db, i_crm.ORIGID, oEip.AskTheDummy, AnnualLeaveMemos);
|
|
}
|
|
else
|
|
{
|
|
var TotalRecoveryHours = oEip.TotalTime;
|
|
var RecoverLeaveRequestResult = UpddateNormalRequestLeave(db, i_crm.ORIGID, oEip.AskTheDummy, AnnualLeaveMemos);
|
|
TotalRecoveryHours -= RecoverLeaveRequestResult.Item3;
|
|
if (TotalRecoveryHours > 0)
|
|
{
|
|
var sYear = iYear.ToString();
|
|
var oLeaveSet = db.Queryable<OTB_EIP_LeaveSet>().Single(it => it.OrgID == i_crm.ORIGID && it.UserID == oEip.AskTheDummy && it.TYear == sYear);
|
|
if (oLeaveSet != null)
|
|
{
|
|
var jaSetInfo = (JArray)JsonConvert.DeserializeObject(oLeaveSet.SetInfo);
|
|
foreach (JObject jo in jaSetInfo)
|
|
{
|
|
if (jo[@"Id"].ToString() == oEip.HolidayCategory)
|
|
{
|
|
var sPaymentHours = jo[@"PaymentHours"].ToString();
|
|
jo[@"UsedHours"] = Convert.ToDecimal(jo[@"UsedHours"].ToString()) - oEip.TotalTime;
|
|
if (sPaymentHours != @"")
|
|
{
|
|
jo[@"RemainHours"] = Convert.ToDecimal(sPaymentHours) - Convert.ToDecimal(jo[@"UsedHours"].ToString());
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
var oLeaveSetUpd = new OTB_EIP_LeaveSet
|
|
{
|
|
SetInfo = JsonToString(jaSetInfo)
|
|
};
|
|
db.Updateable(oLeaveSetUpd).UpdateColumns(it => new { it.SetInfo })
|
|
.Where(it => it.Guid == oLeaveSet.Guid).ExecuteCommand();
|
|
}
|
|
}
|
|
}
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
} while (false);
|
|
return rm;
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), @"請假單管理", @"SetReEdit(抽單)", @"", @"", @"");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion 抽單
|
|
|
|
#region 請假單管理(查詢筆數)
|
|
|
|
/// <summary>
|
|
/// 請假單管理(查詢筆數)
|
|
/// </summary>
|
|
/// <param name="i_crm"></param>
|
|
/// <returns></returns>
|
|
public ResponseMessage QueryCout(RequestMessage i_crm)
|
|
{
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.GetIntance();
|
|
try
|
|
{
|
|
do
|
|
{
|
|
var sEndTime = _fetchString(i_crm, @"EndTime");
|
|
var iHours = _fetchInt(i_crm, @"Hours");
|
|
|
|
var rEndTime = Convert.ToDateTime(sEndTime);
|
|
var rStartTime = rEndTime.AddHours(-iHours);
|
|
|
|
var iCout = db.Queryable<OTB_EIP_Leave>()
|
|
.Where(x => x.OrgID == i_crm.ORIGID && x.AskTheDummy == i_crm.USERID && x.EndDate > rStartTime && x.EndDate <= rEndTime)
|
|
.Count();
|
|
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, iCout);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), "", "QueryCout(請假單管理(查詢筆數))", "", "", "");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion 請假單管理(查詢筆數)
|
|
|
|
#region 請假單管理(檢核當月最大請教時數)
|
|
|
|
/// <summary>
|
|
/// 請假單管理(檢核當月最大請教時數)
|
|
/// </summary>
|
|
/// <param name="i_crm"></param>
|
|
/// <returns></returns>
|
|
public ResponseMessage CheckMaxHours(RequestMessage i_crm)
|
|
{
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.GetIntance();
|
|
try
|
|
{
|
|
do
|
|
{
|
|
var sDate = _fetchString(i_crm, @"Date");
|
|
var iCurHours = decimal.Parse(_fetchString(i_crm, @"CurHours"));
|
|
var iMaxHours = _fetchInt(i_crm, @"MaxHours");
|
|
|
|
var rDate = Convert.ToDateTime(sDate);
|
|
var iYear = rDate.Year;
|
|
var iNonth = rDate.Month;
|
|
|
|
var listData = db.Queryable<OTB_EIP_Leave>()
|
|
.Where(x => x.OrgID == i_crm.ORIGID && x.AskTheDummy == i_crm.USERID && x.StartDate.HasValue && x.StartDate.Value.Year == iYear)
|
|
.Select(x => new { x.StartDate, x.EndDate, x.TotalTime }).ToList();
|
|
|
|
var iHours = listData.Where(x => x.StartDate.Value.Month == iNonth || x.EndDate.Value.Month == iNonth).Sum(x => x.TotalTime);
|
|
|
|
//var iHours = db.Queryable<OTB_EIP_Leave>()
|
|
// .Where(x => x.OrgID == i_crm.ORIGID && x.AskTheDummy == i_crm.USERID && x.StartDate.Value.Year == iYear && (x.StartDate.Value.Month == iNonth || x.EndDate.Value.Month == iNonth))
|
|
// .Sum(x => x.TotalTime);
|
|
//.ToSql();
|
|
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, iHours + iCurHours > iMaxHours);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), "", "QueryCout(請假單管理(檢核當月最大請教時數))", "", "", "");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion 請假單管理(檢核當月最大請教時數)
|
|
|
|
#region 獲取請假規則設定
|
|
|
|
/// <summary>
|
|
/// 檢查假別
|
|
/// </summary>
|
|
/// <param name="i_crm"></param>
|
|
/// <returns></returns>
|
|
public ResponseMessage GetLeaveSetting(RequestMessage i_crm)
|
|
{
|
|
ResponseMessage rm = null;
|
|
string sMsg = null;
|
|
var db = SugarBase.DB;
|
|
try
|
|
{
|
|
do
|
|
{
|
|
var sArgumentID = _fetchString(i_crm, @"ArgumentID");
|
|
var sOrgID = _fetchString(i_crm, @"OrgID");
|
|
|
|
//取得出勤設定資料
|
|
var oLeaveRuelsSetting = db.Queryable<OTB_SYS_Arguments, OTB_SYS_ArgumentsRelated>
|
|
((t1, t2) =>
|
|
new object[] {
|
|
JoinType.Left, t1.ArgumentID == t2.ArgumentID
|
|
}
|
|
)
|
|
.Where((t1, t2) => t1.ArgumentClassID == "LeaveType" && t1.ArgumentID == sArgumentID && t1.OrgID == sOrgID && t2.OrgID == sOrgID)
|
|
.Select((t1, t2) => new { t1.Correlation, t2.Field1, t2.Field2, t2.Field3 })
|
|
.Single();
|
|
|
|
rm = new SuccessResponseMessage(null, i_crm);
|
|
rm.DATA.Add(BLWording.REL, oLeaveRuelsSetting);
|
|
} while (false);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sMsg = Util.GetLastExceptionMsg(ex);
|
|
LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(LeaveSetService), @"出勤設定", @"GetLeaveSettingByType(依據請假類別獲取請假規則設定)", @"", @"", @"");
|
|
}
|
|
finally
|
|
{
|
|
if (null != sMsg)
|
|
{
|
|
rm = new ErrorResponseMessage(sMsg, i_crm);
|
|
}
|
|
}
|
|
return rm;
|
|
}
|
|
|
|
#endregion 依據請假類別獲取請假規則設定
|
|
|
|
#region GetUpdateWenZhong
|
|
|
|
/// <summary>
|
|
/// 返回特休假,leave一定要有資料
|
|
/// </summary>
|
|
/// <param name="db"></param>
|
|
/// <param name="leave"></param>
|
|
/// <returns></returns>
|
|
public Tuple<bool, string> UpddateWenZhongAnnualLeave(SqlSugarClient db,string OrgID, string UserID, JArray AnnualLeaveData)
|
|
{
|
|
var Result = new List<OTB_EIP_WenZhong>();
|
|
if (!AnnualLeaveData.Any())
|
|
return new Tuple<bool, string>(false, @"請假的特休資訊遺失,請資訊人員核查!");
|
|
if(string.IsNullOrEmpty(OrgID) || string.IsNullOrEmpty(UserID))
|
|
return new Tuple<bool, string>(false, @"缺少組織或使用者資訊,請重新整理!");
|
|
|
|
var RelativeWZGuid = new List<string>();
|
|
var Dic = new Dictionary<string, decimal>();
|
|
foreach (var ALM in AnnualLeaveData)
|
|
{
|
|
var Guid = ALM["Guid"].ToString();
|
|
RelativeWZGuid.Add(ALM["Guid"].ToString());
|
|
decimal.TryParse(ALM["Hours"].ToString(), out var Hours);
|
|
Dic.Add(Guid, Hours);
|
|
}
|
|
var saWenZhong = db.Queryable<OTB_EIP_WenZhong>()
|
|
.Where(it => it.OrgID == OrgID && it.UserID == UserID && RelativeWZGuid.Contains(it.Guid)).ToList();
|
|
if (saWenZhong.Count > 0)
|
|
{
|
|
var UpdateWZData = new List<OTB_EIP_WenZhong>();
|
|
foreach (OTB_EIP_WenZhong wz in saWenZhong)
|
|
{
|
|
decimal.TryParse(Dic[wz.Guid].ToString(), out var ReturnHours);
|
|
var oWenZhong = new OTB_EIP_WenZhong
|
|
{
|
|
Guid = wz.Guid,
|
|
UsedHours = wz.UsedHours - ReturnHours,
|
|
RemainHours = wz.RemainHours + ReturnHours,
|
|
DelFlag = false,
|
|
};
|
|
UpdateWZData.Add(oWenZhong);
|
|
}
|
|
if (UpdateWZData.Any())
|
|
{
|
|
db.Updateable(UpdateWZData).UpdateColumns(it => new { it.Guid, it.UsedHours, it.RemainHours, it.DelFlag }).ExecuteCommand();
|
|
}
|
|
}
|
|
return new Tuple<bool, string>(true,"");
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
public Tuple<bool, string,decimal> UpddateNormalRequestLeave(SqlSugarClient db, string OrgID, string UserID, JArray NormalLeaveData)
|
|
{
|
|
if (string.IsNullOrEmpty(OrgID) || string.IsNullOrEmpty(UserID))
|
|
return new Tuple<bool, string, decimal>(false, @"缺少組織或使用者資訊,請重新整理!", decimal.Zero);
|
|
if (NormalLeaveData == null || NormalLeaveData.Count == 0 )
|
|
return new Tuple<bool, string, decimal>(false, @"缺少請假資料,請重新整理!", decimal.Zero);
|
|
var RelativeLeaveRequestGuid = new List<string>();
|
|
var Dic = new Dictionary<string, decimal>();
|
|
var RecoverHours = decimal.Zero;
|
|
foreach (var NLD in NormalLeaveData)
|
|
{
|
|
var Guid = NLD["Guid"].ToString();
|
|
RelativeLeaveRequestGuid.Add(NLD["Guid"].ToString());
|
|
decimal.TryParse(NLD["Hours"].ToString(), out var Hours);
|
|
RecoverHours += Hours;
|
|
Dic.Add(Guid, Hours);
|
|
}
|
|
var saLeaveRequests = db.Queryable<OTB_EIP_LeaveRequest>()
|
|
.Where(it => it.OrgID == OrgID && it.MemberID == UserID && RelativeLeaveRequestGuid.Contains(it.guid)).ToList();
|
|
if (saLeaveRequests.Count > 0)
|
|
{
|
|
foreach (OTB_EIP_LeaveRequest wz in saLeaveRequests)
|
|
{
|
|
decimal.TryParse(Dic[wz.guid].ToString(), out var ReturnHours);
|
|
wz.UsedHours = wz.UsedHours - ReturnHours;
|
|
wz.RemainHours = wz.RemainHours + ReturnHours;
|
|
|
|
}
|
|
db.Updateable(saLeaveRequests).UpdateColumns(it => new { it.UsedHours, it.RemainHours }).ExecuteCommand();
|
|
}
|
|
return new Tuple<bool, string, decimal>(true, "", RecoverHours);
|
|
}
|
|
|
|
}
|
|
}
|