Browse Source

Merge branch 'develop' of http://132.232.92.186:3000/XinXiBu/OA2023 into develop

wangh 1 year ago
parent
commit
d4d5fb073a
22 changed files with 1062 additions and 77 deletions
  1. 1 1
      OASystem/OASystem.Api/Controllers/AuthController.cs
  2. 79 2
      OASystem/OASystem.Api/Controllers/FinancialController.cs
  3. 48 4
      OASystem/OASystem.Api/Controllers/GroupsController.cs
  4. 81 39
      OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs
  5. 1 1
      OASystem/OASystem.Api/Controllers/SystemController.cs
  6. 330 9
      OASystem/OASystem.Api/OAMethodLib/PayrollComputation.cs
  7. 6 9
      OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/QiYeWeChatApiService.cs
  8. 121 0
      OASystem/OASystem.Domain/Dtos/Financial/ForForeignReceivablesNewDto.cs
  9. 18 0
      OASystem/OASystem.Domain/Dtos/Groups/EnterExitCostDto.cs
  10. 1 1
      OASystem/OASystem.Domain/Dtos/Groups/GroupListDto.cs
  11. 2 1
      OASystem/OASystem.Domain/Dtos/PersonnelModule/WageSheetMonthWorkdaysDto.cs
  12. 2 2
      OASystem/OASystem.Domain/Entities/System/Sys_Calendar.cs
  13. 110 0
      OASystem/OASystem.Domain/ViewModels/Financial/Fin_ForeignReceivablesView.cs
  14. 73 0
      OASystem/OASystem.Domain/ViewModels/Groups/EnterExitCostView.cs
  15. 2 0
      OASystem/OASystem.Domain/ViewModels/PersonnelModule/WageSheetMonthView.cs
  16. 1 1
      OASystem/OASystem.Domain/ViewModels/PersonnelModule/WageSheetView.cs
  17. 2 0
      OASystem/OASystem.Domain/ViewModels/QiYeWeChat/ApprovalDataView.cs
  18. 137 1
      OASystem/OASystem.Infrastructure/Repositories/Financial/ForeignReceivablesRepository.cs
  19. 2 2
      OASystem/OASystem.Infrastructure/Repositories/Groups/DelegationInfoRepository.cs
  20. 36 3
      OASystem/OASystem.Infrastructure/Repositories/Groups/DelegationVisaRepository.cs
  21. 1 1
      OASystem/OASystem.Infrastructure/Repositories/Groups/EnterExitCostRepository.cs
  22. 8 0
      OASystem/OASystem.Infrastructure/Repositories/Login/LoginRepository.cs

+ 1 - 1
OASystem/OASystem.Api/Controllers/AuthController.cs

@@ -230,7 +230,7 @@ namespace OASystem.API.Controllers
             var userData = _loginRep.Register(dto);
             if (userData.Result.Code != 0)
             {
-                return Ok(JsonView(false, "注册失败!"));
+                return Ok(JsonView(false, userData.Result.Msg));
             }
 
             return Ok(JsonView(true, userData.Result.Msg));

+ 79 - 2
OASystem/OASystem.Api/Controllers/FinancialController.cs

@@ -624,6 +624,31 @@ namespace OASystem.API.Controllers
 
         #region 对外收款账单
 
+        /// <summary>
+        /// 对外收款账单 
+        /// 数据源
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostGroupReceivablesDataSource()
+        {
+            try
+            {
+                Result ffrData = await _ForForeignReceivablesRep.PostDataSource();
+                if (ffrData.Code != 0)
+                {
+                    return Ok(JsonView(false, ffrData.Msg));
+                }
+                return Ok(JsonView(true, ffrData.Msg, ffrData.Data));
+            }
+            catch (Exception ex)
+            {
+                return Ok(JsonView(false, ex.Message));
+                throw;
+            }
+        }
 
         /// <summary>
         /// 对外收款账单 
@@ -633,11 +658,63 @@ namespace OASystem.API.Controllers
         /// <returns></returns>
         [HttpPost]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> PostGroupReceivablesInfoByDiId(ForForeignReceivablesInfoDto dto)
