Browse Source

重构和新增功能,优化权限验证

在 `Program.cs` 中,添加了 `Grp_RestaurantInfo` 和 `Grp_EnterExitCostQuote` 相关的表初始化代码。

在 `GroupsController.cs` 中:
- 添加了 `OASystem.Infrastructure.Tools` 和 `System.Text.Json` 的引用。
- 添加了 `EnterExitCostQuoteRepository` 的依赖注入。
- 删除了 `SetDayAndCostAreaChange` 方法,新增了 `EnterExitCostQuoteInitData`、`EnterExitCostQuoteNameListDto` 和 `EnterExitCostGroupNameListDto` 方法。

在 `EnterExitCostQuoteDto.cs` 中,新增了多个 DTO 类。

在 `Crm_TableOperationRecord.cs` 中,修正了注释格式。

在 `Grp_EnterExitCostQuote.cs` 中,修改了表名和字段,删除了一些字段,添加了 `CurrencyRemark` 字段。

在 `Grp_EnterExitCostQuoteItem.cs` 中,新增了 `Grp_EnterExitCostQuoteItem` 类。

在 `EnterExitCostQuoteView.cs` 中,新增了多个 View 类。

在 `EnterExitCostView.cs` 中,新增了 `LiveRateInfo` 类。

在 `EnterExitCostDraftRepository.cs` 中,修改了 `PermissionValidationAsync` 方法的返回类型,并相应地修改了调用逻辑。

在 `EnterExitCostQuoteRepository.cs` 中,新增了 `EnterExitCostQuoteRepository` 类及其方法。

在 `EnterExitCostRepository.cs` 中:
- 修改了 `PermissionValidationAsync` 方法的返回类型,并相应修改了调用逻辑。
- 修改了 `MobilePermissionsValidationAsync` 方法,接收两个返回值 `viewPerm` 和 `assignPerm`。

在 `CommonFun.cs` 中:
- 新增了 `TruncDecimals` 扩展方法,并删除了 `CutDecimalWithN` 方法。
- 新增了私有方法 `GetDecimalDigits`。
LEIYI 1 month ago
parent
commit
b2477400e2

+ 3 - 1
OASystem/EntitySync/Program.cs

@@ -147,6 +147,8 @@ db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(new Type[]
     //typeof(Res_BasicInsuranceCost)//保险国家基础费用 
     //typeof(Grp_EnterExitCostPermission),//团组 - 出入境费用 --> 操作权限
     //typeof(Grp_EnterExitCostDraftPermission)//团组 - 出入境费用 --> 操作权限-草稿
-    typeof(Grp_RestaurantInfo)
+    //typeof(Grp_RestaurantInfo),
+    //ypeof(Grp_EnterExitCostQuote), //团组 - 出入境费用报价表
+    //ypeof(Grp_EnterExitCostQuoteItem), //团组 - 出入境费用报价表
 });
 Console.WriteLine("数据库结构同步完成!");

+ 82 - 53
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -32,6 +32,7 @@ using OASystem.Domain.ViewModels.Groups;
 using OASystem.Infrastructure.Repositories.CRM;
 using OASystem.Infrastructure.Repositories.Financial;
 using OASystem.Infrastructure.Repositories.Groups;
+using OASystem.Infrastructure.Tools;
 using Quartz.Util;
 using SqlSugar.Extensions;
 using System.Collections;
@@ -39,6 +40,7 @@ using System.Data;
 using System.Diagnostics;
 using System.Globalization;
 using System.IO.Compression;
+using System.Text.Json;
 using TencentCloud.Ocr.V20181119.Models;
 using static OASystem.API.OAMethodLib.JWTHelper;
 using static OASystem.Infrastructure.Repositories.Groups.AirTicketResRepository;
@@ -105,6 +107,7 @@ namespace OASystem.API.Controllers
         private readonly TableOperationRecordRepository _tableorRep;
         private readonly EnterExitCostDraftRepository _enterExitCostDraftRep;
         private readonly RestaurantRepository _restaurantRep;
+        private readonly EnterExitCostQuoteRepository _enterExitCostQuoteRep;
 
         /// <summary>
         /// 构造函数
@@ -148,6 +151,7 @@ namespace OASystem.API.Controllers
         /// <param name="tableorRep"></param>
         /// <param name="enterExitCostDraftRep"></param>
         /// <param name="restaurantRep"></param>
