浏览代码

收款账单
文件下载

leiy 1 年之前
父节点
当前提交
a5b8b6c136

+ 430 - 3
OASystem/OASystem.Api/Controllers/FinancialController.cs

@@ -16,6 +16,14 @@ using OASystem.Infrastructure.Repositories.Groups;
 using SqlSugar;
 using SqlSugar;
 using StackExchange.Redis;
 using StackExchange.Redis;
 using System.Data;
 using System.Data;
+using static OpenAI.GPT3.ObjectModels.SharedModels.IOpenAiModels;
+using System.Web;
+using Aspose.Words;
+using NPOI.HSSF.Util;
+using OASystem.Domain.Entities.Customer;
+using System.IO.Compression;
+using NPOI.SS.UserModel;
+using System.Net.Http;
 
 
 namespace OASystem.API.Controllers
 namespace OASystem.API.Controllers
 {
 {
@@ -29,6 +37,7 @@ namespace OASystem.API.Controllers
         private readonly IMapper _mapper;
         private readonly IMapper _mapper;
         private readonly IConfiguration _config;
         private readonly IConfiguration _config;
         private readonly SqlSugarClient _sqlSugar;
         private readonly SqlSugarClient _sqlSugar;
+        private readonly HttpClient _httpClient;
         private readonly SetDataTypeRepository _setDataTypeRep;
         private readonly SetDataTypeRepository _setDataTypeRep;
         private readonly DailyFeePaymentRepository _daiRep;    //日付申请仓库
         private readonly DailyFeePaymentRepository _daiRep;    //日付申请仓库
         private readonly TeamRateRepository _teamRateRep;      //团组汇率仓库
         private readonly TeamRateRepository _teamRateRep;      //团组汇率仓库
@@ -41,7 +50,7 @@ namespace OASystem.API.Controllers
         /// </summary>
         /// </summary>
         public FinancialController(IMapper mapper, IConfiguration configuration, DailyFeePaymentRepository daiRep, SqlSugarClient sqlSugar, SetDataTypeRepository setDataTypeRep,
         public FinancialController(IMapper mapper, IConfiguration configuration, DailyFeePaymentRepository daiRep, SqlSugarClient sqlSugar, SetDataTypeRepository setDataTypeRep,
             TeamRateRepository teamRateRep, ForeignReceivablesRepository ForForeignReceivablesRep, ProceedsReceivedRepository proceedsReceivedRep,
             TeamRateRepository teamRateRep, ForeignReceivablesRepository ForForeignReceivablesRep, ProceedsReceivedRepository proceedsReceivedRep,
-            PaymentRefundAndOtherMoneyRepository paymentRefundAndOtherMoneyRep)
+            PaymentRefundAndOtherMoneyRepository paymentRefundAndOtherMoneyRep, HttpClient httpClient)
         {
         {
             _mapper = mapper;
             _mapper = mapper;
             _config = configuration;
             _config = configuration;
@@ -52,6 +61,7 @@ namespace OASystem.API.Controllers
             _ForForeignReceivablesRep = ForForeignReceivablesRep;
             _ForForeignReceivablesRep = ForForeignReceivablesRep;
             _proceedsReceivedRep = proceedsReceivedRep;
             _proceedsReceivedRep = proceedsReceivedRep;
             _paymentRefundAndOtherMoneyRep = paymentRefundAndOtherMoneyRep;
             _paymentRefundAndOtherMoneyRep = paymentRefundAndOtherMoneyRep;
+            _httpClient = httpClient;
         }
         }
 
 
         #region 日付申请
         #region 日付申请
@@ -656,7 +666,6 @@ namespace OASystem.API.Controllers
             catch (Exception ex)
             catch (Exception ex)
             {
             {
                 return Ok(JsonView(false, ex.Message));
                 return Ok(JsonView(false, ex.Message));
-                throw;
             }
             }
         }
         }
 
 
@@ -682,7 +691,6 @@ namespace OASystem.API.Controllers
             catch (Exception ex)
             catch (Exception ex)
             {
             {
                 return Ok(JsonView(false, ex.Message));
                 return Ok(JsonView(false, ex.Message));
-                throw;
             }
             }
         }
         }
 
 
@@ -738,7 +746,426 @@ namespace OASystem.API.Controllers
             }
             }
         }
         }
 
 