+        public async Task<IActionResult> PostGroupReceivablesInfoByDiId(ForForeignReceivablesNewDto dto)
         {
             try
             {
-                Result ffrData = await _ForForeignReceivablesRep.GetGroupReceivablesInfoByDiId(dto);
+                Result ffrData = await _ForForeignReceivablesRep.PostGroupReceivablesInfoByDiId(dto);
+                if (ffrData.Code != 0)
+                {
+                    return Ok(JsonView(false, ffrData.Msg));
+                }
+                return Ok(JsonView(true, ffrData.Msg, ffrData.Data));
+            }
+            catch (Exception ex)
+            {
+                return Ok(JsonView(false, ex.Message));
+                throw;
+            }
+        }
+
+        /// <summary>
+        /// 对外收款账单 
+        /// 添加 And 更新
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostReceivablesSave(ForeignReceivablesSaveDto dto)
+        {
+            try
+            {
+                Result ffrData = await _ForForeignReceivablesRep.PostReceivablesSave(dto);
+                if (ffrData.Code != 0)
+                {
+                    return Ok(JsonView(false, ffrData.Msg));
+                }
+                return Ok(JsonView(true, ffrData.Msg, ffrData.Data));
+            }
+            catch (Exception ex)
+            {
+                return Ok(JsonView(false, ex.Message));
+                throw;
+            }
+        }
+
+        /// <summary>
+        /// 已收账单 
+        /// 删除
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostReceivablesDel(ForeignReceivablesDelDto dto)
+        {
+            try
+            {
+                Result ffrData = await _ForForeignReceivablesRep.PostReceivablesDel(dto);
                 if (ffrData.Code != 0)
                 {
                     return Ok(JsonView(false, ffrData.Msg));

+ 48 - 4
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -366,7 +366,7 @@ namespace OASystem.API.Controllers
 
             GroupStepForDelegation.CreateWorkStep(dto.GroupId); //创建管控流程
 
-            return Ok(JsonView(groupData.Data));
+            return Ok(JsonView(true,"操作成功!",groupData.Data));
         }
 
         
@@ -627,10 +627,13 @@ namespace OASystem.API.Controllers
                     if (updCount > 0 && dto.publishCode == 1) {
 
                         _delegationVisaRep.ChangeDataBase(DBEnum.OA2014DB); //切换到新OA后删除
-                        GroupInfoDto grpDto = new GroupInfoDto() { Id = dto.diId };
-                        var groupData = await _groupRepository.GetGroupInfo(grpDto);
+                        
+                        string sqlDelegation = string.Format(@" Select * From DelegationInfo With(Nolock) Where Id = {0} ", dto.diId);
+                        OA2021_DelegationInfo groupData = _sqlSugar.SqlQueryable<OA2021_DelegationInfo>(sqlDelegation).First();
+                        //GroupInfoDto grpDto = new GroupInfoDto() { Id = dto.diId };
+                        //var groupData = await _groupRepository.GetGroupInfo(grpDto);
                         _delegationVisaRep.ChangeDataBase(DBEnum.OA2023DB); //切换到新OA后删除
-                        if (groupData.Code != 0)
+                        if (groupData == null)
                         {
                             _delegationVisaRep.RollbackTran();
                         }
@@ -2755,6 +2758,47 @@ namespace OASystem.API.Controllers
 
         }
 
+        /// <summary>
+        /// 团组模块 - 出入境国家费用标准 根据城市查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostNationalTravelFeeInfoByCountryAndCity(NationalTravelFeeByCountryAndCityDto dto)
+        {
+            if (dto == null) return Ok(JsonView(false, "请传入参数!"));
+
+            int portId = dto.PortType;
+            if (portId != 1 && portId != 2 && portId != 3) return Ok(JsonView(false, "请输入正确的端口号!\r\n请求端口分类1 Web 2 Android 3 IOS"));
+
+            string whereSql = string.Empty;
+            if (!string.IsNullOrEmpty(dto.Country))
+            {
+                whereSql = string.Format(@"And Country = '{0}' ", dto.Country);
+            }
+
+            if (!string.IsNullOrEmpty(dto.City))
+            {
+                whereSql = string.Format(@"And City = '{0}' ", dto.City);
+            }
+
+            
+            string sql = string.Format(@"Select gntf.Country,gntf.City,gntf.Currency,ssd.Name as CurrencyCode, 
+	                                                ssd.Remark as CurrencyName,gntf.RoomCost,gntf.FoodCost,gntf.PublicCost,
+	                                                gntf.LastUpdateUserId,su.CnName as LastUpdateUserName,gntf.LastUpdateTime 
+                                             From Grp_NationalTravelFee gntf
+                                             Left Join Sys_SetData ssd On ssd.STid = 66 And gntf.Currency = ssd.Id
+                                             Left Join Sys_Users su On gntf.LastUpdateUserId = su.Id 
+                                             Where gntf.Isdel = 0 {0} ", whereSql);
+
+            var nationalTravelFeeData = await _groupRepository._sqlSugar.SqlQueryable<NationalTravelFeeInfoByCountryAndCityView>(sql).FirstAsync();
+
+
+
+            return Ok(JsonView(true, "查询成功!", nationalTravelFeeData));
+
+        }
+
         /// <summary>
         /// 团组模块 - 出入境国家费用标准 - Add Or Update
         /// </summary>

+ 81 - 39
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -6,6 +6,7 @@ using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Domain.ViewModels.PersonnelModule;
 using OASystem.Domain.ViewModels.QiYeWeChat;
 using OASystem.Infrastructure.Repositories.PersonnelModule;
+using System.Collections.Generic;
 using System.Data;
 using System.Diagnostics;
 using System.Globalization;
@@ -45,7 +46,6 @@ namespace OASystem.API.Controllers
 
         #region 工资表单
 
-
         /// <summary>
         /// 工资 月列表
         /// </summary>
@@ -110,68 +110,87 @@ namespace OASystem.API.Controllers
             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);
+            Pm_WageIssueWorkingDay pm_WageIssueWorkingDay1 = new Pm_WageIssueWorkingDay();
+            pm_WageIssueWorkingDay1 = _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();
+            pm_WageIssueWorkingDay1.Workdays = sys_Calendars.Where(it => it.IsWorkDay == true).ToList().Count();
             foreach (var item in sys_Calendars)
             {
-                item.Remark = pm_WageIssueWorkingDay.Remark;
-                item.CreateUserId = pm_WageIssueWorkingDay.CreateUserId;
-                item.CreateTime = pm_WageIssueWorkingDay.CreateTime;
+                item.Remark = pm_WageIssueWorkingDay1.Remark;
+                item.CreateUserId = pm_WageIssueWorkingDay1.CreateUserId;
+                item.CreateTime = pm_WageIssueWorkingDay1.CreateTime;
             }
 
             #endregion
 
             var _sqlSugar = _wageSheetRep._sqlSugar;
-            if (dto.Status == 1)
+            _sqlSugar.BeginTran();
+
+
+            try
             {
-                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)
+
+
+                //月份表是否存在
+                Pm_WageIssueWorkingDay pm_WageIssueWorkingDay = new Pm_WageIssueWorkingDay()
                 {
-                    return Ok(JsonView(false, dto.YearMonth + "日期数据已存在,请前往修改!"));
-                }
+                    YearMonth = dto.YearMonth,
+                    StartDate = dto.StartDate,
+                    EndDate = dto.EndDate,
+                    Workdays = dto.CalendarInfos.Where(it => it.IsWorkDay == true).ToList().Count()
+                };
 
-                _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();
+                string sql = string.Format("Select * From Pm_WageIssueWorkingDay Where Isdel = 0 And YearMonth='{0}'", dto.YearMonth);
+                var workdsys = await _sqlSugar.SqlQueryable<Pm_WageIssueWorkingDay>(sql).FirstAsync();
 
+                if (workdsys == null) //添加
+                {
+                    pm_WageIssueWorkingDay.CreateUserId = dto.UserId;
+                    pm_WageIssueWorkingDay.IsDel = 0;
 
-                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 })
+                    int addId = await _sqlSugar.Insertable(pm_WageIssueWorkingDay).ExecuteReturnIdentityAsync();
+                }
+                else //更新
+                {
+                    int updCount = await _sqlSugar.Updateable(pm_WageIssueWorkingDay).IgnoreColumns(z => new { z.CreateUserId, z.CreateTime, z.DeleteUserId, z.DeleteTime, z.IsDel }).ExecuteCommandAsync();
+                }
+
+                List<Sys_Calendar> sys_Calendars_add = new List<Sys_Calendar>();
+                List<Sys_Calendar> sys_Calendars_update = new List<Sys_Calendar>();
+                sys_Calendars_add = sys_Calendars.Where(it => it.Id == 0).ToList();
+                sys_Calendars_update = sys_Calendars.Where(it => it.Id != 0).ToList();
+
+                int add1 = 0;
+                int upd = 0;
+                if (sys_Calendars_add.Count > 0)
+                {
+                    await _sqlSugar.Insertable(sys_Calendars_add).ExecuteReturnIdentityAsync();
+                }
+                if (sys_Calendars_update.Count > 0)
+                {
+                    await _sqlSugar.Updateable<Sys_Calendar>(sys_Calendars)
+                    .UpdateColumns(it => new { it.Dt, it.IsWorkDay, it.IsHoliDay, it.HoliDayName })
+                    .WhereColumns(it => it.Id)
                     .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(true, "操作成功!"));
+            }
+            catch (Exception ex)
+            {
+                _sqlSugar.RollbackTran();
+                return Ok(JsonView(false, ex.Message));
+            }
 
 
-            return Ok(JsonView(false, "操作失败!"));
         }
 
-
         /// <summary>
         /// 工资表单 基础数据源
         /// </summary>
@@ -789,6 +808,29 @@ namespace OASystem.API.Controllers
             return Ok(JsonView(true, "操作成功!"));
         }
 
+        /// <summary>
+        /// 打卡记录测试
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> Test(string startDt,string endDt) 
+        {
+            UserIdListView userIdListView = await _qiYeWeChatApiService.GetUserIdListAsync();
+            if (userIdListView.errcode != 0)
+            {
+                _result.Msg = "【企业微信】【打卡】【获取员工ID】【Msg】" + userIdListView.errmsg;
+                return Ok(JsonView(false, _result.Msg));
+            }
+
+            List<string> qyWhchatIdList = new List<string>();
+            qyWhchatIdList = userIdListView.dept_user.Select(it => it.userid).ToList();
+
+            var data = await _qiYeWeChatApiService.GetCheckinDataAsync(qyWhchatIdList,2,Convert.ToDateTime(startDt), Convert.ToDateTime(endDt));
+            return Ok(JsonView(true, "操作成功!", data.checkindata));
+        }
+
+
         #endregion
 
     }

