Просмотр исходного кода

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

yuanrf месяцев назад: 4
Родитель
Сommit
34bd72fe24

+ 125 - 16
OASystem/OASystem.Api/Controllers/FinancialController.cs

@@ -27,6 +27,8 @@ using System.Globalization;
 using System.IO.Compression;
 using NPOI.SS.Formula.Functions;
 using Org.BouncyCastle.Asn1.X509.Qualified;
+using MathNet.Numerics;
+using static OASystem.API.OAMethodLib.JWTHelper;
 
 namespace OASystem.API.Controllers
 {
@@ -46,9 +48,9 @@ namespace OASystem.API.Controllers
         private readonly DailyFeePaymentRepository _daiRep;    //日付申请仓库
         private readonly TeamRateRepository _teamRateRep;      //团组汇率仓库
         private readonly ForeignReceivablesRepository _ForForeignReceivablesRep;  //对外收款账单仓库
-        private readonly ProceedsReceivedRepository _proceedsReceivedRep;  //已收款项仓库
+        private readonly ProceedsReceivedRepository _proceedsReceivedRep;         //已收款项仓库
         private readonly PaymentRefundAndOtherMoneyRepository _paymentRefundAndOtherMoneyRep; //收款退还与其他款项 仓库
-        private readonly DelegationInfoRepository _delegationInfoRep; //团组信息 仓库
+        private readonly DelegationInfoRepository _delegationInfoRep;             //团组信息 仓库
         private readonly ForeignReceivablesRepository _foreignReceivablesRepository;
 
         /// <summary>
@@ -85,7 +87,11 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostPageSearchDailyPaymentPriceTypeData(PortDtoBase dto)
         {
-            var result = await _daiRep.GetPagePriceTypeData(dto);
+            var currUserInfo = JwtHelper.SerializeJwt(HttpContext.Request.Headers.Authorization);
+            if (currUserInfo == null) return Ok(JsonView(false, "请传入token!"));
+
+
+            var result = await _daiRep.GetPagePriceTypeData(dto,currUserInfo.UserId);
 
             if (result == null || result.Code != 0)
             {
@@ -840,6 +846,13 @@ namespace OASystem.API.Controllers
             ));
         }
 
+        private class EnterExitCostCurrency 
+        {
+            public string Name { get; set; }
+            public string Code { get; set; }
+            public decimal Rate { get; set; }
+        }
+
         /// <summary>
         /// 已收账单 
         /// File Downloasd
@@ -860,7 +873,7 @@ namespace OASystem.API.Controllers
                 {
                     return Ok(JsonView(false, "请传入有效FileType参数! 1 生成收款单(四川)  2 生成收款单(北京)  3 汇款账单"));
                 }
-
+                var _currencyDatas = _sqlSugar.Queryable<Sys_SetData>().Where(x => x.IsDel == 0 && x.STid == 66).ToList();
                 var _DelegationInfo = _sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0 && it.Id == dto.DiId).First();
                 if (_DelegationInfo == null)
                 {
@@ -968,6 +981,28 @@ namespace OASystem.API.Controllers
                         return Ok(JsonView(false, "该团组未填写出入境费用;"));
                     }
 
+                    var _EnterExitCostCurrencys = new List<EnterExitCostCurrency>();
+
+                    if (!string.IsNullOrEmpty(_EnterExitCosts.CurrencyRemark))
+                    { 
+                        var currency1 = _EnterExitCosts.CurrencyRemark.Split("|");
+                        foreach (var item in currency1)
+                        {
+                            var currency2 = item.Split(":");
+                            var currency3 = currency2[0].Split("(");
+                            var currencyName = currency3[0].ToString();
+                            var currencyCode = currency3[1].Split(")")[0].ToString();
+
+                            _EnterExitCostCurrencys.Add(new EnterExitCostCurrency
+                            {
+                                Name = currencyName,
+                                Code = currencyCode,
+                                Rate = Convert.ToDecimal(currency2[1] ?? "0")
+                            });
+
+                        }
+                    }
+
                     var _cityFee = _sqlSugar.Queryable<Grp_NationalTravelFee>().Where(it => it.IsDel == 0).ToList();
 
                     foreach (var item in _DayAndCosts)
@@ -1057,7 +1092,6 @@ namespace OASystem.API.Controllers
                              *  458	公务舱
                              *  460	经济舱
                              */
-
                             decimal airPrice = 0.00M;
                             string airName = string.Empty;
                             if (client.AirType == 457)
@@ -1077,7 +1111,6 @@ namespace OASystem.API.Controllers
                             }
 
                             //计算费用总和
-
                             decimal AllPrice = airPrice + _EnterExitCosts.CityTranffic + dac1.Sum(x => x.SubTotal) + dac2.Sum(x => x.SubTotal) +
                                                dac3.Sum(x => x.SubTotal) + dac4.Sum(x => x.SubTotal) + _EnterExitCosts.Visa + _EnterExitCosts.Safe +
                                                +_EnterExitCosts.YiMiao + _EnterExitCosts.YiMiao + _EnterExitCosts.Ticket + _EnterExitCosts.Service;