+        /// <summary>
+        /// 已收账单 
+        /// File Downloasd
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostReceivablesFeilDownload(ForeignReceivablesFeilDownloadDto dto)
+        {
+            try
+            {
+                if (dto.DiId < 1)
+                {
+                    return Ok(JsonView(false, "请传入有效DiId参数!"));
+                }
+                if (dto.FileType < 1 || dto.FileType > 3)
+                {
+                    return Ok(JsonView(false, "请传入有效FileType参数! 1 生成收款单(四川)  2 生成收款单(北京)  3 汇款账单"));
+                }
+
+                var _DelegationInfo = _sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0 && it.Id == dto.DiId).First();
+                if (_DelegationInfo == null)
+                {
+                    return Ok(JsonView(false, "暂无团组信息!!"));
+                }
+
+                if (dto.FileType == 1 || dto.FileType == 2)
+                {
+                    var _ForeignReceivables = _sqlSugar.Queryable<Fin_ForeignReceivables>().Where(it => it.IsDel == 0 && it.Diid == dto.DiId).ToList();
+                    if (_ForeignReceivables.Count < 1)
+                    {
+                        return Ok(JsonView(false, "暂无收款信息!!"));
+                    }
+
+                    string tempName = "";
+                    if (dto.FileType == 1) tempName = $"收款账单(四川)模板.docx";
+                    else if (dto.FileType == 2) tempName = $"收款账单(北京)模板.docx";
+
+
+
+                    string tempPath = AppSettingsHelper.Get("WordBasePath") + $"ForeignReceivables/Temp/{tempName}";
+                    //载入模板
+                    Document doc = new Document(tempPath);
+                    DocumentBuilder builder = new DocumentBuilder(doc);
+
+                    #region 替换Word模板书签内容
+
+                    //这里可以创建个DataTable循环添加书签的值,这里提示一下就不多做修改了
+                    //付款方
+                    if (doc.Range.Bookmarks["To"] != null)
+                    {
+                        Bookmark mark = doc.Range.Bookmarks["To"];
+                        mark.Text = _ForeignReceivables[0].To == null ? "" : _ForeignReceivables[0].To.ToString();
+                    }
+                    //付款方电话
+                    if (doc.Range.Bookmarks["ToTel"] != null)
+                    {
+                        Bookmark mark = doc.Range.Bookmarks["ToTel"];
+                        mark.Text = _ForeignReceivables[0].ToTel == null ? "" : _ForeignReceivables[0].ToTel.ToString();
+                    }
+                    //导出时间
+                    if (doc.Range.Bookmarks["Date"] != null)
+                    {
+                        Bookmark mark = doc.Range.Bookmarks["Date"];
+                        mark.Text = DateTime.Now.ToString("yyyy-MM-dd");
+                    }
+                    //注
+                    if (doc.Range.Bookmarks["Attention"] != null)
+                    {
+                        Bookmark mark = doc.Range.Bookmarks["Attention"];
+                        mark.Text = _ForeignReceivables[0].Attention == null ? "" : _ForeignReceivables[0].Attention.ToString();
+                    }
+
+                    //团队名称
+                    if (doc.Range.Bookmarks["Team"] != null)
+                    {
+                        Bookmark mark = doc.Range.Bookmarks["Team"];
+                        mark.Text = _DelegationInfo.VisitCountry == null ? "" : _DelegationInfo.VisitCountry.ToString();
+                    }
+
+                    //付款日期
+                    if (doc.Range.Bookmarks["PayDate"] != null)
+                    {
+                        Bookmark mark = doc.Range.Bookmarks["PayDate"];
+                        mark.Text = _ForeignReceivables[0].PayDate == null ? "" : Convert.ToDateTime(_ForeignReceivables[0].PayDate).ToString("yyyy年MM月dd日");
+                    }
+
+                    decimal sumPrice = 0;
+                    //各项费用
+                    if (doc.Range.Bookmarks["PayItemContent"] != null)
+                    {
+                        string items = "";
+                        foreach (var fr in _ForeignReceivables)
+                        {
+                            items += fr.PriceName + "   " + fr.Currency + " " + fr.Price.ToString("#0.00") + " * " + fr.Count + " " + fr.Unit + " * " + fr.Rate + ".................. RMB " + fr.ItemSumPrice.ToString("#0.00") + "\n";
+                            sumPrice += fr.ItemSumPrice;
+                        }
+                        Bookmark mark = doc.Range.Bookmarks["PayItemContent"];
+                        mark.Text = items;
+                    }
+                    //合计
+                    if (doc.Range.Bookmarks["Total"] != null)
+                    {
+                        Bookmark mark = doc.Range.Bookmarks["Total"];
+                        mark.Text = sumPrice.ToString("#0.00");
+                    }
+
+                    #endregion
+
+                    //文件名
+                    string strFileName = _DelegationInfo.TeamName + "-收款账单.docx";
+
+                    doc.Save(AppSettingsHelper.Get("WordBasePath") + "ForeignReceivables/File/" + strFileName);
+                    string url = AppSettingsHelper.Get("WordBaseUrl") + "Office/Word/ForeignReceivables/File/" + strFileName;
+
+                    return Ok(JsonView(true, "成功", new { Url = url }));
+                }
+                else if (dto.FileType == 3) //汇款通知
+                {
+                    var _EnterExitCosts = _sqlSugar.Queryable<Grp_EnterExitCost>().Where(it => it.IsDel == 0 && it.DiId == dto.DiId).First();
+                    var _DayAndCosts = _sqlSugar.Queryable<Grp_DayAndCost>().Where(it => it.IsDel == 0 && it.DiId == dto.DiId).ToList();
+                    if (_EnterExitCosts == null)
+                    {
+                        return Ok(JsonView(false, "该团组未填写出入境费用;"));
+                    }
+
+                    //数据源
+                    List<Grp_DayAndCost> dac1 = _DayAndCosts.Where(it => it.Type == 1).ToList(); //住宿费
+                    List<Grp_DayAndCost> dac2 = _DayAndCosts.Where(it => it.Type == 2).ToList(); //伙食费
+                    List<Grp_DayAndCost> dac3 = _DayAndCosts.Where(it => it.Type == 3).ToList(); //公杂费
+                    List<Grp_DayAndCost> dac4 = _DayAndCosts.Where(it => it.Type == 4).ToList(); //培训费
+
+                    var DeleClientList = _sqlSugar.Queryable<Grp_TourClientList>()
+                                                  .LeftJoin<Crm_DeleClient>((tcl, dc) => tcl.ClientId == dc.Id && dc.IsDel == 0)
+                                                  .LeftJoin<Crm_CustomerCompany>((tcl, dc, cc) => dc.CrmCompanyId == cc.Id && dc.IsDel == 0)
+                                                  .Where((tcl, dc, cc) => tcl.IsDel == 0 && tcl.DiId == dto.DiId)
+                                                  .Select((tcl, dc, cc) => new
+                                                  {
+                                                      Name = dc.LastName + dc.FirstName,
+                                                      Sex = dc.Sex,
+                                                      Birthday = dc.BirthDay,
+                                                      Company = cc.CompanyFullName,
+                                                      Job = dc.Job,
+                                                      AirType = tcl.ShippingSpaceTypeId
+                                                  })
+                                                  .ToList();
+                    if (DeleClientList.Count<1)
+                    {
+                        return Ok(JsonView(false, "暂无团组成员,请先填写团组成员!!!"));
+                    }
+                    var _ClientNames = DeleClientList.Select(x => x.Name).ToList();
+                    var _GroupClient = DeleClientList.GroupBy(x => x.Company).ToList();
+
+
+                    Dictionary<string, string> bookmarkArr = null;
+
+                    string tempPath = AppSettingsHelper.Get("WordBasePath") + $"ForeignReceivables/Temp/汇款通知.docx";
+                    //载入模板
+                    Document doc = new Document(tempPath);
+                    DocumentBuilder builder = null;
+
+
+                    List<string> filesToZip = new List<string>();
+
+                    foreach (var ClientItem in _GroupClient) //遍历单位
+                    {
+                        doc = new Document(tempPath);
+                        builder = new DocumentBuilder(doc);
+                        Paragraph paragraph = new Paragraph(doc);
+
+                        bookmarkArr = new Dictionary<string, string>();
+                        bookmarkArr.Add("titleClientUnit", ClientItem.Key); //title单位
+                        bookmarkArr.Add("ClientUnit", ClientItem.Key); //单位
+                        bookmarkArr.Add("VisitStartDate", _DelegationInfo.VisitStartDate.ToString("yyyy年MM月dd日"));//出发日期
+                        bookmarkArr.Add("name", string.Join(",", ClientItem.Select(x => x.Name).ToArray()).TrimEnd(','));//全部人员信息
+                        bookmarkArr.Add("VisitCountry", _DelegationInfo.VisitCountry);//出访国家
+                        bookmarkArr.Add("dayTime", DateTime.Now.ToString("yyyy年MM月dd日"));//今天日期
+
+                        var ClientItemList = ClientItem.ToList();
+                        string UsersTop = string.Empty;//word中人员以及金额
+                        decimal WordAllPrice = 0.00M;
+
+                        //int[] infoColumn = new int[5] {dac1.Select(x=>x.Place.Length).ToList().Max(),2, dac1.Select(x => x.Cost.Length).Max() + dac1.Select(x => x.Currency.Length).Max(),
+                        //    6, 3 + dac1.Where(x=>!string.IsNullOrWhiteSpace(x.Place)).Select(x=>(Convert.ToDecimal(x.SubTotal) / Convert.ToDecimal(x.Cost)).ToString().Length).Max() };
+
+                        //遍历人员
+                        for (int i = 0; i < ClientItemList.Count(); i++)
+                        {
+                            Dictionary<string, string> TeableBookmarkArr = new Dictionary<string, string>();
+                            var client = ClientItemList[i]; //每个人员
+                            var firstName = ClientItemList[i].Name;
+
+                            //计算费用总和
+                            decimal airPrice = client.AirType == 460 ? _EnterExitCosts.AirJJ : _EnterExitCosts.AirGW;
+                            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.Service;
+                            WordAllPrice += AllPrice;
+
+                            UsersTop += firstName + "出访费用为¥" + AllPrice.ToString("#0.00") + "元、";
+
+                            TeableBookmarkArr.Add("jp",(client.AirType == 460 ? _EnterExitCosts.AirJJ : _EnterExitCosts.AirGW).ToString("#0.00") + " 元"); //机票金额
+                            TeableBookmarkArr.Add("cs", _EnterExitCosts.CityTranffic.ToString("#0.00") + " 元"); //城市交通费用
+                            TeableBookmarkArr.Add("zs", dac1.Sum(x => Convert.ToDecimal(x.SubTotal)).ToString("#0.00") + " 元"); //住宿费
+                            string zsinfo = string.Empty;
+                            string hsinfo = string.Empty;
+                            string gzinfo = string.Empty;
+                            List<string> placeArr = new List<string>();
+
+                            Aspose.Words.Tables.Table FirstTable = (Aspose.Words.Tables.Table)doc.GetChild(NodeType.Table, 0, true);
+                            Aspose.Words.Tables.Table ChildTable = (Aspose.Words.Tables.Table)FirstTable.GetChild(NodeType.Table, 0, true);
+                            Aspose.Words.Tables.Table ChildTable1 = (Aspose.Words.Tables.Table)FirstTable.GetChild(NodeType.Table, 1, true);
+                            Aspose.Words.Tables.Table ChildTable2 = (Aspose.Words.Tables.Table)FirstTable.GetChild(NodeType.Table, 2, true);
+
+                            int rowIndex = 0;
+                            foreach (var item in dac1)
+                            {
+                                if (string.IsNullOrWhiteSpace(item.Place))
+                                {
+                                    continue;
+                                }
+
+                                if (placeArr.Contains(item.Place))
+                                {
+                                    continue;
+                                }
+                                else
+                                {
+                                    placeArr.Add(item.Place);
+                                }
+                                if (!string.IsNullOrWhiteSpace(item.Place))
+                                {
+                                    if (rowIndex > ChildTable.Rows.Count - 1)
+                                    {
+                                        var chitableRow = ChildTable.LastRow.Clone(true);
+                                        ChildTable.AppendChild(chitableRow);
+                                    }
+                                    int days = dac1.FindAll(x => x.Place == item.Place).Count();
+                                    SetCells(ChildTable, doc, rowIndex, 0, item.Place);
+                                    SetCells(ChildTable, doc, rowIndex, 1, days + "晚");
+                                    SetCells(ChildTable, doc, rowIndex, 2, item.Cost + item.Currency + "/晚");
+                                    SetCells(ChildTable, doc, rowIndex, 3, " 汇率" + (item.SubTotal / item.Cost).ToString("#0.00"));
+                                    SetCells(ChildTable, doc, rowIndex, 4, "CNY" + item.SubTotal * days + "\r\n");
+                                    rowIndex++;
+                                    zsinfo += item.Place + "  " + days + "晚 " + item.Cost + item.Currency + "/晚" + " 汇率" + (item.SubTotal /item.Cost).ToString("#0.00") + "   CNY" + item.SubTotal * days + "\r\n";
+                                }
+
+                            }
+                            placeArr.Clear();
+                            rowIndex = 0;
+                            foreach (var item in dac2)
+                            {
+                                if (string.IsNullOrWhiteSpace(item.Place))
+                                {
+                                    continue;
+                                }
+
+                                if (placeArr.Contains(item.Place))
+                                {
+                                    continue;
+                                }
+                                else
+                                {
+                                    placeArr.Add(item.Place);
+                                }
+                                if (!string.IsNullOrWhiteSpace(item.Place))
+                                {
+                                    if (rowIndex > ChildTable1.Rows.Count - 1)
+                                    {
+                                        var chitableRow = ChildTable1.LastRow.Clone(true);
+                                        ChildTable1.AppendChild(chitableRow);
+                                    }
+                                    int days = dac2.FindAll(x => x.Place == item.Place).Count();
+                                    SetCells(ChildTable1, doc, rowIndex, 0, item.Place);
+                                    SetCells(ChildTable1, doc, rowIndex, 1, days + "天");
+                                    SetCells(ChildTable1, doc, rowIndex, 2, item.Cost + item.Currency + "/天");
+                                    SetCells(ChildTable1, doc, rowIndex, 3, " 汇率" + (item.SubTotal / item.Cost).ToString("#0.00"));
+                                    SetCells(ChildTable1, doc, rowIndex, 4, "CNY" +item.SubTotal * days);
+                                    rowIndex++;
+                                    hsinfo += item.Place + "  " + days + "天 " + item.Cost + item.Currency + "/天" + " 汇率" + (item.SubTotal / item.Cost).ToString("#0.00") + "   CNY" +item.SubTotal * days + "\r\n";
+                                }
+
+                            }
+                            placeArr.Clear();
+                            rowIndex = 0;
+                            foreach (var item in dac3)
+                            {
+                                if (string.IsNullOrWhiteSpace(item.Place))
+                                {
+                                    continue;
+                                }
+
+                                if (placeArr.Contains(item.Place))
+                                {
+                                    continue;
+                                }
+                                else
+                                {
+                                    placeArr.Add(item.Place);
+                                }
+                                if (!string.IsNullOrWhiteSpace(item.Place))
+                                {
+                                    if (rowIndex > ChildTable2.Rows.Count - 1)
+                                    {
+                                        var chitableRow = ChildTable2.LastRow.Clone(true);
+                                        ChildTable2.AppendChild(chitableRow);
+                                    }
+                                    int days = dac3.FindAll(x => x.Place == item.Place).Count();
+                                    SetCells(ChildTable2, doc, rowIndex, 0, item.Place);
+                                    SetCells(ChildTable2, doc, rowIndex, 1, days + "天");
+                                    SetCells(ChildTable2, doc, rowIndex, 2, item.Cost + item.Currency + "/天");
+                                    SetCells(ChildTable2, doc, rowIndex, 3, " 汇率" + (item.SubTotal / item.Cost).ToString("#0.00"));
+                                    SetCells(ChildTable2, doc, rowIndex, 4, "CNY" + item.SubTotal * days + "\r\n");
+                                    rowIndex++;
+                                    gzinfo += item.Place + "  " + days + "天 " + item.Cost + item.Currency + "/天" + " 汇率" + (item.SubTotal / item.Cost).ToString("#0.00") + "   CNY" + item.SubTotal * days + "\r\n";
+                                }
+
+                            }
+                            placeArr.Clear();
+                            TeableBookmarkArr.Add("zsinfo", zsinfo); //住宿费详情
+                            TeableBookmarkArr.Add("hs", dac2.Sum(x => Convert.ToDecimal(x.SubTotal)).ToString("#0.00") + " 元"); //伙食费
+                            TeableBookmarkArr.Add("hsinfo", hsinfo); //伙食费详情
+                            TeableBookmarkArr.Add("gz", dac3.Sum(x => Convert.ToDecimal(x.SubTotal)).ToString("#0.00") + " 元"); //公杂费
+                            TeableBookmarkArr.Add("gzinfo", gzinfo); //公杂费详情
+                            TeableBookmarkArr.Add("qt", (_EnterExitCosts.Visa + _EnterExitCosts.Safe).ToString("#0.00") + " 元");//其他费用
+                            TeableBookmarkArr.Add("qtinfo", $"(签证费{_EnterExitCosts.Visa.ToString("#0.00")}元、保险{_EnterExitCosts.Safe.ToString("#0.00")}元等费用)");//其他费用第二列
+                            TeableBookmarkArr.Add("fw", _EnterExitCosts.Service.ToString("#0.00") + "元/人");//服务费
+                            TeableBookmarkArr.Add("AllPrice", AllPrice.ToString("#0.00") + "元/人");//表格合计费用
+                            string airStr = client.AirType == 460 ? "经济舱" : client.AirType == 458 ? "公务舱" : "";
+                            TeableBookmarkArr.Add("title", $"费用清单-{airStr}({firstName})");
+                            foreach (var book in TeableBookmarkArr.Keys)
+                            {
+
+                                if (doc.Range.Bookmarks[book] != null)
+                                {
+                                    Bookmark mark = doc.Range.Bookmarks[book];
+                                    mark.Text = TeableBookmarkArr[book];
+                                }
+                            }
+                            if (i != ClientItemList.Count - 1)
+                            {
+                                builder.PageSetup.Orientation = Aspose.Words.Orientation.Portrait;
+                                Aspose.Words.Tables.Table table = (Aspose.Words.Tables.Table)doc.GetChild(NodeType.Table, 0, true);
+                                table.ParentNode.InsertAfter(paragraph, table);
+                                var CloneTable = (Aspose.Words.Tables.Table)table.Clone(true);
+                                table.ParentNode.InsertAfter(CloneTable, paragraph);
+                            }
+
+                            TeableBookmarkArr.Clear();
+                        }
+
+
+                        bookmarkArr.Add("VisitPrice", WordAllPrice.ToString());//出访费用总额
+                        bookmarkArr.Add("CnAllPrice", WordAllPrice.ConvertCNYUpper());//出访费用总额中文
+                        bookmarkArr.Add("namesPrice", UsersTop.TrimEnd('、'));//各人员出访费用  付辰同志出访费用为¥73,604.8元
 
 
+                        foreach (var book in bookmarkArr.Keys)
+                        {
+
+                            if (doc.Range.Bookmarks[book] != null)
+                            {
+                                Bookmark mark = doc.Range.Bookmarks[book];
+                                mark.Text = bookmarkArr[book];
+                            }
+                        }
+                        //MemoryStream outSteam = new MemoryStream();
+                        string filsPath = $"ForeignReceivables/File/{ClientItem.Key}.docx";
+                        doc.Save(AppSettingsHelper.Get("WordBasePath") + filsPath);
+                        filesToZip.Add(filsPath);
+                        //streams.Add(ClientItem.Key + ".docx", outSteam.ToArray());
+                    }
+
+                    //文件名
+                    string zipFileName = _DelegationInfo.TeamName + "-收款账单.zip";
+                    string zipPath =  $"ForeignReceivables/File/{_DelegationInfo.TeamName}-收款账单{DateTime.Now.ToString("yyyyMMddHHmmss")}.zip";
+                    try
+                    {
+                        using (var zip = ZipFile.Open(zipPath, ZipArchiveMode.Create))
+                        {
+                            foreach (var file in filesToZip)
+                            {
+                                zip.CreateEntryFromFile(file, Path.GetFileName(file));
+                            }
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        return Ok(JsonView(false, ex.Message));
+                    }
+
+                    string url = AppSettingsHelper.Get("WordBasePath") + $"{zipPath}";
+
+                    return Ok(JsonView(true, "成功", new { Url = url }));
+                }
+
+                return Ok(JsonView(false, "操作失败!"));
+            }
+            catch (Exception ex)
+            {
+                return Ok(JsonView(false, ex.Message));
+            }
+        }
+
+        private void SetCells(Aspose.Words.Tables.Table table, Document doc, int rows, int cells, string val)
+        {
+            //获取table中的某个单元格,从0开始
+            Aspose.Words.Tables.Cell lshCell = table.Rows[rows].Cells[cells];
+            //将单元格中的第一个段落移除
+            lshCell.FirstParagraph.Remove();
+            //新建一个段落
+            Paragraph p = new Paragraph(doc);
+            var r = new Run(doc, val);
+            r.Font.Size = 8;
+            //把设置的值赋给之前新建的段落
+            p.AppendChild(r);
+
+            //将此段落加到单元格内
+            lshCell.AppendChild(p);
+        }
         #endregion
         #endregion
 
 
         #region 已收款项
         #region 已收款项

+ 16 - 13
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -3582,7 +3582,6 @@ namespace OASystem.API.Controllers
                     return Ok(JsonView(false, "该团组未填写出入境费用;"));
                     return Ok(JsonView(false, "该团组未填写出入境费用;"));
                 }
                 }
 
 