+ 1 - 1
OASystem/OASystem.Api/Controllers/SystemController.cs

@@ -74,7 +74,7 @@ namespace OASystem.API.Controllers
                 return Ok(JsonView(false, msgData.Msg));
             }
 
-            return Ok(JsonView(true, msgData.Data));
+            return Ok(JsonView(true,"成功", msgData.Data));
         }
 
         /// <summary>

+ 330 - 9
OASystem/OASystem.Api/OAMethodLib/PayrollComputation.cs

@@ -1,5 +1,6 @@
 using Google.Protobuf.WellKnownTypes;
 using NPOI.HPSF;
+using NPOI.OpenXmlFormats.Dml.Diagram;
 using NPOI.OpenXmlFormats.Spreadsheet;
 using NPOI.SS.Formula.Functions;
 using NPOI.Util;
@@ -12,6 +13,7 @@ using OASystem.Infrastructure.Repositories.Groups;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics.Eventing.Reader;
+using System.Drawing;
 using System.Linq.Expressions;
 using TencentCloud.Ocr.V20181119.Models;
 
@@ -75,8 +77,26 @@ namespace OASystem.API.OAMethodLib
                 _result.Msg = "【企业微信】【打卡】【获取时间段内所有日打卡】【Msg】" + checkInDayDataView.errmsg;
                 return _result;
             }
+
+            //获取所有打卡记录 外出
+            CheckInDataView checkInDataView = new CheckInDataView();
+            checkInDataView = await _qiYeWeChatApiService.GetCheckinDataAsync(qyWhchatIdList, 3,startDt, endDt);
+            if (checkInDataView.errcode != 0)
+            {
+                _result.Msg = "【企业微信】【打卡】【获取时间段内所有日打卡记录】【Msg】" + checkInDataView.errmsg;
+                return _result;
+            }
+
+            //查询工作日
+            List<Sys_Calendar> sys_Calendars = new List<Sys_Calendar>();
+            string sys_sql = string.Format("Select * From Sys_Calendar Where Isdel = 0 And Dt between '{0}' And '{1}'", 
+                startDt.ToString("yyyy-MM-dd"), endDt.ToString("yyyy-MM-dd"));
+            sys_Calendars = await _usersRep._sqlSugar.SqlQueryable<Sys_Calendar>(sys_sql).ToListAsync();
+
             //筛选出工作日日报
-            List<Root> workday_userRoots = checkInDayDataView.datas.Where(it => it.base_info.day_type == 0 && it.base_info.record_type == 1).ToList(); //工作日日报
+            List<Root> workday_userRoots = checkInDayDataView.datas.Where(it => it.base_info.day_type == 0 && it.base_info.record_type == 1).ToList(); 
+
+            //工作日日报
             workday_userRoots = workday_userRoots.OrderBy(it => it.base_info.date).ToList();
 
             //获取 请假类型 Sp_Detail.template_id
@@ -93,7 +113,7 @@ namespace OASystem.API.OAMethodLib
                 foreach (var pm_wsInfo in pm_WageSheetDattaSources)
                 {
                     string itemName = userNames.Where(it => it.Id == pm_wsInfo.UserId).FirstOrDefault().CnName;
-
+                    
 
                     //补贴 金额
                     decimal meal_subsidy = 0.00M;  // 午餐(午餐10元/天)  补贴 * 计算方式:单日上午请假时长(小时)大于或者等于三小时 没有餐补
@@ -135,6 +155,7 @@ namespace OASystem.API.OAMethodLib
                     List<Ex_Items> ex_Items = new List<Ex_Items>();//假勤 And 打卡备注集合
                     Ex_Items ex_Items_dk = new Ex_Items() { Type = "打卡" };    //打卡
                     Ex_Items ex_Items_jq = new Ex_Items() { Type = "假勤" };   //假勤
+                    Ex_Items ex_Items_cc = new Ex_Items() { Type = "出差" };   //出差
                     #endregion
 
 
@@ -152,7 +173,6 @@ namespace OASystem.API.OAMethodLib
                     //userRoots = userRoots.Distinct().ToList();
                     userRoots = userRoots.OrderBy(it => it.base_info.date).ToList();
 
-
                     int dk_work_days = userRoots.Count;   //应出勤天数 
 
                     if (dk_work_days > work_days)
@@ -176,12 +196,23 @@ namespace OASystem.API.OAMethodLib
 
                         int user_probationary_bk_num = 0; 
                                                           
-                                                          
                         decimal user_probationary_bk_decimal = pm_wsInfo.Floats; //绩效工资为0 则为试用员工
 
+                        //处理外出打卡记录
+                        List<CheckInDataInfo> checkInData1 = new List<CheckInDataInfo>();
+                        checkInData1 = checkInDataView.checkindata;
+                        List<CheckInDataInfo> checkInDatas = new List<CheckInDataInfo>();
+                        checkInDatas = checkInData1.Where(it => it.userid == acctid).ToList();
+                        //找出外出的打卡记录
+                        List<CheckInDataInfo> checkInData2 = new List<CheckInDataInfo>();
+                        checkInData2 = checkInDatas.Where(it => it.exception_type.Equals("未打卡")).ToList();
+                        
+
+
                         #region 迟到 早退 旷工
 
                         int user_cd_zt_num = 0; //早退/迟到 次数 10分钟内 2次以内不记处罚 三次及以上50一次
+
                         foreach (var root in userRoots)
                         {
                             List<Holiday_infos> holiday_Infos = root.holiday_infos; //当天假勤信息
@@ -408,15 +439,133 @@ namespace OASystem.API.OAMethodLib
                             }
                         }
 
