浏览代码

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

yuanrf 3 月之前
父节点
当前提交
357a94e00d

+ 2 - 2
OASystem/EntitySync/Program.cs

@@ -143,7 +143,7 @@ db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(new Type[]
     //typeof(Res_TranslatorLibrary),//翻译人员库 
     //typeof(Grp_OfficialDutyLinkTranslator),//公务信息关联翻译人员 
     //typeof(Sys_DeviceToken),
-    typeof(Res_MediaSuppliers)//策划部供应商资料
-
+    //typeof(Res_MediaSuppliers),//策划部供应商资料 
+    typeof(Res_BasicInsuranceCost)//保险国家基础费用 
 });
 Console.WriteLine("数据库结构同步完成!");

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

@@ -1263,7 +1263,6 @@ FROM
             return Ok(JsonView(true, "操作成功!", rst));
         }
 
-
         #endregion
 
         #region 团组&签证
@@ -14236,11 +14235,16 @@ ORDER by  gctggrc.id DESC
             #region 应用推送
             try
             {
+
                 int ccpId = groupData.Data.GetType().GetProperty("ccpId").GetValue(groupData.Data, null);
                 int sign = groupData.Data.GetType().GetProperty("sign").GetValue(groupData.Data, null);
+                int dataId = groupData.Data.GetType().GetProperty("dataId").GetValue(groupData.Data, null);
 
                 await AppNoticeLibrary.SendChatMsg_GroupStatus_ApplyFee(ccpId, sign, QiyeWeChatEnum.GuoJiaoLeaderChat);
 
+                //自动审核
+                await _feeAuditRep.FeeAutomaticAudit(4, dto.DiId, dataId);
+
                 //2024-10-21 新增LZ UID
                 var userIds = new List<int>() { 21 };
                 string title = $"系统通知";

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

@@ -47,6 +47,8 @@ namespace OASystem.API.Controllers
         private readonly TranslatorLibraryRepository _translatorRep;
         private readonly MediaSuppliersRepository _mediaSupplierRep;
         private readonly List<int> _portIds;
+        private readonly BasicInsuranceCostRepository _insuranceCostRep;
+
 
         public ResourceController(
             IMapper mapper, 
@@ -68,7 +70,8 @@ namespace OASystem.API.Controllers
             TourClientListRepository tourClientListRep, 
             DelegationInfoRepository delegationInfoRep,
             TranslatorLibraryRepository translatorRep,
-            MediaSuppliersRepository mediaSupplierRep
+            MediaSuppliersRepository mediaSupplierRep,
+            BasicInsuranceCostRepository insuranceCostRep
             )
         {
             _mapper = mapper;
@@ -92,6 +95,7 @@ namespace OASystem.API.Controllers
             _translatorRep = translatorRep;
             _mediaSupplierRep = mediaSupplierRep;
             _portIds = new List<int> { 1, 2, 3 };
+            _insuranceCostRep = insuranceCostRep;
         }
 
         #region 车公司资料板块
@@ -4155,7 +4159,6 @@ WHERE
         /// 策划部供应商资料
         /// Init
         /// </summary>
-        /// <param name="id"></param>
         /// <returns></returns>
         [HttpGet]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
@@ -4236,6 +4239,138 @@ WHERE
         }
 
         #endregion