@@ -1127,7 +1160,20 @@ namespace OASystem.API.Controllers
 
                                     string currencyCode = currData.Find(it => it.Id == item.Currency)?.Remark ?? "Unknown";
                                     SetCells(ChildTable, doc, rowIndex, 2, item.Cost.ToString("#0.00") + currencyCode + "/晚");
-                                    SetCells(ChildTable, doc, rowIndex, 3, "汇率" + (item.SubTotal / item.Cost).ToString("#0.0000"));
+
+                                    var currencyRate = DecimalToString((item.SubTotal / item.Cost), 4);
+                                    var sys_currencyInfo = _currencyDatas.Find(x => item.Currency == x.Id);
+                                    if (sys_currencyInfo != null)
+                                    {
+                                        var sys_currencyCode = sys_currencyInfo.Name;
+                                        var eec_currencyInfo = _EnterExitCostCurrencys.Find(x => x.Code.Equals(sys_currencyCode));
+                                        if (eec_currencyInfo != null)
+                                        {
+                                            currencyRate = DecimalToString(eec_currencyInfo.Rate, 4);
+                                        }
+                                    }
+
+                                    SetCells(ChildTable, doc, rowIndex, 3, "汇率" + currencyRate);
                                     SetCells(ChildTable, doc, rowIndex, 4, "CNY " + item.SubTotal + "\r\n");
                                     rowIndex++;
                                     zsinfo += item.Place + "  " + days + "晚 " + item.Cost.ToString("#0.00") + currencyCode + "/晚" + " 汇率" + (item.SubTotal / item.Cost).ToString("#0.0000") + "   CNY " + item.SubTotal * days + "\r\n";
@@ -1164,7 +1210,20 @@ namespace OASystem.API.Controllers
 
                                     string currencyCode = currData.Find(it => it.Id == item.Currency)?.Remark ?? "Unknown";
                                     SetCells(ChildTable1, doc, rowIndex, 2, item.Cost.ToString("#0.00") + currencyCode + "/天");
-                                    SetCells(ChildTable1, doc, rowIndex, 3, "汇率" + (item.SubTotal / item.Cost).ToString("#0.0000"));
+
+                                    var currencyRate = DecimalToString((item.SubTotal / item.Cost), 4);
+                                    var sys_currencyInfo = _currencyDatas.Find(x => item.Currency == x.Id);
+                                    if (sys_currencyInfo != null)
+                                    {
+                                        var sys_currencyCode = sys_currencyInfo.Name;
+                                        var eec_currencyInfo = _EnterExitCostCurrencys.Find(x => x.Code.Equals(sys_currencyCode));
+                                        if (eec_currencyInfo != null)
+                                        {
+                                            currencyRate = DecimalToString(eec_currencyInfo.Rate, 4);
+                                        }
+                                    }
+
+                                    SetCells(ChildTable1, doc, rowIndex, 3, "汇率" + currencyRate);
                                     SetCells(ChildTable1, doc, rowIndex, 4, "CNY " + item.SubTotal);
                                     rowIndex++;
                                     hsinfo += item.Place + "  " + days + "天 " + item.Cost.ToString("#0.00") + currencyCode + "/天" + " 汇率" + (item.SubTotal / item.Cost).ToString("#0.0000") + "   CNY " + item.SubTotal * days + "\r\n";
@@ -1201,7 +1260,19 @@ namespace OASystem.API.Controllers
 
                                     string currencyCode = currData.Find(it => it.Id == item.Currency)?.Remark ?? "Unknown";
                                     SetCells(ChildTable2, doc, rowIndex, 2, item.Cost.ToString("#0.00") + currencyCode + "/天");
-                                    SetCells(ChildTable2, doc, rowIndex, 3, "汇率" + (item.SubTotal / item.Cost).ToString("#0.0000"));
+
+                                    var currencyRate = DecimalToString((item.SubTotal / item.Cost), 4);
+                                    var sys_currencyInfo = _currencyDatas.Find(x => item.Currency == x.Id);
+                                    if (sys_currencyInfo != null)
+                                    {
+                                        var sys_currencyCode = sys_currencyInfo.Name;
+                                        var eec_currencyInfo = _EnterExitCostCurrencys.Find(x => x.Code.Equals(sys_currencyCode));
+                                        if (eec_currencyInfo != null)
+                                        {
+                                            currencyRate = DecimalToString(eec_currencyInfo.Rate, 4);
+                                        }
+                                    }
+                                    SetCells(ChildTable2, doc, rowIndex, 3, "汇率" + currencyRate);
                                     SetCells(ChildTable2, doc, rowIndex, 4, "CNY " + item.SubTotal + "\r\n");
                                     rowIndex++;
                                     gzinfo += item.Place + "  " + days + "天 " + item.Cost.ToString("#0.00") + currencyCode + "/天" + " 汇率" + (item.SubTotal / item.Cost).ToString("#0.00") + "   CNY " + item.SubTotal * days + "\r\n";
@@ -1275,7 +1346,6 @@ namespace OASystem.API.Controllers
                             TeableBookmarkArr.Clear();
                         }
 