-
                 //数据源
                 //数据源
                 List<Grp_DayAndCost> dac1 = _DayAndCosts.Where(it => it.Type == 1).ToList(); //住宿费
                 List<Grp_DayAndCost> dac1 = _DayAndCosts.Where(it => it.Type == 1).ToList(); //住宿费
                 List<Grp_DayAndCost> dac2 = _DayAndCosts.Where(it => it.Type == 2).ToList(); //伙食费
                 List<Grp_DayAndCost> dac2 = _DayAndCosts.Where(it => it.Type == 2).ToList(); //伙食费
@@ -3670,7 +3669,7 @@ namespace OASystem.API.Controllers
                             builder.Write("第" + dac1[i].Days.ToString() + "晚:");
                             builder.Write("第" + dac1[i].Days.ToString() + "晚:");
 
 
                             builder.MoveToCell(0, i + 1, 1, 0);
                             builder.MoveToCell(0, i + 1, 1, 0);
-                            builder.Write(dac1[i].Place);
+                            builder.Write(dac1[i].Place == null ? "" : dac1[i].Place);
 
 
                             builder.MoveToCell(0, i + 1, 2, 0);
                             builder.MoveToCell(0, i + 1, 2, 0);
                             builder.Write("费用标准:");
                             builder.Write("费用标准:");
