瀏覽代碼

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

yuanrf 13 小時之前
父節點
當前提交
2cdb10d2ba

+ 3 - 2
OASystem/EntitySync/Program.cs

@@ -161,8 +161,7 @@ db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(new Type[]
     //typeof(Grp_OrderPreInfo), //团组下单前信息
     //typeof(Grp_OrderPreItem), //团组下单前信息Item
     //typeof(Grp_GroupShareFile),//团组共享文件 
-    //typeof(Pm_GoodsAudit),//物品确认审核表 
-    
+    //typeof(Pm_GoodsAudit),//物品确认审核表
     //typeof(Pm_GoodsReceiveDetails),//物品领用明细表 
     /*审核流程相关表*/
     //typeof(Sys_AuditFlow),//审核流程表 
@@ -179,5 +178,7 @@ db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(new Type[]
     //typeof(Grp_VisaProcessSteps_Log),//流程节点 
     //typeof(Grp_ProcessLog),//流程节点 
     //typeof(Grp_FeeEntryAcknowledge),//团组费用录入通知记录表 
+    typeof(Res_OverseaVehicle),//境外用车信息 
+    typeof(Res_OverseaVehicleTypePrice),//境外用车类型价格信息     
 });
 Console.WriteLine("数据库结构同步完成!");

+ 5 - 0
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -10665,6 +10665,11 @@ FROM
             }));
         }
 
+        #region 城市区间交通费
+
+        #endregion
+
+
         /// <summary>
         /// 团组模块 - 出入境费用 - Info
         /// </summary>

+ 62 - 5
OASystem/OASystem.Api/Controllers/MarketCustomerResourcesController.cs

@@ -1,5 +1,6 @@
 using Aspose.Cells;
 using EyeSoft.Extensions;
+using NPOI.SS.Formula.Functions;
 using OASystem.API.OAMethodLib;
 using OASystem.Domain.AesEncryption;
 using OASystem.Domain.Attributes;
@@ -9,6 +10,7 @@ using OASystem.Infrastructure.Repositories.CRM;
 using OASystem.RedisRepository;
 using System.Collections;
 using System.Data;
+using System.Diagnostics;
 using System.Net;
 using UAParser;
 
@@ -1285,6 +1287,65 @@ namespace OASystem.API.Controllers
             return Ok(jw);
         }
 
+        [HttpGet("{userId}")]
+        public async Task<IActionResult> SearchClientByUserId(int userId)
+        {
+            var sw = Stopwatch.StartNew();
+            var jw = JsonView(true);
+            if (!await _sqlSugar.Queryable<Sys_Users>().Where(x => x.IsDel == 0 && x.Id == userId).AnyAsync())
+            {
+                jw.Code = StatusCodes.Status400BadRequest;
+                jw.Msg = $"请传入有效的UserId";
+                return Ok(jw);
+            }
+
+            var expression = Expressionable.Create<Crm_NewClientData>().And(x => x.IsDel == 0);
+
+            //获取个人的客户
+            if (userId != 21)
+            {
+                var userList = _clientDataRepository.GetNewExistClient(userId).Select(x => x.Id);
+                var newClientData = _sqlSugar.Queryable<Crm_ClientDataAndUser>()
+                    .Where(x => x.IsDel == 0 && userList.Contains(x.usersId))
+                    .Select(x => x.NewClientDataId)
+                    .Distinct()
+                    .ToList();
+                expression = expression.And(x => newClientData.Contains(x.Id));
+            }
+
+            string field = "Id,Client";
+            var newClitnData = _sqlSugar.Queryable<Crm_NewClientData>()
+                .Where(expression.ToExpression())
+                .Select(field)
+                .ToList();
+            foreach (var item in newClitnData)
+            {
+                EncryptionProcessor.DecryptProperties(item);
+            }
+
+            var matches = newClitnData
+                    .Where(fullString => !string.IsNullOrWhiteSpace(fullString.Client))
+                    .OrderByDescending(x => x.Id)
+                    .Select(x => new { x.Id, x.Client })
+                    .DistinctBy(x => x.Client)
+                    .ToList();
+
+            if (matches.Any())
+            {
+                jw.Data = matches;
+                jw.Count = matches.Count();
+            }
+            else
+            {
+                jw.Code = 201;
+                jw.Msg = "empty list";
+                jw.Data = new List<string>(1);
+            }
+
+            sw.Stop();
+            jw.Msg = $"操作成功!耗时:{sw.Elapsed.TotalMilliseconds}ms.";
+            return Ok(jw);
+        }
 
         [HttpPost]
         public async Task<IActionResult> QueryUnlockDropList()
@@ -1311,8 +1372,6 @@ namespace OASystem.API.Controllers
             return Ok(jw);
         }
 
-
-
         [HttpPost]
         public IActionResult InsertDataExcel(InsertDataExcelDto dto)
         {
@@ -1430,7 +1489,7 @@ namespace OASystem.API.Controllers
 
             // 获取表头(第一行作为列名)
             int headerRowIndex = 0; // 假设第一行是表头
-            Row headerRow = worksheet.Cells.Rows[headerRowIndex];
+            Aspose.Cells.Row headerRow = worksheet.Cells.Rows[headerRowIndex];
             int colCount = worksheet.Cells.MaxDataColumn + 1;
 
             // 动态存储列名
@@ -1594,8 +1653,6 @@ namespace OASystem.API.Controllers
         }
 
         #region 回滚数据记录
