Bladeren bron

计算工资 调整 1.1

leiy 1 jaar geleden
bovenliggende
commit
170a281d25

+ 127 - 15
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -1,28 +1,13 @@
 using Aspose.Cells;
-using Autofac.Diagnostics;
-using MathNet.Numerics.Statistics.Mcmc;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
 using OASystem.API.OAMethodLib;
 using OASystem.API.OAMethodLib.QiYeWeChatAPI;
-using OASystem.Domain;
 using OASystem.Domain.Dtos.PersonnelModule;
-using OASystem.Domain.Dtos.QiYeWeChat;
-using OASystem.Domain.Entities.Business;
-using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.Entities.PersonnelModule;
-using OASystem.Domain.ViewModels.Business;
-using OASystem.Domain.ViewModels.JuHeExchangeRate;
 using OASystem.Domain.ViewModels.PersonnelModule;
 using OASystem.Domain.ViewModels.QiYeWeChat;
 using OASystem.Infrastructure.Repositories.PersonnelModule;
-using SqlSugar;
-using StackExchange.Redis;
-using System.Collections.Generic;
 using System.Diagnostics;
 using System.Globalization;
-using System.IO;
-using System.Web;
 
 namespace OASystem.API.Controllers
 {
@@ -58,6 +43,133 @@ namespace OASystem.API.Controllers
 
         #region 工资表单
 
+
+        /// <summary>
+        /// 工资 月列表
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetWageSheetMonth()
+        {
+            string sql = string.Format("Select * From  Pm_WageIssueWorkingDay Where IsDel = 0 Order By YearMonth Desc");
+            var data = await _wageSheetRep._sqlSugar.SqlQueryable<WageSheetMonthView>(sql).ToListAsync();
+
+            return Ok(JsonView(true, "查询成功!", data));
+        }
+
+        /// <summary>
+        /// 工资 工作日信息
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetWageSheetMonthWorkdays(string startDt, string endDt )
+        {
+
+            //参数处理
+            string dtFormat = "yyyy-MM-dd";
+            DateTime startDt1, endDt1;
+            bool startDtIsValid = DateTime.TryParseExact(startDt, dtFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out startDt1);
+            bool endDtIsValid = DateTime.TryParseExact(endDt, dtFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out endDt1);
+
+            if (!startDtIsValid) return Ok(JsonView(false, "开始日期格式错误!正确时间格式:yyyy-MM-dd  "));
+            if (!endDtIsValid) return Ok(JsonView(false, "结束格式错误!正确时间格式:yyyy-MM-dd  "));
+
+
+
+            string sql = string.Format(@"Select  * From Sys_Calendar
+										 Where Isdel = 0 And Dt between  '{0}' And  '{1}'", startDt, endDt);
+            var data = await _wageSheetRep._sqlSugar.SqlQueryable<CalendarInfoView>(sql).ToListAsync();
+
+            return Ok(JsonView(true, "查询成功!", data));
+
+        }
+
+        /// <summary>
+        /// 工资 工作日信息
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetWageSheetMonthWorkdaysAddOrEdit(WageSheetMonthWorkdaysAddOrEditDto dto)
+        {
+
+            //参数处理
+            string yearFormat = "yyyy-MM";
+            string dtFormat = "yyyy-MM-dd";
+            DateTime yearDt, startDt1, endDt1;
+            bool yearDtIsValid = DateTime.TryParseExact(dto.YearMonth, yearFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out yearDt);
+            bool startDtIsValid = DateTime.TryParseExact(dto.StartDate, dtFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out startDt1);
+            bool endDtIsValid = DateTime.TryParseExact(dto.EndDate, dtFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out endDt1);
+
+
+            if (!yearDtIsValid) return Ok(JsonView(false, "年月日期格式错误!正确时间格式:yyyy-MM  "));
+            if (!startDtIsValid) return Ok(JsonView(false, "开始日期格式错误!正确时间格式:yyyy-MM-dd  "));
+            if (!endDtIsValid) return Ok(JsonView(false, "结束格式错误!正确时间格式:yyyy-MM-dd  "));
+
+            
+
+            int res = -1;
+
+            #region 处理数据
+            Pm_WageIssueWorkingDay pm_WageIssueWorkingDay = new Pm_WageIssueWorkingDay();
+            pm_WageIssueWorkingDay = _mapper.Map<Pm_WageIssueWorkingDay>(dto);
+            List<Sys_Calendar> sys_Calendars = new List<Sys_Calendar>();
+            sys_Calendars = _mapper.Map<List<Sys_Calendar>>(dto.CalendarInfos);
+            pm_WageIssueWorkingDay.Workdays = sys_Calendars.Where(it => it.IsWorkDays == true).ToList().Count();
+            foreach (var item in sys_Calendars)
+            {
+                item.Remark = pm_WageIssueWorkingDay.Remark;
+                item.CreateUserId = pm_WageIssueWorkingDay.CreateUserId;
+                item.CreateTime = pm_WageIssueWorkingDay.CreateTime;
+            }
+
+            #endregion
+
+            var _sqlSugar = _wageSheetRep._sqlSugar;
+            if (dto.Status == 1)
+            {
+                string sql = string.Format("Select * From  Pm_WageIssueWorkingDay Where IsDel = 0 and YearMonth='{0}'",dto.YearMonth);
+
+                var data = await _sqlSugar.SqlQueryable<WageSheetMonthView>(sql).FirstAsync();
+                if (data != null)
+                {
+                    return Ok(JsonView(false, dto.YearMonth + "日期数据已存在,请前往修改!"));
+                }
+
+                _sqlSugar.BeginTran();
+                int add1 = await _sqlSugar.Insertable< Pm_WageIssueWorkingDay>(pm_WageIssueWorkingDay).ExecuteCommandAsync();
+                if (add1 > 0) res = 0;
+                int add2 = await _sqlSugar.Insertable<Sys_Calendar>(sys_Calendars).ExecuteCommandAsync();
+                if (add2 > 0) res = 0;
+                _sqlSugar.CommitTran();
+            }
+            else if (dto.Status == 1)
+            {
+                _sqlSugar.BeginTran();
+
+
+                int upd1 = await _sqlSugar.Updateable< Pm_WageIssueWorkingDay >(pm_WageIssueWorkingDay)
+                    .UpdateColumns(it => new { it.YearMonth,it.StartDate,it.EndDate,it.Workdays,it.DeleteTime })
+                    .ExecuteCommandAsync();
+                if (upd1 > 0) res = 0;
+                int upd2 = await _sqlSugar.Updateable<Sys_Calendar>(sys_Calendars)
+                    .UpdateColumns(it => new { it.Dt, it.IsWorkDays, it.IsHoliDay, it.HoliDayName })
+                    .ExecuteCommandAsync();
+                if (upd2 > 0) res = 0;
+
+                _sqlSugar.CommitTran();
+            }
+            else return Ok(JsonView(false, "Status 请传入正确的状态码 1 添加 2 修改"));
+
+            if (res == 0) return Ok(JsonView(true, "操作成功!"));
+
+
+            return Ok(JsonView(false, "操作失败!"));
+        }
+
+
         /// <summary>
         /// 工资表单 基础数据源
         /// </summary>

+ 86 - 48
OASystem/OASystem.Api/OAMethodLib/PayrollComputation.cs

@@ -768,7 +768,8 @@ namespace OASystem.API.OAMethodLib
                 return _result;
             }
 
-            List<string> qyWhchatIdList = userIdListView.dept_user.Select(it => it.userid).ToList();
+            List<string> qyWhchatIdList = new List<string>();
+            qyWhchatIdList = userIdListView.dept_user.Select(it => it.userid).ToList();
             CheckInDayDataView checkInDayDataView = await _qiYeWeChatApiService.GetCheckInDayDataAsync(qyWhchatIdList, startDt, endDt);
             if (checkInDayDataView.errcode != 0)
             {
@@ -837,7 +838,9 @@ namespace OASystem.API.OAMethodLib
                     #endregion
 
                     List<Root> userRoots = workday_userRoots.Where(it => it.base_info.name == itemName).ToList(); //工作日日报 1-固定上下班;
-                    userRoots = userRoots.Distinct().ToList();
+                    //userRoots = userRoots.Distinct().ToList();
+                    userRoots = userRoots.OrderBy(it => it.base_info.date).ToList();
+
 
                     int dk_work_days = userRoots.Count;   //应出勤天数 
 
@@ -854,6 +857,11 @@ namespace OASystem.API.OAMethodLib
                         List<Ex_Item> ex_reissuecard_Items = new List<Ex_Item>(); //打卡类型 数据
                         List<Sp_items> acc_sp_items = new List<Sp_items>(); //审批数据
 
+                        int user_probationary_bk_num = 0; 
+                                                          
+                                                          
+                        decimal user_probationary_bk_decimal = pm_wsInfo.Floats; //绩效工资为0 则为试用员工
+
                         #region 迟到 早退 矿工
 
                         int user_cd_zt_num = 0; //早退/迟到 次数 10分钟内 2次以内不记处罚 三次及以上50一次
@@ -999,7 +1007,6 @@ namespace OASystem.API.OAMethodLib
                                 }
                                 else if (exception == 3) //缺卡
                                 {
-
                                     if (root.exception_infos.Count == 2)
                                     {
                                         day_deduction = dailyWage;
@@ -1078,7 +1085,6 @@ namespace OASystem.API.OAMethodLib
                             }
                         }
 
-                        
                         #endregion
 
                         #region 假勤/补卡次数 审批
@@ -1201,13 +1207,16 @@ namespace OASystem.API.OAMethodLib
 
                             if (ex_ItemInfos.Count > 0)
                             {
-                                ex_Items_jq.Ex_ItemInfo = ex_ItemInfos.OrderBy(it => it.SubTypeId).ThenBy(it => it.Apply_time_dt).ToList();
+                                ex_Items_jq.Ex_ItemInfo = ex_ItemInfos.OrderBy(it => it.StartTimeDt).ThenBy(it => it.Apply_time_dt).ToList();
                                 ex_Items.Add(ex_Items_jq);
                             }
 
                         }
 
                         //打卡补卡