@@ -3706,7 +3705,7 @@ namespace OASystem.API.Controllers
                             builder.Write("第" + dac2[i].Days.ToString() + "天:");
                             builder.Write("第" + dac2[i].Days.ToString() + "天:");
 
 
                             builder.MoveToCell(1, i + 1, 1, 0);
                             builder.MoveToCell(1, i + 1, 1, 0);
-                            builder.Write(dac2[i].Place);
+                            builder.Write(dac2[i].Place == null ? "" : dac1[i].Place);
 
 
                             builder.MoveToCell(1, i + 1, 2, 0);
                             builder.MoveToCell(1, i + 1, 2, 0);
                             builder.Write("费用标准:");
                             builder.Write("费用标准:");
@@ -3742,7 +3741,7 @@ namespace OASystem.API.Controllers
                             builder.Write("第" + dac3[i].Days.ToString() + "天:");
                             builder.Write("第" + dac3[i].Days.ToString() + "天:");
 
 
                             builder.MoveToCell(2, i + 1, 1, 0);
                             builder.MoveToCell(2, i + 1, 1, 0);
-                            builder.Write(dac3[i].Place);
+                            builder.Write(dac3[i].Place == null ? "" : dac1[i].Place);
 
 
                             builder.MoveToCell(2, i + 1, 2, 0);
                             builder.MoveToCell(2, i + 1, 2, 0);
                             builder.Write("费用标准:");
                             builder.Write("费用标准:");