+                        //List<CheckInDataInfo> checkInDatas1 = new List<CheckInDataInfo>();
+                        //checkInDatas1 = checkInDatas.Where((x, i) => checkInDatas.FindLastIndex(z => z.checkin_time_dt.ToString("yyyy-MM-dd")
+                        //== x.checkin_time_dt.ToString("yyyy-MM-dd")) == i).ToList();
+
+                        //foreach (var checkInData in checkInDatas1)
+                        //{
+                        //    ex_reissuecard_Items.Add(new Ex_Item()
+                        //    {
+                        //        SubTypeId = 11,
+                        //        SubType = "外出打卡",
+                        //        StartTimeDt = Convert.ToDateTime(checkInData.checkin_time_dt.ToString("yyyy-MM-dd HH:mm:ss")),
+                        //        Reason = checkInData.location_title + "(" + checkInData.location_detail + ")"
+                        //    });
+                        //}
+
+                        #region 外出打卡 计算旷工迟到
+                        ////外出打卡 计算旷工迟到
+                        //foreach (var checkInData in checkInDatas1)
+                        //{
+                        //    //当前时间是上午还是下午
+                        //    decimal timelength = 0.00M;
+                        //    string thisTime = string.Format(@"12:00:00");
+                        //    string wcdkTime = checkInData.checkin_time_dt.ToString("HH:mm:ss");
+                        //    DateTime wcdkDt = Convert.ToDateTime(wcdkTime);
+                        //    if (Convert.ToDateTime(thisTime) > wcdkDt) //上午
+                        //    {
+                        //        DateTime amDt = Convert.ToDateTime("09:00:00");
+                        //        timelength = (decimal)(wcdkDt - amDt).TotalMinutes;
+                        //        if (wcdkDt <=  amDt)
+                        //        {
+                        //            continue;
+                        //        }
+                        //    }
+                        //    else //下午
+                        //    {
+                        //        DateTime pmDt = Convert.ToDateTime("18:00:00");
+                        //        DateTime pmDt1 = Convert.ToDateTime("13:30:00");
+                        //        timelength = (decimal)(pmDt1 - wcdkDt).TotalMinutes;
+                        //        if (wcdkDt >= pmDt)
+                        //        {
+                        //            continue;
+                        //        }
+                        //    }
+                        //    if (timelength < 1)
+                        //    {
+                        //        continue;
+                        //    }
+                        //    timelength = ConvertToDecimal(timelength);
+                        //    decimal day_deduction = 0.00M;
+                        //    Ex_Item beLate_belate_ex = new Ex_Item()
+                        //    {
+                        //        SubTypeId = 4,
+                        //        SubType = "旷工",
+                        //        Duration = timelength,
+                        //        StartTimeDt = Convert.ToDateTime(checkInData.checkin_time_dt.ToString("yyyy-MM-dd HH:mm:ss")),
+                        //        Unit = "分钟",
+                        //        Reason = "[外出打卡]"
+                        //    };
+                        //    if (timelength >= 1 && timelength < 10)
+                        //    {
+                        //        user_cd_zt_num++;
+                        //        beLate_belate_ex.SubTypeId = 1;
+                        //        beLate_belate_ex.SubType = "迟到";
+                        //        string thisStartDt = wcdkDt.ToString("yyyy-MM-dd HH:mm:ss");
+                        //        beLate_belate_ex.StartTimeDt = Convert.ToDateTime(thisStartDt);
+                        //        if (user_cd_zt_num >= 3)
+                        //        {
+                        //            day_deduction = 50.00M;
+                        //        }
+                        //        else
+                        //        {
+                        //            day_deduction = 0.00M;
+                        //        }
+                        //        beLate_belate_ex.Reason += "迟到/早退";
+                        //        beLate_deduction += day_deduction; //迟到扣款 总额
+                        //    }
+                        //    else if (timelength >= 10 && timelength <= 60)
+                        //    {
+                        //        beLate_belate_ex.SubType = "迟到";
+                        //        string thisStartDt = wcdkDt.ToString("yyyy-MM-dd HH:mm:ss");
+                        //        beLate_belate_ex.StartTimeDt = Convert.ToDateTime(thisStartDt);
+                        //        day_deduction = 50.00M;
+                        //        beLate_deduction += day_deduction; //迟到扣款 总额
+                        //        beLate_belate_ex.SubTypeId = 1;
+                        //        beLate_belate_ex.Reason += "迟到/早退";
+                        //    }
+                        //    else if (timelength > 60 && timelength <= 180)
+                        //    {
+                        //        day_deduction = ConvertToDecimal(((dailyWage / 7.50M) * 3.00M)); //3小时
+                        //        meal_deduction += 10.00M;  //餐补扣款
+                        //        absenteeism_deduction += day_deduction; //矿工半日
+                        //        beLate_belate_ex.Reason += " 迟到/早退(60分钟) 视为旷工上午(3小时)";
+                        //    }
+                        //    else if (timelength > 180 && timelength <= 270)
+                        //    {
+                        //        day_deduction = ConvertToDecimal(((dailyWage / 7.50M) * 4.50M)); //4小时
+                        //        meal_deduction += 10.00M;  //餐补扣款
+                        //        absenteeism_deduction += day_deduction; //矿工半日
+                        //        beLate_belate_ex.Reason += " 迟到/早退(60分钟) 视为旷工下午(4.5小时)";
+                        //    }
+                        //    else if(timelength > 270)
+                        //    {
+                        //        day_deduction = ConvertToDecimal(dailyWage);
+                        //        absenteeism_deduction += day_deduction; //矿工一日
+                        //        meal_deduction += 10.00M;
+                        //        beLate_belate_ex.Reason += " 迟到/早退 视为旷工一天(7.5小时)";
+                        //    }
+
+                        //    beLate_belate_ex.Deduction = day_deduction;
+                        //    ex_reissuecard_Items.Add(beLate_belate_ex);
+
+                        //}  
+                        #endregion
+
                         #endregion
 
                         #region 假勤/补卡次数 审批
 
                         int leaveNum = 0; //请假次数
-                        int reissuecardNum = 0; //补卡次数\
+                        int reissuecardNum = 0; //补卡次数
+                        int evectionNum = 0; //出差次数
                         //类型:1 - 请假;2 - 补卡;3 - 出差;4 - 外出;100 - 外勤
                         leaveNum = acc_sp_items.Where(it => it.type == 1).ToList().Count();
                         reissuecardNum = acc_sp_items.Where(it => it.type == 2).ToList().Count();
+                        List<Sp_items> acc_sp_items_evection = new List<Sp_items>();
+                        acc_sp_items_evection = acc_sp_items.Where(it => it.type == 3).ToList();
+                        evectionNum = acc_sp_items_evection.Count();
 
                         //请假审批
                         if (leaveNum > 0)
@@ -629,6 +778,41 @@ namespace OASystem.API.OAMethodLib
                                     }
                                 }
                             }
+
+                            //打卡记录里抓取的未打卡数据
+                            foreach (var item in checkInData2)
+                            {
+                                decimal bukaPrice = 0.00M;
+
+                                if (user_probationary_bk_decimal == 0) //计算试用员工补卡次数
+                                {
+                                    if (bukaNum <= 2) bukaPrice = 0.00M;
+                                    else if (bukaNum <= 4 && bukaNum > 2) bukaPrice = 10.00M;
+                                    else bukaPrice = 50.00M;
+
+                                }
+                                else   //计算正式员工补卡次数
+                                {
+                                    if (bukaNum <= 2) bukaPrice = 10.00M;
+                                    else bukaPrice = 50.00M;
+                                }
+
+
+
+                                Ex_Item ex_reissueCard = new Ex_Item()
+                                {
+                                    SubTypeId = 7,
+                                    SubType = "打卡补卡",
+                                    StartTimeDt = Convert.ToDateTime(item.checkin_time_dt.ToString("yyyy-MM-dd HH:mm:ss")),  //未打卡时间
+                                    Deduction = bukaPrice,
+                                    Reason = "[打卡记录]抓取到的未打卡数据!",
+                                    Unit = string.Empty
+                                };
+                                unprinted_deduction += bukaPrice;
+                                ex_reissuecard_Items.Add(ex_reissueCard);
+                                bukaNum++;
+                            }
+
                         }
 
                         if (ex_reissuecard_Items.Count > 0)
@@ -638,6 +822,143 @@ namespace OASystem.API.OAMethodLib
                             ex_Items.Add(ex_Items_dk);
                         }
 