+        /// <param name="enterExitCostQuoteRep"></param>
         public GroupsController(
             ILogger<GroupsController> logger,
             IMapper mapper,
@@ -186,7 +190,8 @@ namespace OASystem.API.Controllers
             OpinionaireRepository opinionaireRep,
             TableOperationRecordRepository tableorRep,
             EnterExitCostDraftRepository enterExitCostDraftRep,
-            RestaurantRepository restaurantRep
+            RestaurantRepository restaurantRep,
+            EnterExitCostQuoteRepository enterExitCostQuoteRep
             )
         {
             _logger = logger;
@@ -243,6 +248,7 @@ namespace OASystem.API.Controllers
             _tableorRep = tableorRep;
             _enterExitCostDraftRep = enterExitCostDraftRep;
             _restaurantRep = restaurantRep;
+            _enterExitCostQuoteRep = enterExitCostQuoteRep;
 
         }
 
@@ -5301,58 +5307,6 @@ FROM
 
         #region 团组经理模块 出入境费用
 
-        /// <summary>
-        /// 团组模块 - 出入境费用 - 子项 地区更改为 nationalTravelFee 的id
-        /// </summary>
-        /// <returns></returns>
-        [HttpPost]
-        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> SetDayAndCostAreaChange()
-        {
-            try
-            {
-                var nationalTravelFee = await _sqlSugar.Queryable<Grp_NationalTravelFee>().ToListAsync();
-                var dayAndCost = await _sqlSugar.Queryable<Grp_DayAndCost>().Where(it => it.IsDel == 0).ToListAsync();
-
-                var unite = dayAndCost.Where(a => nationalTravelFee.Any(b => a.Place.Trim() == b.City)).ToList(); //交集
-
-                var merge = dayAndCost.Where(a => !nationalTravelFee.Any(b => a.Place.Trim() == b.City)).ToList(); //差集
-
-                foreach (var item in unite) //处理交集数据
-                {
-                    dayAndCost.Where(it => it.Id == item.Id).FirstOrDefault().NationalTravelFeeId = nationalTravelFee.Where(it => it.City.Trim() == item.Place.Trim()).FirstOrDefault().Id;
-                }
-
-                foreach (var item in merge) //处理差集数据
-                {
-                    int nationalTravelFeeId = 0;
-
-                    var cityData = nationalTravelFee.Where(it => it.City.Trim() == item.Place.Trim()).FirstOrDefault();
-
-                    if (cityData != null) nationalTravelFeeId = cityData.Id;
-                    else
-                    {
-                        var countryData = nationalTravelFee.Where(it => it.Country.Trim() == item.Place.Trim()).FirstOrDefault();
-                        if (countryData != null) nationalTravelFeeId = countryData.Id;
-                    }
-
-                    dayAndCost.Where(it => it.Id == item.Id).FirstOrDefault().NationalTravelFeeId = nationalTravelFeeId;
-                }
-
-                //只更新dayAndCost 的 nationalTravelFeeId;
-                var result = _sqlSugar.Updateable(dayAndCost).UpdateColumns(it => new { it.NationalTravelFeeId }).ExecuteCommand();
-
-                if (result > 0) return Ok(JsonView(true, "nationalTravelFeeId列更新成功!"));
-                else return Ok(JsonView(false, "nationalTravelFeeId列更新失败!"));
-
-            }
-            catch (Exception ex)
-            {
-                return Ok(JsonView(false, ex.Message));
-                throw;
-            }
-        }
-
         /// <summary>
         /// 团组模块 - 出入境费用 - 基础数据源(团组名称/币种类型)
         /// </summary>
@@ -11773,6 +11727,81 @@ WHERE
 
         #endregion
 
