|  | @@ -67,6 +67,7 @@ using OASystem.API.OAMethodLib.YouDaoAPI;
 | 
	
		
			
				|  |  |  using NPOI.XSSF.Streaming.Values;
 | 
	
		
			
				|  |  |  using OASystem.API.OAMethodLib.Quartz.Business;
 | 
	
		
			
				|  |  |  using System.Linq;
 | 
	
		
			
				|  |  | +using NPOI.POIFS.NIO;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace OASystem.API.Controllers
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -9004,10 +9005,12 @@ namespace OASystem.API.Controllers
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// 生成VOUCHER
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  | -        /// <param name=""></param>
 | 
	
		
			
				|  |  | +        /// <param name="dto"></param>
 | 
	
		
			
				|  |  |          /// <returns></returns>
 | 
	
		
			
				|  |  |          [HttpPost]
 | 
	
		
			
				|  |  |          [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
 | 
	
	
		
			
				|  | @@ -9201,6 +9204,7 @@ namespace OASystem.API.Controllers
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +       
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// 导出确认单
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
	
		
			
				|  | @@ -9638,12 +9642,13 @@ namespace OASystem.API.Controllers
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// 酒店预订
 | 
	
		
			
				|  |  |          /// 生成VOUCHER
 | 
	
		
			
				|  |  | +        /// 2024.05.06 之前版本
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          /// <param name="_dto"></param>
 | 
	
		
			
				|  |  |          /// <returns></returns>
 | 
	
		
			
				|  |  |          [HttpPost]
 | 
	
		
			
				|  |  |          [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
 | 
	
		
			
				|  |  | -        public async Task<IActionResult> PostHotelReservationsCreateVoucher(HotelReservationsCreateVoucherDto _dto)
 | 
	
		
			
				|  |  | +        public async Task<IActionResult> PostHotelReservationsCreateVoucher1(HotelReservationsCreateVoucherDto _dto)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              try
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -9903,6 +9908,170 @@ namespace OASystem.API.Controllers
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// 酒店预订
 | 
	
		
			
				|  |  | +        /// 生成VOUCHER
 | 
	
		
			
				|  |  | +        /// 2024.05.06 之后版本
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        /// <param name="_dto"></param>
 | 
	
		
			
				|  |  | +        /// <returns></returns>
 | 
	
		
			
				|  |  | +        [HttpPost]
 | 
	
		
			
				|  |  | +        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
 | 
	
		
			
				|  |  | +        public async Task<IActionResult> PostHotelReservationsCreateVoucher(HotelReservationsCreateVoucherDto _dto)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +                #region  参数验证
 | 
	
		
			
				|  |  | +                if (_dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
 | 
	
		
			
				|  |  | +                if (_dto.PageId < 1) _dto.PageId = 28; //酒店预定Id
 | 
	
		
			
				|  |  | +                if (_dto.DiId < 1) return Ok(JsonView(false, "团组Id为空"));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                #region 团组操作权限验证 76 酒店预定模块
 | 
	
		
			
				|  |  | +                var groupAuthView = await GeneralMethod.PostGroupOperationAuth(_dto.DiId, _dto.UserId, 76);
 | 
	
		
			
				|  |  | +                if (groupAuthView.Code != 0) return Ok(JsonView(false, groupAuthView.Msg));
 | 
	
		
			
				|  |  | +                #endregion
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                #region 页面操作权限验证
 | 
	
		
			
				|  |  | +                pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if (pageFunAuthView.FilesDownloadAuth == 0) return Ok(JsonView(false, "您没有文件下载权限!"));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            #endregion
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            #endregion
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            List<Grp_HotelReservations> hrDtas = await _sqlSugar.Queryable<Grp_HotelReservations>().Where(it => it.IsDel == 0 && it.DiId == _dto.DiId).ToListAsync();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //判断数据是否完整
 | 
	
		
			
				|  |  | +            if (hrDtas.Count < 1) return Ok(JsonView(false, "请先录入酒店预订信息!"));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            hrDtas = hrDtas.OrderBy(it => it.CheckInDate).ToList();
 | 
	
		
			
				|  |  | +            string strFileName = "HotelStatement/";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            string guestNames = ""; //格式Mr.xxx Ms.xxx
 | 
	
		
			
				|  |  | +            List<HotelVoucherInfoView> vouchers = new List<HotelVoucherInfoView>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            #region 数据处理
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            List<int> guestIds = new List<int>();
 | 
	
		
			
				|  |  | +            int index = 0; 
 | 
	
		
			
				|  |  | +            foreach (var item in hrDtas)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                if (item.GuestName.Contains(","))
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    string[] guestIdArr = item.GuestName.Split(',');
 | 
	
		
			
				|  |  | +                    foreach (var guestIdStr in guestIdArr)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        bool guestBool = int.TryParse(guestIdStr,out int guestId);
 | 
	
		
			
				|  |  | +                        if (guestBool)
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            guestIds.Add(guestId);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                else guestNames += item.GuestName;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                var voucherInfo = new HotelVoucherInfoView()
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    HotelName = item.HotelName,
 | 
	
		
			
				|  |  | +                    CheckInDate = item.CheckInDate,
 | 
	
		
			
				|  |  | +                    CheckOutDate = item.CheckOutDate,
 | 
	
		
			
				|  |  | +                    ConfirmationNumber = item.DetermineNo.Trim(),
 | 
	
		
			
				|  |  | +                    RoomType = item.RoomExplanation
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +                vouchers.Add(voucherInfo);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (guestIds.Count > 0)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                guestIds = guestIds.Distinct().ToList();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                var guestDatas = await _sqlSugar.Queryable<Crm_DeleClient>().Where(it => it.IsDel == 0 && guestIds.Contains(it.Id)).ToListAsync();
 | 
	
		
			
				|  |  | +                if (guestDatas.Count > 0 )
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    guestNames = "";
 | 
	
		
			
				|  |  | +                    foreach ( var guest in guestDatas ) 
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        string guestName = "";
 | 
	
		
			
				|  |  | +                        if (guest.Sex == 0) guestName += @"MR.";
 | 
	
		
			
				|  |  | +                        else if (guest.Sex == 1) guestName += @"MS.";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        if (guest.Pinyin == null) guestName += $"{string.Join("", guest.LastName.GetTotalPingYin()).ToUpper()}/{string.Join("", guest.FirstName.GetTotalPingYin()).ToUpper()}";
 | 
	
		
			
				|  |  | +                        else guestName += @$"{guest.Pinyin.Replace(" ","")}";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        guestNames += @$"{guestName.Trim()}、";
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    if (guestNames.Length > 0 )
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        guestNames = guestNames.Substring(0, guestNames.Length - 1);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            #endregion
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //载入模板
 | 
	
		
			
				|  |  | +            string sss = AppSettingsHelper.Get("WordBasePath") + "Template/Voucher-2024Versions.docx";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Document doc = new Document(sss);
 | 
	
		
			
				|  |  | +            DocumentBuilder builder = new DocumentBuilder(doc);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (doc.Range.Bookmarks["GuestName"] != null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Bookmark mark = doc.Range.Bookmarks["GuestName"];
 | 
	
		
			
				|  |  | +                mark.Text = guestNames;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            NodeCollection allTables = doc.GetChildNodes(NodeType.Table, true);
 | 
	
		
			
				|  |  | +            Aspose.Words.Tables.Table table = allTables[0] as Aspose.Words.Tables.Table;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            vouchers = vouchers.OrderBy(it => it.CheckInDate).ToList();
 | 
	
		
			
				|  |  | +            for (int i = 1; i <= vouchers.Count; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                HotelVoucherInfoView hviv = vouchers[i-1];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                builder.MoveToCell(0, i, 0, 0);
 | 
	
		
			
				|  |  | +                builder.Write(hviv.HotelName);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                builder.MoveToCell(0, i, 1, 0);
 | 
	
		
			
				|  |  | +                builder.Write(hviv.CheckInDate);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                builder.MoveToCell(0, i, 2, 0);
 | 
	
		
			
				|  |  | +                builder.Write(hviv.CheckOutDate);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                builder.MoveToCell(0, i, 3, 0);
 | 
	
		
			
				|  |  | +                builder.Write(hviv.RoomType);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                builder.MoveToCell(0, i, 4, 0);
 | 
	
		
			
				|  |  | +                builder.Write(hviv.ConfirmationNumber);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //删除多余行
 | 
	
		
			
				|  |  | +            int currRowIndex = vouchers.Count+1;
 | 
	
		
			
				|  |  | +            int delRows = 21 - currRowIndex;
 | 
	
		
			
				|  |  | +            if (delRows > 0)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                for (int i = 0; i < delRows; i++)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    table.Rows.RemoveAt(currRowIndex);
 | 
	
		
			
				|  |  | +                    //cultivateRowIndex++;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            strFileName += "VOUCHER.docx";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var fileDir = AppSettingsHelper.Get("WordBasePath") + strFileName;
 | 
	
		
			
				|  |  | +            doc.Save(fileDir);
 | 
	
		
			
				|  |  | +            string Url = AppSettingsHelper.Get("WordBaseUrl") + "Office/Word/" + strFileName;
 | 
	
		
			
				|  |  | +            return Ok(JsonView(true, "操作成功!", Url));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// 酒店预订
 | 
	
		
			
				|  |  |          /// 确认单
 | 
	
	
		
			
				|  | @@ -11127,7 +11296,7 @@ namespace OASystem.API.Controllers
 | 
	
		
			
				|  |  |          [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
 | 
	
		
			
				|  |  |          public async Task<IActionResult> PostVisaFeeAddAndUpdate(VisaFeeAddAndUpdateDto _dto)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            var _view = await _visaFeeInfoRep._AddAndUpdate(_dto);
 | 
	
		
			
				|  |  | +            var _view = await _visaFeeInfoRep._Update(_dto);
 | 
	
		
			
				|  |  |              if (_view.Code != 0)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  return Ok(JsonView(false, _view.Msg));
 |