+                        //出差申请
+                        if (evectionNum > 0)
+                        {
+                            List<Sp_Detail> sp_leave_details = new List<Sp_Detail>();
+                            sp_leave_details = await _qiYeWeChatApiService.GetApprovalDetailsAsync(startDt, endDt, acctid, 2, 3); //时间段内所有 已同意的 出差 审批数据
+                            if (sp_leave_details.Count <= 0)
+                            {
+                                _result.Msg += startDt + " - " + endDt + "  " + itemName + "  请假 审批数据获取未获取到!\r\n";
+                                //continue;
+                            }
+                            List<Ex_Item> cc_ex_ItemInfos = new List<Ex_Item>();
+
+                            foreach (Sp_Detail sp_item in sp_leave_details)
+                            {
+                                Apply_data? apply_data = sp_item.apply_data;
+                                if (apply_data != null)
+                                {
+                                    List<ContentsItem> contents = apply_data.contents;
+                                    ContentsItem content_Vacation = contents.Where(it => it.control == "Attendance").FirstOrDefault();  //出差类型 
+                                    ContentsItem content_Textarea = contents.Where(it => it.control == "Textarea").FirstOrDefault(); //多行文本 
+
+                                    if (content_Vacation != null)
+                                    {
+                                        //Vacation vacation = content_Vacation.value.vacation;
+                                        Attendance attendance = content_Vacation.value.attendance; //假勤组件
+                                        //Selector selector = vacation.selector;       //请假类型
+
+                                        //List<OptionsItem> optionsItems = selector.options; //key 请假类型 id
+                                        //List<TitleItem> value = optionsItems[0].value; // value 文本描述值
+
+                                        int leaveType = int.Parse("3");  //key 请假子类型 id
+                                        Date_range date_Range = attendance.date_range;
+
+                                        //筛选 不在工作日内的假勤申请
+                                        if (startDt >= date_Range.new_begin_dt || Convert.ToDateTime(date_Range.new_end_dt.ToString("yyyy-MM-dd")) > endDt)
+                                        {
+                                            continue;
+                                        }
+
+                                        string leave_starttime = date_Range.new_begin_dt.ToString("HH:mm");
+                                        string leave_endtime = date_Range.new_end_dt.ToString("HH:mm");
+
+                                        string typeName = string.Empty;
+                                        string unit = string.Empty;
+                                        int leaveTypeId = leaveType;
+                                        typeName = "出差";
+
+                                        string startTime = string.Empty;
+                                        string endTime = string.Empty;
+                                        string startTime1 = string.Empty;
+                                        string endTime1 = string.Empty;
+                                        //计算请假类型扣款金额
+                                        decimal new_duration = 0.00M;
+                                        if (date_Range.type == "halfday")
+                                        {
+                                            new_duration = Convert.ToDecimal(date_Range.new_duration) / 86400.00M;
+                                            unit = "天";
+                                            startTime = date_Range.new_begin_dt.ToString("yyyy-MM-dd") + " 09:00";
+                                            endTime = date_Range.new_begin_dt.ToString("yyyy-MM-dd") + " 18:00";
+                                            startTime1 = "09:00:00";
+                                            endTime1 = "18:00:00";
+                                        }
+                                        else if (date_Range.type == "hour")
+                                        {
+                                            new_duration = Convert.ToDecimal(date_Range.new_duration) / 3600.00M;
+                                            unit = "小时";
+                                            startTime = date_Range.new_begin_dt.ToString("yyyy-MM-dd HH:mm:ss");
+                                            endTime = date_Range.new_end_dt.ToString("yyyy-MM-dd HH:mm:ss");
+                                            startTime1 = date_Range.new_begin_dt.ToString("HH:mm:ss");
+                                            endTime1 = date_Range.new_end_dt.ToString("HH:mm:ss");
+                                        }
+
+                                        //出差扣款
+                                        decimal cckk = 0.00M;
+
+                                        int days = (int)(date_Range.new_end_dt - date_Range.new_begin_dt).TotalDays;
+                                        for (int i = 0; i <= days; i++)
+                                        {
+                                            DateTime thisDt = date_Range.new_begin_dt.AddDays(i);
+                                            if (thisDt > date_Range.new_end_dt)
+                                            {
+                                                continue;
+                                            }
+
+                                            Sys_Calendar sys_Calendar = new Sys_Calendar();
+                                            sys_Calendar = sys_Calendars.Where(it => it.Dt == thisDt.ToString("yyyy-MM-dd")).FirstOrDefault();
+                                            if (sys_Calendar != null) {
+                                                if (sys_Calendar.IsWorkDay)
+                                                {
+                                                    cckk += 10.00M;
+                                                }
+                                            }
+                                        }
+
+
+                                        meal_deduction += cckk;
+
+
+                                        Ex_Item ex_Item = new Ex_Item()
+                                        {
+                                            SubTypeId = leaveType,
+                                            SubType = typeName,
+                                            StartTimeDt = Convert.ToDateTime(date_Range.new_begin_dt.ToString("yyyy-MM-dd") + " " + startTime1),
+                                            EndTimeDt = Convert.ToDateTime(date_Range.new_end_dt.ToString("yyyy-MM-dd") + " " + endTime1),
+                                            Duration = new_duration,
+                                            Unit = unit,
+                                            Deduction = 0.00M,
+                                            //Reason = apply_data.reason,
+                                            Apply_time_dt = Convert.ToDateTime(sp_item.apply_time_dt.ToString("yyyy-MM-dd HH:mm:ss"))
+                                            //Approval_name = sp_item.approval_name,
+                                        };
+
+                                        cc_ex_ItemInfos.Add(ex_Item);
+
+                                    }
+                                }
+                            }
+
+                            if (cc_ex_ItemInfos.Count > 0)
+                            {
+                                //ex_Items_cc.Ex_ItemInfo = cc_ex_ItemInfos.OrderBy(it => it.StartTimeDt).ThenBy(it => it.Apply_time_dt).ToList();
+                                //ex_Items.Add(ex_Items_cc);
+                                List<Ex_Item> ex_jq_Items = new List<Ex_Item>();
+                                ex_jq_Items = (List<Ex_Item>)ex_Items_jq.Ex_ItemInfo;
+                                ex_jq_Items.AddRange(cc_ex_ItemInfos);
+                                ex_Items.Remove(ex_Items_jq);
+                                ex_Items.Add(
+                                    new Ex_Items()
+                                    {
+                                        Type = "假勤",
+                                        Ex_ItemInfo = ex_jq_Items.OrderBy(it => it.StartTimeDt).ThenBy(it => it.Apply_time_dt).ToList()
+                                    }
+                                    );
+                            }
+                        }
+
+
                         #endregion
 
                     }
@@ -693,10 +1014,10 @@ namespace OASystem.API.OAMethodLib
                     pm_wsInfo.Ex_ItemsRemark = JsonConvert.SerializeObject(ex_Items);  //
                     pm_wsInfo.Mealsupplement = mealTotal;          //餐补
 