-
-
         //[HttpPost]
         //public async Task<IActionResult> actionResult()
         //{

+ 85 - 2
OASystem/OASystem.Api/Controllers/ResourceController.cs

@@ -45,7 +45,8 @@ namespace OASystem.API.Controllers
         private readonly MediaSuppliersRepository _mediaSupplierRep;
         private readonly List<int> _portIds;
         private readonly BasicInsuranceCostRepository _insuranceCostRep;
-        private readonly GamesBudgetMasterRepository _gamesBudgetMasterRep;
+        private readonly GamesBudgetMasterRepository _gamesBudgetMasterRep; 
+        private readonly OverseaVehicleRepository _overseaVehicleRep;
         /// <summary>
         /// 签证费用归属省份静态数据
         /// </summary>
@@ -79,7 +80,8 @@ namespace OASystem.API.Controllers
             TranslatorLibraryRepository translatorRep,
             MediaSuppliersRepository mediaSupplierRep,
             BasicInsuranceCostRepository insuranceCostRep,
-            GamesBudgetMasterRepository gamesBudgetMasterRep
+            GamesBudgetMasterRepository gamesBudgetMasterRep,
+            OverseaVehicleRepository overseaVehicleRep
             )
         {
             _mapper = mapper;
@@ -105,6 +107,7 @@ namespace OASystem.API.Controllers
             _portIds = new List<int> { 1, 2, 3 };
             _insuranceCostRep = insuranceCostRep;
             _gamesBudgetMasterRep = gamesBudgetMasterRep;
+            _overseaVehicleRep = overseaVehicleRep;
         }
 
         #region 车公司资料板块
@@ -5129,6 +5132,86 @@ WHERE
         }
 
 
+        #endregion
+
+        #region 境外用车
+
+        /// <summary>
+        /// 境外用车 
+        /// Init
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet()]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> OverseaVehicleInitAsync()
+        {
+            return Ok(await _overseaVehicleRep.InitAsync());
+        }
+
+        /// <summary>
+        /// 境外用车 
+        /// Info
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("{id}")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> OverseaVehicleInfoAsync([Required(ErrorMessage = "数据编号不能为空!")] int id)
+        {
+            return Ok(await _overseaVehicleRep.InfoAsync(id));
+        }
+
+        /// <summary>
+        /// 境外用车
+        /// List
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> OverseaVehicleListAsync(OverseaVehicleListDto dto)
+        {
+            return Ok(await _overseaVehicleRep.ListAsync(dto));
+        }
+
+        /// <summary>
+        /// 境外用车
+        /// OP(Add/Edit)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> OverseaVehicleAddOrEditAsync(OverseaVehicleAddOrEditDto dto)
+        {
+            if (dto.Id > 0)
+            {
+                //修改
+                return Ok(await _overseaVehicleRep.EditAsync(dto));
+            }
+            else if (dto.Id < 1)
+            {
+                //添加
+                return Ok(await _overseaVehicleRep.AddAsync(dto));
+            }
+
+            return Ok(JsonView(false));
+        }
+
+        /// <summary>
+        /// 境外用车
+        /// 删除
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> OverseaVehicleDelAsync(OverseaVehicleDelDto dto)
+        {
+            return Ok(await _overseaVehicleRep.DelAsync(dto));
+        }
+
+
         #endregion
     }
 }

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

@@ -93,7 +93,7 @@ namespace OASystem.API.Controllers
         #region ALL OA 多词条搜索
 
         /// <summary>
-        ///  日付信息列表 关键字输入提示
+        ///  日付信息 关键字输入提示
         /// </summary>
         /// <param name="keyword">关键字</param>
         /// <param name="auditType">审核类型 0 全部 1 张总未审核</param>

+ 8 - 0
OASystem/OASystem.Domain/AutoMappers/_baseMappingProfile.cs

@@ -321,6 +321,14 @@ namespace OASystem.Domain.AutoMappers
             CreateMap<GamesBudgetMasterAddDto, Grp_GamesBudgetMaster>();
             CreateMap<GamesBudgetMasterEditDto, Grp_GamesBudgetMaster>();
             #endregion
+
+            #region 境外用车信息
+            CreateMap<Res_OverseaVehicle, OverseaVehicleInfoView>();
+            CreateMap<OverseaVehicleInfoView, Res_OverseaVehicle>();
+            CreateMap<OverseaVehicleTypeInfoView, Res_OverseaVehicleTypePrice>();
+            CreateMap<Res_OverseaVehicleTypePrice, OverseaVehicleTypeInfoView>();
+            CreateMap<OverseaVehicleAddOrEditDto, Res_OverseaVehicle>();
+            #endregion
             #endregion
 
             #region Crm

+ 76 - 0
OASystem/OASystem.Domain/Dtos/Resource/OverseaVehicleDto.cs