-
                         bookmarkArr.Add("VisitPrice", WordAllPrice.ToString());//出访费用总额
                         bookmarkArr.Add("CnAllPrice", WordAllPrice.ConvertCNYUpper());//出访费用总额中文
                         bookmarkArr.Add("namesPrice", UsersTop.TrimEnd('、'));//各人员出访费用  付辰同志出访费用为¥73,604.8元
@@ -1290,7 +1360,7 @@ namespace OASystem.API.Controllers
                             }
                         }
                         //MemoryStream outSteam = new MemoryStream();
-                        string filsPath = AppSettingsHelper.Get("WordBasePath") + $"ForeignReceivables/File/{ClientItem.Key.Replace("\n", "")}.docx";
+                        string filsPath = AppSettingsHelper.Get("WordBasePath") + $"ForeignReceivables/File/{ClientItem.Key.Replace("\n", "")}_{_DelegationInfo.VisitCountry.Replace("|","、")}.docx";
                         //去水印
                         new Aspose.Words.License().SetLicense(new MemoryStream(Convert.FromBase64String(AsposeHelper.asposeKey)));
                         doc.Save(filsPath);
@@ -1329,6 +1399,45 @@ namespace OASystem.API.Controllers
             }
         }
 
+         /// <summary>
+         /// decimal保留指定位数小数
+         /// </summary>
+         /// <param name="num">原始数量</param>
+         /// <param name="scale">保留小数位数</param>
+         /// <returns>截取指定小数位数后的数量字符串</returns>
+         private static string DecimalToString(decimal num, int scale)
+         {
+             string numToString = num.ToString();
+
+             int index = numToString.IndexOf(".");
+             int length = numToString.Length;
+
+             if (index != -1)
+             {
+                 return string.Format("{0}.{1}",
+                     numToString.Substring(0, index),
+                     numToString.Substring(index + 1, Math.Min(length - index - 1, scale)));
+             }
+             else
+             {
+                 return num.ToString();
+             }
+         }
+
+        /// <summary>
+        /// 保留小数位数
+        /// </summary>
+        /// <param name="n">待处理的值</param>
+        /// <param name="d">保留位数</param>
+        /// <param name="isEnter">是否四舍五入</param>
+        /// <returns></returns>
+        private static decimal Round(decimal n, int d, bool isEnter = false)
+        {
+            if (isEnter)
+                return decimal.Round(n, d, MidpointRounding.AwayFromZero);
+            return Math.Truncate(n * (decimal)Math.Pow(10, d)) / (decimal)Math.Pow(10, d);
+        }
+
         private void SetCells(Aspose.Words.Tables.Table table, Document doc, int rows, int cells, string val)
         {
             //获取table中的某个单元格,从0开始
@@ -4266,7 +4375,7 @@ Group by PriceType ", dto.diId);
         #region 信用卡对账
 
         /// <summary>
-        ///将指定的Excel的文件转换成DataTable (Excel的第一个sheet)
+        ///将指定的Excel的文件转换成DataTable(Excel的第一个sheet)
         /// </summary>
         /// <param name="fullFielPath">文件的绝对路径</param>
         /// <returns></returns>
@@ -4430,11 +4539,13 @@ Group by PriceType ", dto.diId);
 
             //读取ExcelFile
             DataTable dt = ExcelFileToDataTable(file);
-            dt.TableName = "TB";
+            
             if (dt == null)
             {
                 return Ok(JsonView(false, $"您上传的Excel工作表没有内容,请检查!!!"));
             }
+
+            dt.TableName = "TB";
             //信用卡信息
             string sql = string.Format($"Select * From Grp_CreditCardPayment Where Isdel = 0 And CTDId = {cardType} And ConsumptionDate between '{beginDt}' and '{endDt}' ");
             var List_ccp = await _sqlSugar.SqlQueryable<Grp_CreditCardPayment>(sql).ToListAsync();
@@ -4537,8 +4648,6 @@ Group by PriceType ", dto.diId);
                             dt.AcceptChanges(); //提交
                         }
                     }