-                    pm_wsInfo.Should = salaryTotal;               //应发合计
-                    pm_wsInfo.TotalDeductions = eductionTotal;    //扣款合计
-                    pm_wsInfo.TotalRealHair = actualReleaseTotal - pm_wsInfo.WithholdingTax; //实发合计
-                    pm_wsInfo.AfterTax = actualReleaseTotal - pm_wsInfo.WithholdingTax; //税后工资
+                    pm_wsInfo.Should = ConvertToDecimal( salaryTotal);               //应发合计
+                    pm_wsInfo.TotalDeductions = ConvertToDecimal(eductionTotal);    //扣款合计
+                    pm_wsInfo.TotalRealHair = ConvertToDecimal(actualReleaseTotal - pm_wsInfo.WithholdingTax); //实发合计
+                    pm_wsInfo.AfterTax = ConvertToDecimal(actualReleaseTotal - pm_wsInfo.WithholdingTax); //税后工资
 
                     pm_wsInfo.LastUpdateUserId = userId;
                     pm_wsInfo.LastUpdateDt = DateTime.Now;

+ 6 - 9
OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/QiYeWeChatApiService.cs

@@ -608,16 +608,16 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
             string url = string.Format("/cgi-bin/checkin/getcheckindata?access_token={0}", access_Token.access_token);
 
             DateTime centerDt = startDt.AddDays(30);
+
             long startTs = (long)(startDt - _1970).TotalSeconds;
             long centerTs = (long)(centerDt - _1970).TotalSeconds;
             long endTs = (long)(endDt - _1970).TotalSeconds;
-
             CheckInData_Request checkInData_Req = new CheckInData_Request()
             {
                 access_token = access_Token.access_token,
-                opencheckindatatype = opencheckindatatype, 
+                opencheckindatatype = opencheckindatatype,
                 useridlist = useridlist,
-                starttime = startTs, 
+                starttime = startTs,
                 endtime = centerTs
             };
 