@@ -0,0 +1,76 @@
+using OASystem.Domain.ViewModels.Resource;
+
+namespace OASystem.Domain.Dtos.Resource
+{
+    /// <summary>
+    /// 境外用车 Dto
+    /// </summary>
+    public class OverseaVehicleDto
+    {
+        public int Id { get; set; }
+    }
+
+    public class OverseaVehicleListDto : DtoBase
+    {
+        public string Search { get; set; }
+    }
+
+    public class OverseaVehicleAddOrEditDto: OverseaVehicleDto
+    {
+        /// <summary>
+        /// 大洲名称
+        /// </summary>
+        public string ContinentName { get; set; }
+
+        /// <summary>
+        /// 国家名称
+        /// </summary>
+        public string CountryName { get; set; }
+
+        /// <summary>
+        /// 城市名称
+        /// </summary>
+        public string CityName { get; set; }
+
+        /// <summary>
+        /// 接送机导游价格
+        /// </summary>
+        public decimal GuidePrice { get; set; }
+
+        /// <summary>
+        /// 其他费用1:举牌接机(仅澳大利亚使用)
+        /// </summary>
+        public decimal OtherPrice1 { get; set; }
+
+        /// <summary>
+        /// 其他费用2:送机协助值机(仅澳大利亚使用)
+        /// </summary>
+        public decimal OtherPrice2 { get; set; }
+
+        /// <summary>
+        /// 其他费用3:备用
+        /// </summary>
+        public decimal OtherPrice3 { get; set; }
+
+        /// <summary>
+        /// 费用结算币种 SetdataId = 66
+        /// </summary>
+        public int Currency { get; set; }
+
+        /// <summary>
+        /// 车型价格信息
+        /// </summary>
+        public List<OverseaVehicleTypeInfoView> CarInfos { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string Remark { get; set; }
+        public int CurrUserId { get; set; }
+    }
+
+    public class OverseaVehicleDelDto : OverseaVehicleDto
+    {
+        public int CurrUserId { get; set; }
+    }
+}

+ 12 - 18
OASystem/OASystem.Domain/Entities/Groups/ConferenceAffairsCost.cs

@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace OASystem.Domain.Entities.Groups
+namespace OASystem.Domain.Entities.Groups
 {
     /// <summary>
     /// 会务活动主表
@@ -16,9 +10,9 @@ namespace OASystem.Domain.Entities.Groups
         /// </summary>
         public string City { get; set; }
 
-        /// <summary>
-        /// 权限控制
-        /// </summary>
+        ///// <summary>
+        ///// 权限控制
+        ///// </summary>
         //public string PermissionControl { get; set; }
 
         /// <summary>
@@ -34,7 +28,7 @@ namespace OASystem.Domain.Entities.Groups
         /// <summary>
         /// 分配币种
         /// </summary>
-        public int AllocationCurrency { get;set; }
+        public int AllocationCurrency { get; set; }
 
         /// <summary>
         /// 分配时汇率
@@ -68,21 +62,21 @@ namespace OASystem.Domain.Entities.Groups
     /// </summary>
     public class Grp_ConferenceAffairsCostChild : Entities.EntityBase
     {
-        /// <summary>
-        /// 是否选中
-        /// </summary>
+        ///// <summary>
+        ///// 是否选中
+        ///// </summary>
         //public bool isCheck { get; set; }
 
         /// <summary>
         /// 序号
         /// </summary>
         public int Index { get; set; }
-        
+
         /// <summary>
         /// 费用类型
         /// </summary>
         public int PriceType { get; set; }
-    
+
         /// <summary>
         /// 费用名称
         /// </summary>
@@ -93,7 +87,7 @@ namespace OASystem.Domain.Entities.Groups
         /// 成本费用
         /// </summary>
         public decimal CostPrice { get; set; }
-        
+
         /// <summary>
         /// 币种
         /// </summary>
@@ -127,7 +121,7 @@ namespace OASystem.Domain.Entities.Groups
         /// <summary>
         /// 附加值
         /// </summary>
-        public decimal AddedValue { get;set; }
+        public decimal AddedValue { get; set; }
 
 
         /// <summary>

+ 12 - 8
OASystem/OASystem.Domain/Entities/Groups/Grp_CarGuides.cs

@@ -1,15 +1,9 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace OASystem.Domain.Entities.Groups
+namespace OASystem.Domain.Entities.Groups
 {
     /// <summary>
     /// 司兼导
     /// </summary>
-    public class Grp_CarGuides:EntityBase
+    public class Grp_CarGuides : EntityBase
     {
         /// <summary>
         /// 国家
@@ -54,6 +48,16 @@ namespace OASystem.Domain.Entities.Groups
         /// 币种
         /// </summary>
         public string Currency { get; set; }
+
+        /// <summary>
+        /// 最后修改用户Id
+        /// </summary>
+        public int LastUpdateUserId { get; set; }
+
+        /// <summary>
+        /// 最后修改时间
+        /// </summary>
+        public string LastUpdateTime { get; set; }
     }
 
     /// <summary>

+ 6 - 6
OASystem/OASystem.Domain/Entities/Groups/Grp_ConferenceProcedures.cs

@@ -14,9 +14,9 @@ namespace OASystem.Domain.Entities.Groups
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
         public int DiId { get; set; }
 
-        /// <summary>
-        /// 标题Id
-        /// </summary>
+        ///// <summary>
+        ///// 标题Id
+        ///// </summary>
         //[SugarColumn(IsNullable = true, ColumnDataType = "int")]
         //public int TitleId { get; set; }
 
@@ -26,9 +26,9 @@ namespace OASystem.Domain.Entities.Groups
         [SugarColumn(IsNullable = true, ColumnDataType = "varchar(100)")]
         public string Title { get; set; }
 
-        /// <summary>
-        /// 时间安排
-        /// </summary>
+        ///// <summary>
+        ///// 时间安排
+        ///// </summary>
         //[SugarColumn(IsNullable = true, ColumnDataType = "DateTime")]
         //public DateTime Date { get; set; }
 

+ 183 - 0
OASystem/OASystem.Domain/Entities/Resource/Res_OverseaVehicle.cs

@@ -0,0 +1,183 @@
+using OASystem.Domain.Enums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.Resource
+{
+    /// <summary>
+    /// 境外用车信息
+    /// </summary>
+    [SugarTable("Res_OverseaVehicle", "境外用车信息")]
+    public class Res_OverseaVehicle : EntityBase
+    {
+        /// <summary>
+        /// 大洲名称
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "ContinentName",
+            ColumnDescription = "大洲名称",
+            ColumnDataType = "varchar(50)",
+            IsNullable = true)]
+        public string ContinentName { get; set; }
+
+        /// <summary>
+        /// 国家名称
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "CountryName",
+            ColumnDescription = "国家名称",
+            ColumnDataType = "varchar(50)",
+            IsNullable = true)]
+        public string CountryName { get; set; }
+
+        /// <summary>
+        /// 城市名称
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "CityName",
+            ColumnDescription = "城市名称",
+            ColumnDataType = "varchar(100)",
+            IsNullable = true)]
+        public string CityName { get; set; }
+
+        /// <summary>
+        /// 接送机导游价格
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "GuidePrice",
+            ColumnDescription = "接送机导游价格",
+            ColumnDataType = "decimal(10,2)",
+            IsNullable = true)]
+        public decimal GuidePrice { get; set; }
+
+        /// <summary>
+        /// 其他费用1:举牌接机(仅澳大利亚使用)
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "OtherPrice1",
+            ColumnDescription = "其他费用1:举牌接机(仅澳大利亚使用)",
+            ColumnDataType = "decimal(10,2)",
+            IsNullable = true)]
+        public decimal OtherPrice1 { get; set; }
+
+        /// <summary>
+        /// 其他费用2:送机协助值机(仅澳大利亚使用)
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "OtherPrice2",
+            ColumnDescription = "其他费用2:送机协助值机(仅澳大利亚使用)",
+            ColumnDataType = "decimal(10,2)",
+            IsNullable = true)]
+        public decimal OtherPrice2 { get; set; }
+
+        /// <summary>
+        /// 其他费用3:备用
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "OtherPrice3",
+            ColumnDescription = "其他费用3:备用",
+            ColumnDataType = "decimal(10,2)",
+            IsNullable = true)]
+        public decimal OtherPrice3 { get; set; }
+
+        /// <summary>
+        /// 费用结算币种 SetdataId = 66
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "Currency",
+            ColumnDescription = "费用结算币种 SetdataId = 66",
+            ColumnDataType = "int",
+            IsNullable = true)]
+        public int Currency { get; set; }
+
+        /// <summary>
+        /// 最后更新用户Id
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "LastUpdateUserId",
+            ColumnDescription = "最后更新用户Id",
+            ColumnDataType = "int",
+            IsNullable = true)]
+        public int LastUpdateUserId { get; set; }
+
+        /// <summary>
+        /// 最后更新时间
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "LastUpdateTime",
+            ColumnDescription = "最后更新时间",
+            ColumnDataType = "datetime",
+            IsNullable = true)]
+        public DateTime LastUpdateTime { get; set; }
+    }
+
+    /// <summary>
+    /// 境外用车类型价格信息
+    /// </summary>
+    [SugarTable("Res_OverseaVehicleTypePrice", "境外用车类型价格信息")]
+    public class Res_OverseaVehicleTypePrice : EntityBase
+    {
+        /// <summary>
+        /// 境外用车信息 外键Id
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "OvId",
+            ColumnDescription = "境外用车信息 外键Id",
+            ColumnDataType = "int",
+            IsNullable = true)]
+        public int OvId { get; set; }
+
+        /// <summary>
+        /// 车型名称
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "CarTypeName",
+            ColumnDescription = "车型名称",
+            ColumnDataType = "varchar(100)",
+            IsNullable = true)]
+        public string CarTypeName { get; set; }
+
+        /// <summary>
+        /// 服务类型
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "ServiceType",
+            ColumnDescription = "服务类型",
+            ColumnDataType = "int",
+            IsNullable = true)]
+        public VehicleServiceTypeEnum ServiceType { get; set; }
+
+        /// <summary>
+        /// 价格
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "Price",
+            ColumnDescription = "价格",
+            ColumnDataType = "decimal(10,2)",
+            IsNullable = true)]
+        public decimal Price { get; set; }
+
+        /// <summary>
+        /// 最后更新用户Id
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "LastUpdateUserId",
+            ColumnDescription = "最后更新用户Id",
+            ColumnDataType = "int",
+            IsNullable = true)]
+        public int LastUpdateUserId { get; set; }
+
+        /// <summary>
+        /// 最后更新时间
+        /// </summary>
+        [SugarColumn(
+            ColumnName = "LastUpdateTime",
+            ColumnDescription = "最后更新时间",
+            ColumnDataType = "datetime",
+            IsNullable = true)]
+        public DateTime LastUpdateTime { get; set; }
+    }
+}