+
+        #region 保险国家基础费用
+
+        /// <summary>
+        /// 保险国家基础费用
+        /// Info
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> InsuranceCostInfo(InsuranceCostInfoDto dto)
+        {
+            if (!_portIds.Contains(dto.PortType)) return Ok(JsonView(false, MsgTips.Port));
+
+            if (dto.Id < 1) return Ok(JsonView(false, MsgTips.Port));
+
+            var id = dto.Id;
+            var info = await _insuranceCostRep.Query(x => x.Id == id)
+                .Select(x => new {
+                    x.Id,
+                    x.IsSchengen,
+                    x.CountryName,
+                    x.Cost,
+                    x.Remark,
+                    CreateUserName = SqlFunc.Subqueryable<Sys_Users>().Where(s => s.Id == x.CreateUserId).Select(s => s.CnName).FirstOrDefault(),
+                    x.CreateTime
+                })
+                .FirstAsync();
+
+
+            return Ok(JsonView(info));
+        }
+
+        /// <summary>
+        /// 保险国家基础费用
+        /// 分页查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> InsuranceCostPageItem(InsuranceCostPageItemDto dto)
+        {
+            if (!_portIds.Contains(dto.PortType)) return Ok(JsonView(false, MsgTips.Port));
+
+            RefAsync<int> total = 0;
+
+            var data = await _sqlSugar.Queryable<Res_BasicInsuranceCost>()
+                .LeftJoin<Sys_Users>((bic,u) => bic.CreateUserId == u.Id)
+                .Where((bic, u) => bic.IsDel == 0)
+                .WhereIF(!string.IsNullOrEmpty(dto.Search), (bic, u) => bic.CountryName.Contains(dto.Search))
+                .OrderBy((bic, u) => bic.Id)
+                .Select((bic, u) => new {
+                    bic.Id,
+                    bic.IsSchengen,
+                    bic.CountryName,
+                    bic.Cost,
+                    bic.Remark,
+                    CreateUserName = u.CnName,
+                    bic.CreateTime
+                })
+                .ToPageListAsync(dto.PageIndex,dto.PageSize,total);
+
+            return Ok(JsonView(data,total));
+        }
+
+        /// <summary>
+        /// 保险国家基础费用
+        /// 操作(添加 Or 编辑)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> InsuranceCostOp(InsuranceCostOpDto dto)
+        {
+            var result = new JsonView() { Code = 400, Msg = "操作失败" };
+            var userId = dto.CurrUserId;
+            if (!_portIds.Contains(dto.PortType)) return Ok(JsonView(false, MsgTips.Port));
+            if (userId < 1) return Ok(JsonView(false, MsgTips.UserId));
+            var countryName = dto.CountryName.Trim();
+            if (string.IsNullOrEmpty(countryName)) return Ok(JsonView(false,$"国家名称不能为空!"));
+
+            var info = _mapper.Map<Res_BasicInsuranceCost>(dto);
+            info.CreateUserId = dto.CurrUserId;
+            info.CountryName = countryName;
+            if (dto.Id < 1) //添加
+            {
+                var addInfo = await _insuranceCostRep.Query(x => x.CountryName.Equals(countryName)).FirstAsync();
+                if (addInfo != null) return Ok(JsonView(false, $"该国家信息已存在,不可添加!"));
+                var add = await _insuranceCostRep.AddAsync(info);
+                if (add < 1) return Ok(JsonView(false, "添加失败!"));
+            }
+            else //修改
+            {
+                var upd = await _insuranceCostRep.UpdateAsync(x => x.Id == dto.Id, x => new Res_BasicInsuranceCost
+                {
+                    IsSchengen = dto.IsSchengen,
+                    CountryName = dto.CountryName, 
+                    Cost = dto.Cost,
+                    Remark = dto.Remark
+                });
+                if (!upd) return Ok(JsonView(false, "修改失败!"));
+            }
+
+            return Ok(JsonView(true));
+        }
+
+        /// <summary>
+        /// 保险国家基础费用
+        /// 删除
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> InsuranceCostSoftDel(InsuranceCostSoftDelDto dto)
+        {
+            int userId = dto.CurrUserId, id = dto.Id;
+            if (!_portIds.Contains(dto.PortType)) return Ok(JsonView(false, MsgTips.Port));
+
+            if (userId < 1) return Ok(JsonView(false, MsgTips.UserId));
+            if (id < 1) return Ok(JsonView(false, MsgTips.Id));
+
+            var del = await _insuranceCostRep.SoftDeleteAsync(x => x.Id == id, userId);
+            if (!del) return Ok(JsonView(false));
+
+            return Ok(JsonView(true));
+        }
+
+        #endregion
     }
 }
 

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

@@ -149,6 +149,7 @@ namespace OASystem.Domain.AutoMappers
             CreateMap<Grp_CreditCardPayment, CarTouristCreditCardPaymentView>();
             CreateMap<Grp_CarTouristGuideGroundReservationsContent, CarTouristGuideGroundReservationsContentView>();
             #endregion