@@ -629,11 +629,8 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
             checkInDataView = System.Text.Json.JsonSerializer.Deserialize<CheckInDataView>(stringResponse,
                 new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
 
-            if (checkInDataView.errcode != 0)
-            {
-                return checkInDataView;
-            }
-            if (centerTs != endTs)
+
+            if (centerDt < endDt)
             {
                 checkInData_Req.starttime = centerTs;
                 checkInData_Req.endtime = endTs;
@@ -645,7 +642,7 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI
 
                 CheckInDataView checkInDataView1 = System.Text.Json.JsonSerializer.Deserialize<CheckInDataView>(stringResponse1,
                     new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
-                if (checkInDataView1.errcode !=  0)
+                if (checkInDataView1.errcode != 0)
                 {
                     return checkInDataView1;
                 }

+ 121 - 0
OASystem/OASystem.Domain/Dtos/Financial/ForForeignReceivablesNewDto.cs

@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Financial
+{
+    /// <summary>
+    /// 财务模块
+    /// 对外收款
+    /// </summary>
+    public class ForForeignReceivablesNewDto : PortDtoBase
+    {
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        public int DiId { get; set; }
+    }
+
+    /// <summary>
+    /// 财务模块
+    /// 收款账单
+    /// Add or Update Info
+    /// </summary>
+    public class ForeignReceivablesSaveDto : PortDtoBase
+    {
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        public int DiId { get; set; }
+
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public int UserId { get; set; }
+
+        /// <summary>
+        /// 财务模块
+        /// Add or Update Info
+        /// </summary>
+        public List<ForeignReceivablesInfoNew>? foreignReceivablesInfos { get; set; }
+    }
+
+    /// <summary>
+    /// 财务模块
+    /// Add or Update Info
+    /// </summary>
+    public class ForeignReceivablesInfoNew
+    {
+        /// <summary>
+        /// 主键编号
+        /// id=0 时添加
+        /// 其他值时 修改
+        /// </summary>
+        public int Id { get; set; }
+        /// <summary>
+        /// 费用名称
+        /// </summary>
+        public string? PriceName { get; set; }
+
+        /// <summary>
+        /// 费用
+        /// </summary>
+        public decimal Price { get; set; }
+
+        /// <summary>
+        /// 数量
+        /// </summary>
+        public int Count { get; set; }
+
+        /// <summary>
+        /// 单位
+        /// </summary>
+        public string? Unit { get; set; }
+
+        /// <summary>
+        /// 单项总和
+        /// </summary>
+        public decimal ItemSumPrice { get; set; }
+
+        /// <summary>
+        /// 汇率
+        /// </summary>
+        public decimal Rate { get; set; }
+
+        /// <summary>
+        /// 币种
+        /// </summary>
+        public int Currency { get; set; }
+
+        /// <summary>
+        /// 添加方式   
+        /// 0 - 账单页面添加   1 - 预算成本页面添加
+        /// </summary>
+        public int AddingWay { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string? Remark { get; set; }
+    }
+
+
+    /// <summary>
+    /// 财务模块
+    /// 收款账单
+    /// Del
+    /// </summary>
+    public class ForeignReceivablesDelDto : PortDtoBase
+    {
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public int UserId { get; set; }
+
+
+        public int Id { get; set; }
+
+    }
+}

+ 18 - 0
OASystem/OASystem.Domain/Dtos/Groups/EnterExitCostDto.cs

@@ -234,6 +234,24 @@ namespace OASystem.Domain.Dtos.Groups
         public string City { get; set; }
     }
 
+    /// <summary>
+    /// 团组模块 - 出入境国家费用标准 
+    /// 根据国家城市查询Dto
+    /// </summary>
+    public class NationalTravelFeeByCountryAndCityDto : PortDtoBase
+    {
+        /// <summary>
+        /// 国家
+        /// </summary>
+        public string Country { get; set; }
+
+        /// <summary>
+        /// 城市
+        /// </summary>
+        public string City { get; set; }
+
+    }
+
     /// <summary>
     /// 出入境费用子项删除
     /// </summary>

+ 1 - 1
OASystem/OASystem.Domain/Dtos/Groups/GroupListDto.cs

@@ -220,7 +220,7 @@ namespace OASystem.Domain.Dtos.Groups
     /// <summary>
     /// 确认出团dto
     /// </summary>
-    public class ConfirmationGroupDto:DtoBase 
+    public class ConfirmationGroupDto:PortDtoBase 
     {
         /// <summary>
         /// 团组Id

+ 2 - 1
OASystem/OASystem.Domain/Dtos/PersonnelModule/WageSheetMonthWorkdaysDto.cs

@@ -17,8 +17,9 @@ namespace OASystem.Domain.Dtos.PersonnelModule
     /// <summary>
     /// 添加 Or 修改
     /// </summary>
-    public class WageSheetMonthWorkdaysAddOrEditDto : OpBaseDto
+    public class WageSheetMonthWorkdaysAddOrEditDto 
     {
+        public int UserId { get; set; }
         /// <summary>
         /// 年月
         /// </summary>

+ 2 - 2
OASystem/OASystem.Domain/Entities/System/Sys_Calendar.cs

@@ -19,10 +19,10 @@ namespace OASystem.Domain.Entities.System
         public string Dt { get; set; }
         /// <summary>
         /// 是否是工作日
-        ///  0 true 1 false
+        ///  true  false
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "bit")]
-        public bool IsWorkDays { get; set; }
+        public bool IsWorkDay { get; set; }
 
         /// <summary>
         /// 是否是节假日

+ 110 - 0
OASystem/OASystem.Domain/ViewModels/Financial/Fin_ForeignReceivablesView.cs

@@ -128,4 +128,114 @@ namespace OASystem.Domain.ViewModels.Financial
         /// </summary>
         public List<ProceedsReceivedView>? _ProceedsReceivedDatas { get; set; }
     }
+
+
+    #region 不关联已收账单
+
+    /// <summary>
+    /// 团组已收款项Info View
+    /// </summary>
+    public class ProceedsReceivedNewView
+    {
+        /// <summary>
+        /// 主键ID
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        public int Diid { get; set; }
+
+        /// <summary>
+        /// 费用名称
+        /// </summary>
+        public string? PriceName { get; set; }
+
+        /// <summary>
+        /// 费用
+        /// </summary>
+        public decimal Price { get; set; }
+
+        /// <summary>
+        /// 数量
+        /// </summary>
+        public int Count { get; set; }
+
+        /// <summary>
+        /// 单位
+        /// </summary>
+        public string? Unit { get; set; }
+
+        /// <summary>
+        /// 单项总和
+        /// </summary>
+        public decimal ItemSumPrice { get; set; }
+
+        /// <summary>
+        /// 付款方
+        /// </summary>
+        public string? To { get; set; }
+
+        /// <summary>
+        /// 付款方电话
+        /// </summary>
+        public string? ToTel { get; set; }
+
+        /// <summary>
+        /// 付款日期
+        /// </summary>
+        public string? PayDate { get; set; }
+
+        /// <summary>
+        /// 付款注意事项
+        /// </summary>
+        public string? Attention { get; set; }
+
+        /// <summary>
+        /// 汇率
+        /// </summary>
+        public decimal Rate { get; set; }
+
+        /// <summary>
+        /// 币种
+        /// </summary>
+        public int Currency { get; set; }
+
+        /// <summary>
+        /// 添加方式   
+        /// 0 - 账单页面添加   1 - 预算成本页面添加
+        /// </summary>
+        public int AddingWay { get; set; }
+
+        /// <summary>
+        /// 添加方式描述
+        /// </summary>
+        public string? AddingModeName
+        {
+            get
+            {
+
+                string str = "";
+                if (AddingWay == 0) str = "账单模块";
+                else if (AddingWay == 1) str = "成本预算模块";
+
+                return str;
+            }
+        }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string? Remark { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime? CreateTime { get; set; }
+    }
+
+
+
+    #endregion
 }

+ 73 - 0
OASystem/OASystem.Domain/ViewModels/Groups/EnterExitCostView.cs

@@ -170,6 +170,79 @@ namespace OASystem.Domain.ViewModels.Groups
 
     }
 
+    /// <summary>
+    /// 出入境国家(城市)费用标准 Info  View
+    /// </summary>
+    public class NationalTravelFeeInfoByCountryAndCityView
+    {
+        /// <summary>
+        /// 洲别
+        /// </summary>
+        public string? Continent { get; set; }
+
+        /// <summary>
+        /// 国家
+        /// </summary>
+        public string? Country { get; set; }
+
+        /// <summary>
+        /// 城市
+        /// </summary>
+        public string? City { get; set; }
+
+        /// <summary>
+        /// 币种
+        /// Sys_SetData STid=66
+        /// </summary>
+        public int Currency { get; set; }
+
+        /// <summary>
+        /// 币种code
+        /// </summary>
+        public string CurrencyCode { get; set; }
+
+        /// <summary>
+        /// 币种名称
+        /// </summary>
+        public string CurrencyName { get; set; }
+
+        /// <summary>
+        /// 住宿费
+        /// </summary>
+        public decimal RoomCost { get; set; }
+
+        /// <summary>
+        /// 伙食费
+        /// </summary>
+        public decimal FoodCost { get; set; }
+
+        /// <summary>
+        /// 公杂费 
+        /// </summary>
+        public decimal PublicCost { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string Remark { get; set; }
+
+        /// <summary>
+        /// 最后更新人 
+        /// </summary>
+        public int LastUpdateUserId { get; set; }
+
+        /// <summary>
+        /// 最后更新人
+        /// </summary>
+        public string LastUpdateUserName { get; set; }
+
+        /// <summary>
+        /// 最后更新时间 
+        /// </summary>
+        public DateTime? LastUpdateTime { get; set; } = DateTime.Now;
+
+    }
+
     /// <summary>
     /// 出入境费用info
     /// </summary>

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

@@ -37,6 +37,8 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
     /// </summary>
     public class CalendarInfoView
     {
+        public int Id { get; set; }
+
         /// <summary>
         /// 日期 
         /// Eg:yyyy-MM-dd

+ 1 - 1
OASystem/OASystem.Domain/ViewModels/PersonnelModule/WageSheetView.cs

@@ -479,7 +479,7 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
         /// </summary>
         public string? Type { get; set; }
 
-        public Object? Ex_ItemInfo { get; set; }
+        public Object Ex_ItemInfo { get; set; }
     }
 
 

+ 2 - 0
OASystem/OASystem.Domain/ViewModels/QiYeWeChat/ApprovalDataView.cs

@@ -361,6 +361,8 @@ namespace OASystem.Domain.ViewModels.QiYeWeChat
         /// </summary>
         public List<Related_Approval> related_approval { get; set; }
 
+        public Attendance attendance { get; set; }
+
         ///// <summary>
         ///// 
         ///// </summary>

+ 137 - 1
OASystem/OASystem.Infrastructure/Repositories/Financial/ForeignReceivablesRepository.cs

@@ -109,7 +109,6 @@ namespace OASystem.Infrastructure.Repositories.Financial
 
         }
 
-
         /// <summary>
         /// 应收款项 删除
         /// </summary>
@@ -269,7 +268,144 @@ namespace OASystem.Infrastructure.Repositories.Financial
 
         #endregion
 
+        #region 未关联已收款项
+
+        /// <summary>
+        /// 收款账单 数据源
+        /// </summary>
+        /// <returns></returns>
+        public async Task<Result> PostDataSource()
+        {
+            Result result = new() { Code = -2 };
+
+            var groupNameData = await _delegationRep.GetGroupNameList(new GroupNameDto());
+            var currencyData = await _setDataRep.GetSetDataBySTId(_setDataRep, 66); //币种
+            var remittanceMethodData = await _setDataRep.GetSetDataBySTId(_setDataRep, 14); //汇款方式
+
+            result.Code = 0;
+            result.Msg = "成功!";
+            result.Data = new
+            {
+                GroupNameData = groupNameData.Data,
+                CurrencyData = currencyData.Data,
+                RemittanceMethodData = remittanceMethodData.Data
+            };
+
+            return result;
+        }
+
+        /// <summary>
+        /// 根据diid查询团组应收款项
+        /// </summary>
+        /// <param name="diid"></param>
+        /// <returns></returns>
+        public async Task<Result> PostGroupReceivablesInfoByDiId(ForForeignReceivablesNewDto dto)
+        {
+            Result result = new() { Code = -2 };
+
+            var groupInfoData = await _delegationRep.GetGroupInfo(new GroupInfoDto() { Id = dto.DiId });
+
+            //应收款项
+            string groupReceivedSql = string.Format(@"Select * From Fin_ForeignReceivables Where IsDel=0 And Diid={0}", dto.DiId);
+            var groupReceivedList = await _sqlSugar.SqlQueryable<ProceedsReceivedNewView>(groupReceivedSql).ToListAsync();
+
+            result.Code = 0;
+            result.Msg = "查询成功!";
+            result.Data = new
+            {
+                GroupInfo = groupInfoData.Data,
+                GroupCollectionStatementData = groupReceivedList
+            };
 
+            return result;
+
+        }
+
+        /// <summary>
+        /// 财务模块
+        /// 收款账单 Add And Update
+        /// </summary>
+        /// <param name="diid"></param>
+        /// <returns></returns>
+        public async Task<Result> PostReceivablesSave(ForeignReceivablesSaveDto dto)
+        {
+            Result result = new() { Code = -2 };
+
+            if (dto.foreignReceivablesInfos.Count <= 0)
+            {
+                result.Msg = "收款账单没有信息,不能进行,添加或修改操作!!!";
+                return result;
+            }
+
+            int addCount = 0, updateCount = 0;
+            if (dto.PortType == 1)
+            {
+                List<Fin_ForeignReceivables> _ForeignReceivables = new List<Fin_ForeignReceivables>();
+                foreach (var item in dto.foreignReceivablesInfos)
+                {
+                    _ForeignReceivables.Add(new Fin_ForeignReceivables()
+                    {
+                        Diid = dto.DiId,
+                        Id = item.Id,
+                        PriceName = item.PriceName,
+                        Price = item.Price,
+                        Count = item.Count,
+                        Unit = item.Unit,
+                        ItemSumPrice = item.ItemSumPrice,
+                        Rate = item.Rate,
+                        Currency = item.Currency,
+                        AddingWay = item.AddingWay,
+                        CreateUserId = dto.UserId,
+                        CreateTime = DateTime.Now,
+                        Remark = item.Remark
+                    });
+                }
+                if (_ForeignReceivables.Count > 0)
+                {
+                    var x = _sqlSugar.Storageable(_ForeignReceivables).ToStorage();
+                    addCount = x.AsInsertable.ExecuteCommand();        //不存在插入
+                    updateCount = x.AsUpdateable.ExecuteCommand();    //存在更新
+                }
+                result.Code = 0;
+                result.Msg = string.Format(@"操作成功!添加:{0}条;更新:{1};", addCount, updateCount);
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 财务模块
+        /// 收款账单 
+        /// Del
+        /// </summary>
+        /// <param name="diid"></param>
+        /// <returns></returns>
+        public async Task<Result> PostReceivablesDel(ForeignReceivablesDelDto dto)
+        {
+            Result result = new() { Code = -2 };
+           var delStatus = await _sqlSugar.Updateable<Fin_ForeignReceivables>()
+                                     .SetColumns(a => new Fin_ForeignReceivables
+                                     {
+                                         IsDel = 1,
+                                         DeleteUserId = dto.UserId,
+                                         DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+                                     })
+                                     .Where(a => a.Id == dto.Id)
+                                     .ExecuteCommandAsync();
+
+            if (delStatus > 0)
+            {
+                result.Msg = "操作成功!";
+                result.Code = 0;
+            }
+            else
+            {
+                result.Msg = "操作成功!";
+            }
+            return result;
+        }
+
+        #endregion
 
     }
 }

+ 2 - 2
OASystem/OASystem.Infrastructure/Repositories/Groups/DelegationInfoRepository.cs

@@ -590,11 +590,11 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 if (deleteStatus)
                 {
                     result.Code = 0;
-                    result.Msg = "确认出团成功!";
+                    result.Msg = "确认出团设置成功!";
                 }
                 else
                 {
-                    result.Msg = "确认出团失败!";
+                    result.Msg = "确认出团设置失败!";
                 }
 
             }