+                        //补卡:员工发现自己漏打卡时,需及时提起补卡申请,并说明情况。
+                        //试用期员工每月有 2 次补卡机会,超过 2 次不足 5 次的部分,按 10 元/次处罚,5 次及以上的漏卡,按 50 元/次处罚;
+                        //正式员工每月 3 次以内的补卡,按 10 元/次处罚,3 次及以上的漏卡,按 50 元/次处罚。
                         if (reissuecardNum > 0)
                         {
                             List<Sp_Detail> sp_buka_details = new List<Sp_Detail>();
@@ -1234,16 +1243,23 @@ namespace OASystem.API.OAMethodLib
                                         {
                                             continue;
                                         }
-
+                                        
                                         decimal bukaPrice = 0.00M;
-                                        if (bukaNum <= 2)
+
+                                        if (user_probationary_bk_decimal == 0) //计算试用员工补卡次数
                                         {
-                                            bukaPrice = 10.00M;
-                                        }
-                                        else
+                                            if (bukaNum <= 2) bukaPrice = 0.00M;
+                                            else if (bukaNum <= 4 && bukaNum > 2) bukaPrice = 10.00M;
+                                            else bukaPrice = 50.00M;
+
+                                        } 
+                                        else   //计算正式员工补卡次数
                                         {
-                                            bukaPrice = 50.00M;
+                                            if (bukaNum <= 2) bukaPrice = 10.00M;
+                                            else bukaPrice = 50.00M;
                                         }