+        #region 团组经理模块 出入境费用报价表
+        /// <summary>
+        /// 团组模块 - 出入境费用报价表 - 初始化数据源(币种类型)
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> EnterExitCostQuoteInitData(PortDtoBase dto)
+        {
+            //默认币种显示
+            var currencyInfos = new List<CurrencyInfo>()
+                {
+                    new CurrencyInfo (){ CurrencyCode="USD",CurrencyName = "美元",Rate = 7.5000M },
+                    new CurrencyInfo (){ CurrencyCode="EUR",CurrencyName = "欧元",Rate = 8.0000M },
+                    new CurrencyInfo (){ CurrencyCode="GBP",CurrencyName = "英镑",Rate = 9.5000M },
+                    new CurrencyInfo (){ CurrencyCode="JPY",CurrencyName = "日元",Rate = 0.0500M },
+                    new CurrencyInfo (){ CurrencyCode="HKD",CurrencyName = "港币",Rate = 0.9500M },
+                };
+
+            var liveRateInfos = new List<LiveRateInfo>();
+            var currencyRate = await _juHeApi.PostItemRateAsync(currencyInfos.Select(it => it.CurrencyCode!).ToArray());
+            if (currencyRate.Any())
+            {
+                foreach (var item in currencyInfos)
+                {
+                    var rateInfo = currencyRate.Where(it => it.Name.Equals(item.CurrencyName)).FirstOrDefault();
+                  
+                    if (rateInfo != null)
+                    {
+                        decimal rate1 = Convert.ToDecimal(rateInfo.FSellPri) / 100.00M;
+
+                        if (rateInfo.Name.Equals("日元")) rate1 *= 1.3700M;
+                        else rate1 *= 1.035M;
+
+                        liveRateInfos.Add(new LiveRateInfo() {
+                            CurrencyCode = item.CurrencyCode,
+                            CurrencyName = item.CurrencyName,
+                            Rate = rate1.TruncDecimals(4),
+                            LastUpdTime = $"{rateInfo.Date} {rateInfo.Time}",
+                        });
+                    }
+                }
+            }
+
+            return Ok(JsonView(true, "查询成功!", new
+            {
+                DefualtRates = currencyInfos,
+                LiveRates = liveRateInfos
+            }));
+        }
+
+        /// <summary>
+        /// 团组模块 - 出入境费用报价表 - 报价表名称列表
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> EnterExitCostQuoteNameListDto(EnterExitCostQuoteNameListDto dto)
+        {
+            return Ok(await _enterExitCostQuoteRep.QuoteNameListAsync(dto));
+        }
+
+        /// <summary>
+        /// 团组模块 - 出入境费用报价表 - 团组名称列表
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> EnterExitCostGroupNameListDto(EnterExitCostQuoteGroupNameListDto dto)
+        {
+            return Ok(await _enterExitCostQuoteRep.GroupNameListAsync(dto));
+        }
+
+        #endregion
+
         #region 签证费用录入
 
         /// <summary>

+ 33 - 0
OASystem/OASystem.Domain/Dtos/Groups/EnterExitCostQuoteDto.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Groups
+{
+    public class EnterExitCostQuoteDto
+    {
+    }
+
+    public class EnterExitCostQuoteNameListDto : DtoBase
+    {
+        /// <summary>
+        /// 报价名称
+        /// </summary>
+        public string Name { get; set; }
+    }
+
+    public class EnterExitCostQuoteGroupNameListDto : DtoBase
+    {
+        /// <summary>
+        /// 团组名称
+        /// </summary>
+        public string Name { get; set; }
+    }
+
+    public class EnterExitCostQuoteInfoDto : PortDtoBase
+    {
+        public int Id { get; set; }
+    }
+}

+ 1 - 1
OASystem/OASystem.Domain/Entities/Customer/Crm_TableOperationRecord.cs

@@ -17,7 +17,7 @@ namespace OASystem.Domain.Entities.Customer
         /// 表名
         /// "Crm_NewClientData" 客户资料表
         /// "Login" 登录
-        ///  "InforRetrogressTable"  会务倒退表
+        /// "InforRetrogressTable"  会务倒退表
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)")]
         public string? TableName { get; set; }

+ 13 - 41
OASystem/OASystem.Domain/Entities/Groups/Grp_EnterExitCostQuote.cs

@@ -7,57 +7,29 @@ using System.Threading.Tasks;
 namespace OASystem.Domain.Entities.Groups
 {
     /// <summary>
-    /// 团组 - 出入境费用报价
+    /// 团组-出入境费用报价
     /// </summary>
-    [SugarTable("Grp_EnterExitCost", "团组 - 出入境费用报价")]
-    public class Grp_EnterExitCostQuote: EntityBase
+    [SugarTable("Grp_EnterExitCostQuote", "团组-出入境费用报价")]
+    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; }
+        [SugarColumn(ColumnName = "Name", ColumnDescription = "报价名称", IsNullable = true, ColumnDataType = "varchar(120)")]
+        public string Name { get; set; }
 
         /// <summary>