+ 81 - 0
OASystem/OASystem.Domain/Enums/EnumHelper.cs

@@ -61,6 +61,23 @@ namespace OASystem.Domain.Enums
             return en.ToString();
         }
         /// <summary>
+        /// 根据Key获取枚举描述
+        /// </summary>
+        /// <param name="en"></param>
+        /// <returns></returns>
+        public static string GetDescriptionLabel(this System.Enum en)
+        {
+            Type type = en.GetType();
+            MemberInfo[] memInfo = type.GetMember(en.ToString());
+            if (memInfo != null && memInfo.Length > 0)
+            {
+                object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
+                if (attrs != null && attrs.Length > 0)
+                    return ((DescriptionAttribute)attrs[0]).Description;
+            }
+            return en.ToString();
+        }
+        /// <summary>
         /// 根据枚举类型得到其所有的 值 与 枚举定义Description属性 的集合
         /// </summary>
         /// <param name="enumType"></param>
@@ -130,5 +147,69 @@ namespace OASystem.Domain.Enums
 
             return descriptions;
         }
+
+        /// <summary>
+        /// 获取枚举的所有项(值、名称、描述)
+        /// </summary>
+        public static List<EnumItem> GetEnumItems<T>() where T : Enum
+        {
+            var items = new List<EnumItem>();
+            var type = typeof(T);
+            var values = Enum.GetValues(type);
+
+            foreach (Enum value in values)
+            {
+                var field = type.GetField(value.ToString());
+                var description = field?.GetCustomAttribute<DescriptionAttribute>()?.Description;
+
+                items.Add(new EnumItem
+                {
+                    Value = Convert.ToInt32(value),
+                    Name = value.ToString(),
+                    Description = description ?? value.ToString()
+                });
+            }
+
+            return items;
+        }
+
+        /// <summary>
+        /// 将枚举转换为下拉列表数据源
+        /// </summary>
+        public static List<SelectListItem> ToSelectList<T>(bool addDefault = false, string defaultText = "请选择") where T : Enum
+        {
+            var list = new List<SelectListItem>();
+
+            if (addDefault)
+            {
+                list.Add(new SelectListItem { Value = -1, Text = defaultText });
+            }
+
+            foreach (var item in GetEnumItems<T>())
+            {
+                list.Add(new SelectListItem
+                {
+                    Value = item.Value,
+                    Text = item.Description
+                });
+            }
+
+            return list;
+        }
+
+        // 辅助类
+        public class EnumItem
+        {
+            public int Value { get; set; }
+            public string Name { get; set; }
+            public string Description { get; set; }
+        }
+
+        // MVC 中的 SelectListItem
+        public class SelectListItem
+        {
+            public int Value { get; set; }
+            public string Text { get; set; }
+        }
     }
 }

