Преглед на файлове

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

yuanrf преди 2 месеца
родител
ревизия
8b49016eeb
променени са 19 файла, в които са добавени 761 реда и са изтрити 285 реда
  1. 0 1
      OASystem/OASystem.Api/Controllers/FinancialController.cs
  2. 71 28
      OASystem/OASystem.Api/Controllers/GroupsController.cs
  3. 17 1
      OASystem/OASystem.Api/Controllers/ResourceController.cs
  4. 70 27
      OASystem/OASystem.Api/Controllers/StatisticsController.cs
  5. 1 1
      OASystem/OASystem.Api/Middlewares/RecordAPIOperationMiddleware.cs
  6. 2 7
      OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/AppNotice/Library.cs
  7. 31 1
      OASystem/OASystem.Api/appsettings.json
  8. 11 0
      OASystem/OASystem.Domain/Dtos/Financial/DailyFeePaymentDto.cs
  9. 7 0
      OASystem/OASystem.Domain/Dtos/Groups/EnterExitCostDto.cs
  10. 6 0
      OASystem/OASystem.Domain/Entities/Financial/Fin_DailyFeePayment.cs
  11. 63 0
      OASystem/OASystem.Domain/Entities/Groups/Grp_EnterExitCostQuote.cs
  12. 3 1
      OASystem/OASystem.Domain/ViewModels/Financial/Fin_DailyFeePaymentView.cs
  13. 5 1
      OASystem/OASystem.Domain/ViewModels/Groups/EnterExitCostDraftView.cs
  14. 31 1
      OASystem/OASystem.Domain/ViewModels/Groups/EnterExitCostView.cs
  15. 1 1
      OASystem/OASystem.Domain/ViewModels/Statistics/CorporateProfitViews.cs
  16. 92 1
      OASystem/OASystem.Domain/ViewModels/Statistics/GroupStatementView.cs
  17. 13 22
      OASystem/OASystem.Infrastructure/Repositories/Financial/DailyFeePaymentRepository.cs
  18. 141 68
      OASystem/OASystem.Infrastructure/Repositories/Groups/EnterExitCostDraftRepository.cs
  19. 196 124
      OASystem/OASystem.Infrastructure/Repositories/Groups/EnterExitCostRepository.cs

+ 0 - 1
OASystem/OASystem.Api/Controllers/FinancialController.cs

@@ -89,7 +89,6 @@ namespace OASystem.API.Controllers
             var currUserInfo = JwtHelper.SerializeJwt(HttpContext.Request.Headers.Authorization);
             if (currUserInfo == null) return Ok(JsonView(false, "请传入token!"));
 
-
             var result = await _daiRep.GetPagePriceTypeData(dto,currUserInfo.UserId);
 
             if (result == null || result.Code != 0)

+ 71 - 28
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -5475,6 +5475,7 @@ FROM
         /// </summary>
         /// <returns></returns>
         [HttpPost]