-        /// 人数
+        /// 团组Id
         /// </summary>
-        [SugarColumn(ColumnName = "PplNum", ColumnDescription = "人数", IsNullable = true, ColumnDataType = "int")]
-        public int PplNum { get; set; }
+        [SugarColumn(ColumnName = "GroupId", ColumnDescription = "团组Id", IsNullable = true, ColumnDataType = "int")]
+        public int GroupId { get; set; }
 
         /// <summary>
-        /// 币种
+        ///  多个币种存储
+        ///  存储方式: 美元(USD):6.2350|.......|墨西哥比索(MXN):1.0000
         /// </summary>
-        [SugarColumn(ColumnName = "Currency", ColumnDescription = "币种", IsNullable = true, ColumnDataType = "int")]
-        public int Currency { get; set; }
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(500)")]
+        public string? CurrencyRemark { get; set; }
 
-        /// <summary>
-        /// 合计(CNY)
-        /// </summary>
-        [SugarColumn(ColumnName = "TotalAmt", ColumnDescription = "合计(CNY)", IsNullable = true, ColumnDataType = "deciaml(10,2)")]
-        public decimal TotalAmt { get; set; }
     }
 }

+ 64 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_EnterExitCostQuoteItem.cs

@@ -0,0 +1,64 @@
+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_EnterExitCostQuoteItem", "团组 - 出入境费用报价项信息")]
+    public class Grp_EnterExitCostQuoteItem: EntityBase
+    {
+        /// <summary>
+        /// 出入境费用报价表Id
+        /// </summary>
+        [SugarColumn(ColumnName = "QuoteId", ColumnDescription = "出入境费用报价表Id", IsNullable = true, ColumnDataType = "int")]
+        public int QuoteId { get; set; }
+
+        /// <summary>
+        /// 项ID
+        /// 项ID == 0 在备注里存入汇率相关信息
+        /// </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 = "decimal(10,2)")]
+        public decimal UnitPrice { get; set; }
+
+        /// <summary>
+        /// 数量/天数/间/晚/次
+        /// </summary>
+        [SugarColumn(ColumnName = "Quantity", ColumnDescription = "数量/天数/间/晚/次", IsNullable = true, ColumnDataType = "decimal(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 = "decimal(10,2)")]
+        public decimal TotalAmt { get; set; }
+    }
+}

+ 91 - 0
OASystem/OASystem.Domain/ViewModels/Groups/EnterExitCostQuoteView.cs

@@ -0,0 +1,91 @@
+using OASystem.Domain.Entities.Groups;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.Groups
+{
+    public class EnterExitCostQuoteView:Grp_EnterExitCostQuoteItem
+    {
+    }
+
+    /// <summary>
+    /// 初始化基础项视图
+    /// </summary>
+    public class InitBasicItemView
+    {
+        public int Id { get; set; }
+        public string Name { get; set; }
+        public int Index { get; set; }
+    }
+
+    public class NameView
+    {
+        public int Id { get; set; }
+        public string Name { get; set; }
+    }
+    public class EnterExitCostQuoteNameView : NameView { }
+    public class EnterExitCostQuoteGroupNameView : NameView { }
+
+    public class EnterExitCostQuoteInfoView
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 报价名称
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        public int GroupId { get; set; }
+
+        /// <summary>
+        /// 汇率信息
+        /// </summary>
+        public CurrencyInfo[] Rates { get; set; }
+
+        public int IntTravels { get; set; }
+
+
+    }
+
+    public class QuoteItemInfo
+    {
+        public int QuoteId { get; set; }
+        public int ItemId { get; set; }
+        public string FeeName { get; set; }
+        /// <summary>
+        /// 单价
+        /// </summary>
+        public decimal UnitPrice { get; set; }
+
+        /// <summary>
+        /// 数量/天数/间/晚/次
+        /// </summary>
+        public decimal Quantity { get; set; }
+
+        /// <summary>
+        /// 人数
+        /// </summary>
+        public int PplNum { get; set; }
+
+        /// <summary>
+        /// 币种
+        /// </summary>
+        public int Currency { get; set; }
+
+        /// <summary>
+        /// 合计(CNY)
+        /// </summary>
+        public decimal TotalAmt { get; set; }
+
+        public string Remark { get; set; }
+    }
+}

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