@@ -3861,7 +3860,7 @@ namespace OASystem.API.Controllers
                             //builder.MoveToCell(0, accommodationStartIndex, 0, 0);
                             //builder.MoveToCell(0, accommodationStartIndex, 0, 0);
                             //builder.Write(DeleClientList[i].LastName + DeleClientList[i].Name); 
                             //builder.Write(DeleClientList[i].LastName + DeleClientList[i].Name); 
                             builder.MoveToCell(0, accommodationStartIndex, 1, 0);
                             builder.MoveToCell(0, accommodationStartIndex, 1, 0);
-                            builder.Write(dac.Place);//城市
+                            builder.Write(dac.Place == null ? "" : dac.Place);//城市
                             builder.MoveToCell(0, accommodationStartIndex, 2, 0);
                             builder.MoveToCell(0, accommodationStartIndex, 2, 0);
 
 
                             string currency = _CurrDatas.Find(it => it.Id == dac.Currency).Name;
                             string currency = _CurrDatas.Find(it => it.Id == dac.Currency).Name;
@@ -3883,12 +3882,12 @@ namespace OASystem.API.Controllers
                             builder.MoveToCell(0, accommodationStartIndex, 8, 0);
                             builder.MoveToCell(0, accommodationStartIndex, 8, 0);
 
 
                             decimal rbmPrice = rate * dac.SubTotal;
                             decimal rbmPrice = rate * dac.SubTotal;
