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.

1150 lines
61 KiB

3 years ago
  1. using EasyBL.WebApi.Message;
  2. using EasyNet;
  3. using Entity.Sugar;
  4. using Newtonsoft.Json;
  5. using Newtonsoft.Json.Linq;
  6. using SqlSugar;
  7. using SqlSugar.Base;
  8. using System;
  9. using System.Collections;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. namespace EasyBL.WEBAPP.EIP
  13. {
  14. public class Leave_UpdService : ServiceBase
  15. {
  16. #region 請假單提交簽核
  17. /// <summary>
  18. /// 請假單提交簽核
  19. /// </summary>
  20. /// <param name="i_crm">todo: describe i_crm parameter on LeaveToAudit</param>
  21. /// <returns></returns>
  22. public ResponseMessage LeaveToAudit(RequestMessage i_crm)
  23. {
  24. ResponseMessage rm = null;
  25. string sMsg = null;
  26. try
  27. {
  28. rm = SugarBase.ExecTran(db =>
  29. {
  30. do
  31. {
  32. var sId = _fetchString(i_crm, EasyNetGlobalConstWord.GUID);
  33. var sLeaveSetGuid = _fetchString(i_crm, @"LeaveSetGuid");
  34. var sTotalTime = _fetchString(i_crm, @"TotalTime");
  35. var sHolidayCategory = _fetchString(i_crm, @"HolidayCategory");
  36. var sLeaveSetInfo = _fetchString(i_crm, @"LeaveSetInfo");
  37. var sOrgID = _fetchString(i_crm, @"OrgID");
  38. var strCreateUser = _fetchString(i_crm, @"CreateUser");
  39. var strStartDate = _fetchString(i_crm, @"StartDate");
  40. var strEndDate = _fetchString(i_crm, @"EndDate");
  41. var sDaysOfLeaves = _fetchString(i_crm, @"DaysOfLeaves");
  42. var sLeaveRequestUsing = _fetchString(i_crm, @"LeaveRequestUsing");
  43. var sRoundToInterger = _fetchString(i_crm, @"RoundToInterger");
  44. var ListDaysOfLeaves = new List<string>();
  45. var UsingDateTimeFormate = "yyyy-MM-dd";
  46. var AnnualLeaveMemoInfo = new List<Tuple<string,decimal>>();
  47. var NormalLeaveMemoInfo = new List<Tuple<string, decimal>>();
  48. var NormalRequestGuid = ",";
  49. var LeaveMemo = "";
  50. //轉換物件
  51. var JaDaysOfLeaves = (JArray)JsonConvert.DeserializeObject(sDaysOfLeaves);
  52. foreach (var bill in JaDaysOfLeaves)
  53. {
  54. var asklof = bill.ToString().Split(new char[] { ':', '|' }, StringSplitOptions.RemoveEmptyEntries);
  55. ListDaysOfLeaves.Add(bill.ToString());
  56. }
  57. var JaLeaveRequestUsings = (JArray)JsonConvert.DeserializeObject(sLeaveRequestUsing);
  58. foreach (var lr in JaLeaveRequestUsings)
  59. {
  60. NormalRequestGuid += "," + lr["Guid"].ToString();
  61. decimal.TryParse(lr["UsedHours"].ToString(), out var Result);
  62. NormalLeaveMemoInfo.Add(new Tuple<string, decimal>(lr["Guid"].ToString(), Result));
  63. }
  64. //檢查傳進的ListDaysOfLeaves,一定會有請假資料。
  65. if (!ListDaysOfLeaves.Any())
  66. {
  67. sMsg = "請求錯誤,請重新整理。";
  68. break;
  69. }
  70. //取得請假天數
  71. var oMonthLeaveDay = db.Queryable<OTB_EIP_Leave>()
  72. .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"))
  73. .Count();
  74. //判斷請假時間是否已於系統上申請過
  75. if (oMonthLeaveDay >= 1) //因會找到自己本身的資料,所以需額外+1
  76. {
  77. sMsg = "請假人已經在這段時間申請休假,請重新選擇日期";
  78. break;
  79. }
  80. var sdb = new SimpleClient<OTB_EIP_Leave>(db);
  81. var oEip = sdb.GetById(sId);
  82. if (oEip == null)
  83. {
  84. sMsg = @"系統找不到對應的請假資料,請核查!";
  85. break;
  86. }
  87. if (sHolidayCategory == @"09")
  88. {
  89. //取的當年度的特休
  90. var ApplyAnnualleaveInfo = GetAnnualRange(db, i_crm.ORIGID, strCreateUser, strStartDate, strEndDate);
  91. if (!ApplyAnnualleaveInfo.Item1)
  92. {
  93. sMsg = ApplyAnnualleaveInfo.Item2;
  94. break;
  95. }
  96. else
  97. {
  98. decimal? iLeaveHours = Convert.ToDecimal(sTotalTime);
  99. var ApplyWZ = ApplyAnnualleaveInfo.Item3;
  100. var CheckTheSameYear = ApplyWZ.Count;
  101. var UpdateWZData = new List<OTB_EIP_WenZhong>();
  102. switch (CheckTheSameYear)
  103. {
  104. //同年度
  105. case 1:
  106. {
  107. var UsingWZ = ApplyWZ.First();
  108. //檢查時數是否超過,扣除相對應
  109. if (UsingWZ.RemainHours < iLeaveHours)
  110. sMsg = $"{UsingWZ.EnableDate.Value.ToString(UsingDateTimeFormate) + " ~ " +UsingWZ.ExpirationDate.Value.ToString(UsingDateTimeFormate)}" +
  111. $"特休剩餘時數不足夠,無法請假。";
  112. else
  113. {
  114. var oWenZhongUpd = new OTB_EIP_WenZhong()
  115. {
  116. Guid = UsingWZ.Guid,
  117. DelFlag = false,
  118. RemainHours = UsingWZ.RemainHours - iLeaveHours,
  119. UsedHours = UsingWZ.UsedHours + iLeaveHours
  120. };
  121. UpdateWZData.Add(oWenZhongUpd);
  122. AnnualLeaveMemoInfo.Add(new Tuple<string, decimal>(UsingWZ.Guid, iLeaveHours.Value));
  123. }
  124. }
  125. break;
  126. //跨年度
  127. case 2:
  128. {
  129. //檢查兩個時數是否超過,扣除相對應
  130. var TotalALHours = ApplyWZ.Sum(c => c.RemainHours);
  131. if (TotalALHours < iLeaveHours)
  132. sMsg = "上年度與今年度特休剩餘時數不足夠,無法請假。";
  133. else
  134. {
  135. var DefaultWorkingHours = 8.0m;
  136. #region 開始請假~上年度結束時間。
  137. var LastYearWZ = ApplyWZ[0];
  138. var StartDate = Convert.ToDateTime(strStartDate).Date;
  139. var WZExpiredDay = LastYearWZ.ExpirationDate.Value.Date;
  140. var LastYearEstimateUse = 0.0m;
  141. var NowYearEstimateUse = 0.0m;
  142. while (StartDate <= WZExpiredDay)
  143. {
  144. var StartDtDay = StartDate.ToString(UsingDateTimeFormate);
  145. var FoundDayOfLeave = ListDaysOfLeaves.Where(c => c.Contains(StartDtDay));
  146. if (FoundDayOfLeave.Any())
  147. {
  148. var UsedLeaveInfo = FoundDayOfLeave.First().Split(new char[] { ':', '|' });
  149. var UsedDay = Convert.ToDecimal(UsedLeaveInfo[1]) * DefaultWorkingHours;
  150. var UsedHour = Convert.ToDecimal(UsedLeaveInfo[2]);
  151. LastYearEstimateUse += UsedDay + UsedHour;
  152. }
  153. StartDate = StartDate.AddDays(1);
  154. }
  155. if (LastYearWZ.RemainHours < LastYearEstimateUse)
  156. {
  157. sMsg += $"{LastYearWZ.EnableDate.Value.ToString(UsingDateTimeFormate) + " ~ " + LastYearWZ.ExpirationDate.Value.ToString(UsingDateTimeFormate)}" +
  158. "特休剩餘時數不足夠,無法請假。";
  159. }
  160. else
  161. {
  162. var oWenZhongUpd = new OTB_EIP_WenZhong()
  163. {
  164. Guid = LastYearWZ.Guid,
  165. DelFlag = false,
  166. RemainHours = LastYearWZ.RemainHours - LastYearEstimateUse,
  167. UsedHours = LastYearWZ.UsedHours + LastYearEstimateUse
  168. };
  169. AnnualLeaveMemoInfo.Add(new Tuple<string, decimal>(LastYearWZ.Guid, LastYearEstimateUse));
  170. UpdateWZData.Add(oWenZhongUpd);
  171. }
  172. #endregion
  173. #region MyRegion
  174. //上年度開始時間~結束請假時間
  175. var NowYearWZ = ApplyWZ[1];
  176. var EndDate = Convert.ToDateTime(strEndDate).Date;
  177. var WZEnabledDay = NowYearWZ.EnableDate.Value.Date;
  178. while (WZEnabledDay <= EndDate)
  179. {
  180. var EnabledDay = WZEnabledDay.ToString(UsingDateTimeFormate);
  181. var FoundDayOfLeave = ListDaysOfLeaves.Where(c => c.Contains(EnabledDay));
  182. if (FoundDayOfLeave.Any())
  183. {
  184. var UsedLeaveInfo = FoundDayOfLeave.First().Split(new char[] { ':', '|' });
  185. var UsedDay = Convert.ToDecimal(UsedLeaveInfo[1]) * DefaultWorkingHours;
  186. var UsedHour = Convert.ToDecimal(UsedLeaveInfo[2]);
  187. NowYearEstimateUse += UsedDay + UsedHour;
  188. }
  189. WZEnabledDay = WZEnabledDay.AddDays(1);
  190. }
  191. if (NowYearWZ.RemainHours < NowYearEstimateUse)
  192. {
  193. sMsg += $"{NowYearWZ.EnableDate.Value.ToString(UsingDateTimeFormate) + " ~ " + NowYearWZ.ExpirationDate.Value.ToString(UsingDateTimeFormate)}" +
  194. "特休剩餘時數不足夠,無法請假。";
  195. }
  196. else
  197. {
  198. var oWenZhongUpd = new OTB_EIP_WenZhong()
  199. {
  200. Guid = NowYearWZ.Guid,
  201. DelFlag = false,
  202. RemainHours = NowYearWZ.RemainHours - NowYearEstimateUse,
  203. UsedHours = NowYearWZ.UsedHours + NowYearEstimateUse
  204. };
  205. AnnualLeaveMemoInfo.Add(new Tuple<string, decimal>(NowYearWZ.Guid, NowYearEstimateUse));
  206. UpdateWZData.Add(oWenZhongUpd);
  207. }
  208. #endregion
  209. }
  210. }
  211. break;
  212. default:
  213. break;
  214. }
  215. if (string.IsNullOrWhiteSpace(sMsg) && UpdateWZData.Any())
  216. {
  217. db.Updateable(UpdateWZData).UpdateColumns(it => new { it.UsedHours, it.RemainHours, it.DelFlag }).ExecuteCommand();
  218. var AnnualLeaveMemoJson = from d in AnnualLeaveMemoInfo
  219. select new { Guid = d.Item1, Hours = d.Item2 };
  220. LeaveMemo = JsonToString(AnnualLeaveMemoJson);
  221. }
  222. else
  223. {
  224. break;
  225. }
  226. }
  227. }
  228. else
  229. {
  230. var UsingLeaveRequest = db.Queryable<OTB_EIP_LeaveRequest>().Where(t1 => NormalRequestGuid.Contains(t1.guid)).ToList();
  231. foreach (var NLMI in NormalLeaveMemoInfo)
  232. {
  233. var LeaveRequest = UsingLeaveRequest.Where(t1 => t1.guid == NLMI.Item1).Single();
  234. LeaveRequest.UsedHours += NLMI.Item2;
  235. LeaveRequest.RemainHours = LeaveRequest.PaymentHours - LeaveRequest.UsedHours;
  236. }
  237. if(UsingLeaveRequest.Any())
  238. db.Updateable(UsingLeaveRequest).UpdateColumns(it => new { it.PaymentHours, it.RemainHours, it.UsedHours }).ExecuteCommand();
  239. //.Where(it => it.Guid == sLeaveSetGuid).ExecuteCommand();
  240. var oLeaveSetUpd = new OTB_EIP_LeaveSet
  241. {
  242. SetInfo = sLeaveSetInfo
  243. };
  244. db.Updateable(oLeaveSetUpd).UpdateColumns(it => new { it.SetInfo })
  245. .Where(it => it.Guid == sLeaveSetGuid).ExecuteCommand();
  246. var NormalLeaveMemoJson = from d in NormalLeaveMemoInfo
  247. select new { Guid = d.Item1, Hours = d.Item2 };
  248. LeaveMemo = JsonToString(NormalLeaveMemoJson);
  249. }
  250. var oLeaveUpd = new OTB_EIP_Leave
  251. {
  252. AnnualLeaveMemo = LeaveMemo,
  253. Status = @"B",
  254. ModifyUser = i_crm.USERID,
  255. ModifyDate = DateTime.Now
  256. };
  257. db.Updateable(oLeaveUpd).UpdateColumns(it => new { it.Status, it.ModifyDate, it.ModifyUser, it.AnnualLeaveMemo })
  258. .Where(it => it.Guid == sId).ExecuteCommand();
  259. SYS.Task_QryService.TaskStatusUpd(db, i_crm.ORIGID, sId);
  260. if (!string.IsNullOrEmpty(oEip.Agent_Person))
  261. {
  262. var oAskTheDummy = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == i_crm.ORIGID && it.MemberID == oEip.AskTheDummy);
  263. var sTitle = oAskTheDummy.MemberName + @"的請假單申請「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber;
  264. if (i_crm.LANG == @"zh")
  265. {
  266. sTitle = ChineseStringUtility.ToSimplified(sTitle);
  267. }
  268. //添加提醒消息
  269. var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle, oEip.Agent_Person, @"Leave_View" + @"|?Action=Upd&Guid=" + oEip.Guid, WebAppGlobalConstWord.BELL);
  270. db.Insertable(oTipsAdd).ExecuteCommand();
  271. //添加代辦
  272. var oTaskAdd = SYS.Task_QryService.TaskAdd(i_crm, oEip.Guid, oEip.Agent_Person, sTitle, @"Leave_View", @"?Action=Upd&Guid=" + oEip.Guid, @"B");
  273. db.Insertable(oTaskAdd).ExecuteCommand();
  274. }
  275. //檢核未打卡提示中有沒有提醒資料,如果有的話就刪除
  276. var saClockTips = db.Queryable<OTB_SYS_ClockTips>()
  277. .Where(x => x.OrgID == i_crm.ORIGID && x.Owner == oEip.AskTheDummy && x.TipsDate <= oEip.EndDate && x.TipsDate >= oEip.StartDate)
  278. .ToList();
  279. if (saClockTips.Count > 0)
  280. {
  281. db.Deleteable(saClockTips).ExecuteCommand();
  282. }
  283. rm = new SuccessResponseMessage(null, i_crm);
  284. rm.DATA.Add(BLWording.REL, oEip.Agent_Person);
  285. } while (false);
  286. return rm;
  287. });
  288. }
  289. catch (Exception ex)
  290. {
  291. sMsg = Util.GetLastExceptionMsg(ex);
  292. LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), @"請假單管理", @"LeaveToAudit(請假單提交簽核)", @"", @"", @"");
  293. }
  294. finally
  295. {
  296. if (null != sMsg)
  297. {
  298. rm = new ErrorResponseMessage(sMsg, i_crm);
  299. }
  300. }
  301. return rm;
  302. }
  303. #endregion 請假單提交簽核
  304. /// <summary>
  305. /// 取得請假當下的區間
  306. /// </summary>
  307. /// <param name="db"></param>
  308. /// <param name="OrgID"></param>
  309. /// <param name="UserID"></param>
  310. /// <param name="strStartDate"></param>
  311. /// <param name="strEndDate"></param>
  312. /// <returns>依序:是否成功、訊息、資料</returns>
  313. private Tuple<bool,string,List<OTB_EIP_WenZhong>> GetAnnualRange( SqlSugarClient db,string OrgID, string UserID ,string strStartDate, string strEndDate)
  314. {
  315. var AllMatchedWenZhong = db.Queryable<OTB_EIP_WenZhong>()
  316. .Where(it => it.OrgID == OrgID && it.UserID == UserID ).OrderBy(it => it.EnableDate).ToList();
  317. if (AllMatchedWenZhong.Count == 0)
  318. {
  319. return new Tuple<bool, string, List<OTB_EIP_WenZhong>>(false, "系統找不到對應的文中特休假設定,請核查!", new List<OTB_EIP_WenZhong>());
  320. }
  321. else
  322. {
  323. var listWZLastYear = AllMatchedWenZhong.Where(it => it.EnableDate <= DateTime.Parse(strStartDate).Date && it.ExpirationDate >= DateTime.Parse(strStartDate).Date && it.RemainHours > 0).ToList();
  324. var listWZThisYear = AllMatchedWenZhong.Where(it => it.EnableDate <= DateTime.Parse(strEndDate).Date && it.ExpirationDate >= DateTime.Parse(strEndDate).Date && it.RemainHours > 0).ToList();
  325. var dtExpirationDateLY = listWZLastYear.Min(t => t.ExpirationDate);
  326. var dtExpirationDateTY = listWZThisYear.Min(t => t.ExpirationDate);
  327. var saWZLastYear = listWZLastYear.Where(t => t.ExpirationDate == dtExpirationDateLY).First();
  328. var saWZThisYear = listWZThisYear.Where(t => t.ExpirationDate == dtExpirationDateTY).First();
  329. //var saWZLastYear = AllMatchedWenZhong.Where(it => it.EnableDate <= DateTime.Parse(strStartDate).Date && it.ExpirationDate >= DateTime.Parse(strStartDate).Date && it.RemainHours > 0).First();
  330. //var saWZThisYear = AllMatchedWenZhong.Where(it => it.EnableDate <= DateTime.Parse(strEndDate).Date && it.ExpirationDate >= DateTime.Parse(strEndDate).Date && it.RemainHours > 0).First();
  331. var CheckEmptyWZ = saWZThisYear == null && saWZLastYear == null;
  332. if (CheckEmptyWZ)
  333. {
  334. return new Tuple<bool, string, List<OTB_EIP_WenZhong>>(false, "系統找不到對應的文中特休假設定,請核查!", new List<OTB_EIP_WenZhong>());
  335. }
  336. //在同個年度內。
  337. else if(saWZLastYear.Equals(saWZThisYear))
  338. {
  339. return new Tuple<bool, string, List<OTB_EIP_WenZhong>>(true, "請假區間在同文中年度內", new List<OTB_EIP_WenZhong>() { saWZLastYear });
  340. }
  341. //在不同年度內
  342. else
  343. {
  344. return new Tuple<bool, string, List<OTB_EIP_WenZhong>>(true, "請假區間在不同文中年度內。", new List<OTB_EIP_WenZhong>() { saWZLastYear, saWZThisYear });
  345. }
  346. }
  347. }
  348. /// <summary>
  349. /// 檢查請假是否為小數
  350. /// </summary>
  351. /// <param name="db"></param>
  352. /// <param name="LeaveType"></param>
  353. /// <param name="sLeaveType"></param>
  354. /// <param name="OrgID"></param>
  355. /// <returns></returns>
  356. public bool CheckLeaveHourInterger(SqlSugarClient db, string sLeaveType, string OrgID)
  357. {
  358. var Default = false;
  359. try
  360. {
  361. do
  362. {
  363. //取得出勤設定資料
  364. var oLeaveRuelsSetting = db.Queryable<OTB_SYS_Arguments, OTB_SYS_ArgumentsRelated>
  365. ((t1, t2) =>
  366. new object[] {
  367. JoinType.Left, t1.ArgumentID == t2.ArgumentID
  368. }
  369. )
  370. .Where((t1, t2) => t1.ArgumentClassID == "LeaveType" && t1.ArgumentID == sLeaveType && t1.OrgID == OrgID && t2.OrgID == OrgID)
  371. .Select((t1, t2) => new { t1.Correlation, t2.ExFeild4 })
  372. .Single();
  373. if (oLeaveRuelsSetting.ExFeild4 == "Y")
  374. return true;
  375. else
  376. return Default;
  377. } while (false);
  378. }
  379. catch (Exception ex)
  380. {
  381. LogAndSendEmail(@"Param:" , ex, OrgID, " ", nameof(Leave_UpdService), @"請假單管理", @"CheckInterger(檢查請假是否為小數)", @"", @"", @"");
  382. }
  383. return Default;
  384. }
  385. #region 請假單簽核|签辦
  386. /// <summary>
  387. /// 請假單簽核|签辦
  388. /// </summary>
  389. /// <param name="i_crm">todo: describe i_crm parameter on LeaveAudit</param>
  390. /// <returns></returns>
  391. public ResponseMessage LeaveAudit(RequestMessage i_crm)
  392. {
  393. ResponseMessage rm = null;
  394. string sMsg = null;
  395. try
  396. {
  397. rm = SugarBase.ExecTran(db =>
  398. {
  399. do
  400. {
  401. var sId = _fetchString(i_crm, @"Guid");
  402. var sAction = _fetchString(i_crm, @"Action");
  403. var sGoNext = _fetchString(i_crm, @"GoNext");
  404. var sHandlePerson = _fetchString(i_crm, @"HandlePerson");
  405. var sNextSignedWays = _fetchString(i_crm, @"NextSignedWays");
  406. var sNextUsers = _fetchString(i_crm, @"NextUsers");
  407. var sTipsUsers = _fetchString(i_crm, @"TipsUsers");
  408. var sCheckFlows = _fetchString(i_crm, @"CheckFlows");
  409. var sHandleFlows = _fetchString(i_crm, @"HandleFlows");
  410. var sSignedDecision = _fetchString(i_crm, @"SignedDecision");
  411. var sHandleDecision = _fetchString(i_crm, @"HandleDecision");
  412. var sdb = new SimpleClient<OTB_EIP_Leave>(db);
  413. var oEip = sdb.GetById(sId);
  414. var TipsType = WebAppGlobalConstWord.CHECK;
  415. if (oEip == null)
  416. {
  417. sMsg = @"系統找不到對應的請假資料,請核查!";
  418. break;
  419. }
  420. var saNextSignedWays = (JArray)JsonConvert.DeserializeObject(sNextSignedWays);
  421. var saNextUsers = (JArray)JsonConvert.DeserializeObject(sNextUsers);
  422. var saTipsUsers = (JArray)JsonConvert.DeserializeObject(sTipsUsers);
  423. var oUser_Self = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == i_crm.ORIGID && it.MemberID == i_crm.USERID);
  424. var oAskTheDummy = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == i_crm.ORIGID && it.MemberID == oEip.AskTheDummy);
  425. var sTitle_Self = @"";
  426. var sTitle_Handle = oUser_Self.MemberName + @"審批了" + oAskTheDummy.MemberName + @"的請假單「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber;
  427. var sTitle_Next = oAskTheDummy.MemberName + @"的請假單申請「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber;
  428. var sTitle_Notice = @"";
  429. var sStatus = @"B";
  430. if (sAction == @"Signed")
  431. {
  432. sTitle_Self = oUser_Self.MemberName + @"審批了您的請假單「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber;
  433. sTitle_Notice = oAskTheDummy.MemberName + @"的請假單申請「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber + @",請點擊查看...";
  434. switch (sSignedDecision)
  435. {
  436. case @"Y":
  437. sTitle_Self += @",審批結果:同意";
  438. if (sHandlePerson != @"")
  439. {
  440. sStatus = @"E";
  441. }
  442. break;
  443. case @"N":
  444. sTitle_Self += @",審批結果:不同意";
  445. sStatus = @"D-O";
  446. TipsType = WebAppGlobalConstWord.FAIL;
  447. break;
  448. case @"O":
  449. sTitle_Self += @",審批結果:先加簽";
  450. break;
  451. default:
  452. break;
  453. }
  454. }
  455. else
  456. {
  457. sTitle_Self = oUser_Self.MemberName + @"签辦了您的請假單「" + oEip.KeyNote + @"」簽呈編號:" + oEip.SignedNumber;
  458. if (sHandleDecision == @"Y")
  459. {
  460. sTitle_Self += @"簽辦結果:同意";
  461. sStatus = @"H-O";
  462. }
  463. else if (sHandleDecision == @"O")
  464. {
  465. sTitle_Self += @"簽辦結果:先轉呈其他主管審批";
  466. }
  467. }
  468. if (i_crm.LANG == @"zh")
  469. {
  470. sTitle_Self = ChineseStringUtility.ToSimplified(sTitle_Self);
  471. sTitle_Next = ChineseStringUtility.ToSimplified(sTitle_Next);
  472. sTitle_Notice = ChineseStringUtility.ToSimplified(sTitle_Notice);
  473. }
  474. var oLeaveUpd = new OTB_EIP_Leave
  475. {
  476. Status = sStatus,
  477. CheckFlows = sCheckFlows,
  478. HandleFlows = sHandleFlows,
  479. ModifyUser = i_crm.USERID,
  480. ModifyDate = DateTime.Now
  481. };
  482. db.Updateable(oLeaveUpd)
  483. .UpdateColumns(it => new { it.Status, it.CheckFlows, it.HandleFlows, it.ModifyDate, it.ModifyUser })
  484. .Where(it => it.Guid == sId).ExecuteCommand();
  485. var sOwner = @"";
  486. if (sSignedDecision == @"Y" && sGoNext == @"N")
  487. {
  488. sOwner = i_crm.USERID;
  489. }
  490. SYS.Task_QryService.TaskStatusUpd(db, i_crm.ORIGID, sId, sOwner);
  491. var listTips = new List<OTB_SYS_Tips>();
  492. var listTask = new List<OTB_SYS_Task>();
  493. var listToTips = new List<string>();
  494. if (sStatus != @"D-O")
  495. {
  496. foreach (string flow in saNextSignedWays)
  497. {
  498. if (sGoNext == @"Y")
  499. {
  500. if (flow == @"flow4")//添加通知和提醒給下個流程所有要通知的人
  501. {
  502. foreach (string user in saTipsUsers)
  503. {
  504. //添加提醒消息
  505. var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle_Notice, user, @"Leave_View" + @"|?Action=Upd&Guid=" + oEip.Guid, WebAppGlobalConstWord.BELL);
  506. listTips.Add(oTipsAdd);
  507. listToTips.Add(user);
  508. }
  509. }
  510. else if (flow == @"flow5")//添加通知和提醒給經辦人
  511. {
  512. if (sHandlePerson != @"")
  513. {
  514. if (sHandleDecision != @"N")
  515. {
  516. //添加代辦
  517. var oTaskAdd = SYS.Task_QryService.TaskAdd(i_crm, oEip.Guid, sHandlePerson, sTitle_Handle, @"Leave_View", @"?Action=Upd&Guid=" + oEip.Guid, @"E");
  518. listTask.Add(oTaskAdd);
  519. //添加提醒消息
  520. var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle_Handle, sHandlePerson, @"Leave_View" + @"|?Action=Upd&Guid=" + oEip.Guid, WebAppGlobalConstWord.BELL);
  521. listTips.Add(oTipsAdd);
  522. listToTips.Add(sHandlePerson);
  523. }
  524. }
  525. }
  526. else
  527. {
  528. foreach (string user in saNextUsers)//添加通知和提醒給下一個審核的人
  529. {
  530. if (sSignedDecision == @"Y" || sSignedDecision == @"O")
  531. {
  532. //添加代辦
  533. var oTaskAdd = SYS.Task_QryService.TaskAdd(i_crm, oEip.Guid, user, sTitle_Next, @"Leave_View", @"?Action=Upd&Guid=" + oEip.Guid, @"G");
  534. listTask.Add(oTaskAdd);
  535. //添加提醒消息
  536. var oTipsAdd = SYS.Task_QryService.TipsAdd(i_crm, sTitle_Next, user, @"Leave_View" + @"|?Action=Upd&Guid=" + oEip.Guid, WebAppGlobalConstWord.BELL);
  537. listTips.Add(oTipsAdd);
  538. listToTips.Add(user);
  539. }
  540. }
  541. }
  542. }
  543. }
  544. }
  545. //添加提醒消息(給請假的人)
  546. var oTips_AskTheDummy = SYS.Task_QryService.TipsAdd(i_crm, sTitle_Self, oEip.AskTheDummy, @"Leave_View" + @"|?Action=Upd&Guid=" + oEip.Guid, TipsType);
  547. listTips.Add(oTips_AskTheDummy);
  548. listToTips.Add(oEip.AskTheDummy);
  549. if (listTips.Count > 0)
  550. {
  551. db.Insertable(listTips).ExecuteCommand();
  552. }
  553. if (listTask.Count > 0)
  554. {
  555. db.Insertable(listTask).ExecuteCommand();
  556. }
  557. if (sStatus == @"D-O")
  558. {
  559. if (oEip.HolidayCategory == @"09")
  560. {
  561. var AnnualLeaveMemos = (JArray)JsonConvert.DeserializeObject(oEip.AnnualLeaveMemo);
  562. string strGuid = "";
  563. foreach (var ALM in AnnualLeaveMemos)
  564. {
  565. strGuid = ALM["Guid"].ToString();
  566. }
  567. var saWenZhong = db.Queryable<OTB_EIP_WenZhong>().Where(it => it.Guid == strGuid).ToList();
  568. //var iYear = oEip.StartDate.Value.Year;
  569. //var saWenZhong = db.Queryable<OTB_EIP_WenZhong>()
  570. // .Where(it => it.OrgID == i_crm.ORIGID && it.UserID == oEip.AskTheDummy && (it.EnableDate.Value.Year == iYear || it.ExpirationDate.Value.Year == iYear)).ToList();
  571. if (saWenZhong.Count > 0)
  572. {
  573. foreach (OTB_EIP_WenZhong wz in saWenZhong)
  574. {
  575. //if ((DateTime)oEip.StartDate >= (DateTime)wz.EnableDate && (DateTime)oEip.StartDate <= (DateTime)wz.ExpirationDate)
  576. //{
  577. var oWenZhongUpd = new OTB_EIP_WenZhong
  578. {
  579. UsedHours = (wz.UsedHours ?? 0) - oEip.TotalTime
  580. };
  581. oWenZhongUpd.RemainHours = (wz.PaymentHours ?? 0) - oWenZhongUpd.UsedHours;
  582. oWenZhongUpd.DelFlag = false;
  583. db.Updateable(oWenZhongUpd).UpdateColumns(it => new { it.UsedHours, it.RemainHours, it.DelFlag })
  584. .Where(it => it.Guid == wz.Guid).ExecuteCommand();
  585. break;
  586. //}
  587. }
  588. }
  589. }
  590. else
  591. {
  592. var sYear = ((DateTime)oEip.StartDate).ToString(@"yyyy");
  593. var oLeaveSet = db.Queryable<OTB_EIP_LeaveSet>().Single(it => it.OrgID == i_crm.ORIGID && it.UserID == oEip.AskTheDummy && it.TYear == sYear);
  594. if (oLeaveSet != null)
  595. {
  596. var jaSetInfo = (JArray)JsonConvert.DeserializeObject(oLeaveSet.SetInfo);
  597. foreach (JObject jo in jaSetInfo)
  598. {
  599. if (jo[@"Id"].ToString() == oEip.HolidayCategory)
  600. {
  601. var sUsedHours = jo[@"UsedHours"] == null ? @"0" : jo[@"UsedHours"].ToString();
  602. var sPaymentHours = jo[@"PaymentHours"] == null ? @"0" : jo[@"PaymentHours"].ToString();
  603. jo[@"UsedHours"] = Convert.ToDecimal(sUsedHours) - oEip.TotalTime;
  604. if (sPaymentHours != @"")
  605. {
  606. jo[@"RemainHours"] = Convert.ToDecimal(sPaymentHours) - Convert.ToDecimal(jo[@"UsedHours"].ToString());
  607. }
  608. break;
  609. }
  610. }
  611. var oLeaveSetUpd = new OTB_EIP_LeaveSet
  612. {
  613. SetInfo = JsonToString(jaSetInfo)
  614. };
  615. db.Updateable(oLeaveSetUpd).UpdateColumns(it => new { it.SetInfo })
  616. .Where(it => it.Guid == oLeaveSet.Guid).ExecuteCommand();
  617. }
  618. }
  619. }
  620. db.Ado.CommitTran();
  621. rm = new SuccessResponseMessage(null, i_crm);
  622. rm.DATA.Add("Status", sStatus);
  623. rm.DATA.Add(BLWording.REL, listToTips);
  624. } while (false);
  625. return rm;
  626. });
  627. }
  628. catch (Exception ex)
  629. {
  630. sMsg = Util.GetLastExceptionMsg(ex);
  631. LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), @"請假單管理", @"LeaveAudit(請假單簽核|签辦)", @"", @"", @"");
  632. }
  633. finally
  634. {
  635. if (null != sMsg)
  636. {
  637. rm = new ErrorResponseMessage(sMsg, i_crm);
  638. }
  639. }
  640. return rm;
  641. }
  642. #endregion 請假單簽核|签辦
  643. #region 作廢
  644. /// <summary>
  645. /// 作廢
  646. /// </summary>
  647. /// <param name="i_crm">todo: describe i_crm parameter on SetVoid</param>
  648. /// <returns></returns>
  649. public ResponseMessage SetVoid(RequestMessage i_crm)
  650. {
  651. ResponseMessage rm = null;
  652. string sMsg = null;
  653. try
  654. {
  655. rm = SugarBase.ExecTran(db =>
  656. {
  657. do
  658. {
  659. var sId = _fetchString(i_crm, EasyNetGlobalConstWord.GUID);
  660. var sVoidReason = _fetchString(i_crm, @"VoidReason");
  661. var sdb = new SimpleClient<OTB_EIP_Leave>(db);
  662. var oEip = sdb.GetById(sId);
  663. var iYear = oEip.StartDate.Value.Year;
  664. if (oEip == null)
  665. {
  666. sMsg = @"系統找不到對應的請假資料,請核查!";
  667. break;
  668. }
  669. if (oEip.HolidayCategory == @"09" && string.IsNullOrWhiteSpace(oEip.AnnualLeaveMemo))
  670. {
  671. sMsg = @"請假的特休資訊遺失,請資訊人員核查!";
  672. break;
  673. }
  674. var AnnualLeaveMemos = (JArray)JsonConvert.DeserializeObject(oEip.AnnualLeaveMemo);
  675. var oLeaveUpd = new OTB_EIP_Leave
  676. {
  677. Status = @"X",
  678. VoidReason = sVoidReason,
  679. ModifyUser = i_crm.USERID,
  680. ModifyDate = DateTime.Now
  681. };
  682. db.Updateable(oLeaveUpd).UpdateColumns(it => new { it.Status, it.VoidReason, it.ModifyDate, it.ModifyUser })
  683. .Where(it => it.Guid == sId).ExecuteCommand();
  684. db.Deleteable<OTB_SYS_Task>()
  685. .Where(it => it.OrgID == i_crm.ORIGID && it.SourceID == sId).ExecuteCommand();
  686. new CalendarService().DeleteCalendar(i_crm.ORIGID, "", oEip.Guid);
  687. if (oEip.HolidayCategory == @"09")
  688. {
  689. UpddateWenZhongAnnualLeave(db, i_crm.ORIGID, oEip.AskTheDummy, AnnualLeaveMemos);
  690. }
  691. else
  692. {
  693. var TotalRecoveryHours = oEip.TotalTime;
  694. var RecoverLeaveRequestResult = UpddateNormalRequestLeave(db, i_crm.ORIGID, oEip.AskTheDummy, AnnualLeaveMemos);
  695. TotalRecoveryHours -= RecoverLeaveRequestResult.Item3;
  696. if(TotalRecoveryHours >0)
  697. {
  698. var sYear = iYear.ToString();
  699. var oLeaveSet = db.Queryable<OTB_EIP_LeaveSet>().Single(it => it.OrgID == i_crm.ORIGID && it.UserID == oEip.AskTheDummy && it.TYear == sYear);
  700. if (oLeaveSet != null)
  701. {
  702. var jaSetInfo = (JArray)JsonConvert.DeserializeObject(oLeaveSet.SetInfo);
  703. foreach (JObject jo in jaSetInfo)
  704. {
  705. if (jo[@"Id"].ToString() == oEip.HolidayCategory)
  706. {
  707. jo[@"UsedHours"] = Convert.ToDecimal(jo[@"UsedHours"].ToString()) - oEip.TotalTime;
  708. jo[@"RemainHours"] = Convert.ToDecimal(jo[@"PaymentHours"].ToString()) - Convert.ToDecimal(jo[@"UsedHours"].ToString());
  709. break;
  710. }
  711. }
  712. var oLeaveSetUpd = new OTB_EIP_LeaveSet
  713. {
  714. SetInfo = JsonToString(jaSetInfo)
  715. };
  716. db.Updateable(oLeaveSetUpd).UpdateColumns(it => new { it.SetInfo })
  717. .Where(it => it.Guid == oLeaveSet.Guid).ExecuteCommand();
  718. }
  719. }
  720. }
  721. db.Ado.CommitTran();
  722. rm = new SuccessResponseMessage(null, i_crm);
  723. } while (false);
  724. return rm;
  725. });
  726. }
  727. catch (Exception ex)
  728. {
  729. sMsg = Util.GetLastExceptionMsg(ex);
  730. LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), @"請假單管理", @"SetVoid(作廢)", @"", @"", @"");
  731. }
  732. finally
  733. {
  734. if (null != sMsg)
  735. {
  736. rm = new ErrorResponseMessage(sMsg, i_crm);
  737. }
  738. }
  739. return rm;
  740. }
  741. #endregion 作廢
  742. #region 抽單
  743. /// <summary>
  744. /// 抽單動作
  745. /// </summary>
  746. /// <param name="i_crm">todo: describe i_crm parameter on SetReEdit</param>
  747. /// <returns></returns>
  748. public ResponseMessage SetReEdit(RequestMessage i_crm)
  749. {
  750. ResponseMessage rm = null;
  751. string sMsg = null;
  752. try
  753. {
  754. rm = SugarBase.ExecTran(db =>
  755. {
  756. do
  757. {
  758. var sId = _fetchString(i_crm, EasyNetGlobalConstWord.GUID);
  759. var sdb = new SimpleClient<OTB_EIP_Leave>(db);
  760. var oEip = sdb.GetById(sId);
  761. var iYear = oEip.StartDate.Value.Year;
  762. if (oEip == null)
  763. {
  764. sMsg = @"系統找不到對應的請假資料,請核查!";
  765. break;
  766. }
  767. if (oEip.HolidayCategory == @"09" && string.IsNullOrWhiteSpace(oEip.AnnualLeaveMemo) )
  768. {
  769. sMsg = @"請假的特休資訊遺失,請資訊人員核查!";
  770. break;
  771. }
  772. var AnnualLeaveMemos = (JArray)JsonConvert.DeserializeObject(oEip.AnnualLeaveMemo);
  773. var oLeaveUpd = new OTB_EIP_Leave
  774. {
  775. Status = @"C-O",
  776. ModifyUser = i_crm.USERID,
  777. ModifyDate = DateTime.Now
  778. };
  779. db.Updateable(oLeaveUpd).UpdateColumns(it => new { it.Status, it.ModifyDate, it.ModifyUser })
  780. .Where(it => it.Guid == sId).ExecuteCommand();
  781. db.Deleteable<OTB_SYS_Task>()
  782. .Where(it => it.OrgID == i_crm.ORIGID && it.SourceID == sId).ExecuteCommand();
  783. new CalendarService().DeleteCalendar(i_crm.ORIGID,"", oEip.Guid);
  784. if (oEip.HolidayCategory == @"09")
  785. {
  786. UpddateWenZhongAnnualLeave(db, i_crm.ORIGID, oEip.AskTheDummy, AnnualLeaveMemos);
  787. }
  788. else
  789. {
  790. var TotalRecoveryHours = oEip.TotalTime;
  791. var RecoverLeaveRequestResult = UpddateNormalRequestLeave(db, i_crm.ORIGID, oEip.AskTheDummy, AnnualLeaveMemos);
  792. TotalRecoveryHours -= RecoverLeaveRequestResult.Item3;
  793. if (TotalRecoveryHours > 0)
  794. {
  795. var sYear = iYear.ToString();
  796. var oLeaveSet = db.Queryable<OTB_EIP_LeaveSet>().Single(it => it.OrgID == i_crm.ORIGID && it.UserID == oEip.AskTheDummy && it.TYear == sYear);
  797. if (oLeaveSet != null)
  798. {
  799. var jaSetInfo = (JArray)JsonConvert.DeserializeObject(oLeaveSet.SetInfo);
  800. foreach (JObject jo in jaSetInfo)
  801. {
  802. if (jo[@"Id"].ToString() == oEip.HolidayCategory)
  803. {
  804. var sPaymentHours = jo[@"PaymentHours"].ToString();
  805. jo[@"UsedHours"] = Convert.ToDecimal(jo[@"UsedHours"].ToString()) - oEip.TotalTime;
  806. if (sPaymentHours != @"")
  807. {
  808. jo[@"RemainHours"] = Convert.ToDecimal(sPaymentHours) - Convert.ToDecimal(jo[@"UsedHours"].ToString());
  809. }
  810. break;
  811. }
  812. }
  813. var oLeaveSetUpd = new OTB_EIP_LeaveSet
  814. {
  815. SetInfo = JsonToString(jaSetInfo)
  816. };
  817. db.Updateable(oLeaveSetUpd).UpdateColumns(it => new { it.SetInfo })
  818. .Where(it => it.Guid == oLeaveSet.Guid).ExecuteCommand();
  819. }
  820. }
  821. }
  822. rm = new SuccessResponseMessage(null, i_crm);
  823. } while (false);
  824. return rm;
  825. });
  826. }
  827. catch (Exception ex)
  828. {
  829. sMsg = Util.GetLastExceptionMsg(ex);
  830. LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), @"請假單管理", @"SetReEdit(抽單)", @"", @"", @"");
  831. }
  832. finally
  833. {
  834. if (null != sMsg)
  835. {
  836. rm = new ErrorResponseMessage(sMsg, i_crm);
  837. }
  838. }
  839. return rm;
  840. }
  841. #endregion 抽單
  842. #region 請假單管理(查詢筆數)
  843. /// <summary>
  844. /// 請假單管理(查詢筆數)
  845. /// </summary>
  846. /// <param name="i_crm"></param>
  847. /// <returns></returns>
  848. public ResponseMessage QueryCout(RequestMessage i_crm)
  849. {
  850. ResponseMessage rm = null;
  851. string sMsg = null;
  852. var db = SugarBase.GetIntance();
  853. try
  854. {
  855. do
  856. {
  857. var sEndTime = _fetchString(i_crm, @"EndTime");
  858. var iHours = _fetchInt(i_crm, @"Hours");
  859. var rEndTime = Convert.ToDateTime(sEndTime);
  860. var rStartTime = rEndTime.AddHours(-iHours);
  861. var iCout = db.Queryable<OTB_EIP_Leave>()
  862. .Where(x => x.OrgID == i_crm.ORIGID && x.AskTheDummy == i_crm.USERID && x.EndDate > rStartTime && x.EndDate <= rEndTime)
  863. .Count();
  864. rm = new SuccessResponseMessage(null, i_crm);
  865. rm.DATA.Add(BLWording.REL, iCout);
  866. } while (false);
  867. }
  868. catch (Exception ex)
  869. {
  870. sMsg = Util.GetLastExceptionMsg(ex);
  871. LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), "", "QueryCout(請假單管理(查詢筆數))", "", "", "");
  872. }
  873. finally
  874. {
  875. if (null != sMsg)
  876. {
  877. rm = new ErrorResponseMessage(sMsg, i_crm);
  878. }
  879. }
  880. return rm;
  881. }
  882. #endregion 請假單管理(查詢筆數)
  883. #region 請假單管理(檢核當月最大請教時數)
  884. /// <summary>
  885. /// 請假單管理(檢核當月最大請教時數)
  886. /// </summary>
  887. /// <param name="i_crm"></param>
  888. /// <returns></returns>
  889. public ResponseMessage CheckMaxHours(RequestMessage i_crm)
  890. {
  891. ResponseMessage rm = null;
  892. string sMsg = null;
  893. var db = SugarBase.GetIntance();
  894. try
  895. {
  896. do
  897. {
  898. var sDate = _fetchString(i_crm, @"Date");
  899. var iCurHours = decimal.Parse(_fetchString(i_crm, @"CurHours"));
  900. var iMaxHours = _fetchInt(i_crm, @"MaxHours");
  901. var rDate = Convert.ToDateTime(sDate);
  902. var iYear = rDate.Year;
  903. var iNonth = rDate.Month;
  904. var listData = db.Queryable<OTB_EIP_Leave>()
  905. .Where(x => x.OrgID == i_crm.ORIGID && x.AskTheDummy == i_crm.USERID && x.StartDate.HasValue && x.StartDate.Value.Year == iYear)
  906. .Select(x => new { x.StartDate, x.EndDate, x.TotalTime }).ToList();
  907. var iHours = listData.Where(x => x.StartDate.Value.Month == iNonth || x.EndDate.Value.Month == iNonth).Sum(x => x.TotalTime);
  908. //var iHours = db.Queryable<OTB_EIP_Leave>()
  909. // .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))
  910. // .Sum(x => x.TotalTime);
  911. //.ToSql();
  912. rm = new SuccessResponseMessage(null, i_crm);
  913. rm.DATA.Add(BLWording.REL, iHours + iCurHours > iMaxHours);
  914. } while (false);
  915. }
  916. catch (Exception ex)
  917. {
  918. sMsg = Util.GetLastExceptionMsg(ex);
  919. LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(Leave_UpdService), "", "QueryCout(請假單管理(檢核當月最大請教時數))", "", "", "");
  920. }
  921. finally
  922. {
  923. if (null != sMsg)
  924. {
  925. rm = new ErrorResponseMessage(sMsg, i_crm);
  926. }
  927. }
  928. return rm;
  929. }
  930. #endregion 請假單管理(檢核當月最大請教時數)
  931. #region 獲取請假規則設定
  932. /// <summary>
  933. /// 檢查假別
  934. /// </summary>
  935. /// <param name="i_crm"></param>
  936. /// <returns></returns>
  937. public ResponseMessage GetLeaveSetting(RequestMessage i_crm)
  938. {
  939. ResponseMessage rm = null;
  940. string sMsg = null;
  941. var db = SugarBase.DB;
  942. try
  943. {
  944. do
  945. {
  946. var sArgumentID = _fetchString(i_crm, @"ArgumentID");
  947. var sOrgID = _fetchString(i_crm, @"OrgID");
  948. //取得出勤設定資料
  949. var oLeaveRuelsSetting = db.Queryable<OTB_SYS_Arguments, OTB_SYS_ArgumentsRelated>
  950. ((t1, t2) =>
  951. new object[] {
  952. JoinType.Left, t1.ArgumentID == t2.ArgumentID
  953. }
  954. )
  955. .Where((t1, t2) => t1.ArgumentClassID == "LeaveType" && t1.ArgumentID == sArgumentID && t1.OrgID == sOrgID && t2.OrgID == sOrgID)
  956. .Select((t1, t2) => new { t1.Correlation, t2.Field1, t2.Field2, t2.Field3 })
  957. .Single();
  958. rm = new SuccessResponseMessage(null, i_crm);
  959. rm.DATA.Add(BLWording.REL, oLeaveRuelsSetting);
  960. } while (false);
  961. }
  962. catch (Exception ex)
  963. {
  964. sMsg = Util.GetLastExceptionMsg(ex);
  965. LogAndSendEmail(sMsg + @"Param:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(LeaveSetService), @"出勤設定", @"GetLeaveSettingByType(依據請假類別獲取請假規則設定)", @"", @"", @"");
  966. }
  967. finally
  968. {
  969. if (null != sMsg)
  970. {
  971. rm = new ErrorResponseMessage(sMsg, i_crm);
  972. }
  973. }
  974. return rm;
  975. }
  976. #endregion 依據請假類別獲取請假規則設定
  977. #region GetUpdateWenZhong
  978. /// <summary>
  979. /// 返回特休假,leave一定要有資料
  980. /// </summary>
  981. /// <param name="db"></param>
  982. /// <param name="leave"></param>
  983. /// <returns></returns>
  984. public Tuple<bool, string> UpddateWenZhongAnnualLeave(SqlSugarClient db,string OrgID, string UserID, JArray AnnualLeaveData)
  985. {
  986. var Result = new List<OTB_EIP_WenZhong>();
  987. if (!AnnualLeaveData.Any())
  988. return new Tuple<bool, string>(false, @"請假的特休資訊遺失,請資訊人員核查!");
  989. if(string.IsNullOrEmpty(OrgID) || string.IsNullOrEmpty(UserID))
  990. return new Tuple<bool, string>(false, @"缺少組織或使用者資訊,請重新整理!");
  991. var RelativeWZGuid = new List<string>();
  992. var Dic = new Dictionary<string, decimal>();
  993. foreach (var ALM in AnnualLeaveData)
  994. {
  995. var Guid = ALM["Guid"].ToString();
  996. RelativeWZGuid.Add(ALM["Guid"].ToString());
  997. decimal.TryParse(ALM["Hours"].ToString(), out var Hours);
  998. Dic.Add(Guid, Hours);
  999. }
  1000. var saWenZhong = db.Queryable<OTB_EIP_WenZhong>()
  1001. .Where(it => it.OrgID == OrgID && it.UserID == UserID && RelativeWZGuid.Contains(it.Guid)).ToList();
  1002. if (saWenZhong.Count > 0)
  1003. {
  1004. var UpdateWZData = new List<OTB_EIP_WenZhong>();
  1005. foreach (OTB_EIP_WenZhong wz in saWenZhong)
  1006. {
  1007. decimal.TryParse(Dic[wz.Guid].ToString(), out var ReturnHours);
  1008. var oWenZhong = new OTB_EIP_WenZhong
  1009. {
  1010. Guid = wz.Guid,
  1011. UsedHours = wz.UsedHours - ReturnHours,
  1012. RemainHours = wz.RemainHours + ReturnHours,
  1013. DelFlag = false,
  1014. };
  1015. UpdateWZData.Add(oWenZhong);
  1016. }
  1017. if (UpdateWZData.Any())
  1018. {
  1019. db.Updateable(UpdateWZData).UpdateColumns(it => new { it.Guid, it.UsedHours, it.RemainHours, it.DelFlag }).ExecuteCommand();
  1020. }
  1021. }
  1022. return new Tuple<bool, string>(true,"");
  1023. }
  1024. #endregion
  1025. public Tuple<bool, string,decimal> UpddateNormalRequestLeave(SqlSugarClient db, string OrgID, string UserID, JArray NormalLeaveData)
  1026. {
  1027. if (string.IsNullOrEmpty(OrgID) || string.IsNullOrEmpty(UserID))
  1028. return new Tuple<bool, string, decimal>(false, @"缺少組織或使用者資訊,請重新整理!", decimal.Zero);
  1029. if (NormalLeaveData == null || NormalLeaveData.Count == 0 )
  1030. return new Tuple<bool, string, decimal>(false, @"缺少請假資料,請重新整理!", decimal.Zero);
  1031. var RelativeLeaveRequestGuid = new List<string>();
  1032. var Dic = new Dictionary<string, decimal>();
  1033. var RecoverHours = decimal.Zero;
  1034. foreach (var NLD in NormalLeaveData)
  1035. {
  1036. var Guid = NLD["Guid"].ToString();
  1037. RelativeLeaveRequestGuid.Add(NLD["Guid"].ToString());
  1038. decimal.TryParse(NLD["Hours"].ToString(), out var Hours);
  1039. RecoverHours += Hours;
  1040. Dic.Add(Guid, Hours);
  1041. }
  1042. var saLeaveRequests = db.Queryable<OTB_EIP_LeaveRequest>()
  1043. .Where(it => it.OrgID == OrgID && it.MemberID == UserID && RelativeLeaveRequestGuid.Contains(it.guid)).ToList();
  1044. if (saLeaveRequests.Count > 0)
  1045. {
  1046. foreach (OTB_EIP_LeaveRequest wz in saLeaveRequests)
  1047. {
  1048. decimal.TryParse(Dic[wz.guid].ToString(), out var ReturnHours);
  1049. wz.UsedHours = wz.UsedHours - ReturnHours;
  1050. wz.RemainHours = wz.RemainHours + ReturnHours;
  1051. }
  1052. db.Updateable(saLeaveRequests).UpdateColumns(it => new { it.UsedHours, it.RemainHours }).ExecuteCommand();
  1053. }
  1054. return new Tuple<bool, string, decimal>(true, "", RecoverHours);
  1055. }
  1056. }
  1057. }