@@ -1272,4 +1272,15 @@ namespace OASystem.Domain.ViewModels.Groups
         /// </summary>
         public decimal Rate { get; set; }
     }
+
+    /// <summary>
+    /// 实时汇率详情
+    /// </summary>
+    public class LiveRateInfo : CurrencyInfo
+    {
+        /// <summary>
+        /// 最后更新时间
+        /// </summary>
+        public string LastUpdTime { get; set; }
+    }
 }

+ 13 - 14
OASystem/OASystem.Infrastructure/Repositories/Groups/EnterExitCostDraftRepository.cs

@@ -140,12 +140,12 @@ namespace OASystem.Infrastructure.Repositories.Groups
         /// <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, bool)> PermissionValidationAsync(int darftId, int userId, int permission = 1)
         {
             //参数验证
-            if (darftId < 1) return false;
+            if (darftId < 1) return (false,false);
             var permissionIds = new List<int>() { 1, 2, 3, 4, 5 };
-            if (!permissionIds.Contains(permission)) return false;
+            if (!permissionIds.Contains(permission)) return (false, false);
 
             var feeBasePermUserIds = new List<int>();
             var feeBasePerm = AppSettingsHelper.Get<FeeBasePermView>("FeeBasePerm");
@@ -158,14 +158,14 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 if (mktStratData != null) if (mktStratData.Users.Any()) feeBasePermUserIds.AddRange(mktStratData.Users.Select(x => x.Id).ToList());
             }
 
-            if (feeBasePermUserIds.Any(x => x == userId)) return true;
+            if (feeBasePermUserIds.Any(x => x == userId)) return (true, true);
 
             var info = await _sqlSugar.Queryable<Grp_EnterExitCostDraftPermission>()
                 .Where(it => it.DraftId == darftId && it.UserId == userId && it.Permission == permission)
                 .FirstAsync();
-            if (info != null) return true;
+            if (info != null) return(true, false);
 
-            return false;
+            return  (false, false);
         }
 
         /// <summary>