+
+                                        
                                         var app_data = item.apply_data;
                                         var punch_correction1 = app_data.contents[0].value.punch_correction; //未打卡时间
                                         var punch_correction2 = app_data.contents[1].value;
@@ -1274,7 +1290,6 @@ namespace OASystem.API.OAMethodLib
 
                         #endregion
 
-
                     }
                     else
                     {
@@ -1427,8 +1442,6 @@ namespace OASystem.API.OAMethodLib
             string am_starttime = "08:59";
             string am_endtime = "13:01";
 
-            
-
             decimal personalkLeave_dailywage_day = ConvertToDecimal( amountPayable / work_days); //日薪 = 事假日薪 *计算方式:日平均工资 = 当月应发工资 /当月应出勤天数。
 
             //半小时单位
@@ -1452,17 +1465,22 @@ namespace OASystem.API.OAMethodLib
                     {
                         decimal leave_halfHour = Convert.ToDecimal(duration) / Convert.ToDecimal(0.5);
                         typeDeduction = personalkLeave_dailywage_halfhour * leave_halfHour;
-                        if (duration >= 3 && duration <= 7.5M) //单天请假三小时 && 请假时间在上午 则没有餐补
+                        if (duration >= 3 && duration <= 7.5M) //单天请假三小时
                         {
+                            mealDeduction = 10; //餐补扣款
+
+                            #region 上午请假超三小时 扣款
                             //处理开始时间
-                            if (startTime.CompareTo(am_starttime) > 0 && startTime.CompareTo(am_endtime) < 0)
-                            {
-                                //处理结束时间
-                                //if (endTime.CompareTo(am_starttime) > 0 && endTime.CompareTo(am_endtime) > 0)
-                                //{
-                                    mealDeduction = 10; //餐补扣款
-                                //}
-                            }
+                            //if (startTime.CompareTo(am_starttime) > 0 && startTime.CompareTo(am_endtime) < 0)
+                            //{
+                            //    //处理结束时间
+                            //    if (endTime.CompareTo(am_starttime) > 0 && endTime.CompareTo(am_endtime) > 0)
+                            //    {
+                            //        mealDeduction = 10; //餐补扣款
+                            //    }
+                            //}
+                            #endregion
+
                         }
                         else if (duration > 7.5M) //多天计算
                         {
@@ -1510,15 +1528,20 @@ namespace OASystem.API.OAMethodLib
                         typeDeduction = sickLeave_dailywage_halfhour_deduction *sickLeave_halfHour ;
                         if (duration >= 3 && duration <= 7.5M) //单天请假三小时 && 请假时间在上午 则没有餐补
                         {
-                            //处理开始时间
-                            if (startTime.CompareTo(am_starttime) > 0 && startTime.CompareTo(am_endtime) < 0)
-                            {
-                                //处理结束时间
-                                if (endTime.CompareTo(am_starttime) > 0 && endTime.CompareTo(am_endtime) < 0)
-                                {
-                                    mealDeduction = 10; //餐补扣款
-                                }
-                            }
+                            mealDeduction = 10; //餐补扣款
+
+                            #region 上午请假超三小时扣款
+                            ////处理开始时间
+                            //if (startTime.CompareTo(am_starttime) > 0 && startTime.CompareTo(am_endtime) < 0)
+                            //{
+                            //    //处理结束时间
+                            //    if (endTime.CompareTo(am_starttime) > 0 && endTime.CompareTo(am_endtime) < 0)
+                            //    {
+                            //        mealDeduction = 10; //餐补扣款
+                            //    }
+                            //}
+                            #endregion
+
                         }
                         else if (duration > 7.5M) //多天计算
                         {
@@ -1584,8 +1607,8 @@ namespace OASystem.API.OAMethodLib
         public static void CalculateTypeFeeSub(string date_Range_type, string startTime, string endTime, decimal duration, out decimal mealDeduction)
         {
             mealDeduction = 0;
-            string am_starttime = "08:59";
-            string am_endtime = "13:01";
+            string am_starttime = "09:00";
+            string am_endtime = "11:59";
 
             if (date_Range_type == "halfday")
             {
@@ -1595,15 +1618,28 @@ namespace OASystem.API.OAMethodLib
             {
                 if (duration >= 3 && duration < 7) //单天请假三小时 && 请假时间在上午 则没有餐补
                 {
-                    //处理开始时间
-                    if (startTime.CompareTo(am_starttime) > 0 && startTime.CompareTo(am_endtime) < 0)
-                    {
-                        //处理结束时间
-                        if (endTime.CompareTo(am_starttime) > 0 && endTime.CompareTo(am_endtime) < 0)
-                        {
-                            mealDeduction = 10; //餐补扣款
-                        }
-                    }
+                    mealDeduction = 10; //餐补扣款
+
+                    #region 上午请假超三小时 扣款
+
+                    //TimeSpan start_ts = TimeSpan.Parse(startTime); // 10 PM
+                    //TimeSpan end_ts = TimeSpan.Parse(endTime);     // 2  AM
+
+                    //TimeSpan am_start_ts = TimeSpan.Parse(am_starttime); // 10 PM
+                    //TimeSpan am_end_ts = TimeSpan.Parse(am_endtime);     // 2  AM
+
+                    ////处理开始时间
+                    //if (start_ts >= am_start_ts && start_ts <= am_end_ts)
+                    //{
+                    //    //处理结束时间
+                    //    if (end_ts > am_start_ts && end_ts >= am_end_ts)
+                    //    {
+                    //        mealDeduction = 10; //餐补扣款
+                    //    }
+                    //}
+
+                    #endregion
+
                 }
                 else if (duration >= 7 && duration <= 7.50M )
                 {
@@ -1625,11 +1661,13 @@ namespace OASystem.API.OAMethodLib
                         int lastHours = (Convert.ToDateTime(endTime) - Convert.ToDateTime("09:00")).Hours;
                         if (lastHours >= 3)
                         {
-                            //处理结束时间
-                            if (endTime.CompareTo(am_starttime) > 0 && endTime.CompareTo(am_endtime) < 0)
-                            {
-                                mealDeduction += 10; //餐补扣款
-                            }
+                            mealDeduction += 10; //餐补扣款
+
+                            ////处理结束时间
+                            //if (endTime.CompareTo(am_starttime) > 0 && endTime.CompareTo(am_endtime) < 0)
+                            //{
+                            //    mealDeduction += 10; //餐补扣款
+                            //}
                         }
                     }
                 }

+ 3 - 1
OASystem/OASystem.Domain/AutoMappers/_baseMappingProfile.cs

@@ -216,7 +216,9 @@ namespace OASystem.Domain.AutoMappers
             CreateMap<WageSheetInfos, Pm_WageSheet>();
             CreateMap<SalaryCalculatorSingleDto, Pm_WageSheet>();
             CreateMap<Pm_WageSheet, WageSheetInfoView>();
-            
+
+            CreateMap<WageSheetMonthWorkdaysAddOrEditDto, Pm_WageIssueWorkingDay>();
+            CreateMap<CalendarInfoView, Sys_Calendar>();
             #endregion
         }
     }

+ 35 - 0
OASystem/OASystem.Domain/Dtos/PersonnelModule/WageSheetMonthWorkdaysDto.cs

@@ -0,0 +1,35 @@
+using OASystem.Domain.ViewModels.PersonnelModule;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.PersonnelModule
+{
+    /// <summary>
+    /// 工资 工作日 Dto
+    /// </summary>
+    public class WageSheetMonthWorkdaysDto
+    {
+    }
+
+    /// <summary>
+    /// 添加 Or 修改
+    /// </summary>
+    public class WageSheetMonthWorkdaysAddOrEditDto : OpBaseDto
+    {
+        /// <summary>
+        /// 年月
+        /// </summary>
+        public string YearMonth { get; set; }
+
+        public string StartDate { get; set; }
+        public string EndDate { get; set; }
+
+        /// <summary>
+        /// 日期信息
+        /// </summary>
+        public List<CalendarInfoView> CalendarInfos { get; set; }
+    }
+}

+ 61 - 0
OASystem/OASystem.Domain/ViewModels/PersonnelModule/WageSheetMonthView.cs

@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.PersonnelModule
+{
+    /// <summary>
+    /// 工资月 List
+    /// </summary>
+    public class WageSheetMonthView
+    {
+        /// <summary>
+        /// 年月
+        /// </summary>
+        public string YearMonth { get; set; }
+
+        /// <summary>
+        /// 开始日期
+        /// </summary>
+        public string StartDate { get; set; }
+
+        /// <summary>
+        /// 结束日期
+        /// </summary>
+        public string EndDate { get; set; }
+
+        /// <summary>
+        /// 当月工作日
+        /// </summary>
+        public int Workdays { get; set; }
+    }
+
+    /// <summary>
+    /// 日期内容Info
+    /// </summary>
+    public class CalendarInfoView
+    {
+        /// <summary>
+        /// 日期 
+        /// Eg:yyyy-MM-dd
+        /// </summary>
+        public string Dt { get; set; }
+
+        /// <summary>
+        /// 是否是工作日
+        /// </summary>
+        public bool IsWorkDay { get; set; }
+
+        /// <summary>
+        /// 是否是节假日
+        /// </summary>
+        public bool IsHoliDay { get; set; }
+
+        /// <summary>
+        /// 节假日名称
+        /// </summary>
+        public string HoliName { get; set; }
+    }
+}

+ 2 - 1
OASystem/OASystem.Infrastructure/Repositories/PersonnelModule/WageSheetRepository.cs

@@ -58,7 +58,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                                          Left Join Sys_Users sys_u2 On pm_ws.LastUpdateUserId = sys_u2.Id
                                          Left Join Sys_Company sc On  sys_u1.companyId = sc.Id
                                          Left Join Sys_Department sd On sys_u1.DepId = sd.Id
-                                         Where pm_ws.IsDel = 0 And pm_ws.YearMonth = '{0}'", yearMonth);
+                                         Where pm_ws.IsDel = 0 And pm_ws.YearMonth = '{0}'
+                                         Order By UserId Asc ", yearMonth);
             var wageSheetList = await _sqlSugar.SqlQueryable<WageSheetItemInfoView>(sql).ToListAsync();
 
             if (wageSheetList.Count <= 0 )