using Autofac.Diagnostics; 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.PersonnelModule; 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; namespace OASystem.API.Controllers { /// /// 人事模块 /// [Route("api/[controller]/[action]")] public class PersonnelModuleController : ControllerBase { private Result _result; private readonly IMapper _mapper; private readonly decimal _chengDuMinimumWage = 2100.00M; private readonly IQiYeWeChatApiService _qiYeWeChatApiService; private readonly WageSheetRepository _wageSheetRep; private readonly UsersRepository _usersRep; /// /// 初始化 /// /// /// /// /// public PersonnelModuleController(IQiYeWeChatApiService qiYeWeChatApiService,WageSheetRepository wageSheetRep, UsersRepository usersRep, IMapper mapper) { _mapper = mapper; _usersRep = usersRep; _qiYeWeChatApiService = qiYeWeChatApiService; _wageSheetRep = wageSheetRep; _result = new Result(); } #region 工资表单 /// /// 工资表单 基础数据源 /// /// [HttpPost] [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)] public async Task GetWageSheetBasicsDataSource() { //获取OA系统内所有用户 var nameData = await _usersRep.GetUserNameList(1); if (nameData.Code != 0) { return Ok(JsonView(false, nameData.Msg)); } var data = new { userNames = nameData.Data }; return Ok(JsonView(true, "查询成功!", data)); } /// /// 获取工资表单 /// /// /// [HttpPost] [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)] public async Task GetWageSheetList(WageSheetListDto dto) { //参数处理 string ymFormat = "yyyy-MM"; DateTime yearMonthDt; bool yearMonthDttIsValid = DateTime.TryParseExact(dto.YearMonth, ymFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out yearMonthDt); if (!yearMonthDttIsValid) { _result.Msg = "年月格式错误!正确时间格式:yyyy-MM "; return Ok(JsonView(false, _result.Msg)); } //获取月工资数据 string yearMonth = yearMonthDt.ToString("yyyy-MM"); string startDt = yearMonthDt.AddDays(-1).ToString("yyyy-MM") + "-28", endDt = yearMonth + "-27"; //应发合计 = 基本工资 +绩效工资 + 岗位津贴 + 员工的岗位津贴 + 服装洗理补贴 + 通讯补贴 + 交通补贴 + 保密费 + 操作奖金+ 其他补贴 + 部门集体团建费 + 代扣保险 + 代扣公积金 + 餐补 //事假 病假 合计 //扣款合计 = 迟到 + 早退 + 矿工 + 未打卡 + 其他扣款 if (dto.PortType == 1) { _result = await _wageSheetRep.Get_WageSheet_ListByYearMonthAsync(yearMonth); if (_result.Code != 0) { return Ok(JsonView(false, _result.Msg)); } } else if (dto.PortType == 2) { } else if (dto.PortType == 3) { } else { return Ok(JsonView(false, "请选择正确的端口参数")); } return Ok(JsonView(true, _result.Msg, _result.Data)); } /// /// 获取工资 详情 /// /// /// [HttpPost] [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)] public async Task GetWageSheetById(WageSheetInfoDto dto) { if (dto.PortType == 1) { _result = await _wageSheetRep.Get_WageSheet_InfoByIdAsync(dto.Id); if (_result.Code != 0) { return Ok(JsonView(false, _result.Msg)); } } else if (dto.PortType == 2) { } else if (dto.PortType == 3) { } else { return Ok(JsonView(false, "请选择正确的端口参数")); } return Ok(JsonView(true, _result.Msg, _result.Data)); } /// /// 人事模块 工资表单 删除 /// /// /// [HttpPost] [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)] public async Task PostWageSheetDel(WageDelDto dto) { try { _result = await _wageSheetRep.Post_WageSheet_DelAsync(dto); if (_result.Code != 0) { return Ok(JsonView(false, _result.Msg)); } } catch (Exception ex) { return Ok(JsonView(false, ex.Message)); } return Ok(JsonView(true, _result.Msg, _result.Data)); } /// /// 人事模块 工资表单 添加 Or 修改 /// /// /// [HttpPost] [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)] public async Task PostWageSheetAddOrEdit(WageAddOrEditDto dto) { try { _result = await _wageSheetRep.Post_WageSheet_AddOrEditAsync(dto); if (_result.Code != 0) { return Ok(JsonView(false, _result.Msg)); } } catch (Exception ex) { return Ok(JsonView(false, ex.Message)); } return Ok(JsonView(true, _result.Msg, _result.Data)); } /// /// 计算工资 /// /// [HttpPost] [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)] public async Task SalaryCalculatorAsync(SalaryCalculatorDto dto) { //var tepDetail = await PayrollComputation.GetVacationReissueCardTypes("C4RdAPs6gcGyLdSG1RTfKV6kKiRJzXSwF27LaJbyf"); Result result = new Result(); Stopwatch sw = new Stopwatch(); sw.Start(); //参数处理 string ymFormat = "yyyy-MM"; DateTime yearMonthDt; bool yearMonthDttIsValid = DateTime.TryParseExact(dto.yearMonth, ymFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out yearMonthDt); if (!yearMonthDttIsValid) { return Ok(JsonView(false, "年月格式错误!正确时间格式:yyyy-MM ")); } string thisYearMonth = dto.yearMonth; string preYearMonth = yearMonthDt.AddMonths(-1).ToString("yyyy-MM"); //计算本月工资起止时间 DateTime thisStartDt = Convert.ToDateTime(preYearMonth + "-28"); DateTime thisEndDt = Convert.ToDateTime(thisYearMonth + "-27"); //本月工资是否有数据 有数据则不计算 result = await _wageSheetRep.Get_WageSheet_ListByYearMonthAsync(thisYearMonth); if (result.Code == 0 ) { return Ok(JsonView(false, thisYearMonth + " 工资数据已存在,若无人员工资请手动添加!")); } //获取上个月工资信息 List preWageSheetItems = await _wageSheetRep._sqlSugar.Queryable().Where(it => it.IsDel == 0 && it.YearMonth == preYearMonth).ToListAsync(); if (preWageSheetItems.Count <= 0) { return Ok(JsonView(false, thisYearMonth + " 上月工资数据不存在,请手动添加!")); } //获取OA系统内所有用户 var nameData = await _usersRep.GetUserNameList(1); List? userNames = nameData.Data; List wageSheets = new List(); _result = await PayrollComputation.SalaryCalculatorAsync(preWageSheetItems, userNames,dto.UserId, thisYearMonth, thisStartDt, thisEndDt); #region 批量添加 if (_result.Code != 0) { return Ok(JsonView(false, _result.Msg)); } wageSheets = _result.Data; //var add = await _wageSheetRep._sqlSugar.Insertable(wageSheets).ExecuteCommandAsync(); //if (add <= 0) //{ // return Ok(JsonView(false, "操作失败!")); //} #endregion #region 处理返回数据 List wageSheetItems = new List(); wageSheetItems = _mapper.Map>(wageSheets); wageSheetItems = wageSheetItems.Select(it => { UserNameView? uName1 = new UserNameView(); UserNameView? uName2 = new UserNameView(); uName1 = userNames.Where(it1 => it.UserId == it1.Id).FirstOrDefault(); if (uName1 != null) it.Name = uName1.CnName; uName2 = userNames.Where(it1 => it.LastUpdateUserId == it1.Id).FirstOrDefault(); if (uName2 != null) it.LastUpdateUserName = uName2.CnName; return it; } ).ToList(); #endregion sw.Stop(); return Ok(JsonView(true, "操作成功! 耗时:" + sw.ElapsedMilliseconds + "ms", wageSheetItems)); } /// /// 计算工资 By YearMonth And UserId /// /// [HttpPost] [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)] public async Task SalaryCalculatorSingleAsync(SalaryCalculatorSingleDto dto) { Result result = new Result(); Stopwatch sw = new Stopwatch(); sw.Start(); //参数处理 string ymFormat = "yyyy-MM"; string ymdFormat = "yyyy-MM-dd"; DateTime yearMonthDt,startDt,endDt; bool yearMonthDtIsValid = DateTime.TryParseExact(dto.YearMonth, ymFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out yearMonthDt); bool startDtIsValid = DateTime.TryParseExact(dto.StartDate, ymdFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out startDt); bool endDtIsValid = DateTime.TryParseExact(dto.EndDate, ymdFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out endDt); if (!yearMonthDtIsValid) return Ok(JsonView(false, "年月格式错误!正确时间格式:yyyy-MM ")); if (!startDtIsValid) return Ok(JsonView(false, "开始时间格式错误!正确时间格式:yyyy-MM-dd ")); if (!yearMonthDtIsValid) return Ok(JsonView(false, "结束时间格式错误!正确时间格式:yyyy-MM-dd ")); //本月工资是否有数据 有数据则不计算 //result = await _wageSheetRep.Get_WageSheet_ListByYearMonthAsync(dto.YearMonth); //if (result.Code == 0) //{ // return Ok(JsonView(false, dto.YearMonth + " 工资数据已存在,若无人员工资请手动添加!")); //} List wageSheets = new List(); Pm_WageSheet wageSheet = _mapper.Map(dto); wageSheets.Add(wageSheet); //获取OA系统内所有用户 var nameData = await _usersRep.GetUserNameList(1); List? userNames = nameData.Data; _result = await PayrollComputation.SalaryCalculatorAsync(wageSheets, userNames, dto.UserId, dto.YearMonth, startDt, endDt); if (_result.Code != 0) { return Ok(JsonView(false, _result.Msg)); } List wageSheets1 = new List(); wageSheets1 = _result.Data; #region 处理返回数据 List wageSheetItems = new List(); wageSheetItems = _mapper.Map>(wageSheets1); wageSheetItems = wageSheetItems.Select(it => { UserNameView? uName1 = new UserNameView(); UserNameView? uName2 = new UserNameView(); uName1 = userNames.Where(it1 => it.UserId == it1.Id).FirstOrDefault(); if (uName1 != null) it.Name = uName1.CnName; uName2 = userNames.Where(it1 => it.LastUpdateUserId == it1.Id).FirstOrDefault(); if (uName2 != null) it.LastUpdateUserName = uName2.CnName; return it; } ).ToList(); #endregion sw.Stop(); return Ok(JsonView(true, "操作成功!耗时:"+ sw.ElapsedMilliseconds +"ms", wageSheetItems[0])); } #endregion } }