+        //[ApiLog("Grp_EnterExitCost", OperationEnum.Details)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> GetEnterExitCostInfobyDiId(EnterExitCostInfobyDiIdDto dto)
         {
@@ -5533,6 +5534,7 @@ FROM
         /// </summary>
         /// <returns></returns>
         [HttpPost]
+        [ApiLog("Grp_EnterExitCost",OperationEnum.Add)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostEnterExitCostOperate(EnterExitCostOperateDto dto)
         {
@@ -5650,6 +5652,7 @@ FROM
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost]
+        //[ApiLog("Grp_EnterExitCost", OperationEnum.Download)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostEnterExitCostDownload(EnterExitCostDownloadDto dto)
         {
@@ -7225,6 +7228,7 @@ FROM
         /// </summary>
         /// <returns></returns>
         [HttpPost]
+        //[ApiLog("Grp_EnterExitCost", OperationEnum.Del)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostEnterExitCostOneClickClear(EnterExitCostOneClickClearDto dto)
         {
@@ -7256,6 +7260,7 @@ FROM
         /// </summary>
         /// <returns></returns>
         [HttpPost]
+        //[ApiLog("Grp_EnterExitCost", OperationEnum.Del)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostEnterExitCostSubItemDel(EnterExitCostSubItemDelDto dto)
         {
@@ -7282,6 +7287,7 @@ FROM
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost]
+        //[ApiLog("Grp_EnterExitCost", OperationEnum.Del)]
         public IActionResult DeleteOtherExpenses(EnterExitCostSubItemDelDto dto)
         {
             var jw = JsonView(false, "删除失败!");
@@ -7682,6 +7688,7 @@ FROM
         /// </summary>
         /// <returns></returns>
         [HttpPost]
+        //[ApiLog("Grp_EnterExitCostDraft", OperationEnum.Details)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> EnterExitCostDraftInfoById(EnterExitCostDraftInfoByIdDto dto)
         {
@@ -7737,6 +7744,7 @@ FROM
         /// </summary>
         /// <returns></returns>
         [HttpPost]
+        [ApiLog("Grp_EnterExitCostDraft", OperationEnum.Add)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> EnterExitCostDraftOp(EnterExitCostDraftOpDto dto)
         {
@@ -7760,6 +7768,7 @@ FROM
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost]
+        //[ApiLog("Grp_EnterExitCostDraft", OperationEnum.Download)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> EnterExitCostDraftDownload(EnterExitCostDraftDownloadDto dto)
         {
@@ -8145,7 +8154,7 @@ FROM
 
                             #endregion
                         }
-                        else dic.Add("SubPX", $"六、培训费合计:  0    元/人");
+                        //else dic.Add("SubPX", $"六、培训费合计:  0    元/人");
                         //删除多余行
                         while (table4.Rows.Count > table4Row)
                         {
@@ -8195,7 +8204,8 @@ FROM
 
                             #endregion
                         }
-                        else dic.Add("SubQT", "七、其他费用合计:  0    元/人");
+                        //else dic.Add("SubQT", "七、其他费用合计:  0    元/人");
+                        
                         //删除多余行
                         while (table5.Rows.Count > table5Row)
                         {
@@ -8209,16 +8219,28 @@ FROM
                                 subGWC = 0.00M,
                                 subTDC = 0.00M;
 
+                        //全部费用总计: 元 / 人(经济舱)  元 / 人(公务舱)  元 / 人(头等舱)
+                        string totalLabel = string.Format("全部费用总计:");
                         //经济舱
-                        if (_EnterExitCosts.SumJJC == 1) subJJC = otherFeeTotal + _EnterExitCosts.OutsideJJPay;
+                        if (_EnterExitCosts.SumJJC == 1)
+                        {
+                            subJJC = otherFeeTotal + _EnterExitCosts.OutsideJJPay;
+                            totalLabel += $"{subJJC.ToString("#0.00")} 元/人(经济舱)";
+                        }
                         //公务舱
-                        if (_EnterExitCosts.SumGWC == 1) subGWC = otherFeeTotal + _EnterExitCosts.OutsideGWPay;
+                        if (_EnterExitCosts.SumGWC == 1)
+                        {
+                            subGWC = otherFeeTotal + _EnterExitCosts.OutsideGWPay;
+                            totalLabel += $"{subGWC.ToString("#0.00")} 元/人(公务舱)";
+                        }
                         //头等舱
-                        if (_EnterExitCosts.SumTDC == 1) subTDC = otherFeeTotal + _EnterExitCosts.OutsideTDPay;
-
-                        dic.Add("SubJJC", subJJC.ToString("#0.00"));
-                        dic.Add("SubGWC", subGWC.ToString("#0.00"));
-                        dic.Add("SubTDC", subTDC.ToString("#0.00"));
+                        if (_EnterExitCosts.SumTDC == 1)
+                        {
+                            subTDC = otherFeeTotal + _EnterExitCosts.OutsideTDPay;
+                            totalLabel += $"{subTDC.ToString("#0.00")} 元/人(头等舱)";
+                        }
+                        //TotalLabel
+                        dic.Add("TotalLabel", totalLabel);
 
                         #region 填充word模板书签内容
                         foreach (var key in dic.Keys)
@@ -8832,12 +8854,12 @@ FROM
             return _city;
         }
 
-
         /// <summary>
         /// 团组模块 - 出入境费用-草稿 - 一键清空
         /// </summary>
         /// <returns></returns>
         [HttpPost]
+        //[ApiLog("Grp_EnterExitCostDraft", OperationEnum.Del)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> EnterExitCostDraftOneClickEmpty(EnterExitCostDraftOneClickEmptyDto dto)
         {
@@ -8859,6 +8881,7 @@ FROM
         /// </summary>
         /// <returns></returns>
         [HttpPost]
+        //[ApiLog("Grp_EnterExitCostDraft", OperationEnum.Del)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> EnterExitCostDraftSubItemDel(EnterExitCostDraftSubItemDelDto dto)
         {
@@ -8878,6 +8901,7 @@ FROM
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost]
+        //[ApiLog("Grp_EnterExitCostDraft", OperationEnum.Del)]
         public IActionResult EnterExitCostDraftOtherExpensesDel(EnterExitCostDraftOtherExpensesDelDto dto)
         {
             var jw = JsonView(false, "删除失败!");
@@ -8963,22 +8987,8 @@ FROM
                     }
                 }
 
-
-                var permissionUsers = await _enterExitCostRep.PermissionViewUsersAsync();
-                var userIds = permissionUsers.Select(x => x.Id).ToList();
-                var permissions = new List<Grp_EnterExitCostPermission>();
-                if (userIds.Any())
-                {
-                    foreach (var userId1 in userIds)
-                    {
-                        permissions.Add(new Grp_EnterExitCostPermission()
-                        {
-                            GroupId = groupId,
-                            UserId = userId1,
-                            CreateUserId = dto.UserId
-                        });
-                    }
-                }
+                //默认添加查看、编辑权限(创建人、自己) 
+                await _enterExitCostRep.InitPerm(dto.GroupId,dto.UserId);
 
                 var dayDatas = _sqlSugar.Queryable<Grp_DayAndCostDraft>().Where(x => x.IsDel == 0 && x.ParentId == draftId).ToList();
                 var otherDatas = _sqlSugar.Queryable<Grp_DayOtherPriceDraft>().Where(x => x.IsDel == 0 && x.ParentId == draftId).ToList();
@@ -9028,12 +9038,15 @@ FROM
                     return Ok(JsonView(false, "草稿数据导入失败!"));
                 }
 
-                if (permissions.Any()) _sqlSugar.Insertable(permissions).ExecuteCommand();
-
                 if (newDayDatas.Any()) _sqlSugar.Insertable(newDayDatas).ExecuteCommand();
 
                 if (newOtherDatas.Any()) _sqlSugar.Insertable(newOtherDatas).ExecuteCommand();
 
+
+                #region 默认添加权限
+
+                #endregion
+
                 _sqlSugar.CommitTran();
 
                 //执行操作之后
@@ -10481,6 +10494,36 @@ WHERE
 
         #region 团组经理模块 出入境费用-草稿 移动端(Android/IOS)
 
+        /// <summary>
+        /// 团组模块 - 出入境费用-草稿-移动端 - 草稿名称数据Data
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> EnterExitCostDraftMobileNameData(EnterExitCostDraftMobileNameDataDto dto)
+        {
+            if (!_portTypeData.Contains(dto.PortType)) return Ok(JsonView(false, MsgTips.Port));
+            if (dto.CurrUserId < 1) return Ok(JsonView(false, MsgTips.UserId));
+
+            RefAsync<int> total = 0;
+
+            var data = await _sqlSugar.Queryable<Grp_EnterExitCostDraft>()
+                .Where(x => x.IsDel == 0 && !string.IsNullOrEmpty(x.DraftName))
+                .WhereIF(!string.IsNullOrEmpty(dto.DraftName), x => x.DraftName.Contains(dto.DraftName))
+                .Select(x => new
+                {
+                    Id = x.Id,
+                    DraftName = x.DraftName,
+                    IsViewOrEdit = SqlFunc.Subqueryable<Grp_EnterExitCostDraftPermission>()
+                                          .Where(x1 => x1.IsDel == 0 && x1.Permission == 1 && x1.DraftId == x.Id && x1.UserId == dto.CurrUserId)
+                                          .Any()
+                })
+                .OrderByDescending(x => x.Id)
+                .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
+
+            return Ok(JsonView(true, "查询成功!", data, total));
+        }
+
         /// <summary>
         /// 出入境费用-草稿 移动端
         /// 获取币种基础数据(含逻辑处理)

+ 17 - 1
OASystem/OASystem.Api/Controllers/ResourceController.cs

@@ -2017,6 +2017,14 @@ Inner Join Sys_Department as d With(Nolock) On u.DepId=d.Id Where m.Id={0} ", _m
             var data = _sqlSugar.Queryable<Sys_SetData>().Where(a => a.IsDel == 0).ToList();
             var data1 = data.Where(a => a.STid == 38).Select(x => new { x.Id, x.Name }).ToList();
             var data2 = data.Where(a => a.STid == 101).Select(x => new { x.Id, x.Name }).ToList();
+            //张总安排未参与对接
+            if (data2.Any(x => x.Name.Equals("张总安排未参与对接")))
+            {
+                var zhangZong = data2.FirstOrDefault(x => x.Name.Equals("张总安排未参与对接"));
+                if (zhangZong != null) data2.Remove(zhangZong);
+                data2.Insert(0, zhangZong);
+            }
+
             var data3 = data.Where(a => a.STid == 66).Select(x => new { x.Id, x.Name, x.Remark }).ToList();
 
             var _DeleFile = _sqlSugar.Queryable<Grp_DeleFile>().Where(a => a.Diid == dto.DiId && a.IsDel == 0 && a.Category == 970).ToList();
@@ -2026,7 +2034,15 @@ Inner Join Sys_Department as d With(Nolock) On u.DepId=d.Id Where m.Id={0} ", _m
             var translatorData1 = _mapper.Map<List<TranslatorView>>(translatorData);
             foreach (var item in translatorData1) EncryptionProcessor.DecryptProperties(item);
 
-            return Ok(JsonView(true, "查询成功!", new { Delegation = groupInfos, SetData = data1, DataSource = data2, currencyData = data3, DeleFile = _DeleFile, TranslatorData = translatorData1 }));
+            return Ok(JsonView(true, 
+                "查询成功!", 
+                new { Delegation = groupInfos, 
+                    SetData = data1, 
+                    DataSource = data2, 
+                    currencyData = data3, 
+                    DeleFile = _DeleFile, 
+                    TranslatorData = translatorData1 
+                }));
         }
 
         /// <summary>

+ 70 - 27
OASystem/OASystem.Api/Controllers/StatisticsController.cs

@@ -10,6 +10,7 @@ using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.ViewModels.Financial;
 using OASystem.Domain.ViewModels.Statistics;
 using OASystem.Infrastructure.Repositories.Groups;
+using SqlSugar;
 using System.Data;
 using static OASystem.API.OAMethodLib.GeneralMethod;
 using TypeInfo = OASystem.Domain.ViewModels.Statistics.TypeInfo;
@@ -1314,6 +1315,45 @@ ORDER BY
                 _geView.GroupRoyaltyFeeStr = string.Format(@"人民币总费用:{0} CNY", royaltyCNYTotalPrice.ToString("#0.00"));
                 #endregion
 
+                #region 公司内部人员报销
+                var reimburseDatas = await _sqlSugar
+                    .Queryable<Fin_DailyFeePayment, Sys_Users, Sys_SetData, Sys_Company>((dfp, u, sd1, c) =>
+                    new JoinQueryInfos(
+                        JoinType.Left, dfp.CreateUserId == u.Id,
+                        JoinType.Left, dfp.TransferTypeId == sd1.Id,
+                        JoinType.Left, dfp.CompanyId == c.Id
+                        ))
+                    .Where((dfp, u, sd1, c) => dfp.IsDel == 0 && dfp.PriceTypeId == 1353 && dfp.GroupId == _dto.DiId)
+                    .Select((dfp, u, sd1, c) => new GroupReimburseFeeInfoView()
+                    {
+                        TotalAmt = dfp.SumPrice,
+                        //FeeItems = SqlFunc.Subqueryable<Fin_DailyFeePaymentContent>()
+                        //           .Where(x => x.DFPId == dfp.Id && x.IsDel == 0)
+                        //           .Select(x => new GroupReimburseFeeSubInfo()
+                        //           {
+                        //               PriceName = x.PriceName,
+                        //               Quantity = x.Quantity,
+                        //               Price = x.Price,
+                        //               SubTotal = x.ItemTotal,
+                        //               Remark = x.Remark
+                        //           })
+                        //           .ToList(),
+                        AppReason = dfp.Instructions,
+                        TransferLabel = sd1.Name,
+                        ApplyComp = c.CompanyName,
+                        FAudit = dfp.FAudit,
+                        MAudit = dfp.MAudit,
+                        PayStatusFlag = dfp.IsPay == 0 ? "未付款" : "已付款",
+                        ApplyName = u.CnName,
+                        ApplyTime = dfp.CreateTime
+
+                    })
+                    .ToListAsync();
+                var reimburseTotalPrice = reimburseDatas.Sum(x => x.TotalAmt);
+                _geView.GroupReimburseFeeViews = reimburseDatas;
+                _geView.GroupReimburseFeeStr = string.Format(@"人民币总费用:{0} CNY", reimburseTotalPrice.ToString("#0.00"));
+
+                #endregion
                 _view.GroupExpenditure = _geView;
                 #endregion
 
@@ -1332,7 +1372,7 @@ ORDER BY
                 decimal _receivableProfit = 0.00M; //应收利润
                 decimal _receivedProfit = 0.00M;   //已收利润
                 _totalExpenditure = HotelCNYTotalPrice + CTGGRCNYTotalPrice + AirCNYTotalPrice + VisaCNYTotalPirce + InvitationalCNYTotalPrice +
-                                    InsuranceCNYTotalPrice + DecreaseCNYTotalPrice + exTotalAmount + royaltyCNYTotalPrice;
+                                    InsuranceCNYTotalPrice + DecreaseCNYTotalPrice + exTotalAmount + royaltyCNYTotalPrice + reimburseTotalPrice;
                 _amountReceivable = frTotalAmount;
                 _amountReceived = prTotalAmount;
                 _receivableProfit = _amountReceivable - promTotalAmount - _totalExpenditure;
@@ -8436,7 +8476,6 @@ WHERE
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> CorporateProfitExcelDownload(CorporateProfitExcelDownloadDto dto)
         {
-
             int portType = dto.PortType,
                 userId = dto.UserId,
                 pageId = dto.PageId,
@@ -8620,11 +8659,11 @@ WHERE
                 otherTypeIds.AddRange(inforTypeIds);
                 otherTypeIds.AddRange(competitionTypeIds);
 
-                decimal monthAllIncomes = groupItems.Sum(x => x.ReceivedAmount), //月-收入
-                        monthTzIncomes = groupItems.Where(x => groupTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivedAmount),
-                        monthHwIncomes = groupItems.Where(x => inforTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivedAmount),
-                        monthSsIncomes = groupItems.Where(x => competitionTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivedAmount),
-                        monthQtIncomes = groupItems.Where(x => !otherTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivedAmount),
+                decimal monthAllIncomes = groupItems.Sum(x => x.ReceivableAmount), //月-收入
+                        monthTzIncomes = groupItems.Where(x => groupTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivableAmount),
+                        monthHwIncomes = groupItems.Where(x => inforTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivableAmount),
+                        monthSsIncomes = groupItems.Where(x => competitionTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivableAmount),
+                        monthQtIncomes = groupItems.Where(x => !otherTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivableAmount),
                         monthAllCost = groupItems.Sum(x => x.CostTotal), //月-成本
                         monthTzCost = groupItems.Where(x => groupTypeIds.Contains(x.TeamDid)).Sum(x => x.CostTotal),
                         monthHwCost = groupItems.Where(x => inforTypeIds.Contains(x.TeamDid)).Sum(x => x.CostTotal),
@@ -8635,11 +8674,11 @@ WHERE
                         monthHwGross = monthHwIncomes - monthHwCost,
                         monthSsGross = monthSsIncomes - monthSsCost,
                         monthQtGross = monthQtIncomes - monthQtCost,
-                        yearAllIncomes = yearGroupItems.Sum(x => x.ReceivedAmount), //年-收入
-                        yearTzIncomes = yearGroupItems.Where(x => groupTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivedAmount),
-                        yearHwIncomes = yearGroupItems.Where(x => inforTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivedAmount),
-                        yearSsIncomes = yearGroupItems.Where(x => competitionTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivedAmount),
-                        yearQtIncomes = yearGroupItems.Where(x => !otherTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivedAmount),
+                        yearAllIncomes = yearGroupItems.Sum(x => x.ReceivableAmount), //年-收入
+                        yearTzIncomes = yearGroupItems.Where(x => groupTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivableAmount),
+                        yearHwIncomes = yearGroupItems.Where(x => inforTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivableAmount),
+                        yearSsIncomes = yearGroupItems.Where(x => competitionTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivableAmount),
+                        yearQtIncomes = yearGroupItems.Where(x => !otherTypeIds.Contains(x.TeamDid)).Sum(x => x.ReceivableAmount),
                         yearAllCost = yearGroupItems.Sum(x => x.CostTotal), //年-成本
                         yearTzCost = yearGroupItems.Where(x => groupTypeIds.Contains(x.TeamDid)).Sum(x => x.CostTotal),
                         yearHwCost = yearGroupItems.Where(x => inforTypeIds.Contains(x.TeamDid)).Sum(x => x.CostTotal),
@@ -8920,24 +8959,28 @@ WHERE
                 {
                     string monthComment = $"C{i + 3}",
                            yearComment = $"D{i + 3}";
+
                     int monthCommentIndex = dailySheet.Comments.Add(monthComment),
                         yearCommentIndex = dailySheet.Comments.Add(yearComment);
+                    if (dailyViewItems[i].ThisMonthAmount != 0.00M)
+                    {
+                        string commentText1 = conmmentTexts[i].MonthComment;
+                        Aspose.Cells.Comment comment = dailySheet.Comments[monthCommentIndex];
+                        comment.Note = commentText1;
+                        comment.Width = 400;
+                        comment.Height = 400;
+                        comment.Font.Color = Color.Red;
+                    }
 
-
-                    string commentText1 = conmmentTexts[i].MonthComment,
-                           commentText2 = conmmentTexts[i].YearComment;
-
-                    Aspose.Cells.Comment comment1 = dailySheet.Comments[monthCommentIndex];
-                    comment1.Note = commentText1;
-                    comment1.Width = 400;
-                    comment1.Height = 400;
-                    comment1.Font.Color = Color.Red;
-
-                    Aspose.Cells.Comment comment2 = dailySheet.Comments[yearCommentIndex];
-                    comment2.Note = commentText2;
-                    comment2.Width = 400;
-                    comment2.Height = 400;
-                    comment2.Font.Color = Color.Red;
+                    if (dailyViewItems[i].ThisYearAmount != 0.00M)
+                    {
+                        string commentText2 = conmmentTexts[i].YearComment;
+                        Aspose.Cells.Comment comment = dailySheet.Comments[yearCommentIndex];
+                        comment.Note = commentText2;
+                        comment.Width = 400;
+                        comment.Height = 400;
+                        comment.Font.Color = Color.Red;
+                    }
                 }
 
                 string fileName = $"利润报表({beginDate.ToString("yyyy年MM月dd日")}~{endDate.ToString("yyyy年MM月dd日")}){Guid.NewGuid().ToString()}.xls";

+ 1 - 1
OASystem/OASystem.Api/Middlewares/RecordAPIOperationMiddleware.cs

@@ -19,7 +19,7 @@ namespace OASystem.API.Middlewares
         private readonly SqlSugarClient _sqlSugar;
 
         /// <summary>
-        /// 初始化
+        /// 初始化DeleteUserId
         /// </summary>
         /// <param name="next"></param>
         /// <param name="config"></param>

+ 2 - 7
OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/AppNotice/Library.cs

@@ -753,12 +753,10 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice
 
             Sys_SetData sd_tansferType = _grpDeleRep.Query<Sys_SetData>(s => s.Id == fin_DailyFeePayment.TransferTypeId).First();
             Sys_SetData sd_priceType = _grpDeleRep.Query<Sys_SetData>(s => s.Id == fin_DailyFeePayment.PriceTypeId).First();
-            string feeSignStr = string.Format(@"{0}-{1}", sd_tansferType.Name, sd_priceType.Name);
+            string feeSignStr = string.Format(@"{0}-{1}", sd_tansferType.Name, sd_priceType?.Name ?? "");
 
             string priceStr = fin_DailyFeePayment.SumPrice.ToString("#0.00");
 
-
-
             DailyPayReminders_Create_ToCaiwuChatModel info = new DailyPayReminders_Create_ToCaiwuChatModel()
             {
                 CreateDt = fin_DailyFeePayment.CreateTime.ToString("yyyy-MM-dd HH:mm"),
@@ -770,10 +768,7 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice
 
             };
 
-            if (sign == 2)
-            {
-                info.TitleStr = "[更新]一项费用待审核";
-            }
+            if (sign == 2) info.TitleStr = "[更新]一项费用待审核";
 
             ResponseBase result = await _qiYeWeChatApiService.GroupStatus_SendChatMsg_Markdown(chatId, MarkdownLib.DailyPayReminders_Create_ToCaiwuChat(info));
             if (result.errcode != 0)

+ 31 - 1
OASystem/OASystem.Api/appsettings.json

@@ -379,5 +379,35 @@
   ],
 
   //日付类型Data
-  "Dailypayment": "666,667"
+  "Dailypayment": "666,667",
+
+  //出入境费用明细权限特定基础人员
+  "FeeBasePerm": [
+    {
+      "Dept": "IntlDplmcy", //国交部
+      "Users": [
+        {
+          "Id": 149,
+          "Name": "王鸽"
+        },
+        {
+          "Id": 330,
+          "Name": "刘琪"
+        },
+        {
+          "Id": 334,
+          "Name": "朱琳"
+        }
+      ]
+    },
+    {
+      "Dept": "MktStrat", //市场部
+      "Users": [
+        {
+          "Id": 95,
+          "Name": "舒庆"
+        }
+      ]
+    }
+  ]
 }

+ 11 - 0
OASystem/OASystem.Domain/Dtos/Financial/DailyFeePaymentDto.cs

@@ -121,6 +121,11 @@ namespace OASystem.Domain.Dtos.Financial
         /// </summary>
         public int CompanyId { get; set; }
 
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        public int GroupId { get; set; }
+
         /// <summary>
         /// 费用明细
         /// </summary>
@@ -197,6 +202,12 @@ namespace OASystem.Domain.Dtos.Financial
         /// </summary>
         public int CompanyId { get; set; }
 
+
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        public int GroupId { get; set; }
+
         /// <summary>
         /// 费用明细
         /// </summary>

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

@@ -829,6 +829,13 @@ namespace OASystem.Domain.Dtos.Groups
 
     #region Draft Mobile Request Dto
 
+    //EnterExitCostDraftMobileNameData
+    public class EnterExitCostDraftMobileNameDataDto : DtoBase
+    {
+        public int CurrUserId { get; set; }
+        public string DraftName { get; set; }
+    }
+
     public class PostEnterExitCostDraftMobileGroupDataDto : DtoBase
     {
 

+ 6 - 0
OASystem/OASystem.Domain/Entities/Financial/Fin_DailyFeePayment.cs

@@ -74,5 +74,11 @@ namespace OASystem.Domain.Entities.Financial
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "int")] 
         public int CompanyId { get; set; }
+
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int GroupId { get; set; }
     }
 }

+ 63 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_EnterExitCostQuote.cs

@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.Groups
+{
+    /// <summary>
+    /// 团组 - 出入境费用报价
+    /// </summary>
+    [SugarTable("Grp_EnterExitCost", "团组 - 出入境费用报价")]
+    public class Grp_EnterExitCostQuote: EntityBase
+    {
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        [SugarColumn(ColumnName = "GroupId",ColumnDescription = "团组Id", IsNullable = true, ColumnDataType = "int")]
+        public int GroupId { get; set; }
+
+        /// <summary>
+        /// 项ID
+        /// </summary>
+        [SugarColumn(ColumnName = "ItemId", ColumnDescription = "项ID(1,2,3...)", IsNullable = true, ColumnDataType = "int")]
+        public int ItemId { get; set; }
+
+        /// <summary>
+        /// 费用名称
+        /// </summary>
+        [SugarColumn(ColumnName = "FeeName", ColumnDescription = "费用名称", IsNullable = true, ColumnDataType = "varchar(120)")]
+        public string FeeName { get; set; }
+
+        /// <summary>
+        /// 单价
+        /// </summary>
+        [SugarColumn(ColumnName = "UnitPrice", ColumnDescription = "单价", IsNullable = true, ColumnDataType = "deciaml(10,2)")]
+        public decimal UnitPrice { get; set; }
+
+        /// <summary>
+        /// 数量/天数/间/晚/次
+        /// </summary>
+        [SugarColumn(ColumnName = "Quantity", ColumnDescription = "数量/天数/间/晚/次", IsNullable = true, ColumnDataType = "deciaml(10,2)")]
+        public decimal Quantity { get; set; }
+
+        /// <summary>
+        /// 人数
+        /// </summary>
+        [SugarColumn(ColumnName = "PplNum", ColumnDescription = "人数", IsNullable = true, ColumnDataType = "int")]
+        public int PplNum { get; set; }
+
+        /// <summary>
+        /// 币种
+        /// </summary>
+        [SugarColumn(ColumnName = "Currency", ColumnDescription = "币种", IsNullable = true, ColumnDataType = "int")]
+        public int Currency { get; set; }
+
+        /// <summary>
+        /// 合计(CNY)
+        /// </summary>
+        [SugarColumn(ColumnName = "TotalAmt", ColumnDescription = "合计(CNY)", IsNullable = true, ColumnDataType = "deciaml(10,2)")]
+        public decimal TotalAmt { get; set; }
+    }
+}

+ 3 - 1
OASystem/OASystem.Domain/ViewModels/Financial/Fin_DailyFeePaymentView.cs

@@ -215,6 +215,8 @@ namespace OASystem.Domain.ViewModels.Financial
         public string Instructions { get; set; }
         public decimal SumPrice { get; set; }
 
+        public int GroupId { get; set; }
+
         public int CreateUserId { get; set; }
 
         /// <summary>
@@ -266,7 +268,7 @@ namespace OASystem.Domain.ViewModels.Financial
         public int PriceTypeId { get; set; }
         public string Instructions { get; set; }
         public decimal SumPrice { get; set; }
-
+        public int GroupId { get; set; }
         public int CreateUserId { get; set; }
 
         public List<Fin_DailyFeePaymentContentInfolView> FeeContents { get; set; }

+ 5 - 1
OASystem/OASystem.Domain/ViewModels/Groups/EnterExitCostDraftView.cs

@@ -13,6 +13,9 @@ namespace OASystem.Domain.ViewModels.Groups
     {
     }
 
+    
+
+
     public class PermissionViewUserview
     {
         public int Id { get; set; }
@@ -24,8 +27,9 @@ namespace OASystem.Domain.ViewModels.Groups
     /// </summary>
     public class EnterExitCostDraftInfoView
     {
-        public bool IsSave { get; set; }
+        public bool IsSave { get; set; } = false;
         public bool IsView { get; set; } = false;
+        public bool IsAssignPerm { get; set; } = false;
 
         public int[] ViewUsers { get; set; } = Array.Empty<int>();
 

+ 31 - 1
OASystem/OASystem.Domain/ViewModels/Groups/EnterExitCostView.cs

@@ -24,6 +24,23 @@ namespace OASystem.Domain.ViewModels.Groups
         public string IsNull { get; set; }
     }
 
+    /// <summary>
+    /// 出入境费用明细权限特定基础人员
+    /// </summary>
+    public class FeeBasePermView
+    {
+        /// <summary>
+        /// 部门
+        /// </summary>
+        public string Dept { get; set; }
+
+        /// <summary>
+        /// 人员列表
+        /// </summary>
+        public PermissionViewUserview[] Users { get; set; }
+    }
+
+
     /// <summary>
     /// 出入境国家(城市)费用标准 View
     /// </summary>
@@ -259,9 +276,22 @@ namespace OASystem.Domain.ViewModels.Groups
     /// </summary>
     public class EnterExitCostInfoView
     {
-        public bool IsSave { get; set; }
+        /// <summary>
+        /// 是否有保存权限
+        /// </summary>
+        public bool IsSave { get; set; } = false;
+        /// <summary>
+        /// 是否有查看权限
+        /// </summary>
         public bool IsView { get; set; } = false;
+        /// <summary>
+        /// 是否有分配权限
+        /// </summary>
+        public bool IsAssignPerm { get; set; } = false;
 
+        /// <summary>
+        /// 权限人员信息
+        /// </summary>
         public int[] ViewUsers { get; set; } = Array.Empty<int>();
 
         /// <summary>

+ 1 - 1
OASystem/OASystem.Domain/ViewModels/Statistics/CorporateProfitViews.cs

@@ -198,7 +198,7 @@ namespace OASystem.Domain.ViewModels.Statistics
         {
             get
             {
-                string tips = $"应收数据:{ReceivableTotal} 条\r\n已收数据:{ReceivedTotal} 条\r\n收款退还数据:{RefundedTotal} 条\r\n酒店数据:{HotelTotal} 条\r\n地接数据:{LocalGuideTotal} 条\r\n机票数据:{AirTicketToal} 条\r\n签证数据:{VisaTotal} 条\r\n商邀数据:{OATotal} 条\r\n保险退还数据:{InsureTotal} 条\r\n其他费用数据:{OtherTotal} 条\r\n";
+                string tips = $"应收数据:{ReceivableTotal} 条<br />已收数据:{ReceivedTotal} 条<br />收款退还数据:{RefundedTotal} 条<br />酒店数据:{HotelTotal} 条<br />地接数据:{LocalGuideTotal} 条<br />机票数据:{AirTicketToal} 条<br />签证数据:{VisaTotal} 条<br />商邀数据:{OATotal} 条<br />保险退还数据:{InsureTotal} 条<br />其他费用数据:{OtherTotal} 条";
 
                 return tips;
             }

+ 92 - 1
OASystem/OASystem.Domain/ViewModels/Statistics/GroupStatementView.cs

@@ -5,6 +5,7 @@ using OASystem.Domain.Entities.Groups;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Runtime.Intrinsics.Arm;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -616,6 +617,15 @@ namespace OASystem.Domain.ViewModels.Statistics
 
         public List<GroupRoyaltyFeeView> GroupRoyaltyFeeViews { get; set; }
         public string? GroupRoyaltyFeeStr { get; set; }
+
+        /// <summary>
+        /// 公司人员报销费用集合
+        /// </summary>
+        public List<GroupReimburseFeeInfoView> GroupReimburseFeeViews { get; set; }
+        /// <summary>
+        /// 公司人员报销费用描述
+        /// </summary>
+        public string? GroupReimburseFeeStr { get; set; }
     }
 
     /// <summary>
@@ -1420,7 +1430,6 @@ namespace OASystem.Domain.ViewModels.Statistics
 
     }
 
-
     public class GroupRoyaltyFeeInfo
     {
         public int GroupId { get; set; }
@@ -1473,6 +1482,88 @@ namespace OASystem.Domain.ViewModels.Statistics
         public DateTime CreateTime { get; set; }
     }
 
+    public class GroupReimburseFeeInfoView
+    {
+        /// <summary>
+        /// 金额总计
+        /// </summary>
+        public decimal TotalAmt { get; set; }
+
+        public string Currency { get; set; } = "CNY";
+
+        //public GroupReimburseFeeSubInfo[]? FeeItems { get; set; }
+
+        /// <summary>
+        /// 申请原因
+        /// </summary>
+        public string AppReason { get; set; }
+        
+        public int FAudit { get; set; }
+
+        public int MAudit { get; set; }
+
+        /// <summary>
+        /// 审核状态
+        /// </summary>
+        public string AuditStatusFlg
+        {
+            get
+            {
+                var fLabel = FAudit == 0 ? "财务未审核" : FAudit == 1 ? "财务已审核" : "财务审核未通过";
+                var mLabel = MAudit == 0 ? "总经理未审核" : MAudit == 1 ? "总经理已审核" : "总经理审核未通过";
+                return $"{fLabel}<br />{mLabel}";
+            }
+        }
+
+        /// <summary>
+        /// 付款描述
+        /// </summary>
+        public string PayStatusFlag { get; set; }
+        /// <summary>
+        /// 转账标识
+        /// </summary>
+        public string TransferLabel { get; set; }
+        /// <summary>
+        /// 申请公司
+        /// </summary>
+        public string ApplyComp { get; set; }
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string ApplyName { get; set; }
+        /// <summary>
+        /// 申请时间
+        /// </summary>
+        public DateTime ApplyTime { get; set; }
+    }
+
+    public class GroupReimburseFeeSubInfo
+    {
+        /// <summary>
+        /// 费用名称
+        /// </summary>
+        public string? PriceName { get; set; }
+
+        /// <summary>
+        /// 数量
+        /// </summary>
+        public decimal Quantity { get; set; }
+
+        /// <summary>
+        /// 单价
+        /// </summary>
+        public decimal Price { get; set; }
+        
+        /// <summary>
+        /// 小记
+        /// </summary>
+        public decimal SubTotal { get; set; }
+
+        public string Currency { get; set; } = "CNY";
+
+        public string Remark { get; set; }
+    }
+
     /// <summary>
     /// 操作人员提成View
     /// </summary>

+ 13 - 22
OASystem/OASystem.Infrastructure/Repositories/Financial/DailyFeePaymentRepository.cs

@@ -58,6 +58,7 @@ namespace OASystem.Infrastructure.Repositories.Financial
                 51, //其他费用
                 55, //大运会
                 90, //各部门基础固定费用明细
+                104, //团组费用
             };
             var priceTypeData = setTypeData.Where(s => typeIds.Contains(s.Id)).ToList();
             var priceSubTypeData = setData.Where(s => typeIds.Contains(s.STid)).ToList();
@@ -366,7 +367,7 @@ namespace OASystem.Infrastructure.Repositories.Financial
             _sqlSugar.BeginTran();
             try
             {
-                Fin_DailyFeePayment _fee = _mapper.Map<Fin_DailyFeePayment>(dto);
+                var _fee = _mapper.Map<Fin_DailyFeePayment>(dto);
                 _fee.CreateUserId = dto.UserId;
 
                 /*
@@ -384,9 +385,9 @@ namespace OASystem.Infrastructure.Repositories.Financial
 
                 int? feeId = await _sqlSugar.Insertable(_fee).ExecuteReturnIdentityAsync();
 
-                if (dto.FeeContents.Count > 0)
+                if (dto.FeeContents.Any())
                 {
-                    List<Fin_DailyFeePaymentContent> _feeContents = _mapper.Map<List<Fin_DailyFeePaymentContent>>(dto.FeeContents);
+                    var _feeContents = _mapper.Map<List<Fin_DailyFeePaymentContent>>(dto.FeeContents);
 
                     foreach (var item in _feeContents)
                     {
@@ -409,7 +410,6 @@ namespace OASystem.Infrastructure.Repositories.Financial
             }
 
             return result;
-
         }
 
         /// <summary>
@@ -421,23 +421,21 @@ namespace OASystem.Infrastructure.Repositories.Financial
         {
             Result result = new Result() { Code = -2 };
 
-            #region 已审核过的日付申请不可编辑
-
-            var _DailyFeePayment = await _sqlSugar.Queryable<Fin_DailyFeePayment>().Where(it => it.Id == dto.Id && it.IsDel == 0).FirstAsync();
-            if (_DailyFeePayment != null)
+            #region 已审核的数据不可编辑
+            var dailyFeePayment = await _sqlSugar.Queryable<Fin_DailyFeePayment>().Where(it => it.Id == dto.Id && it.IsDel == 0).FirstAsync();
+            if (dailyFeePayment != null)
             {
-                if (_DailyFeePayment.FAudit == 1 || _DailyFeePayment.MAudit == 1)
+                if (dailyFeePayment.FAudit == 1 || dailyFeePayment.MAudit == 1)
                 {
                     var setData = await _sqlSugar.Queryable<Sys_SetData>().Where(x => x.IsDel == 0 && x.Id == dto.PriceTypeId).FirstAsync();
                     if (setData != null)
                     {
                         if (setData.STid == 90)
                         {
-                            if (_DailyFeePayment.IsPay == 1)
+                            if (dailyFeePayment.IsPay == 1)
                             {
                                 result.Msg = "该笔费用已付款,不可修改!";
                                 return result;
-
                             }
                         }
                         else
@@ -470,10 +468,10 @@ namespace OASystem.Infrastructure.Repositories.Financial
                                           TransferTypeId = dto.TransferTypeId,
                                           PriceTypeId = dto.PriceTypeId,
                                           CompanyId = dto.CompanyId,
+                                          GroupId = dto.GroupId,
                                       }).ExecuteCommandAsync();
 
-                List<Fin_DailyFeePaymentContent> _feeContents = _mapper.Map<List<Fin_DailyFeePaymentContent>>(dto.FeeContents);
-
+                var _feeContents = _mapper.Map<List<Fin_DailyFeePaymentContent>>(dto.FeeContents);
 
                 await _sqlSugar.Updateable<Fin_DailyFeePaymentContent>()
                                   .Where(a => a.DFPId == _fee.Id)
@@ -484,22 +482,15 @@ namespace OASystem.Infrastructure.Repositories.Financial
                                       DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                                   }).ExecuteCommandAsync();
 
-
-                if (_feeContents.Count > 0)
+                if (_feeContents.Any())
                 {
                     foreach (var item in _feeContents)
                     {
-
                         item.DFPId = _fee.Id;
                         item.CreateUserId = dto.UserId;
-
                     }
 
-                    if (_feeContents.Count > 0)
-                    {
-                        await _sqlSugar.Insertable(_feeContents).ExecuteCommandAsync();
-
-                    }
+                    await _sqlSugar.Insertable(_feeContents).ExecuteCommandAsync();
                 }
 
                 _sqlSugar.CommitTran();

+ 141 - 68
OASystem/OASystem.Infrastructure/Repositories/Groups/EnterExitCostDraftRepository.cs

@@ -10,6 +10,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using AutoMapper;
+using EyeSoft.Collections.Generic;
 
 namespace OASystem.Infrastructure.Repositories.Groups
 {
@@ -28,38 +29,140 @@ namespace OASystem.Infrastructure.Repositories.Groups
             _mapper = mapper;
         }
 
-
         /// <summary>
         /// 权限用户基础数据
         /// </summary>
         /// <returns></returns>
         public async Task<List<PermissionViewUserview>> PermissionViewUsersAsync()
         {
-            var gj_jobPostIds = new List<int>() { 22, 32 };
+           // 添加市场部人员
             var viewPermissionData = await _sqlSugar.Queryable<Sys_Users>()
-                .Where(x => x.IsDel == 0 && ((x.DepId == 7 && gj_jobPostIds.Contains(x.JobPostId)) || x.DepId == 6))
-                .Select(x => new PermissionViewUserview { Id = x.Id, Name = x.CnName })
+                .LeftJoin<Sys_Department>((u, d) => u.DepId == d.Id)
+                .Where((u, d) => u.IsDel == 0 && u.HrAudit == 1 && d.DepName.Equals("市场部"))
+                .Select((u, d) => new PermissionViewUserview { Id = u.Id, Name = u.CnName })
                 .ToListAsync();
 
+            //去掉特殊人员
+            if (viewPermissionData.Any())
+            {
+                var notName = new string[] { "高媛媛", "管理员" };
+                viewPermissionData = viewPermissionData.Where(x => !notName.Any(x1 => x.Name.Contains(x1))).ToList();
+            }
+
+            //添加特定人员
+            var feeBasePerm = AppSettingsHelper.Get<FeeBasePermView>("FeeBasePerm");
+            if (feeBasePerm.Any())
+            {
+                foreach (var item in feeBasePerm)
+                {
+                    if (item.Users.Any())
+                    {
+                        viewPermissionData.AddRange(item.Users);
+                    }
+                }
+
+                return viewPermissionData.GroupBy(x => x.Id).Select(x => x.First()).OrderBy(x => x.Id).ToList();
+            }
+
             return viewPermissionData;
         }
 
+        /// <summary>
+        /// 初始化配置权限
+        /// </summary>
+        /// <param name="draftId"></param>
+        /// <param name="currUserId"></param>
+        /// <returns></returns>
+        public async Task<bool> InitPerm(int draftId, int currUserId)
+        {
+            var feeBasePerm = AppSettingsHelper.Get<FeeBasePermView>("FeeBasePerm");
+            var intlDplmcyBasePerm = new List<PermissionViewUserview>(); //国交部
+            var mktStratBasePerm = new List<PermissionViewUserview>();   //市场部
+
+            if (feeBasePerm.Any())
+            {
+                var intlDplmcyData = feeBasePerm.Find(x => x.Dept.Equals("IntlDplmcy"));
+                if (intlDplmcyData != null) if (intlDplmcyData.Users.Any()) intlDplmcyBasePerm = intlDplmcyData.Users.ToList();
+
+                var mktStratData = feeBasePerm.Find(x => x.Dept.Equals("MktStrat"));
+                if (mktStratData != null) if (mktStratData.Users.Any()) mktStratBasePerm = mktStratData.Users.ToList();
+            }
+
+            /*
+             * 权限分配规则
+             * 刘琪、王鸽、朱琳的账号:默认只能刘、王、朱查看
+             * 舒庆的账号 默认只能舒、刘、王、朱查看
+             * 其他销售 默认只能自己、舒、刘、王、朱查看
+             */
+            var feeBasePermIds = new List<int>();
+            if (intlDplmcyBasePerm.Any(x => x.Id == currUserId))
+            {
+                feeBasePermIds = intlDplmcyBasePerm.Select(x => x.Id).ToList();
+            }
+            else if (mktStratBasePerm.Any(x => x.Id == currUserId))
+            {
+                feeBasePermIds.AddRange(mktStratBasePerm.Select(x => x.Id).ToList());
+                feeBasePermIds.AddRange(intlDplmcyBasePerm.Select(x => x.Id).ToList());
+            }
+            else
+            {
+                feeBasePermIds.Add(currUserId);
+                feeBasePermIds.AddRange(mktStratBasePerm.Select(x => x.Id).ToList());
+                feeBasePermIds.AddRange(intlDplmcyBasePerm.Select(x => x.Id).ToList());
+            }
+
+            if (feeBasePermIds.Any())
+            {
+                var permissions = new List<Grp_EnterExitCostDraftPermission>();
+                foreach (var userId in feeBasePermIds)
+                {
+                    permissions.Add(new Grp_EnterExitCostDraftPermission()
+                    {
+                        DraftId = draftId,
+                        UserId = userId,
+                        Permission = 1,
+                        CreateUserId = userId,
+                    });
+                }
+
+                if (permissions.Any())
+                {
+                    await _sqlSugar.Insertable(permissions).ExecuteReturnIdentityAsync();
+                    return true;
+                }
+            }
+            return false;
+        }
+
         /// <summary>
         /// 出入境费用草稿 --> 权限验证
         /// </summary>
         /// <param name="groupId">草稿Id</param>
         /// <param name="permission">操作权限 1:查看;2:新增;3:编辑;4:删除;5:下载; </param>
         /// <returns></returns>
-        public async Task<bool> PermissionValidationAsync(int darftId, int userId, int permission=1)
+        public async Task<bool> PermissionValidationAsync(int darftId, int userId, int permission = 1)
         {
             //参数验证
             if (darftId < 1) return false;
             var permissionIds = new List<int>() { 1, 2, 3, 4, 5 };
             if (!permissionIds.Contains(permission)) return false;
 
+            var feeBasePermUserIds = new List<int>();
+            var feeBasePerm = AppSettingsHelper.Get<FeeBasePermView>("FeeBasePerm");
+            if (feeBasePerm.Any())
+            {
+                var intlDplmcyData = feeBasePerm.Find(x => x.Dept.Equals("IntlDplmcy"));
+                if (intlDplmcyData != null) if (intlDplmcyData.Users.Any()) feeBasePermUserIds.AddRange(intlDplmcyData.Users.Select(x => x.Id).ToList());
+
+                var mktStratData = feeBasePerm.Find(x => x.Dept.Equals("MktStrat"));
+                if (mktStratData != null) if (mktStratData.Users.Any()) feeBasePermUserIds.AddRange(mktStratData.Users.Select(x => x.Id).ToList());
+            }
+
+            if (feeBasePermUserIds.Any(x => x == userId)) return true;
+
             var info = await _sqlSugar.Queryable<Grp_EnterExitCostDraftPermission>()
-                     .Where(it => it.DraftId == darftId && it.UserId == userId && it.Permission == permission)
-                     .FirstAsync();
+                .Where(it => it.DraftId == darftId && it.UserId == userId && it.Permission == permission)
+                .FirstAsync();
             if (info != null) return true;
 
             return false;
@@ -68,7 +171,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
         /// <summary>
         /// 移动端操作权限验证
         /// </summary>
-        /// <param name="groupId"></param>
+        /// <param name="id"></param>
         /// <param name="currUserId"></param>
         /// <param name="permissionType">1 查看 2 编辑</param>
         /// <returns></returns>
@@ -82,23 +185,16 @@ namespace OASystem.Infrastructure.Repositories.Groups
             {
                 status = await PermissionValidationAsync(id, currUserId);//查看权限
                 if (enterExitCostData.CreateUserId == currUserId) status = true; //查看权限
-                if (!status)
-                {
-                    var setUserName = await _sqlSugar.Queryable<Sys_Users>().Where(x => x.Id == enterExitCostData.CreateUserId).Select(x => x.CnName).FirstAsync();
+                if (!status) msg = $"未分配查看权限,如要查看,请联系市场部或国交部负责人!";
 
-                    msg = $"{setUserName}设置了你不能查看当前团组的出入境费用明细数据,如要查看,请联系{setUserName}!";
-                }
                 return (status, msg);
             }
             else if (permissionType == 2)
             {
-                if (enterExitCostData.CreateUserId == currUserId) status = true; //编辑权限
-                if (!status)
-                {
-                    var setUserName = await _sqlSugar.Queryable<Sys_Users>().Where(x => x.Id == enterExitCostData.CreateUserId).Select(x => x.CnName).FirstAsync();
+                status = await PermissionValidationAsync(id, currUserId);//查看权限
+                if (enterExitCostData.CreateUserId == currUserId) status = true; //查看权限
+                if (!status) msg = $"未分配查看权限,如要查看,请联系市场部或国交部负责人!";
 
-                    msg = $"您没有编辑权限,“{setUserName}”才可编辑!";
-                }
                 return (status, msg);
 
             }
@@ -126,30 +222,31 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
                     enterExitCostInfoView = _mapper.Map<EnterExitCostDraftInfoView>(enterExitCostDraftData);
 
-                    var isView = await PermissionValidationAsync(enterExitCostDraftData.Id, dto.CurrUserId);
+                    bool assignPerm = await PermissionValidationAsync(enterExitCostDraftData.Id, dto.CurrUserId);
 
-                    if (isView) enterExitCostInfoView.IsView = true; //查看权限
-
-                    if (enterExitCostDraftData.CreateUserId == dto.CurrUserId)
+                    if (assignPerm || enterExitCostDraftData.CreateUserId == dto.CurrUserId)
                     {
                         enterExitCostInfoView.IsSave = true; //操作权限
                         enterExitCostInfoView.IsView = true; //查看权限
                     }
-
-                    if (!enterExitCostInfoView.IsView)
+                    else
                     {
-                        var setUserName = await _sqlSugar.Queryable<Sys_Users>().Where(x => x.Id == enterExitCostDraftData.CreateUserId).Select(x => x.CnName).FirstAsync();
-
-                        result.Msg = $"{setUserName}设置了你不能查看当前团组的出入境费用明细数据-草稿,如要查看,请联系{setUserName}!";
+                        result.Msg = "未分配查看权限,如要查看,请联系市场部或国交部负责人!";
                         return result;
                     }
 
-                    enterExitCostInfoView.ViewUsers = await _sqlSugar
-                        .Queryable<Grp_EnterExitCostDraftPermission>()
-                        .Where(x => x.IsDel == 0 && x.DraftId == id)
-                        .Select(x => x.UserId)
-                        .ToArrayAsync();
+                    //设置权限按钮
+                    var feeBasePerm = AppSettingsHelper.Get<PermissionViewUserview>("FeeBasePerm");
+                    if (feeBasePerm.Any(x => x.Id == dto.CurrUserId))
+                    {
+                        enterExitCostInfoView.IsAssignPerm = true;
 
+                        enterExitCostInfoView.ViewUsers = await _sqlSugar
+                            .Queryable<Grp_EnterExitCostDraftPermission>()
+                            .Where(x => x.IsDel == 0 && x.DraftId == id)
+                            .Select(x => x.UserId)
+                            .ToArrayAsync();
+                    }
 
                     var dayAndCostDraftSql = string.Format(@"Select ntf.Country,ntf.City,ssd.Name CurremcyCode,ssd.Remark CurrencyName,gdac.* From Grp_DayAndCostDraft gdac
                                                         Left Join Grp_NationalTravelFee ntf On ntf.Id = gdac.NationalTravelFeeId
@@ -157,7 +254,6 @@ namespace OASystem.Infrastructure.Repositories.Groups
                                                         Where gdac.Isdel = 0 And ntf.IsDel = 0 And gdac.ParentId = {0} Order By [Type] ASC,[Days] ASC", id);
                     var dayAndCostDraftData = await _sqlSugar.SqlQueryable<DayAndCostDraftInfoView>(dayAndCostDraftSql).ToListAsync();
 
-
                     enterExitCostInfoView.QuarterageData = dayAndCostDraftData.Where(it => it.Type == 1).ToList(); //住宿费 1
                     enterExitCostInfoView.BoardWagesData = dayAndCostDraftData.Where(it => it.Type == 2).ToList(); //伙食费 2
                     enterExitCostInfoView.MiscellaneousFeeData = dayAndCostDraftData.Where(it => it.Type == 3).ToList();  //公杂费 3
@@ -261,24 +357,21 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     var isNull = _sqlSugar.Queryable<Grp_EnterExitCostDraft>().Where(it => it.IsDel == 0 && it.DraftName.Equals(dto.DraftName)).First();
                     if (isNull != null) //修改
                     {
-                        //编辑验证
-                        if (isNull.CreateUserId != dto.UserId)
+
+                        var assignPerm = await PermissionValidationAsync(enterExitCost.Id, dto.UserId);
+                        if (!assignPerm)
                         {
-                            var userName = _sqlSugar.Queryable<Sys_Users>().Where(x => isNull.CreateUserId == isNull.Id).Select(x => x.CnName).First();
                             _sqlSugar.RollbackTran();
-                            result.Msg = $"该条信息只有操作人“{userName}”可修改!";
+                            result.Msg = "未分配编辑权限,如要编辑,请联系市场部或国交部负责人!";
                             return result;
                         }
 
-
                         var updateId = _sqlSugar.Updateable(enterExitCost)
-                                                .IgnoreColumns(it => new { it.DeleteUserId, it.DeleteTime, it.CreateUserId, it.CreateTime, it.IsDel })
-                                                .WhereColumns(it => it.DraftName)
-                                                .ExecuteCommand();
-                        if (updateId > 0)
-                        {
-                            enterExitId = isNull.Id;
-                        }
+                            .IgnoreColumns(it => new { it.DeleteUserId, it.DeleteTime, it.CreateUserId, it.CreateTime, it.IsDel })
+                            .WhereColumns(it => it.DraftName)
+                            .ExecuteCommand();
+
+                        if (updateId > 0) enterExitId = isNull.Id;
                         else
                         {
                             _sqlSugar.RollbackTran();
@@ -299,28 +392,8 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         subData.Select(x => { x.Id = 0; return x; }).ToList();
                         dto.DayOtherPriceData.Select(x => { x.Id = 0; return x; }).ToList();
 
-                        //默认添加查看权限
-                        var users = await PermissionViewUsersAsync();
-                        var userIds = users.Select(x => x.Id).ToList();
-                        if (userIds.Any())
-                        {
-                            var permissions = new List<Grp_EnterExitCostDraftPermission>();
-                            foreach (var userId in userIds)
-                            {
-                                permissions.Add(new Grp_EnterExitCostDraftPermission()
-                                {
-                                    DraftId = enterExitId,
-                                    UserId = userId,
-                                    Permission = 1
-                                });
-                            }
-
-                            if (permissions.Any())
-                            {
-                                _sqlSugar.Insertable(permissions).ExecuteReturnIdentity();
-                            }
-                        }
-
+                        //初始化权限(查看、编辑)
+                        await InitPerm(enterExitId,dto.UserId);
                     }
 
                     if (enterExitId > 0)

+ 196 - 124
OASystem/OASystem.Infrastructure/Repositories/Groups/EnterExitCostRepository.cs

@@ -1,5 +1,7 @@
 
 using AutoMapper;
+using EyeSoft.Collections.Generic;
+using EyeSoft.Runtime.InteropServices;
 using NPOI.SS.Formula.Functions;
 using OASystem.Domain;
 using OASystem.Domain.Dtos.Groups;
@@ -38,19 +40,110 @@ namespace OASystem.Infrastructure.Repositories.Groups
         /// <returns></returns>
         public async Task<List<PermissionViewUserview>> PermissionViewUsersAsync()
         {
-            var gj_jobPostIds = new List<int>() { 22, 32 };
+            //添加市场部人员
             var viewPermissionData = await _sqlSugar.Queryable<Sys_Users>()
-                .Where(x => x.IsDel == 0 && ((x.DepId == 7 && gj_jobPostIds.Contains(x.JobPostId)) || x.DepId == 6))
-                .Select(x => new PermissionViewUserview { Id = x.Id, Name = x.CnName })
+                .LeftJoin<Sys_Department>((u, d) => u.DepId == d.Id)
+                .Where((u, d) => u.IsDel == 0 && u.HrAudit == 1 && d.DepName.Equals("市场部"))
+                .Select((u, d) => new PermissionViewUserview { Id = u.Id, Name = u.CnName })
                 .ToListAsync();
 
+            //去掉特殊人员
+            if (viewPermissionData.Any())
+            {
+                var notName = new string[] { "高媛媛", "管理员" };
+                viewPermissionData = viewPermissionData.Where(x => !notName.Any(x1 => x.Name.Contains(x1))).ToList();
+            }
+
+            //添加特定人员
+            var feeBasePerm = AppSettingsHelper.Get<FeeBasePermView>("FeeBasePerm");
+            if (feeBasePerm.Any())
+            {
+                foreach (var item in feeBasePerm)
+                {
+                    if (item.Users.Any())
+                    {
+                        viewPermissionData.AddRange(item.Users);
+                    }
+                }
+
+                return viewPermissionData.GroupBy(x => x.Id).Select(x => x.First()).OrderBy(x => x.Id).ToList();
+            }
+
             return viewPermissionData;
         }
 
+        /// <summary>
+        /// 初始化配置权限
+        /// </summary>
+        /// <param name="groupId"></param>
+        /// <param name="currUserId"></param>
+        /// <returns></returns>
+        public async Task<bool> InitPerm(int groupId,int currUserId)
+        {
+            var feeBasePerm = AppSettingsHelper.Get<FeeBasePermView>("FeeBasePerm");
+            var intlDplmcyBasePerm = new List<PermissionViewUserview>(); //国交部
+            var mktStratBasePerm = new List<PermissionViewUserview>();   //市场部
+
+            if (feeBasePerm.Any())
+            {
+                var intlDplmcyData = feeBasePerm.Find(x => x.Dept.Equals("IntlDplmcy"));
+                if (intlDplmcyData != null) if (intlDplmcyData.Users.Any()) intlDplmcyBasePerm = intlDplmcyData.Users.ToList();
+
+                var mktStratData = feeBasePerm.Find(x => x.Dept.Equals("MktStrat"));
+                if (mktStratData != null) if (mktStratData.Users.Any()) mktStratBasePerm = mktStratData.Users.ToList();
+            }
+
+            /*
+             * 权限分配规则
+             * 刘琪、王鸽、朱琳的账号:默认只能刘、王、朱查看
+             * 舒庆的账号 默认只能舒、刘、王、朱查看
+             * 其他销售 默认只能自己、舒、刘、王、朱查看
+             */
+            var feeBasePermIds = new List<int>();
+            if (intlDplmcyBasePerm.Any(x => x.Id == currUserId))
+            {
+                feeBasePermIds = intlDplmcyBasePerm.Select(x => x.Id).ToList();
+            }
+            else if (mktStratBasePerm.Any(x => x.Id == currUserId))
+            {
+                feeBasePermIds.AddRange(mktStratBasePerm.Select(x => x.Id).ToList());
+                feeBasePermIds.AddRange(intlDplmcyBasePerm.Select(x => x.Id).ToList());
+            }
+            else
+            {
+                feeBasePermIds.Add(currUserId);
+                feeBasePermIds.AddRange(mktStratBasePerm.Select(x => x.Id).ToList());
+                feeBasePermIds.AddRange(intlDplmcyBasePerm.Select(x => x.Id).ToList());
+            }
+
+            if (feeBasePermIds.Any())
+            {
+                var permissions = new List<Grp_EnterExitCostPermission>();
+                foreach (var userId in feeBasePermIds)
+                {
+                    permissions.Add(new Grp_EnterExitCostPermission()
+                    {
+                        GroupId = groupId,
+                        UserId = userId,
+                        Permission = 1,
+                        CreateUserId = currUserId,
+                    });
+                }
+
+                if (permissions.Any())
+                {
+                    await _sqlSugar.Insertable(permissions).ExecuteReturnIdentityAsync();
+                    return true;
+                }
+            }
+            return false;
+        }
+
         /// <summary>
         /// 出入境费用正式 --> 权限验证
         /// </summary>
         /// <param name="groupId">团组Id</param>
+        /// <param name="userId">用户Id</param>
         /// <param name="permission">操作权限 1:查看;2:新增;3:编辑;4:删除;5:下载; </param>
         /// <returns></returns>
         public async Task<bool> PermissionValidationAsync(int groupId, int userId, int permission = 1)
@@ -61,14 +154,29 @@ namespace OASystem.Infrastructure.Repositories.Groups
             var permissionIds = new List<int>() { 1, 2, 3, 4, 5 };
             if (!permissionIds.Contains(permission)) return false;
 
+            var feeBasePerm = AppSettingsHelper.Get<FeeBasePermView>("FeeBasePerm");
+            var feeBasePermUserIds = new List<int>(); 
+
+            if (feeBasePerm.Any())
+            {
+                var intlDplmcyData = feeBasePerm.Find(x => x.Dept.Equals("IntlDplmcy"));
+                if (intlDplmcyData != null) if (intlDplmcyData.Users.Any()) feeBasePermUserIds.AddRange(intlDplmcyData.Users.Select(x=>x.Id).ToList());
+
+                var mktStratData = feeBasePerm.Find(x => x.Dept.Equals("MktStrat"));
+                if (mktStratData != null) if (mktStratData.Users.Any()) feeBasePermUserIds.AddRange(mktStratData.Users.Select(x => x.Id).ToList());
+            }
+
+            if (feeBasePermUserIds.Any(x => x == userId)) return true;
+
             var info = await _sqlSugar.Queryable<Grp_EnterExitCostPermission>()
-                     .Where(it => it.GroupId == groupId && it.UserId == userId && it.Permission == permission)
-                     .FirstAsync();
+                .Where(it => it.GroupId == groupId && it.UserId == userId && it.Permission == permission)
+                .FirstAsync();
             if (info != null) return true;
 
             return false;
         }
 
+
         /// <summary>
         /// 更新出入境费用汇率信息
         /// </summary>
@@ -107,48 +215,45 @@ namespace OASystem.Infrastructure.Repositories.Groups
         /// <param name="currUserId"></param>
         /// <param name="permissionType">1 查看 2 编辑</param>
         /// <returns></returns>
-        public async Task<(bool, string)> MobilePermissionsValidationAsync(int groupId,int currUserId,int permissionType = 1)
+        public async Task<(bool, string)> MobilePermissionsValidationAsync(int groupId, int currUserId, int permissionType = 1)
         {
-            bool status = false;
             string msg = string.Empty;
+            bool assignPerm = await PermissionValidationAsync(groupId, currUserId);//分配权限
 
-            var enterExitCostData = await _sqlSugar.Queryable<Grp_EnterExitCost>().OrderByDescending(x => x.CreateTime).FirstAsync(it => it.DiId == groupId && it.IsDel == 0);
+            var enterExitCostData = await _sqlSugar
+                .Queryable<Grp_EnterExitCost>()
+                .OrderByDescending(x => x.CreateTime)
+                .FirstAsync(it => it.DiId == groupId && it.IsDel == 0);
             if (permissionType == 1)
             {
-                status = await PermissionValidationAsync(groupId, currUserId);//查看权限
-                if (enterExitCostData.CreateUserId == currUserId) status = true; //查看权限
-                if (!status)
-                {
-                    var setUserName = await _sqlSugar.Queryable<Sys_Users>().Where(x => x.Id == enterExitCostData.CreateUserId).Select(x => x.CnName).FirstAsync();
 
-                    msg = $"{setUserName}设置了你不能查看当前团组的出入境费用明细数据,如要查看,请联系{setUserName}!";
+                if (!assignPerm || enterExitCostData.CreateUserId != currUserId)
+                {
+                    msg = $"未分配查看权限,如要查看,请联系市场部或国交部负责人!";
                 }
-                return (status, msg);
+                return (true, msg);
             }
             else if (permissionType == 2)
             {
-                if (enterExitCostData.CreateUserId == currUserId) status = true; //编辑权限
-                if (!status)
+                //if (enterExitCostData.CreateUserId == currUserId) status = true; //编辑权限
+                if (!assignPerm || enterExitCostData.CreateUserId != currUserId)
                 {
-                    var setUserName = await _sqlSugar.Queryable<Sys_Users>().Where(x => x.Id == enterExitCostData.CreateUserId).Select(x => x.CnName).FirstAsync();
-
-                    msg = $"您没有编辑权限,“{setUserName}”才可编辑!";
+                    msg = $"未分配编辑权限,如要编辑,请联系市场部或国交部负责人!";
                 }
-                return (status, msg);
+                return (true, msg);
 
             }
             else msg = $"请传入正确的权限验证类型!";
-            return (status, msg);
+            return (false, msg);
         }
 
-
         /// <summary>
         /// 查询 根据 Diid 查询
         /// </summary>
         /// <returns></returns>
         public async Task<JsonView> GetEnterExitCostInfoByDiId(EnterExitCostInfobyDiIdDto dto)
         {
-            var result = new JsonView() { Code = 400 , Msg = "暂无数据" };
+            var result = new JsonView() { Code = 400, Msg = "暂无数据" };
 
             var enterExitCostData = await _sqlSugar.Queryable<Grp_EnterExitCost>().OrderByDescending(x => x.CreateTime).FirstAsync(it => it.DiId == dto.DiId && it.IsDel == 0);
 
@@ -162,28 +267,30 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 {
                     enterExitCostInfoView = _mapper.Map<EnterExitCostInfoView>(enterExitCostData);
 
-                    var isView = await PermissionValidationAsync(dto.DiId, dto.CurrUserId);
-                    if (isView) enterExitCostInfoView.IsView = true; //查看权限
-
-                    if (enterExitCostData.CreateUserId == dto.CurrUserId) {
+                    bool assignPerm = await PermissionValidationAsync(dto.DiId, dto.CurrUserId);
+                    if (assignPerm || enterExitCostData.CreateUserId == dto.CurrUserId)
+                    {
                         enterExitCostInfoView.IsSave = true; //操作权限
                         enterExitCostInfoView.IsView = true; //查看权限
                     }
-
-
-                    if (!enterExitCostInfoView.IsView)
+                    else
                     {
-                        var setUserName = await _sqlSugar.Queryable<Sys_Users>().Where(x => x.Id == enterExitCostData.CreateUserId).Select(x => x.CnName).FirstAsync();
-
-                        result.Msg = $"{setUserName}设置了你不能查看当前团组的出入境费用明细数据,如要查看,请联系{setUserName}!";
+                        result.Msg = $"未分配查看权限,如要查看,请联系市场部或国交部负责人!";
                         return result;
                     }
 
-                    enterExitCostInfoView.ViewUsers = await _sqlSugar
-                        .Queryable<Grp_EnterExitCostPermission>()
-                        .Where(x => x.IsDel == 0 && x.GroupId == dto.DiId)
-                        .Select(x => x.UserId)
-                        .ToArrayAsync();
+                    //设置权限按钮
+                    var feeBasePerm = AppSettingsHelper.Get<PermissionViewUserview>("FeeBasePerm");
+                    if (feeBasePerm.Any(x => x.Id == dto.CurrUserId))
+                    {
+                        enterExitCostInfoView.IsAssignPerm = true;
+
+                        enterExitCostInfoView.ViewUsers = await _sqlSugar
+                            .Queryable<Grp_EnterExitCostPermission>()
+                            .Where(x => x.IsDel == 0 && x.GroupId == dto.DiId)
+                            .Select(x => x.UserId)
+                            .ToArrayAsync();
+                    }
 
                     //enterExitCostInfoView.FirstItemRemark = enterExitCostData.Remark;
                     var dayAndCostSql = string.Format(@"Select ntf.Country,ntf.City,ssd.Name CurremcyCode,ssd.Remark CurrencyName,gdac.* From Grp_DayAndCost gdac
@@ -192,27 +299,26 @@ namespace OASystem.Infrastructure.Repositories.Groups
                                                         Where gdac.Isdel = 0 And ntf.IsDel = 0 And gdac.DiId = {0} Order By [Type] ASC,[Days] ASC", dto.DiId);
                     var dayAndCostData = await _sqlSugar.SqlQueryable<DayAndCostInfoView>(dayAndCostSql).ToListAsync();
 
-
                     enterExitCostInfoView.QuarterageData = dayAndCostData.Where(it => it.Type == 1).ToList(); //住宿费 1
                     enterExitCostInfoView.BoardWagesData = dayAndCostData.Where(it => it.Type == 2).ToList(); //伙食费 2
                     enterExitCostInfoView.MiscellaneousFeeData = dayAndCostData.Where(it => it.Type == 3).ToList();  //公杂费 3
                     enterExitCostInfoView.TrainingExpenseData = dayAndCostData.Where(it => it.Type == 4).ToList();  //培训费 4
 
                     enterExitCostInfoView.DayOtherPriceData = _sqlSugar.Queryable<Grp_DayOtherPrice>()
-                                                                .Where(x => x.IsDel == 0 && x.Diid == dto.DiId)
-                                                                .OrderBy(x => x.Index)
-                                                                .Select(x => new DayOtherPriceView
-                                                                {
-                                                                    DiId = x.Diid,
-                                                                    Id = x.Id,
-                                                                    Cost = x.Cost,
-                                                                    Currency = x.Currency,
-                                                                    Index = x.Index,
-                                                                    SetDataId = x.SetDataId,
-                                                                    SubTotal = x.SubTotal,
-                                                                    Remark = x.Remark,
-                                                                })
-                                                                .ToList();
+                        .Where(x => x.IsDel == 0 && x.Diid == dto.DiId)
+                        .OrderBy(x => x.Index)
+                        .Select(x => new DayOtherPriceView
+                        {
+                            DiId = x.Diid,
+                            Id = x.Id,
+                            Cost = x.Cost,
+                            Currency = x.Currency,
+                            Index = x.Index,
+                            SetDataId = x.SetDataId,
+                            SubTotal = x.SubTotal,
+                            Remark = x.Remark,
+                        })
+                        .ToList();
 
                     enterExitCostInfoView.Currencys = (List<CurrencyInfo>?)CommonFun.GetCurrencyChinaToList(enterExitCostData.CurrencyRemark);
 
@@ -252,7 +358,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     mobileInfo = _mapper.Map<EnterExitCostMobileInfoView>(enterExitCostData);
 
                     var dayAndCostData = _sqlSugar.Queryable<Grp_DayAndCost>()
-                        .LeftJoin<Grp_NationalTravelFee>((dac,ntf) => dac.NationalTravelFeeId == ntf.Id)
+                        .LeftJoin<Grp_NationalTravelFee>((dac, ntf) => dac.NationalTravelFeeId == ntf.Id)
                         .LeftJoin<Sys_SetData>((dac, ntf, sd) => dac.Currency == sd.Id)
                         .Where((dac, ntf, sd) => dac.IsDel == 0 && dac.DiId == dto.DiId)
                         .Select((dac, ntf, sd) => new DayAndCostMobileInfoView
@@ -262,7 +368,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                             Type = dac.Type,
                             Days = dac.Days,
                             NationalTravelFeeId = dac.NationalTravelFeeId,
-                            Arae =  $"{ntf.Country}-{ntf.City}",
+                            Arae = $"{ntf.Country}-{ntf.City}",
                             Cost = dac.Cost,
                             Currency = dac.Currency,
                             CurrencyName = sd.Name,
@@ -271,7 +377,8 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         .ToList();
 
                     mobileInfo.ChoiceOneTotalCost = enterExitCostData.InsidePay;
-                    mobileInfo.ChoiceOneDetails = new ChoiceOneMobileInfoView() { 
+                    mobileInfo.ChoiceOneDetails = new ChoiceOneMobileInfoView()
+                    {
                         Visa = enterExitCostData.Visa,
                         VisaRemark = enterExitCostData.VisaRemark,
                         YiMiao = enterExitCostData.YiMiao,
@@ -280,10 +387,10 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         Ticket = enterExitCostData.Ticket,
                         Safe = enterExitCostData.Safe,
                     };
-                    mobileInfo.ChoiceTwoDetails = new ChoiceTwoMobileInfoView() 
-                    {   
-                        AirJJ = enterExitCostData.AirJJ, 
-                        AirGW = enterExitCostData.AirGW, 
+                    mobileInfo.ChoiceTwoDetails = new ChoiceTwoMobileInfoView()
+                    {
+                        AirJJ = enterExitCostData.AirJJ,
+                        AirGW = enterExitCostData.AirGW,
                         AirTD = enterExitCostData.AirTD,
                         CityTranffic = enterExitCostData.CityTranffic
                     };
@@ -291,11 +398,11 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     mobileInfo.ChoiceFourDetails = dayAndCostData.Where(it => it.Type == 2).OrderBy(it => it.Days).ToArray();  //伙食费 2
                     mobileInfo.ChoiceFiveDetails = dayAndCostData.Where(it => it.Type == 3).OrderBy(it => it.Days).ToArray();  //公杂费 3
                     mobileInfo.ChoiceSixDetails = dayAndCostData.Where(it => it.Type == 4).OrderBy(it => it.Days).ToArray();   //培训费 4
-                    
+
                     //其他款项
                     mobileInfo.OtherExpensesDetails = _sqlSugar.Queryable<Grp_DayOtherPrice>()
-                        .LeftJoin<Sys_SetData>((dop,sd1) => dop.SetDataId == sd1.Id)
-                        .LeftJoin<Sys_SetData>((dop, sd1,sd2) => dop.Currency == sd2.Id)
+                        .LeftJoin<Sys_SetData>((dop, sd1) => dop.SetDataId == sd1.Id)
+                        .LeftJoin<Sys_SetData>((dop, sd1, sd2) => dop.Currency == sd2.Id)
                         .Where((dop, sd1, sd2) => dop.IsDel == 0 && dop.Diid == dto.DiId)
                         .OrderBy((dop, sd1, sd2) => dop.Index)
                         .Select((dop, sd1, sd2) => new DayOtherPriceMobileInfoView
@@ -370,38 +477,22 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 try
                 {
                     int enterExitId = 0;
-                    
+
                     if (enterExitCost.Id > 0) //修改
                     {
-                        //操作权限验证 只有创建人可修改
-                        var info = await _sqlSugar.Queryable<Grp_EnterExitCost,Sys_Users>((eec,u) => new JoinQueryInfos(JoinType.Left,eec.CreateUserId == u.Id))
-                            .Where((eec, u) => eec.IsDel == 0 && eec.Id == enterExitCost.Id)
-                            .Select((eec, u) => new { eec.CreateUserId,u.CnName })
-                            .FirstAsync();
-                        if (info.CreateUserId != dto.UserId)
+                        //操作权限验证 可查看人员亦可编辑
+                        var assignPerm = await PermissionValidationAsync(enterExitCost.DiId, dto.UserId);
+                        if (!assignPerm)
                         {
-                            
                             _sqlSugar.RollbackTran();
-                            result.Msg = $"该条信息只有操作人“{info.CnName}”可修改!";
+                            result.Msg = "未分配编辑权限,如要编辑,请联系市场部或国交部负责人!";
                             return result;
                         }
 
-                        //修改验证
-                        //IsConfirm == 2 不可修改
-                        //var info = _sqlSugar.Queryable<Grp_EnterExitCost>().Where(it => it.IsDel == 0 && it.Id == enterExitCost.Id).First();
-                        //if (info.IsConfirm == 2)
-                        //{
-                        //    result.Msg = "该团出入境费用已确认!不可更改!!";
-                        //    return result;
-                        //}
-
                         var updateId = _sqlSugar.Updateable<Grp_EnterExitCost>(enterExitCost)
-                                                .IgnoreColumns(it => new { it.DeleteUserId, it.DeleteTime, it.CreateUserId, it.CreateTime, it.IsDel })
-                                                .ExecuteCommand();
-                        if (updateId > 0)
-                        {
-                            enterExitId = enterExitCost.Id;
-                        }
+                            .IgnoreColumns(it => new { it.DeleteUserId, it.DeleteTime, it.CreateUserId, it.CreateTime, it.IsDel })
+                            .ExecuteCommand();
+                        if (updateId > 0) enterExitId = enterExitCost.Id;
                         else
                         {
                             _sqlSugar.RollbackTran();
@@ -413,12 +504,11 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     {
                         //效重 根据团组Id 
                         var info = _sqlSugar.Queryable<Grp_EnterExitCost>().Where(it => it.IsDel == 0 && it.DiId == dto.DiId).First();
-                        if (info != null )
+                        if (info != null)
                         {
                             _sqlSugar.RollbackTran();
                             result.Msg = "该团组相关数据已存在,请勿重新添加!";
                             return result;
-
                         }
 
                         //添加
@@ -430,28 +520,8 @@ namespace OASystem.Infrastructure.Repositories.Groups
                             return result;
                         }
 
-                        //默认添加查看权限
-                        var users = await PermissionViewUsersAsync();
-                        var userIds = users.Select(x => x.Id).ToList();
-                        if (userIds.Any())
-                        {
-                            var permissions = new List<Grp_EnterExitCostPermission>();
-                            foreach (var userId in userIds)
-                            {
-                                permissions.Add(new Grp_EnterExitCostPermission()
-                                {
-                                    GroupId = enterExitId,
-                                    UserId = userId,
-                                    Permission = 1,
-                                    CreateUserId = dto.UserId,
-                                });
-                            }
-
-                            if (permissions.Any())
-                            {
-                                _sqlSugar.Insertable(permissions).ExecuteReturnIdentity();
-                            }
-                        }
+                        //初始化权限(查看、编辑) 
+                        await InitPerm(dto.DiId, dto.UserId);
                     }
 
                     if (enterExitId > 0)
@@ -485,7 +555,6 @@ namespace OASystem.Infrastructure.Repositories.Groups
             }
             else result.Msg = MsgTips.Port;
 
-
             return result;
         }
 
@@ -515,7 +584,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                                         .SetColumns(x => new Grp_EnterExitCost() { IsConfirm = confirm })
                                         .Where(x => x.Id == dto.Id)
                                         .ExecuteCommandAsync();
-            if (update>0)
+            if (update > 0)
             {
                 _view.Code = 200;
                 _view.Msg = "操作成功!";
@@ -624,7 +693,8 @@ namespace OASystem.Infrastructure.Repositories.Groups
             if (userId < 1) return result = new Result() { Code = -1, Msg = "请传入有效的UserId参数!" };
 
             BeginTran();
-            Grp_EnterExitCost _EnterExitCost = new Grp_EnterExitCost() { 
+            Grp_EnterExitCost _EnterExitCost = new Grp_EnterExitCost()
+            {
                 Id = id,
                 IsDel = 1,
                 DeleteUserId = userId,
@@ -633,14 +703,16 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
             //int update = await _sqlSugar.Updateable<Grp_EnterExitCost>(_EnterExitCost).Where(it => it.Id == id).ExecuteCommandAsync();
             int update = await _sqlSugar.Updateable<Grp_EnterExitCost>(_EnterExitCost)
-                                        .UpdateColumns(it => new { 
-                                            it.IsDel,
-                                            it.DeleteUserId ,
-                                            it.DeleteTime
-                                        })
-                                        .Where(it => it.Id == id).ExecuteCommandAsync();
-
-            if (update > 0) {
+                .UpdateColumns(it => new
+                {
+                    it.IsDel,
+                    it.DeleteUserId,
+                    it.DeleteTime
+                })
+                .Where(it => it.Id == id).ExecuteCommandAsync();
+
+            if (update > 0)
+            {
                 string sqlDelete = string.Format(@"Delete From Grp_DayAndCost Where Diid = {0} ", diId);
                 await ExecuteCommandAsync(sqlDelete);
                 result.Code = 0;
@@ -652,7 +724,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 result.Msg = "操作失败";
                 RollbackTran();
             }
-            
+
             return result;
         }