-
-
                     foreach (DataRow item in dt.Rows)
                     {
                         #region 匹配的金额
@@ -5057,7 +5166,7 @@ Group by PriceType ", dto.diId);
         /// <param name="sheetName">工作表名</param>
         /// <param name="tbContainer">将数据存入的DataTable</param>
         /// <returns></returns>
-        public static DataTable ExcelToDataTable(string pathName, string sheetName)
+        public static DataTable ExcelToDataTable(string pathName, string sheetName="")
         {
             DataTable tbContainer = new DataTable();
             string strConn = string.Empty;

+ 264 - 12
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -29,11 +29,13 @@ using OASystem.Domain.ViewModels.Groups;
 using OASystem.Domain.ViewModels.Statistics;
 using OASystem.Infrastructure.Repositories.Financial;
 using OASystem.Infrastructure.Repositories.Groups;
+using OfficeOpenXml;
 using Quartz.Util;
 using SqlSugar;
 using SqlSugar.Extensions;
 using System.Collections;
 using System.Data;
+using System.Data.OleDb;
 using System.Diagnostics;
 using System.Globalization;
 using System.IO;
@@ -41,6 +43,7 @@ using System.IO.Compression;
 using System.Net.Http;
 using System.Reflection.PortableExecutable;
 using Ubiety.Dns.Core;
+using static NPOI.POIFS.Crypt.CryptoFunctions;
 using static OASystem.API.OAMethodLib.JWTHelper;
 using static OASystem.Infrastructure.Repositories.Groups.AirTicketResRepository;
 using Bookmark = Aspose.Words.Bookmark;
@@ -3555,7 +3558,6 @@ FROM
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> DecreasePaymentsSelect(DecreasePaymentsDto dto)
         {
-
             #region 参数验证
 
             if (dto.UserId < 1) return Ok(JsonView(false, "请传入有效的UserId参数!"));
@@ -3646,7 +3648,6 @@ FROM
             if (dto.Id < 1) return Ok(JsonView(false, "请传入有效的数据Id!"));
 
             return Ok(await _decreasePaymentsRep.QueryDecreasePaymentsById(dto));
-
         }
 
         /// <summary>
@@ -3678,6 +3679,113 @@ FROM
             return Ok(jw);
         }
 
+        /// <summary>
+        /// 团组增减款项 OTA匹配
+        /// </summary>
+        /// <param name="file"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> DecreasePaymentsOTAMate(IFormFile file)
+        {
+            if (file.Length < 1) return Ok(JsonView(false, "请上传文件!"));
+
+            string fileName = file.FileName;
+            if (!fileName.EndsWith(".xlsx") && !fileName.EndsWith(".xls"))
+            {
+                return Ok(JsonView(false, "请上传Excel文件!"));
+            }
+
+            //D:\FTP\File\OA2023\Office\GrpFile\团组增减款项相关文件\团组其他款项(OTA)
+            var path = @$"{AppSettingsHelper.Get("GrpFileBasePath")}团组增减款项相关文件/团组其他款项(OTA)";
+            if (!Directory.Exists(path))
+            {
+                Directory.CreateDirectory(path);
+            }
+            var filePath = @$"{path}/{fileName}";
+            //保存文件
+            using (FileStream fs = System.IO.File.Create(filePath))
+            {
+                file.CopyTo(fs);
+                fs.Flush();
+            }
+            if (!System.IO.File.Exists(filePath)) return Ok(JsonView(false, "文件不存在!"));
+
+            //读取ExcelFile
+            DataTable dt = ConvertExcelToDataTable(filePath);
+            if (dt == null) return Ok(JsonView(false, $"您上传的Excel工作表没有内容,请检查!!!"));
+            dt.TableName = "TB";
+
+            //修改table列名
+            dt.Columns[0].ColumnName = "OrderNo";         // 订单号
+            dt.Columns[1].ColumnName = "OTAOrderNo";      // OTA订单号
+            dt.Columns[2].ColumnName = "PackageName";     // 套餐名
+            dt.Columns[3].ColumnName = "IsPay";           // 是否支付
+            dt.Columns[4].ColumnName = "IsShipments";     // 是否发货
+            dt.Columns[5].ColumnName = "IsSendBack";      // 是否寄回
+            dt.Columns[6].ColumnName = "OpUser";          // 使用人信息
+            dt.Columns[7].ColumnName = "OrderTime";       // 下单时间
+            dt.Columns[8].ColumnName = "UseTime";         // 使用时间
+            dt.Columns[9].ColumnName = "Quantity";        // 台数
+            dt.Columns[10].ColumnName = "Days";           // 租赁天数
+            dt.Columns[11].ColumnName = "QuantityShipped";// 发货数量
+            dt.Columns[12].ColumnName = "TotalPrice";     // 总金额
+            dt.Columns[13].ColumnName = "GroupName";      // 团组名称
+            dt.Columns[14].ColumnName = "OATotalPrice";   // OA金额
+
+            var otaOrderNos = new List<string>();
+            foreach (DataRow item in dt.Rows)
+            {
+                otaOrderNos.Add(item["OTAOrderNo"].ToString());
+            }
+
+            var oaDatas = await _sqlSugar.Queryable<Grp_DecreasePayments>()
+                .LeftJoin<Grp_DelegationInfo>((dp, di) => dp.DiId == di.Id)
+                .Where((dp, di) => dp.IsDel == 0 && dp.PriceName.Contains("wifi") || otaOrderNos.Contains(dp.OTAOrderNo))
+                .Select((dp, di) => new
+                {
+                    dp.PriceName,
+                    dp.OTAOrderNo,
+                    dp.FeeTotal,
+                    di.TeamName,
+                })
+                .ToListAsync();
+
+            foreach (DataRow item in dt.Rows)
+            {
+                var otaOrderNo = item["OTAOrderNo"].ToString();
+                var oaData = oaDatas.Find(x => !string.IsNullOrEmpty(x.OTAOrderNo) &&  x.OTAOrderNo.Contains(otaOrderNo));
+                if (oaData == null) continue;
+
+                item["GroupName"] = oaData.TeamName;
+                item["OATotalPrice"] = oaData.FeeTotal.ToString("#0.00");
+            }
+
+            string fileName1 = $"OTA_WIFI费用{DateTime.Now.ToString("yyyyMMddHHmmss")}.xls";
+            Dictionary<string, object> pairs = new Dictionary<string, object>();
+            List<DataTable> datas = new List<DataTable>();
+            datas.Add(dt);
+            url = AsposeHelper.ExpertExcelToModel("WIFI费用清单-模板.xlsx", $"GrpFile/团组增减款项相关文件/团组其他款项(OTA)", fileName1, pairs, datas);
+
+
+            return Ok(JsonView(true, "操作成功", new { url = url }));
+        }
+
+        #region
+        private DataTable ConvertExcelToDataTable(string excelFilePath)
+        {
+            // 创建Workbook对象
+            Workbook workbook = new Workbook(excelFilePath);
+
+            // 获取第一个工作表
+            Worksheet worksheet = workbook.Worksheets[0];
+
+            // 将工作表转换为DataTable
+            DataTable dataTable = worksheet.Cells.ExportDataTable(1, 0, worksheet.Cells.MaxDataRow + 1, worksheet.Cells.MaxDataColumn + 1);
+
+            return dataTable;
+        }
+        #endregion
+
         #endregion
 
         #region 文件上传、删除
@@ -15397,7 +15505,6 @@ And (UnitName != '' Or UnitName != null) {sqlWhere}");
 
         #endregion
 
-
         #region 团组接待意见调查 Grp_ReceptionOpinionSurvey
         /// <summary>
         /// 团组接待意见调查 - 信息管理
@@ -15434,15 +15541,6 @@ And (UnitName != '' Or UnitName != null) {sqlWhere}");
             if (groupId < 1) Ok(JsonView(false,"请传入有效的diId"));
 
             var data = await _opinionaireRep.Query(x => x.DiId == groupId)
-                 //.LeftJoin<Sys_Users>((x,u) => x.CreateUserId == u.Id)
-                 //.Select((x, u) => new
-                 //{
-                 //    x.Id,
-                 //    x.TourGuideName,
-                 //    x.CityName,
-                 //    CreateUserName = u.CnName,
-                 //    x.CreateTime
-                 //})
                  .Select(x => new
                  {
                      x.Id,
@@ -15523,6 +15621,160 @@ And (UnitName != '' Or UnitName != null) {sqlWhere}");
             return Ok(JsonView("操作成功!"));
         }
 
+        /// <summary>
+        /// 团组接待意见调查 - 用户
+        /// 列表
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("{diId}")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> OpinionaireUserList(int diId)
+        {
+            if (diId < 1) Ok(JsonView(false, "请传入有效的diId"));
+
+
+            var sql = string.Format(@"
+SELECT
+  o.Id,
+  o.DiId,
+  di.TeamName AS 'GroupName',
+  di.VisitPNumber AS 'PeopleNumber',
+  di.ClientName AS 'LeadGroup',
+  di.VisitCountry AS 'Travel',
+  di.VisitDays AS 'Days',
+  o.CityName,
+  o.TourGuideName,
+  o.Catering,
+  o.CateringReason,
+  o.Stay,
+  o.StayReason,
+  o.[Route],
+  o.RouteReason,
+  o.OfficialActivity,
+  o.OfficialActivityReason,
+  o.TourGuide,
+  o.TourGuideReason,
+  o.[Translate],
+  o.TranslateReason,
+  o.Trip,
+  o.TripReason,
+  o.ESFileName,
+  o.SignatureDate,
+  o.Remark
+FROM
+  Grp_Opinionaire o
+  LEFT JOIN Grp_DelegationInfo di ON o.DiId = di.Id
+WHERE
+  o.IsDel = 0
+  AND o.DiId = {0}
+ORDER BY
+  o.Id ASC", diId);
+
+            var data = await _sqlSugar.SqlQueryable<OpinionaireUserListView>(sql).ToListAsync();
+
+            if (data.Count < 1) return Ok(JsonView(false, "暂无数据"));
+
+            return Ok(JsonView(data));
+        }
+
+        /// <summary>
+        /// 团组接待意见调查 - 用户
+        /// 保存
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> OpinionaireUserSave(OpinionaireUserSaveInfo[] dto)
+        {
+            if (dto.Length < 1) Ok(JsonView(false, "请传入有效的参数"));
+
+            foreach (var item in dto)
+            {
+                if (string.IsNullOrEmpty(item.Catering)) Ok(JsonView(false, "请选择餐饮评分!"));
+                if (string.IsNullOrEmpty(item.Stay)) Ok(JsonView(false, "请选择住宿评分!"));
+                if (string.IsNullOrEmpty(item.Route)) Ok(JsonView(false, "请选择行程评分!"));
+                if (string.IsNullOrEmpty(item.OfficialActivity)) Ok(JsonView(false, "请选择公务活动评分!"));
+                if (string.IsNullOrEmpty(item.Translate)) Ok(JsonView(false, "请选择翻译评分!"));
+                if (string.IsNullOrEmpty(item.Trip)) Ok(JsonView(false, "请选择行程评分!"));
+                if (string.IsNullOrEmpty(item.SignatureDate)) Ok(JsonView(false, "请填写签名日期!"));
+                if (item.File.Length < 1) Ok(JsonView(false, "请上传签名图片!"));
+            }
+
+            var filePathBase = $"{AppSettingsHelper.Get("GrpFileBasePath")}OpinionaireElectronicSignature";
+            if (!Directory.Exists(filePathBase))
+            {
+                Directory.CreateDirectory(filePathBase);
+            }
+
+            #region 上传文件
+
+            var filePaths = new List<string>();
+            foreach (var item in dto)
+            {
+                var file = item.File;
+
+                // 将文件保存到指定位置
+                var filePath = Path.Combine(filePathBase, file.FileName);
+                using (var stream = new FileStream(filePath, FileMode.Create))
+                {
+                    await file.CopyToAsync(stream);
+                }
+
+                //验证文件是否上传成功
+                if (!System.IO.File.Exists(filePath))
+                {
+                    foreach (var filePathStr in filePaths)
+                    {
+                        System.IO.File.Delete(filePathStr);
+                    }
+                    return Ok(JsonView(false, "文件上传失败!"));
+                }
+                item.ESFileName = file.FileName;
+            }
+
+            #endregion
+
+            var infos = _mapper.Map<List<Grp_Opinionaire>>(dto);
+
+            var upd = await _sqlSugar.Updateable<Grp_Opinionaire>(infos)
+                .UpdateColumns(x => new
+                {
+                    x.Catering,
+                    x.CateringReason,
+                    x.Stay,
+                    x.StayReason,
+                    x.Route,
+                    x.RouteReason,
+                    x.OfficialActivity,
+                    x.OfficialActivityReason,
+                    x.TourGuide,
+                    x.TourGuideReason,
+                    x.Translate,
+                    x.TranslateReason,
+                    x.Trip,
+                    x.TripReason,
+                    x.ESFileName,
+                    x.SignatureDate,
+                    x.Remark
+                })
+                .WhereColumns(x => new { x.Id })
+                .ExecuteCommandAsync();
+
+            if (upd < 1)
+            {
+                foreach (var filePathStr in filePaths)
+                {
+                    System.IO.File.Delete(filePathStr);
+                }
+                return Ok(JsonView(false));
+            }
+
+
+            return Ok(JsonView(true));
+        }
+
         #endregion
 
         //        /// <summary>

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
OASystem/OASystem.Api/OAMethodLib/File/AsposeHelper.cs


+ 2 - 0
OASystem/OASystem.Api/OAMethodLib/GeneralMethod.cs

@@ -19,6 +19,7 @@ using OASystem.Domain.ViewModels.Groups;
 using OASystem.Domain.ViewModels.JuHeExchangeRate;
 using OASystem.Infrastructure.Repositories.CRM;
 using OASystem.Infrastructure.Repositories.Groups;
+using OfficeOpenXml;
 using System.Data;
 using System.IdentityModel.Tokens.Jwt;
 using System.Security.Claims;
@@ -38,6 +39,7 @@ namespace OASystem.API.OAMethodLib
         private static readonly IHubContext<ChatHub, IChatClient> _hubContext = AutofacIocManager.Instance.GetService<IHubContext<ChatHub, IChatClient>>();
 
         private readonly static string[] weekdays = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
+        
         #region 员工注册默认添加基础页面
 
         /// <summary>

+ 2 - 2
OASystem/OASystem.Api/OASystem.API.csproj

@@ -32,10 +32,10 @@
     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.0" />
     <PackageReference Include="Betalgo.OpenAI.GPT3" Version="6.8.3" />
     <PackageReference Include="BouncyCastle.NetCore" Version="1.8.8" />
-    <PackageReference Include="EPPlus" Version="7.1.3" />
+    <PackageReference Include="EPPlus" Version="7.4.1" />
     <PackageReference Include="Flurl.Http" Version="3.2.4" />
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.11" />
-    <PackageReference Include="NPOI" Version="2.7.0" />
+    <PackageReference Include="NPOI" Version="2.7.1" />
     <PackageReference Include="PinYinConverterCore" Version="1.0.2" />
     <PackageReference Include="QRCoder" Version="1.4.1" />
     <PackageReference Include="Quartz" Version="3.6.2" />

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

@@ -175,6 +175,8 @@ namespace OASystem.Domain.AutoMappers
 
             #region  团组接待意见调查
             CreateMap<OpinionaireManageInfo, Grp_Opinionaire>();
+            CreateMap<Grp_Opinionaire, OpinionaireUserListView>();
+            CreateMap<OpinionaireUserSaveInfo, Grp_Opinionaire>();
             #endregion
             #endregion
 

+ 5 - 0
OASystem/OASystem.Domain/Dtos/Groups/DecreasePaymentsDto.cs

@@ -147,6 +147,11 @@ namespace OASystem.Domain.Dtos.Groups
         /// 备注
         /// </summary>
         public string Remark { get; set; }
+
+        /// <summary>
+        /// OTA订单号NO
+        /// </summary>
+        public string OTAOrderNo { get; set; }
     }
     public class DecreasePaymentsByIdDto
     {

+ 14 - 1
OASystem/OASystem.Domain/Dtos/Groups/OpinionaireDto.cs

@@ -1,4 +1,6 @@
-using System;
+using Microsoft.AspNetCore.Http;
+using OASystem.Domain.ViewModels.Groups;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -27,4 +29,15 @@ namespace OASystem.Domain.Dtos.Groups
         public string TourGuideName { get; set; }
         public string CityName { get; set; }
     }
+
+
+    public class OpinionaireUserSaveInfo : OpinionaireUser_Content
+    {
+        public IFormFile File { get; set; }
+    }
+
+    public class OpinionaireUserSaveDto
+    {
+        public OpinionaireUserSaveInfo[] Items { get; set; }
+    }
 }

+ 6 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_DecreasePayments.cs

@@ -103,5 +103,11 @@ namespace OASystem.Domain.Entities.Groups
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "varchar(120)")]
         public string FilePath { get; set; }