-                            builder.Write(rbmPrice.ToString());//折合人民币
+                            builder.Write(rbmPrice.ToString("#0.00"));//折合人民币
                             accommodationStartIndex++;
                             accommodationStartIndex++;
                             dac1totalPrice += rbmPrice;
                             dac1totalPrice += rbmPrice;
                         }
                         }
 
 
-                        dic.Add("dac1totalPrice", dac1totalPrice.ToString());
+                        dic.Add("dac1totalPrice", dac1totalPrice.ToString("#0.00"));
 
 
                         for (int i = 21; i > (dac1.Count == 0 ? 1 : dac1.Count) + 6; i--)
                         for (int i = 21; i > (dac1.Count == 0 ? 1 : dac1.Count) + 6; i--)
                         {
                         {
@@ -3915,7 +3914,7 @@ namespace OASystem.API.Controllers
                             }
                             }
 
 
                             builder.MoveToCell(0, foodandotherStartIndex, 1, 0);
                             builder.MoveToCell(0, foodandotherStartIndex, 1, 0);
-                            builder.Write(dac.Place);//城市
+                            builder.Write(dac.Place == null ? "" : dac.Place);//城市
                             builder.MoveToCell(0, foodandotherStartIndex, 2, 0);
                             builder.MoveToCell(0, foodandotherStartIndex, 2, 0);
                             string currency = _CurrDatas.Find(it => it.Id == dac.Currency).Name;
                             string currency = _CurrDatas.Find(it => it.Id == dac.Currency).Name;
                             builder.Write(currency);//币种
                             builder.Write(currency);//币种
@@ -4007,7 +4006,6 @@ namespace OASystem.API.Controllers
                             dic.Add("ReturnCode", "未录入行程!");
                             dic.Add("ReturnCode", "未录入行程!");
                         }
                         }
 
 
-                        dic.Add("ReturnCodeAir", dic["ReturnCode"]);
                         dic.Add("ReturnCodeAir", dic["ReturnCode"]);
                         dic.Add("ReturnCodeAir", dic["ReturnCode"]);
                         dic.Add("VisitStartDate", _DelegationInfo.VisitStartDate.ToString("yyyy年MM月dd日"));
                         dic.Add("VisitStartDate", _DelegationInfo.VisitStartDate.ToString("yyyy年MM月dd日"));
                         dic.Add("VisitEndDate", _DelegationInfo.VisitEndDate.ToString("yyyy年MM月dd日"));
                         dic.Add("VisitEndDate", _DelegationInfo.VisitEndDate.ToString("yyyy年MM月dd日"));