@@ -183,7 +183,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
             var enterExitCostData = await _sqlSugar.Queryable<Grp_EnterExitCostDraft>().OrderByDescending(x => x.CreateTime).FirstAsync(it => it.Id == id && it.IsDel == 0);
             if (permissionType == 1)
             {
-                status = await PermissionValidationAsync(id, currUserId);//查看权限
+                (status, bool assginPerm) = await PermissionValidationAsync(id, currUserId);//查看权限
                 if (enterExitCostData.CreateUserId == currUserId) status = true; //查看权限
                 if (!status) msg = $"未分配查看权限,如要查看,请联系市场部或国交部负责人!";
 
@@ -191,7 +191,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
             }
             else if (permissionType == 2)
             {
-                status = await PermissionValidationAsync(id, currUserId);//查看权限
+                (status, bool assginPerm) = await PermissionValidationAsync(id, currUserId);//查看权限
                 if (enterExitCostData.CreateUserId == currUserId) status = true; //查看权限
                 if (!status) msg = $"未分配查看权限,如要查看,请联系市场部或国交部负责人!";
 
@@ -222,9 +222,9 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
                     enterExitCostInfoView = _mapper.Map<EnterExitCostDraftInfoView>(enterExitCostDraftData);
 
-                    bool assignPerm = await PermissionValidationAsync(enterExitCostDraftData.Id, dto.CurrUserId);
+                    (bool viewPerm, bool assignPerm) = await PermissionValidationAsync(enterExitCostDraftData.Id, dto.CurrUserId);
 
-                    if (assignPerm || enterExitCostDraftData.CreateUserId == dto.CurrUserId)
+                    if (viewPerm || enterExitCostDraftData.CreateUserId == dto.CurrUserId)
                     {
                         enterExitCostInfoView.IsSave = true; //操作权限
                         enterExitCostInfoView.IsView = true; //查看权限
@@ -236,8 +236,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     }
 
                     //设置权限按钮
-                    var feeBasePerm = AppSettingsHelper.Get<PermissionViewUserview>("FeeBasePerm");
-                    if (feeBasePerm.Any(x => x.Id == dto.CurrUserId))
+                    if (assignPerm)
                     {
                         enterExitCostInfoView.IsAssignPerm = true;
 
@@ -358,8 +357,8 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     if (isNull != null) //修改
                     {
 
-                        var assignPerm = await PermissionValidationAsync(enterExitCost.Id, dto.UserId);
-                        if (!assignPerm)
+                        (bool viewPerm,bool assignPerm)  = await PermissionValidationAsync(enterExitCost.Id, dto.UserId);
+                        if (!viewPerm)
                         {
                             _sqlSugar.RollbackTran();
                             result.Msg = "未分配编辑权限,如要编辑,请联系市场部或国交部负责人!";

+ 196 - 0
OASystem/OASystem.Infrastructure/Repositories/Groups/EnterExitCostQuoteRepository.cs

@@ -0,0 +1,196 @@
+using AutoMapper;
+using OASystem.Domain;
+using OASystem.Domain.Dtos.Groups;
+using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.ViewModels.Groups;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Infrastructure.Repositories.Groups
+{
+    /// <summary>
+    /// 团组-出入境费用报价表 仓储
+    /// </summary>
+    public class EnterExitCostQuoteRepository : BaseRepository<Grp_EnterExitCostQuoteItem, EnterExitCostQuoteView>
+    {
+        private readonly IMapper _mapper; 
+        public EnterExitCostQuoteRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar)
+        {
+            _mapper = mapper;
+        }
+
+        /// <summary>
+        /// 初始化基础项
+        /// </summary>
+        /// <param name="removeNl">是否移除换行符</param>
+        /// <returns></returns>
+        public async Task<List<InitBasicItemView>> InitBasicItemAsync(bool removeNl)
+        {
+            var origList = await _sqlSugar.Queryable<Sys_SetData>()
+                .Where(x => x.IsDel == 0 && x.STid == 105)
+                .Select(x => new
+                {
+                    Id = x.Id,
+                    Name = x.Name,
+                    Index = x.Remark ?? "-1"
+                }).ToListAsync();
+
+            var newList = origList.Select(x => new InitBasicItemView
+                {
+                    Id = x.Id,
+                    Name = removeNl ? x.Name.Replace("\r\n", "") : x.Name,
+                    Index = int.TryParse(x.Index,out int index) ? index : -1
+                })
+                .OrderBy(x => x.Index)
+                .ToList();
+            return newList;
+        }
+
+        /// <summary>
+        /// 获取报价名称列表
+        /// </summary>
+        /// <param name="name"></param>
+        /// <param name="pageIndex"></param>
+        /// <param name="pageSize"></param>
+        /// <returns></returns>
+        public async Task<JsonView> QuoteNameListAsync(EnterExitCostQuoteNameListDto dto)
+        {
+            int pageIndex = dto.PageIndex, pageSize = dto.PageSize;
+            string name = dto.Name;
+
+            if (pageIndex < 1 || pageSize < 1)
+            {
+                var noPageList = await _sqlSugar.Queryable<Grp_EnterExitCostQuote>()
+                .Where(x => x.IsDel == 0 && !string.IsNullOrEmpty(x.Name))
+                .WhereIF(!string.IsNullOrEmpty(name), x => x.Name.Contains(name))
+                .Select(x => new EnterExitCostQuoteNameView
+                {
+                    Id = x.Id,
+                    Name = x.Name
+                }).ToListAsync();
+
+                return new JsonView
+                {
+                    Code = StatusCodes.Status200OK,
+                    Msg = "获取成功",
+                    Count = noPageList.Count,
+                    Data = noPageList
+                };
+            }
+
+            RefAsync<int> total = 0;
+            var pageList = await _sqlSugar.Queryable<Grp_EnterExitCostQuote>()
+                .Where(x => x.IsDel == 0 && !string.IsNullOrEmpty(x.Name))
+                .WhereIF(!string.IsNullOrEmpty(name), x => x.Name.Contains(name))
+                .Select(x => new EnterExitCostQuoteNameView
+                {
+                    Id = x.Id,
+                    Name = x.Name
+                }).ToPageListAsync(pageIndex, pageSize, total);
+
+            return new JsonView
+            {
+                Code = StatusCodes.Status200OK,
+                Msg = "获取成功",
+                Count = total,
+                Data = pageList
+            };
+        }
+
+        /// <summary>
+        /// 获取团组名称列表
+        /// </summary>
+        /// <param name="name"></param>
+        /// <param name="pageIndex"></param>
+        /// <param name="pageSize"></param>
+        /// <returns></returns>
+        public async Task<JsonView> GroupNameListAsync(EnterExitCostQuoteGroupNameListDto dto)
+        {
+            int pageIndex = dto.PageIndex, pageSize = dto.PageSize;
+            string name = dto.Name;
+
+            if (pageIndex < 1 || pageSize < 1)
+            {
+                var noPageList = await _sqlSugar.Queryable<Grp_DelegationInfo>()
+                .Where(x => x.IsDel == 0 && !string.IsNullOrEmpty(x.TeamName))
+                .WhereIF(!string.IsNullOrEmpty(name), x => x.TeamName.Contains(name))
+                .OrderByDescending(x => x.CreateTime)
+                .Select(x => new EnterExitCostQuoteGroupNameView
+                {
+                    Id = x.Id,
+                    Name = x.TeamName
+                }).ToListAsync();
+
+                return new JsonView
+                {
+                    Code = StatusCodes.Status200OK,
+                    Msg = "获取成功",
+                    Count = noPageList.Count,
+                    Data = noPageList
+                };
+            }
+
+            RefAsync<int> total = 0;
+            var pageList = await _sqlSugar.Queryable<Grp_DelegationInfo>()
+                .Where(x => x.IsDel == 0 && !string.IsNullOrEmpty(x.TeamName))
+                .WhereIF(!string.IsNullOrEmpty(name), x => x.TeamName.Contains(name))
+                .OrderByDescending(x => x.CreateTime)
+                .Select(x => new EnterExitCostQuoteGroupNameView
+                {
+                    Id = x.Id,
+                    Name = x.TeamName
+                }).ToPageListAsync(pageIndex, pageSize, total);
+
+            return new JsonView
+            {
+                Code = StatusCodes.Status200OK,
+                Msg = "获取成功",
+                Count = total,
+                Data = pageList
+            };
+        }
+
+        /// <summary>
+        /// 获取团组名称列表
+        /// </summary>
+        /// <param name="name"></param>
+        /// <param name="pageIndex"></param>
+        /// <param name="pageSize"></param>
+        /// <returns></returns>
+        public async Task<JsonView> InfoAsync(EnterExitCostQuoteInfoDto dto)
+        {
+            if (dto.Id < 1)
+            {
+                return new JsonView
+                {
+                    Code = StatusCodes.Status400BadRequest,
+                    Msg = MsgTips.Id
+                };
+            }
+
+            var quoteInfo = await _sqlSugar.Queryable<Grp_EnterExitCostQuote>()
+                 .Where(x => x.IsDel == 0 && x.Id == x.Id)
+                 .FirstAsync();
+            if (quoteInfo == null)
+            {
+                return new JsonView
+                {
+                    Code = StatusCodes.Status400BadRequest,
+                    Msg = $"未找到Id为{dto.Id}的数据"
+                };
+            }
+
+            //(List<CurrencyInfo>?)CommonFun.GetCurrencyChinaToList(enterExitCostData.CurrencyRemark)
+
+            return new JsonView
+            {
+                Code = StatusCodes.Status200OK,
+                Msg = "获取成功",
+               // Data = pageList
+            };
+        }
+    }
+}

+ 13 - 15
OASystem/OASystem.Infrastructure/Repositories/Groups/EnterExitCostRepository.cs

@@ -146,13 +146,13 @@ namespace OASystem.Infrastructure.Repositories.Groups
         /// <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)
+        public async Task<(bool, bool)> PermissionValidationAsync(int groupId, int userId, int permission = 1)
         {
             //参数验证
-            if (groupId < 1) return false;
-            if (userId < 1) return false;
+            if (groupId < 1) return (false, false);
+            if (userId < 1) return (false, false);
             var permissionIds = new List<int>() { 1, 2, 3, 4, 5 };
-            if (!permissionIds.Contains(permission)) return false;
+            if (!permissionIds.Contains(permission)) return (false, false);
 
             var feeBasePerm = AppSettingsHelper.Get<FeeBasePermView>("FeeBasePerm");
             var feeBasePermUserIds = new List<int>(); 
@@ -166,17 +166,16 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 if (mktStratData != null) if (mktStratData.Users.Any()) feeBasePermUserIds.AddRange(mktStratData.Users.Select(x => x.Id).ToList());
             }
 
-            if (feeBasePermUserIds.Any(x => x == userId)) return true;
+            if (feeBasePermUserIds.Any(x => x == userId)) return (true, true);
 
             var info = await _sqlSugar.Queryable<Grp_EnterExitCostPermission>()
                 .Where(it => it.GroupId == groupId && it.UserId == userId && it.Permission == permission)
                 .FirstAsync();
-            if (info != null) return true;
+            if (info != null) return (true, false);
 
-            return false;
+            return (false, false);
         }
 
-
         /// <summary>
         /// 更新出入境费用汇率信息
         /// </summary>
@@ -218,7 +217,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
         public async Task<(bool, string)> MobilePermissionsValidationAsync(int groupId, int currUserId, int permissionType = 1)
         {
             string msg = string.Empty;
-            bool assignPerm = await PermissionValidationAsync(groupId, currUserId);//分配权限
+            (bool viewPerm,bool assignPerm) = await PermissionValidationAsync(groupId, currUserId);//分配权限
 
             var enterExitCostData = await _sqlSugar
                 .Queryable<Grp_EnterExitCost>()
@@ -267,8 +266,8 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 {
                     enterExitCostInfoView = _mapper.Map<EnterExitCostInfoView>(enterExitCostData);
 
-                    bool assignPerm = await PermissionValidationAsync(dto.DiId, dto.CurrUserId);
-                    if (assignPerm || enterExitCostData.CreateUserId == dto.CurrUserId)
+                    (bool viewPerm, bool assignPerm) = await PermissionValidationAsync(dto.DiId, dto.CurrUserId);
+                    if (viewPerm || enterExitCostData.CreateUserId == dto.CurrUserId)
                     {
                         enterExitCostInfoView.IsSave = true; //操作权限
                         enterExitCostInfoView.IsView = true; //查看权限
@@ -280,8 +279,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     }
 
                     //设置权限按钮
-                    var feeBasePerm = AppSettingsHelper.Get<PermissionViewUserview>("FeeBasePerm");
-                    if (feeBasePerm.Any(x => x.Id == dto.CurrUserId))
+                    if (assignPerm)
                     {
                         enterExitCostInfoView.IsAssignPerm = true;
 
@@ -481,8 +479,8 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     if (enterExitCost.Id > 0) //修改
                     {
                         //操作权限验证 可查看人员亦可编辑
-                        var assignPerm = await PermissionValidationAsync(enterExitCost.DiId, dto.UserId);
-                        if (!assignPerm)
+                        (bool viewPerm,bool assignPerm) = await PermissionValidationAsync(enterExitCost.DiId, dto.UserId);
+                        if (!viewPerm)
                         {
                             _sqlSugar.RollbackTran();
                             result.Msg = "未分配编辑权限,如要编辑,请联系市场部或国交部负责人!";

+ 22 - 4
OASystem/OASystem.Infrastructure/Tools/CommonFun.cs

@@ -295,13 +295,31 @@ public static class CommonFun
         return Decimal.Parse(strDecimal);
     }
 
-    public static decimal CutDecimalWithN(decimal? d, int n)
+
+    /// <summary>
+    /// decimal 保留小数,不四舍五入
+    /// </summary>
+    /// <param name="value"></param>
+    /// <param name="decimalPlaces"></param>
+    /// <returns></returns>
+    public static decimal TruncDecimals(this decimal value, int decimalPlaces)
     {
-        if (d == null)
+        decimal scaleFactor = (decimal)Math.Pow(10, decimalPlaces);
+        var truncated = Math.Truncate(scaleFactor * value) / scaleFactor;
+
+        // 检查是否需要补零
+        if (GetDecimalDigits(value) < decimalPlaces)
         {
-            return Decimal.MinValue;
+            string format = "0." + new string('0', decimalPlaces);
+            truncated = decimal.Parse(truncated.ToString(format));
         }
-        return CutDecimalWithN(Convert.ToDecimal(d), n);
+
+        return truncated;
+    }
+    private static int GetDecimalDigits(decimal number)
+    {
+        string[] parts = number.ToString().Split('.');
+        return parts.Length > 1 ? parts[1].Length : 0;
     }
 
     #endregion