+ 36 - 3
OASystem/OASystem.Infrastructure/Repositories/Groups/DelegationVisaRepository.cs

@@ -39,15 +39,48 @@ From DelegationInfo With(Nolock) {2}
 
             foreach (var item in dataSource)
             {
-                string sql2 = string.Format(@" Select * From Grp_VisaProgressCustomer With(Nolock) Where DiId={0} And IsDel=0 ", item.DiId);
-                List<Grp_VisaProgressCustomer> listComplete = _sqlSugar.SqlQueryable<Grp_VisaProgressCustomer>(sql2).ToList();
+                //string sql2 = string.Format(@" Select * From Grp_VisaProgressCustomer With(Nolock) Where DiId={0} And IsDel=0 ", item.DiId);
+                //List<Grp_VisaProgressCustomer> listComplete = _sqlSugar.SqlQueryable<Grp_VisaProgressCustomer>(sql2).ToList();
+                ChangeDataBase(DBEnum.OA2023DB);
+                string sql2 = string.Format(@" Select WorkStatus as code,COUNT(1) as nums From Grp_VisaProgressCustomer With(Nolock) Where DiId={0} And IsDel=0 Group by WorkStatus ", item.DiId);
+                List<dynamic> listComplete = _sqlSugar.SqlQueryable<dynamic>(sql2).ToList();
+                int totalCount = 0;
+
+
+                //未作详细描述文本
+                int count_0 = 0;
+                int count_1 = 0;
+                int count_2 = 0;
+                int count_3 = 0;
+                foreach (var comCount in listComplete)
+                {
+                    switch (comCount.code)
+                    {
+                        case 0: count_0 = comCount.nums; break;
+                        case 1: count_1 = comCount.nums; break;
+                        case 2: count_2 = comCount.nums; break;
+                        case 3: count_3 = comCount.nums; break;
+                        default:
+                            break;
+                    }
+                    totalCount += comCount.nums;
+                }
 
-                item.CompletePNumber = string.Format(@"已完成{0}人", listComplete.Count);
+                int comNums = totalCount - count_0;
+
+                if (comNums > 0)
+                {
+                    item.CompletePNumber = string.Format(@"{0} / {1}", comNums, totalCount);
+                }
+                else {
+                    item.CompletePNumber = "跳转配置";
+                }
             }
             rst.DataList = new List<Grp_DelegationVisaView>(dataSource);
 
             if (rst.DataList.Count > 0)
             {
+                ChangeDataBase(DBEnum.OA2014DB);
                 string sqlCount = string.Format(@" Select Id as DiId From DelegationInfo With(Nolock) {0} ", sqlWhere);
                 int dataCount = _sqlSugar.SqlQueryable<Grp_DelegationVisaView>(sqlCount).Count();
                 rst.DataCount = dataCount;

+ 1 - 1
OASystem/OASystem.Infrastructure/Repositories/Groups/EnterExitCostRepository.cs

@@ -224,7 +224,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
             {
 
                 var _nationalTravelFee = _sqlSugar.Storageable<Grp_NationalTravelFee>(nationalTravelFee).ToStorage();
-                if (dto.Id != 0) //新增
+                if (dto.Id == 0) //新增
                 {
                     string selectSql = string.Format(@"Select * From Grp_NationalTravelFee 
                                                    Where IsDel = 0 

+ 8 - 0
OASystem/OASystem.Infrastructure/Repositories/Login/LoginRepository.cs

@@ -104,6 +104,14 @@ namespace OASystem.Infrastructure.Repositories.Login
 
             string number = await CreateNumber(registerDto.DepId);
 
+            if (string.IsNullOrEmpty(number))
+            {
+                result.Code = -2;
+                result.Msg = "Number 设置失败,请前往对应部门 备注;里 设置Number前缀!";
+
+                return result;
+            }
+
             Sys_Users _userInfo = new Sys_Users()
             {
                 CnName = registerDto.CnName,