+
+        /// <summary>
+        /// OTA订单号
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(200)")]
+        public string OTAOrderNo { get; set; }
     }
 }

+ 2 - 0
OASystem/OASystem.Domain/ViewModels/Groups/DecreasePaymentsView.cs

@@ -145,5 +145,7 @@ namespace OASystem.Domain.ViewModels.Groups
         /// 备注
         /// </summary>
         public string remark { get; set; }
+
+        public string OTAOrderNo { get; set; }
     }
 }

+ 136 - 0
OASystem/OASystem.Domain/ViewModels/Groups/OpinionaireView.cs

@@ -13,4 +13,140 @@ namespace OASystem.Domain.ViewModels.Groups
     public class OpinionaireView:Grp_Opinionaire
     {
     }
+
+
+    public class OpinionaireUser_Content
+    {
+        /// <summary>
+        /// 编号
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 餐饮评分(A、B、C、D)
+        /// </summary>
+        public string? Catering { get; set; }
+
+        /// <summary>
+        /// 餐饮评分-原因(餐饮==C||D 有值)
+        /// </summary>
+        public string? CateringReason { get; set; }
+
+        /// <summary>
+        /// 住宿评分(A、B、C、D)
+        /// </summary>
+        public string? Stay { get; set; }
+
+        /// <summary>
+        /// 住宿评分-原因(住宿==C||D 有值)
+        /// </summary>
+        public string? StayReason { get; set; }
+
+        /// <summary>
+        /// 行程评分(A、B、C、D)
+        /// </summary>
+        public string? Route { get; set; }
+
+        /// <summary>
+        /// 行程评分-原因(行程==C||D 有值)
+        /// </summary>
+        public string? RouteReason { get; set; }
+
+        /// <summary>
+        /// 公务活动评分(A、B、C、D)
+        /// </summary>
+        public string? OfficialActivity { get; set; }
+
+        /// <summary>
+        /// 公务活动评分-原因(行程==C||D 有值)
+        /// </summary>
+        public string? OfficialActivityReason { get; set; }
+
+        /// <summary>
+        /// 导游评分(A、B、C、D)
+        /// </summary>
+        public string? TourGuide { get; set; }
+
+        /// <summary>
+        /// 导游评分-原因(行程==C||D 有值)
+        /// </summary>
+        public string? TourGuideReason { get; set; }
+
+        /// <summary>
+        /// 翻译评分(A、B、C、D)
+        /// </summary>
+        public string? Translate { get; set; }
+
+        /// <summary>
+        /// 翻译评分-原因(行程==C||D 有值)
+        /// </summary>
+        public string? TranslateReason { get; set; }
+
+        /// <summary>
+        /// 出行评分(A、B、C、D)
+        /// </summary>
+        public string? Trip { get; set; }
+
+        /// <summary>
+        /// 出行评分-原因(行程==C||D 有值)
+        /// </summary>
+        public string? TripReason { get; set; }
+
+        /// <summary>
+        /// 电子签名文件名称
+        /// </summary>
+        public string? ESFileName { get; set; }
+
+        /// <summary>
+        /// 签名日期(2024-10-08 15:00:00)
+        /// </summary>
+        public string? SignatureDate { get; set; }
+
+        public string Remark { get; set; }
+    }
+
+
+    public class OpinionaireUserListView: OpinionaireUser_Content
+    {
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        public int DiId { get; set; }
+
+        /// <summary>
+        /// 团组名称
+        /// </summary>
+        public string GroupName { get; set; }
+
+        /// <summary>
+        /// 人数
+        /// </summary>
+        public int PeopleNumber { get; set; }
+
+        /// <summary>
+        /// 领队
+        /// </summary>
+        public string LeadGroup { get; set; }
+
+        /// <summary>
+        /// 行程
+        /// </summary>
+        public string Travel { get; set; }
+
+        /// <summary>
+        /// 天数
+        /// </summary>
+        public int Days { get; set; }
+
+        /// <summary>
+        /// 城市名称
+        /// </summary>
+        public string? CityName { get; set; }
+
+        /// <summary>
+        /// 导游名称
+        /// </summary>
+        public string? TourGuideName { get; set; }
+    }
+
 }