+
             #region 成本
             CreateMap<Grp_GroupCostDto, Grp_GroupCost>();
             CreateMap<Grp_CheckBoxsDto, Grp_CheckBoxs>();
@@ -257,6 +258,11 @@ namespace OASystem.Domain.AutoMappers
             #region 供应商资料库
             CreateMap<MediaSupplierAddOrEditDto, Res_MediaSuppliers>();
             #endregion
+
+
+            #region 保险国家基础费用
+            CreateMap<InsuranceCostOpDto, Res_BasicInsuranceCost>();
+            #endregion
             #endregion
 
             #region Crm

+ 66 - 0
OASystem/OASystem.Domain/Dtos/Resource/InsuranceCostDto.cs

@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Resource
+{
+    public class InsuranceCostDto
+    {
+    }
+
+
+    public class InsuranceCostInfoDto : PortDtoBase
+    {
+        public int Id { get; set; }
+    }
+
+    public class InsuranceCostPageItemDto : DtoBase
+    {
+        /// <summary>
+        /// 搜索条件(国家名称)
+        /// </summary>
+        public string Search { get; set; }
+    }
+
+    public class InsuranceCostOpDto : PortDtoBase
+    {
+        /// <summary>
+        /// 编号
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public int CurrUserId { get; set; }
+
+        /// <summary>
+        /// 申根国(0 否 1 是)
+        /// </summary>
+        public int IsSchengen { get; set; }
+
+        /// <summary>
+        /// 国家名称
+        /// </summary>
+        public string CountryName { get; set; }
+
+        /// <summary>
+        /// 保险费用
+        /// </summary>
+        public decimal Cost { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string Remark { get; set; }
+
+    }
+
+    public class InsuranceCostSoftDelDto : PortDtoBase
+    {
+        public int CurrUserId { get; set; }
+        public int Id { get; set; }
+    }
+}

+ 34 - 0
OASystem/OASystem.Domain/Entities/Resource/Res_BasicInsuranceCost.cs

@@ -0,0 +1,34 @@
+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_BasicInsuranceCost")]
+    public class Res_BasicInsuranceCost : EntityBase
+    {
+        /// <summary>
+        /// 申根国(0 否 1 是)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "申根国(0 否 1 是)", IsNullable = false, ColumnDataType = "int", DefaultValue = "0")]
+        public int IsSchengen { get; set; }
+
+        /// <summary>
+        /// 国家名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "国家名称", IsNullable = false, ColumnDataType = "varchar(100)")]
+        public string CountryName { get; set; }
+
+        /// <summary>
+        /// 保险费用
+        /// </summary>
+        [SugarColumn(ColumnDescription = "保险费用", IsNullable = false, ColumnDataType = "decimal(10,2)", DefaultValue = "0.00")]
+        public decimal Cost { get; set; }
+
+    }
+}

+ 9 - 9
OASystem/OASystem.Infrastructure/Repositories/Groups/CustomersRepository.cs