@@ -4191,7 +4189,7 @@ namespace OASystem.API.Controllers
                     if (dto.SubTypeId == 1008) //1008(派员单位出(境)任务和预算审批意见表)
                     if (dto.SubTypeId == 1008) //1008(派员单位出(境)任务和预算审批意见表)
                     {
                     {
                         //获取模板
                         //获取模板
-                        string tempPath = (AppSettingsHelper.Get("WordBasePath") + "EnterExitCost/Temp/派员单位出(境)任务和预算审批意见表.xls");
+                        string tempPath = (AppSettingsHelper.Get("WordBasePath") + "EnterExitCost/Temp/派员单位出(境)任务和预算审批意见表.docx");
                         //载入模板
                         //载入模板
                         Document doc = new Document(tempPath);
                         Document doc = new Document(tempPath);
                         DocumentBuilder builder = new DocumentBuilder(doc);
                         DocumentBuilder builder = new DocumentBuilder(doc);
@@ -4247,7 +4245,7 @@ namespace OASystem.API.Controllers
                     else if (dto.SubTypeId == 1009)//1009(省级单位出(境)经费报销单)
                     else if (dto.SubTypeId == 1009)//1009(省级单位出(境)经费报销单)
                     {
                     {
                         //获取模板
                         //获取模板
-                        string tempPath = (AppSettingsHelper.Get("WordBasePath") + "EnterExitCost/Temp/省级单位出(境)经费报销单.xls");
+                        string tempPath = (AppSettingsHelper.Get("WordBasePath") + "EnterExitCost/Temp/省级单位出(境)经费报销单.docx");
                         //载入模板
                         //载入模板
                         Document doc = new Document(tempPath);
                         Document doc = new Document(tempPath);
                         DocumentBuilder builder = new DocumentBuilder(doc);
                         DocumentBuilder builder = new DocumentBuilder(doc);
@@ -4275,7 +4273,7 @@ namespace OASystem.API.Controllers
                             //builder.MoveToCell(0, accommodationStartIndex, 0, 0);
                             //builder.MoveToCell(0, accommodationStartIndex, 0, 0);
                             //builder.Write(DeleClientList[i].LastName + DeleClientList[i].Name); 
                             //builder.Write(DeleClientList[i].LastName + DeleClientList[i].Name); 
                             builder.MoveToCell(0, accommodationStartIndex, 1, 0);
                             builder.MoveToCell(0, accommodationStartIndex, 1, 0);
-                            builder.Write(dac.Place);//城市
+                            builder.Write(dac.Place == null ? "" : dac.Place);//城市
                             builder.MoveToCell(0, accommodationStartIndex, 2, 0);
                             builder.MoveToCell(0, accommodationStartIndex, 2, 0);
 
 
                             string currency = _CurrDatas.Find(it => it.Id == dac.Currency).Name;
                             string currency = _CurrDatas.Find(it => it.Id == dac.Currency).Name;
@@ -4320,7 +4318,7 @@ namespace OASystem.API.Controllers
                             }
                             }
 
 
                             builder.MoveToCell(0, foodandotherStartIndex, 1, 0);
                             builder.MoveToCell(0, foodandotherStartIndex, 1, 0);
-                            builder.Write(dac.Place);//城市
+                            builder.Write(dac.Place == null ? "" : dac.Place);//城市
                             builder.MoveToCell(0, foodandotherStartIndex, 2, 0);
                             builder.MoveToCell(0, foodandotherStartIndex, 2, 0);
 
 
                             string currency = _CurrDatas.Find(it => it.Id == dac.Currency).Name;
                             string currency = _CurrDatas.Find(it => it.Id == dac.Currency).Name;
@@ -4369,6 +4367,11 @@ namespace OASystem.API.Controllers
                 {
                 {
                     if (dto.SubTypeId == 1) //团组成员名单
                     if (dto.SubTypeId == 1) //团组成员名单
                     {
                     {
+                        if (DeleClientList.Count < 1)
+                        {
+                            return Ok(JsonView(false, "团组成员暂未录入!!!"));
+                        }
+
                         //获取模板
                         //获取模板
                         string tempPath = (AppSettingsHelper.Get("WordBasePath") + "EnterExitCost/Temp/dwon_团组人员列表模板.doc");
                         string tempPath = (AppSettingsHelper.Get("WordBasePath") + "EnterExitCost/Temp/dwon_团组人员列表模板.doc");
                         //载入模板
                         //载入模板

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

@@ -1,6 +1,7 @@
 
 
 using Microsoft.AspNetCore.SignalR;
 using Microsoft.AspNetCore.SignalR;
 using Microsoft.International.Converters.PinYinConverter;
 using Microsoft.International.Converters.PinYinConverter;
+using NPOI.HSSF.Util;
 using OASystem.API.OAMethodLib.Hub.HubClients;
 using OASystem.API.OAMethodLib.Hub.HubClients;
 using OASystem.API.OAMethodLib.Hub.Hubs;
 using OASystem.API.OAMethodLib.Hub.Hubs;
 using OASystem.API.OAMethodLib.JuHeAPI;
 using OASystem.API.OAMethodLib.JuHeAPI;
@@ -14,7 +15,9 @@ using OASystem.Domain.ViewModels.JuHeExchangeRate;
 using OASystem.Infrastructure.Repositories.CRM;
 using OASystem.Infrastructure.Repositories.CRM;
 using OASystem.Infrastructure.Repositories.Groups;
 using OASystem.Infrastructure.Repositories.Groups;
 using System.IdentityModel.Tokens.Jwt;
 using System.IdentityModel.Tokens.Jwt;
+using System.IO.Compression;
 using System.Security.Claims;
 using System.Security.Claims;
+using System.Web;
 
 
 namespace OASystem.API.OAMethodLib
 namespace OASystem.API.OAMethodLib
 {
 {
@@ -913,5 +916,281 @@ namespace OASystem.API.OAMethodLib
         }
         }
 
 
         #endregion
         #endregion
+
+        #region 金额转大写
+        /// <summary>
+        /// 金额转换为大写数字
+        /// <para>1、支持的最大数字:999999999999.99(玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖元玖角玖分)</para>
+        /// <para>2、小数点后最多支持两位</para>
+        /// </summary>
+        /// <param name="num">数值</param>
+        /// <returns></returns>
+        public static string ConvertCNYUpper(this decimal num)
+        {
+            if (num == 0)
+            {
+                return "零元";
+            }
+            // 解决327000000转换后缺少单位万的问题
+            return ConvertToChinese(num);
+        }
+
+        #region 实例
+        /// <summary>
+        /// 要转换的数字
+        /// </summary>
+        private static decimal j;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        private static string[] NumChineseCharacter = new string[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
+
+        /// <summary>
+        /// 判断输入的数字是否大于double类型
+        /// </summary>
+        private static bool IsNumber
+        {
+            get
+            {
+                if (j > decimal.MaxValue || j <= 0)
+                    return false;
+                else
+                    return true;
+            }
+        }
+
+        /// <summary>
+        /// 数字转换成大写汉字主函数
+        /// </summary>
+        /// <returns>返回转换后的大写汉字</returns>
+        public static string ConvertToChinese(decimal m)
+        {
+            j = m;
+            string bb = "";
+            if (IsNumber)
+            {
+                string str = j.ToString();
+                string[] Num = str.Split('.');
+                if (Num.Length == 1)
+                {
+                    bb = NumberString(Num[0]) + "元整";
+                    bb = bb.Replace("零零", "零");
+                }
+                else
+                {
+                    bb = NumberString(Num[0]) + "元";
+                    bb += FloatString(Num[1]);
+                    bb = bb.Replace("零零", "零");
+                }
+            }
+            else
+            {
+                throw new FormatException("你输入的数字格式不正确或不是数字!");
+            }
+            return bb;
+        }
+        /// <summary>
+        /// 小数位转换只支持两位的小数
+        /// </summary>
+        /// <param name="Num">转换的小数</param>
+        /// <returns>小数转换成汉字</returns>
+        private static string FloatString(string Num)
+        {
+            string cc = "";
+            if (Num.Length > 2)
+            {
+                throw new FormatException("小数位数过多.");
+            }
+            else
+            {
+                string bb = ConvertString(Num);
+                int len = bb.IndexOf("零");
+                if (len != 0)
+                {
+                    bb = bb.Replace("零", "");
+                    if (bb.Length == 1)
+                    {
+                        cc = bb.Substring(0, 1) + "角";
+                    }
+                    else
+                    {
+                        cc = bb.Substring(0, 1) + "角";
+                        cc += bb.Substring(1, 1) + "分";
+                    }
+                }
+                else
+                    cc = bb + "分";
+            }
+            return cc;
+        }
+        /// <summary>
+        /// 判断数字位数以进行拆分转换
+        /// </summary>
+        /// <param name="Num">要进行拆分的数字</param>
+        /// <returns>转换成的汉字</returns>
+        private static string NumberString(string Num)
+        {
+            string bb = "";
+            if (Num.Length <= 4)
+            {
+                bb = Convert4(Num);
+            }
+            else if (Num.Length > 4 && Num.Length <= 8)
+            {
+                bb = Convert4(Num.Substring(0, Num.Length - 4)) + "万";
+                bb += Convert4(Num.Substring(Num.Length - 4, 4));
+            }
+            else if (Num.Length > 8 && Num.Length <= 12)
+            {
+                bb = Convert4(Num.Substring(0, Num.Length - 8)) + "亿";
+                if (Convert4(Num.Substring(Num.Length - 8, 4)) == "")
+                    if (Convert4(Num.Substring(Num.Length - 4, 4)) != "")
+                        bb += "零";
+                    else
+                        bb += "";
+                else
+                    bb += Convert4(Num.Substring(Num.Length - 8, 4)) + "万";
+                bb += Convert4(Num.Substring(Num.Length - 4, 4));
+            }
+            else
+            {
+                throw new Exception("整数部分最多支持12位");
+            }
+            return bb;
+        }
+        /// <summary>
+        /// 四位数字的转换
+        /// </summary>
+        /// <param name="Num">准备转换的四位数字</param>
+        /// <returns>转换以后的汉字</returns>
+        private static string Convert4(string Num)
+        {
+            string bb = "";
+            if (Num.Length == 1)
+            {
+                bb = ConvertString(Num);
+            }
+            else if (Num.Length == 2)
+            {
+                bb = ConvertString(Num);
+                bb = Convert2(bb);
+            }
+            else if (Num.Length == 3)
+            {
+                bb = ConvertString(Num);
+                bb = Convert3(bb);
+            }
+            else
+            {
+                bb = ConvertString(Num);
+                string cc = "";
+                string len = bb.Substring(0, 4);
+                if (len != "零零零零")
+                {
+                    len = bb.Substring(0, 3);
+                    if (len != "零零零")
+                    {
+                        bb = bb.Replace("零零零", "");
+                        if (bb.Length == 1)
+                        {
+                            bb = bb.Substring(0, 1) + "仟";
+                        }
+                        else
+                        {
+                            if (bb.Substring(0, 1) != "零" && bb.Substring(0, 2) != "零")
+                                cc = bb.Substring(0, 1) + "仟";
+                            else
+                                cc = bb.Substring(0, 1);
+                            bb = cc + Convert3(bb.Substring(1, 3));
+                        }
+                    }
+                    else
+                    {
+                        bb = bb.Replace("零零零", "零");
+                    }
+                }
+                else
+                {
+                    bb = bb.Replace("零零零零", "");
+                }
+            }
+            return bb;
+        }
+        /// <summary>
+        /// 将数字转换成汉字
+        /// </summary>
+        /// <param name="Num">需要转换的数字</param>
+        /// <returns>转换后的汉字</returns>
+        private static string ConvertString(string Num)
+        {
+            string bb = "";
+            for (int i = 0; i < Num.Length; i++)
+            {
+                bb += NumChineseCharacter[int.Parse(Num.Substring(i, 1))];
+            }
+            return bb;
+        }
+        /// <summary>
+        /// 两位数字的转换
+        /// </summary>
+        /// <param name="Num">两位数字</param>
+        /// <returns>转换后的汉字</returns>
+        private static string Convert2(string Num)
+        {
+            string bb = ""; string cc = "";
+            string len = Num.Substring(0, 1);
+            if (len != "零")
+            {
+                bb = Num.Replace("零", "");
+                if (bb.Length == 1)
+                {
+                    cc = bb.Substring(0, 1) + "拾";
+                }
+                else
+                {
+                    cc = bb.Substring(0, 1) + "拾";
+                    cc += bb.Substring(1, 1);
+                }
+            }
+            else
+                cc = Num;
+            return cc;
+        }
+        /// <summary>
+        /// 三位数字的转换
+        /// </summary>
+        /// <param name="Num">三位数字</param>
+        /// <returns>转换后的汉字</returns>
+        private static string Convert3(string Num)
+        {
+            string bb = ""; string cc = "";
+            string len = Num.Substring(0, 2);
+            if (len != "零零")
+            {
+                bb = Num.Replace("零零", "");
+                if (bb.Length == 1)
+                {
+                    bb = bb.Substring(0, 1) + "佰";
+                }
+                else
+                {
+                    if (bb.Substring(0, 1) != "零")
+                        cc = bb.Substring(0, 1) + "佰";
+                    else
+                        cc = bb.Substring(0, 1);
+                    bb = cc + Convert2(bb.Substring(1, 2));
+                }
+            }
+            else
+            {
+                bb = Num.Replace("零零", "零");
+            }
+            return bb;
+        }
+        #endregion
+
+        #endregion
+
     }
     }
 }
 }

+ 16 - 0
OASystem/OASystem.Domain/Dtos/Financial/ForForeignReceivablesNewDto.cs

@@ -118,4 +118,20 @@ namespace OASystem.Domain.Dtos.Financial
         public int Id { get; set; }
         public int Id { get; set; }
 
 
     }
     }
+
+    /// <summary>
+    /// 文件下载 Dto
+    /// </summary>
+    public class ForeignReceivablesFeilDownloadDto
+    {
+        public int DiId { get; set; }
+
+        /// <summary>
+        /// 文件类型
+        /// 1 生成收款单(四川)
+        /// 2 生成收款单(北京)
+        /// 3 汇款账单
+        /// </summary>
+        public int FileType { get; set; }
+    }
 }
 }