+ 47 - 6
OASystem/OASystem.Infrastructure/Repositories/Financial/DailyFeePaymentRepository.cs

@@ -41,7 +41,7 @@ namespace OASystem.Infrastructure.Repositories.Financial
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        public async Task<Result> GetPagePriceTypeData(PortDtoBase dto)
+        public async Task<Result> GetPagePriceTypeData(PortDtoBase dto, int currUserId = 0)
         {
             Result result = new Result() { Code = -2 };
 
@@ -53,20 +53,61 @@ namespace OASystem.Infrastructure.Repositories.Financial
             //48人员费用  49办公费用 50 销售费用 51 其他费用 55 大运会
             var priceTypeData = setTypeData.Where(s => s.Id == 48 || s.Id == 49 || s.Id == 50 || s.Id == 51 || s.Id == 55).ToList();
             var priceSubTypeData = setData.Where(s => s.STid == 48 || s.STid == 49 || s.STid == 50 || s.STid == 51 || s.STid == 55).ToList();
+
+            var isEnable = false;
             //员工姓名列表
-            var userNameData = await _UsersRep.GetUserNameList(dto.PortType);
-            //62 公转 63 私转
+            var userData = _sqlSugar.Queryable<Sys_Users>()
+                .LeftJoin<Sys_Department>((u, d) => u.DepId == d.Id)
+                .LeftJoin<Sys_JobPost>((u, d, jp) => u.JobPostId == jp.Id)
+                .Where((u, d, jp) => u.IsDel == 0)
+                .Select((u, d, jp) => new
+                {
+                    u.Id,
+                    u.CnName,
+                    u.DepId,
+                    d.DepName,
+                    u.JobPostId,
+                    jp.JobName
+                })
+                .ToList();
+            //1 经理职位 查看该部门下所有人员
+            if (currUserId > 0)
+            {
+                //42
+                var auditUserIds = _sqlSugar.Queryable<Sys_UserAuthority>().Where(x => x.IsDel == 0 && x.SmId == 42 && x.FId == 12).Select(x => x.UId).ToList();
+                if (!auditUserIds.Contains(currUserId))
+                {
+                    var screenWheres = new List<string>() { "经理", "主管" };
+
+                    var userInfo = userData.Find(x => x.Id == currUserId && screenWheres.Contains(x.JobName));
+                    if (userInfo != null)
+                    {
+                        userData = userData.Where(x => x.DepName.Equals(userInfo.DepName)).ToList();
+                    }
+                    else
+                    {
+                        userData = userData.Where(x => x.Id == currUserId).ToList();
+                    }
+                }
+                else
+                {
+                    userData.Insert(0, new { Id = -1, CnName = "全部", DepId = 0, DepName = "", JobPostId = 0, JobName = "" });
+                }                     
+                                      
+            }                         
+            var userData1 = userData.Select(x => new { x.Id, x.CnName }).ToList();
+            //62 公转 63 私转        
             var feeMarkTypeData = setTypeData.Where(s => s.Id == 62 || s.Id == 63).ToList();
             var feeMarkSubTypeData = setData.Where(s => s.STid == 62 || s.STid == 63).ToList();
             var companyNameData = await _CompanyRep.GetCompanyNameData();
 
             if (dto.PortType == 1) //web
             {
-                DailyFeePaymentList = new Fin_DailyFeePaymentPagePriceTypeDataView
+                DailyFeePaymentList = new 
                 {
                     FeeTypeData = priceTypeData,
                     FeeSubTypeData = priceSubTypeData,
-                    UserNameData = userNameData.Data,
+                    UserNameData = userData1,
                     FeeMarkTypeData = feeMarkTypeData,
                     FeeMarkSubTypeData = feeMarkSubTypeData,
                     CompanyNameData = companyNameData.Data
@@ -77,7 +118,7 @@ namespace OASystem.Infrastructure.Repositories.Financial
 
                 DailyFeePaymentList = new
                 {
-                    UserNameData = userNameData.Data,
+                    UserNameData = userData1,
                     FeeTypeData = priceTypeData,
                     FeeTypeSubData = priceSubTypeData
                 };

+ 2 - 0
OASystem/OASystem.Infrastructure/Repositories/Groups/DecreasePaymentsRepository.cs

@@ -283,6 +283,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     FeeTotal = grp_Decrease.FeeTotal,
                     Currency = grp_Decrease.Currency,
                     FilePath = grp_Decrease.FilePath,
+                    OTAOrderNo = grp_Decrease.OTAOrderNo,
                     Remark = grp_Decrease.Remark,
                 });
                 if (res)
@@ -446,6 +447,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
 											dp.FeeTotal,
 											dp.Currency,
 											dp.FilePath,
+                                            dp.OTAOrderNo,
 											dp.Remark,
 											ccp.PayDId,
 											ccp.OrbitalPrivateTransfer,