@@ -397,13 +397,13 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
             if (dto.Status == 1)//添加
             {
-                Grp_Customers customers = _sqlSugar.Queryable<Grp_Customers>()
-                                                   .First(a => a.DiId == dto.DiId &&
-                                                               a.IsDel == 0 &&
-                                                               a.ClientName == dto.ClientName &&
-                                                               a.InsuranceCosts == dto.InsuranceCosts &&
-                                                               a.Currency == dto.Currency
-                                                    );
+                var customers = _sqlSugar.Queryable<Grp_Customers>()
+                                         .First(a => a.DiId == dto.DiId &&
+                                                     a.IsDel == 0 &&
+                                                     a.ClientName == dto.ClientName &&
+                                                     a.InsuranceCosts == dto.InsuranceCosts &&
+                                                     a.Currency == dto.Currency
+                                         );
                 if (customers != null)
                 {
                     return result = new Result() { Code = -1, Msg = "该笔费用已存在,请勿重复添加!" };
@@ -417,7 +417,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         int cId = await _sqlSugar.Insertable(c).ExecuteReturnIdentityAsync();
                         if (cId != 0)
                         {
-                            var data = new { ccpId = cId, sign = 1 };
+                            var data = new { ccpId = cId, sign = 1, dataId = id };
                             result = new Result() { Code = 0, Msg = "添加成功!", Data = data };
                         }
                         else
@@ -479,7 +479,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     else
                     {
                         Grp_CreditCardPayment ccp = Query<Grp_CreditCardPayment>(a => a.CId == cus.Id && a.CTable == 82).First();
-                        var data = new { ccpId = ccp.Id, sign = 2 };
+                        var data = new { ccpId = ccp.Id, sign = 2, dataId = dto.Id };
                         result = new Result() { Code = 0, Msg = "修改成功!", Data = data };
                     }
                 }

+ 121 - 2
OASystem/OASystem.Infrastructure/Repositories/Groups/FeeAuditRepository.cs

@@ -2,6 +2,7 @@
 using NPOI.SS.Formula.Functions;
 using OASystem.Domain;
 using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.Entities.Resource;
 using OASystem.Domain.ViewModels.Groups;
 using System;
 using System.Collections.Generic;
@@ -28,6 +29,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
         /// 1.酒店 76 
         /// 2.op 79
         /// 3.其他费用-出行物资 98
+        /// 4.保险 82
         /// </param>
         /// <param name="diId">团组Id</param>
         /// <param name="dataId">数据Id(模块类型主表Id)</param>
@@ -384,7 +386,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
                 var teNames = setData.Where(x => x.STid == 91).Select(x => x.Name).ToList();
                 var otherFeeDatas = _sqlSugar.Queryable<Grp_DecreasePayments>()
-                    .InnerJoin<Grp_CreditCardPayment>((dp,ccp) => dp.Id == ccp.CId && ccp.CTable == 98 && ccp.IsDel == 0)
+                    .InnerJoin<Grp_CreditCardPayment>((dp, ccp) => dp.Id == ccp.CId && ccp.CTable == 98 && ccp.IsDel == 0)
                     .Where((dp, ccp) => dp.IsDel == 0 && dp.DiId == diId)
                     .ToList();
 
@@ -403,7 +405,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                             }
                         }
                     }
-                    else if(teNames.Contains(item.PriceName))
+                    else if (teNames.Contains(item.PriceName))
                     {
                         ids.Add(item.Id);
                     }
@@ -455,6 +457,123 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
                 #endregion
             }