+ 29 - 0
OASystem/OASystem.Domain/Enums/VehicleServiceTypeEnum.cs

@@ -0,0 +1,29 @@
+using System.ComponentModel;
+
+namespace OASystem.Domain.Enums
+{
+    /// <summary>
+    /// 境外用车价格信息
+    /// 用车服务类型
+    /// </summary>
+    public enum VehicleServiceTypeEnum
+    {
+        /// <summary>
+        /// 接送机服务
+        /// </summary>
+        [Description("接送机服务")]
+        TransferService = 1,
+
+        /// <summary>
+        /// 半天
+        /// </summary>
+        [Description("半天")]
+        HALFDAY,
+
+        /// <summary>
+        /// 全天
+        /// </summary>
+        [Description("全天")]
+        FULLDAY,
+    }
+}

+ 9 - 9
OASystem/OASystem.Domain/Result.cs

@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace OASystem.Domain
+namespace OASystem.Domain
 {
     public class Result
     {
@@ -13,6 +7,12 @@ namespace OASystem.Domain
         public dynamic? Data { get; set; } = new { };
 
         public Result() { }
+        public Result(int code, string msg)
+        {
+            Code = code;
+            Msg = msg;
+            Data = null;
+        }
         public Result(int code, string msg, dynamic? data = null)
         {
             Code = code;
@@ -75,7 +75,7 @@ namespace OASystem.Domain
     /// <summary>
     /// 消息 Tips
     /// </summary>
-    public static class MsgTips 
+    public static class MsgTips
     {
         /// <summary>
         /// 成功 消息提示
@@ -161,5 +161,5 @@ namespace OASystem.Domain
         public static string CheckAuth = "您没有查看权限!";
     }
 
-   
+
 }

+ 4 - 10
OASystem/OASystem.Domain/ViewModels/Groups/ConferenceAffairsCostView.cs

@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace OASystem.Domain.ViewModels.Groups
+namespace OASystem.Domain.ViewModels.Groups
 {
     public class ConferenceAffairsCostView
     {
@@ -13,9 +7,9 @@ namespace OASystem.Domain.ViewModels.Groups
         /// </summary>
         public string City { get; set; }
 
-        /// <summary>
-        /// 权限控制
-        /// </summary>
+        ///// <summary>
+        ///// 权限控制
+        ///// </summary>
         //public string PermissionControl { get; set; }
 
         /// <summary>

+ 23 - 1
OASystem/OASystem.Domain/ViewModels/JsonView.cs

@@ -20,6 +20,28 @@ public class JsonView
     /// <summary>
     /// 数据
     /// </summary>
-    public object? Data { get; set; } = new { } ;
+    public object? Data { get; set; } = new { };
+
+    public JsonView() { }
+    public JsonView(bool isSuccess, string msg)
+    {
+        if (isSuccess) Code = 200;
+
+        Msg = msg;
+    }
+
+    /// <summary>
+    /// 操作成功
+    /// </summary>
+    /// <param name="data"></param>
+    /// <param name="count"></param>
+    /// <param name="msg"></param>
+    public JsonView(object? data, int count, string msg)
+    {
+        Code = 200;
+        Count = count;
+        Data = data;
+        Msg = msg;
+    }
 
 }

+ 158 - 0
OASystem/OASystem.Domain/ViewModels/Resource/OverseaVehicleView.cs

@@ -0,0 +1,158 @@
+using OASystem.Domain.Enums;
+
+namespace OASystem.Domain.ViewModels.Resource
+{
+    public class OverseaVehicleView
+    {
+        public int Id { get; set; }
+        
+    }
+
+
+    public class OverseaVehicleListView: OverseaVehicleView
+    {
+        /// <summary>
+        /// 大洲名称
+        /// </summary>
+        public string ContinentName { get; set; }
+
+        /// <summary>
+        /// 国家名称
+        /// </summary>
+        public string CountryName { get; set; }
+
+        /// <summary>
+        /// 城市名称
+        /// </summary>
+        public string CityName { get; set; }
+
+        /// <summary>
+        /// 接送机导游价格
+        /// </summary>
+        public decimal GuidePrice { get; set; }
+
+        /// <summary>
+        /// 其他费用1:举牌接机(仅澳大利亚使用)
+        /// </summary>
+        public decimal OtherPrice1 { get; set; }
+
+        /// <summary>
+        /// 其他费用2:送机协助值机(仅澳大利亚使用)
+        /// </summary>
+        public decimal OtherPrice2 { get; set; }
+
+        /// <summary>
+        /// 其他费用3:备用
+        /// </summary>
+        public decimal OtherPrice3 { get; set; }
+
+        /// <summary>
+        /// 费用结算币种 
+        /// </summary>
+        public string Currency { get; set; }
+
+        /// <summary>
+        /// 车型价格信息
+        /// </summary>
+        public List<OverseaVehicleTypeListView> CarInfos { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string Remark { get; set; }
+
+        public string LastUpdateUserName { get; set; }
+        public string LastUpdateTime { get; set; }
+    }
+
+    public class OverseaVehicleInfoView : OverseaVehicleView
+    {
+        /// <summary>
+        /// 大洲名称
+        /// </summary>
+        public string ContinentName { get; set; }
+
+        /// <summary>
+        /// 国家名称
+        /// </summary>
+        public string CountryName { get; set; }
+
+        /// <summary>
+        /// 城市名称
+        /// </summary>
+        public string CityName { get; set; }
+
+        /// <summary>
+        /// 接送机导游价格
+        /// </summary>
+        public decimal GuidePrice { get; set; }
+
+        /// <summary>
+        /// 其他费用1:举牌接机(仅澳大利亚使用)
+        /// </summary>
+        public decimal OtherPrice1 { get; set; }
+
+        /// <summary>
+        /// 其他费用2:送机协助值机(仅澳大利亚使用)
+        /// </summary>
+        public decimal OtherPrice2 { get; set; }
+
+        /// <summary>
+        /// 其他费用3:备用
+        /// </summary>
+        public decimal OtherPrice3 { get; set; }
+
+        /// <summary>
+        /// 费用结算币种 SetdataId = 66
+        /// </summary>
+        public int Currency { get; set; }
+
+        /// <summary>
+        /// 车型价格信息
+        /// </summary>
+        public List<OverseaVehicleTypeInfoView> CarInfos { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string Remark { get; set; }
+        
+    }
+
+    /// <summary>
+    /// 车型价格信息
+    /// </summary>
+    public class OverseaVehicleTypeInfoView: OverseaVehicleView
+    {
+        /// <summary>
+        /// 车型名称
+        /// </summary>
+        public string CarTypeName { get; set; }
+
+        /// <summary>
+        /// 服务类型
+        /// </summary>
+        public VehicleServiceTypeEnum ServiceType { get; set; }
+
+        /// <summary>
+        /// 价格
+        /// </summary>
+        public decimal Price { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string Remark { get; set; }
+    }
+
+    public class OverseaVehicleTypeListView : OverseaVehicleTypeInfoView
+    {
+        /// <summary>
+        /// 描述
+        /// </summary>
+        public string ServiceTypeName => ServiceType.GetDescriptionLabel();
+
+        //public string LastUpdateUserName { get; set; }
+        //public string LastUpdateTime { get; set; }
+    }
+}

+ 324 - 0
OASystem/OASystem.Infrastructure/Repositories/Resource/OverseaVehicleRepository.cs

@@ -0,0 +1,324 @@
+using Aspose.Words.Lists;
+using AutoMapper;
+using OASystem.Domain;
+using OASystem.Domain.AesEncryption;
+using OASystem.Domain.Dtos.Resource;
+using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.Entities.Resource;
+using OASystem.Domain.ViewModels.Resource;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Infrastructure.Repositories.Resource
+{
+    /// <summary>
+    /// 境外用车信息 仓储
+    /// </summary>
+    public class OverseaVehicleRepository : BaseRepository<Res_OverseaVehicle, Res_OverseaVehicle>
+    {
+        private readonly IMapper _mapper;
+        public OverseaVehicleRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar)
+        {
+            _mapper = mapper;
+        }
+
+        /// <summary>
+        /// Init
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<JsonView> InitAsync()
+        {
+            var currencyDatas = await _sqlSugar.Queryable<Sys_SetData>()
+                .Where(x => x.STid == 66 && x.IsDel == 0)
+                .Select(x =>
+                    new
+                    {
+                        x.Id,
+                        x.Name
+                    })
+                .ToListAsync();
+
+            var serviceTypeDatas = EnumHelper.ToSelectList<VehicleServiceTypeEnum>(false);
+
+            var init = new {
+                currencyDatas,
+                serviceTypeDatas
+            };
+
+            return new JsonView(init, 1, "操作成功!");
+        }
+
+
+        /// <summary>
+        /// List
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<JsonView> ListAsync(OverseaVehicleListDto dto)
+        {
+            var search = dto.Search.Trim();
+            RefAsync<int> total = 0;
+            var infos = await _sqlSugar.Queryable<Res_OverseaVehicle>()
+                .Where(x => x.IsDel == 0)
+                .WhereIF(!string.IsNullOrEmpty(search), x => x.ContinentName.Contains(search) || x.CountryName.Contains(search) || x.CityName.Contains(search))
+                .OrderByDescending(x => x.CreateTime)
+                .Select(x => new OverseaVehicleListView() {
+                    Id = x.Id,
+                    ContinentName = x.ContinentName,
+                    CountryName = x.CountryName, 
+                    CityName = x.CityName,
+                    GuidePrice = x.GuidePrice,
+                    OtherPrice1 = x.OtherPrice1,
+                    OtherPrice2 = x.OtherPrice2,
+                    Currency = x.Currency.ToString(),
+                    LastUpdateUserName = x.LastUpdateUserId.ToString(),
+                    LastUpdateTime = x.LastUpdateTime.ToString("yyyy-MM-dd HH:mm:ss"),
+                    Remark = x.Remark
+                })
+                .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
+
+            if (total == 0)
+            {
+                return new JsonView(infos, total, "暂无数据!");
+            }
+
+            foreach (var item in infos)
+            {
+                if (int.TryParse(item.Currency,out int currencyId))
+                {
+                    item.Currency = _sqlSugar.Queryable<Sys_SetData>().Where(y => y.Id == currencyId).First()?.Name ?? "-";
+                }
+
+                if (int.TryParse(item.LastUpdateUserName, out int lastUpdateUserId))
+                {
+                    item.LastUpdateUserName = _sqlSugar.Queryable<Sys_Users>().Where(y => y.Id == lastUpdateUserId).First()?.CnName ?? "-";
+                }
+
+                item.CarInfos = _sqlSugar.Queryable<Res_OverseaVehicleTypePrice>()
+                    .Where(x => x.IsDel == 0 && x.OvId == item.Id)
+                    .Select(x => new OverseaVehicleTypeListView() {
+                        Id = x.Id,
+                        CarTypeName = x.CarTypeName,
+                        ServiceType = x.ServiceType,
+                        Price = x.Price,
+                        Remark = x.Remark 
+                    })
+                    .ToList();
+            }
+
+            return new JsonView(infos, total, "操作成功!");
+        }
+
+        /// <summary>
+        /// 详细信息
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public async Task<JsonView> InfoAsync(int id)
+        {
+            if (id < 1) return new JsonView(false, "请传入有效的ID!");
+
+            var info = await _sqlSugar.Queryable<Res_OverseaVehicle>()
+                .Where(it => it.Id == id && it.IsDel == 0)
+                .FirstAsync();
+            if (info == null) return new JsonView(false, "暂无数据!");
+
+            var subInfos = await _sqlSugar.Queryable<Res_OverseaVehicleTypePrice>()
+                .Where(it => it.OvId == id && it.IsDel == 0)
+                .ToListAsync();
+
+            var view = _mapper.Map<OverseaVehicleInfoView>(info);
+            view.CarInfos = _mapper.Map<List<OverseaVehicleTypeInfoView>>(subInfos);
+
+            return new JsonView(view, 1, "操作成功!");
+        }
+
+        /// <summary>
+        /// 添加
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<JsonView> AddAsync(OverseaVehicleAddOrEditDto dto)
+        {
+            //参数处理
+            var now = DateTime.Now;
+            var info = _mapper.Map<Res_OverseaVehicle>(dto);
+            info.CreateUserId = dto.CurrUserId;
+            info.LastUpdateUserId = dto.CurrUserId;
+            info.LastUpdateTime = now;
+            var subInfos = _mapper.Map<List<Res_OverseaVehicleTypePrice>>(dto.CarInfos);
+            if (subInfos == null && subInfos.Count < 1)
+            {
+                return new JsonView(false, $"请填写车型信息!");
+            }
+
+            _sqlSugar.BeginTran();
+            try
+            {
+                var infoIsNul = await _sqlSugar.Queryable<Res_OverseaVehicle>()
+                    .Where(x => x.IsDel == 0)
+                    .Where(x => x.ContinentName.Equals(dto.ContinentName.Trim()))
+                    .Where(x => x.CountryName.Equals(dto.CountryName.Trim()))
+                    .Where(x => x.CityName.Equals(dto.CityName.Trim()))
+                    .AnyAsync();
+                if (infoIsNul)
+                {
+                    return new JsonView(false, $"该城市已存在,不可重复添加!");
+                }
+
+                var infoId = await _sqlSugar.Insertable(info).ExecuteReturnIdentityAsync();
+                if (infoId < 1)
+                {
+                    _sqlSugar.RollbackTran();
+                    return new JsonView(false, $"车信息,操作失败!");
+                }
+                foreach (var subInfo in subInfos) {
+                    subInfo.OvId = infoId;
+                    subInfo.CreateUserId = dto.CurrUserId;
+                    subInfo.LastUpdateUserId = dto.CurrUserId;
+                    subInfo.LastUpdateTime = DateTime.Now;
+                }
+                var subCount = await _sqlSugar.Insertable(subInfos).ExecuteCommandAsync();
+                if (subCount < 1)
+                {
+                    _sqlSugar.RollbackTran();
+                    return new JsonView(false, $"车型信息,操作失败!");
+                }
+            }
+            catch (Exception ex)
+            {
+                _sqlSugar.RollbackTran();
+                return new JsonView(false, $"操作失败!ex:{ex.Message}");
+            }
+            _sqlSugar.CommitTran();
+
+            return new JsonView(true, "操作成功!");
+        }
+
+        /// <summary>
+        /// 编辑
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<JsonView> EditAsync(OverseaVehicleAddOrEditDto dto)
+        {
+            //参数处理
+            var now = DateTime.Now;
+            var info = _mapper.Map<Res_OverseaVehicle>(dto);
+            info.LastUpdateUserId = dto.CurrUserId;
+            info.LastUpdateTime = now;
+            var subInfos = _mapper.Map<List<Res_OverseaVehicleTypePrice>>(dto.CarInfos);
+            if (subInfos == null && subInfos.Count < 1)
+            {
+                return new JsonView(false, $"请填写车型信息!");
+            }
+
+            _sqlSugar.BeginTran();
+            try
+            {
+                var infoId = await _sqlSugar.Updateable(info)
+                    .UpdateColumns(it => new
+                    {
+                        it.ContinentName,
+                        it.CountryName,
+                        it.CityName,
+                        it.GuidePrice,
+                        it.OtherPrice1,
+                        it.OtherPrice2,
+                        it.Currency,
+                        it.LastUpdateUserId,
+                        it.LastUpdateTime,
+                        it.Remark
+                    })
+                    .Where(it => it.Id == info.Id)
+                    .ExecuteCommandAsync();
+                if (infoId < 1)
+                {
+                    _sqlSugar.RollbackTran();
+                    return new JsonView(false, $"车信息,操作失败!");
+                }
+                foreach (var subInfo in subInfos)
+                {
+                    subInfo.LastUpdateUserId = dto.CurrUserId;
+                    subInfo.LastUpdateTime = DateTime.Now;
+                }
+                var subCount = await _sqlSugar.Updateable(subInfos)
+                    .UpdateColumns(it => new
+                    {
+                        it.CarTypeName,
+                        it.ServiceType,
+                        it.Price,
+                        it.LastUpdateUserId,
+                        it.LastUpdateTime,
+                        it.Remark
+                    })
+                    .WhereColumns (it => new { it.Id })
+                    .ExecuteCommandAsync();
+                if (subCount < 1)
+                {
+                    _sqlSugar.RollbackTran();
+                    return new JsonView(false, $"车型信息,操作失败!");
+                }
+            }
+            catch (Exception ex)
+            {
+                _sqlSugar.RollbackTran();
+                return new JsonView(false, $"操作失败!ex:{ex.Message}");
+            }
+            _sqlSugar.CommitTran();
+
+            return new JsonView(true, "操作成功!");
+        }
+
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<JsonView> DelAsync(OverseaVehicleDelDto dto)
+        {
+            //参数处理
+            var now = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+            
+            _sqlSugar.BeginTran();
+            try
+            {
+                var infoId = await _sqlSugar.Updateable<Res_OverseaVehicle>()
+                    .SetColumns(x => x.IsDel == 1)
+                    .SetColumns(x => x.DeleteUserId == dto.CurrUserId)
+                    .SetColumns(x => x.DeleteTime == now)
+                    .Where(it => it.Id == dto.Id)
+                    .ExecuteCommandAsync();
+                if (infoId < 1)
+                {
+                    _sqlSugar.RollbackTran();
+                    return new JsonView(false, $"车信息,操作失败!");
+                }
+                
+                var subCount = await _sqlSugar.Updateable<Res_OverseaVehicleTypePrice>()
+                    .SetColumns(x => x.IsDel == 1)
+                    .SetColumns(x => x.DeleteUserId == dto.CurrUserId)
+                    .SetColumns(x => x.DeleteTime == now)
+                    .Where(it => it.OvId == dto.Id)
+                    .ExecuteCommandAsync();
+                if (subCount < 1)
+                {
+                    _sqlSugar.RollbackTran();
+                    return new JsonView(false, $"车型信息,操作失败!");
+                }
+            }
+            catch (Exception ex)
+            {
+                _sqlSugar.RollbackTran();
+                return new JsonView(false, $"操作失败!ex:{ex.Message}");
+            }
+            _sqlSugar.CommitTran();
+
+            return new JsonView(true, "操作成功!");
+        }
+    }
+}