+            else if (feeType == 4)
+            {
+                #region 保险费用录入自动审核
+                var currModule = 82;
+                var groupDetails = _sqlSugar.Queryable<Grp_DelegationInfo>().Where(x => x.IsDel == 0 && x.Id == diId).First(); 
+                if (groupDetails == null)
+                {
+                    _view.Msg = $"团组信息为空,不可自动审核!";
+                    return _view;
+                }
+
+                var insuranceCountryCostData = _sqlSugar.Queryable<Res_BasicInsuranceCost>().Where(x => x.IsDel == 0).ToList();
+                if (!insuranceCountryCostData.Any())
+                {
+                    _view.Msg = $"保险国家费用信息为空,不可自动审核!";
+                    return _view;
+                }
+
+                var insuranceType = _sqlSugar.Queryable<Grp_InsuranceCost>().Where(x => x.IsDel == 0 && x.Id != 2).Select(x => x.Id).ToList();
+                var insuranceCostData1 = _sqlSugar.Queryable<Grp_Customers>()
+                    .LeftJoin<Grp_CreditCardPayment>((c, ccp) => c.Id == ccp.CId && ccp.CTable == 82)
+                    .Where((c, ccp) => c.IsDel == 0 && c.DiId == diId)
+                    .Select((c, ccp) => new
+                    {
+                        c.Id,
+                        c.Iid,
+                        ccpId = ccp.Id,
+                        CNYPrice = ccp.PayMoney * ccp.DayRate
+                    })
+                    .ToList();
+                if (!insuranceCostData1.Any())
+                {
+                    _view.Msg = $"暂无保险数据,不可自动审核!";
+                    return _view;
+                }
+
+                #region 处理已审核的 “新数据请不要选此项” 数据
+                var insuranceCostData2 = insuranceCostData1.Where(x => x.Iid == 2).ToList();
+
+                if (insuranceCostData2.Any())
+                {
+                    var ccpIds = insuranceCostData2.Select(x => x.ccpId).ToList();
+
+                    var auditCcpIds = _sqlSugar.Queryable<Grp_CreditCardPayment>().Where(x => x.IsDel == 0 && ccpIds.Contains(x.Id) && x.IsAuditGM == 3).Select(x => x.Id).ToList();
+
+                    if (auditCcpIds.Any())
+                    {
+                        var ccpUpd = _sqlSugar.Updateable<Grp_CreditCardPayment>()
+                       .SetColumns(it => it.IsAuditGM == 0)
+                       .SetColumns(it => it.AuditGMOperate == 0)
+                       .SetColumns(it => it.AuditGMDate == "")
+                       .Where(s => auditCcpIds.Contains(s.Id))
+                       .ExecuteCommand();
+                    }
+                   
+                }
+
+                #endregion
+
+                var insuranceCostData = insuranceCostData1.Where(x => insuranceType.Contains(x.Iid)).ToList();
+                var currInsuranceInfo = insuranceCostData.Where(x => x.Id == dataId).FirstOrDefault();
+                if (!insuranceCostData.Any() && currInsuranceInfo == null)
+                {
+                    _view.Msg = $"暂无保险数据,不可自动审核!";
+                    return _view;
+                }
+
+                if (currInsuranceInfo.CNYPrice == 0.00M)
+                {
+                    _view.Msg = $"保险数据未录入费用信息,不可自动审核!";
+                    QuashAudit(currModule, diId, dataId);
+                    return _view;
+                }
+
+                var groupPeopleNum = groupDetails.VisitPNumber;
+                var visitCountrys = groupDetails.VisitCountry.Split("|").ToList();
+
+                if (!visitCountrys.Any())
+                {
+                    _view.Msg = $"出访国家为空,不可自动审核!";
+                    return _view;
+                }
+
+                var basicCountrys = insuranceCountryCostData.Select(x => x.CountryName).ToList();
+                var schengenCountry = visitCountrys.Intersect(basicCountrys); //申根国
+                var unSchengenCountry = visitCountrys.Except(basicCountrys);  //非申根国
+
+                var schengenCost = insuranceCountryCostData.Where(x => schengenCountry.Contains(x.CountryName)).Sum(x => x.Cost); // 申根国费用
+                var unSchengenCost = unSchengenCountry.Count() * 35; // 非申根国费用
+
+
+                var groupBudgetCost = (schengenCost + unSchengenCost) * groupPeopleNum;
+                var groupActialCost = insuranceCostData.Sum(x => x.CNYPrice);
+
+                if (groupActialCost > groupBudgetCost)
+                {
+                    _view.Msg = $"保险费用超出团组成本费用";
+                    QuashAudit(currModule, diId, dataId);
+                    return _view;
+                }
+
+                //自动审核
+                var ccpUpdate = _sqlSugar.Updateable<Grp_CreditCardPayment>()
+                                      .SetColumns(it => it.IsAuditGM == 3)
+                                      .SetColumns(it => it.AuditGMOperate == 4)
+                                      .SetColumns(it => it.AuditGMDate == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
+                                      .Where(s => s.DIId == diId && s.CTable == currModule && s.CId == dataId)
+                                      .ExecuteCommand();
+                if (ccpUpdate > 0)
+                {
+                    _view.Code = 200;
+                    _view.Msg = "自动审核执行成功";
+                }
+                else _view.Msg = "自动审核执行失败";
+                return _view;
+                #endregion
+            }
             else _view.Msg = $"请传入有效的feeType参数";
 
             return _view;

+ 29 - 0
OASystem/OASystem.Infrastructure/Repositories/Resource/BasicInsuranceCostRepository.cs

@@ -0,0 +1,29 @@
+using AutoMapper;
+using OASystem.Domain.Entities.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 BasicInsuranceCostRepository:BaseRepository<Res_BasicInsuranceCost, Res_BasicInsuranceCost>
+    {
+        private readonly IMapper _mapper;
+
+        /// <summary>
+        /// 初始化
+        /// </summary>
+        /// <param name="sqlSugar"></param>
+        /// <param name="mapper"></param>
+        public BasicInsuranceCostRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar)
+        {
+            _mapper = mapper;
+        }
+    }
+}