GroupsController.cs 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  1. using Aspose.Cells;
  2. using Aspose.Words;
  3. using Aspose.Words.Tables;
  4. using Microsoft.AspNetCore.Mvc;
  5. using NetTaste;
  6. using Newtonsoft.Json.Serialization;
  7. using NPOI.OpenXmlFormats.Spreadsheet;
  8. using NPOI.SS.Formula.Functions;
  9. using OASystem.API.OAMethodLib;
  10. using OASystem.Domain.Dtos.Groups;
  11. using OASystem.Domain.Entities.Business;
  12. using OASystem.Domain.Entities.Groups;
  13. using OASystem.Domain.ViewModels.Groups;
  14. using OASystem.Infrastructure.Repositories.Groups;
  15. using OASystem.Infrastructure.Tools;
  16. using System.Web;
  17. using static OpenAI.GPT3.ObjectModels.SharedModels.IOpenAiModels;
  18. namespace OASystem.API.Controllers
  19. {
  20. /// <summary>
  21. /// 团组相关
  22. /// </summary>
  23. //[Authorize]
  24. [Route("api/[controller]/[action]")]
  25. public class GroupsController : ControllerBase
  26. {
  27. private readonly GrpScheduleRepository _grpScheduleRep;
  28. private readonly IMapper _mapper;
  29. private readonly DelegationInfoRepository _groupRepository;
  30. private readonly TaskAssignmentRepository _taskAssignmentRep;
  31. private readonly AirTicketResRepository _airTicketResRep;
  32. private readonly SqlSugarClient _sqlSugar;
  33. private string url;
  34. private string path;
  35. public GroupsController(IMapper mapper,SqlSugarClient sqlSugar, GrpScheduleRepository grpScheduleRep, DelegationInfoRepository groupRepository, TaskAssignmentRepository taskAssignmentRep, AirTicketResRepository airTicketResRep)
  36. {
  37. _mapper = mapper;
  38. _grpScheduleRep = grpScheduleRep;
  39. _groupRepository = groupRepository;
  40. _taskAssignmentRep = taskAssignmentRep;
  41. _airTicketResRep = airTicketResRep;
  42. _sqlSugar = sqlSugar;
  43. url = AppSettingsHelper.Get("ExcelBaseUrl");
  44. path = AppSettingsHelper.Get("ExcelBasePath");
  45. if (!System.IO.Directory.Exists(path))
  46. {
  47. System.IO.Directory.CreateDirectory(path);//不存在就创建文件夹
  48. }
  49. }
  50. #region 流程管控
  51. /// <summary>
  52. /// 获取团组流程管控信息
  53. /// </summary>
  54. /// <param name="paras">参数Json字符串</param>
  55. /// <returns></returns>
  56. [HttpPost]
  57. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  58. public async Task<IActionResult> PostSearchGrpSchedule(JsonDtoBase _jsonDto)
  59. {
  60. if (string.IsNullOrEmpty(_jsonDto.Paras))
  61. {
  62. return Ok(JsonView(false, "参数为空"));
  63. }
  64. Grp_ScheduleDto _ScheduleDto = JsonConvert.DeserializeObject<Grp_ScheduleDto>(_jsonDto.Paras);
  65. if (_ScheduleDto != null)
  66. {
  67. if (_ScheduleDto.SearchType == 2)//获取列表
  68. {
  69. List<Grp_ScheduleView> _grpScheduleViewList = await _grpScheduleRep.GetViewList_GrpSchedule(_ScheduleDto);
  70. return Ok(JsonView(_grpScheduleViewList));
  71. }
  72. else//获取对象
  73. {
  74. Grp_ScheduleCombinView _grpScheduleView = await _grpScheduleRep.GetView_GrpSchedule(_ScheduleDto);
  75. if (_grpScheduleView != null)
  76. {
  77. return Ok(JsonView(_grpScheduleView));
  78. }
  79. }
  80. }
  81. else
  82. {
  83. return Ok(JsonView(false, "参数反序列化失败"));
  84. }
  85. return Ok(JsonView(false, "暂无数据!"));
  86. }
  87. /// <summary>
  88. /// 修改团组流程管控详细表数据
  89. /// </summary>
  90. /// <param name="paras"></param>
  91. /// <returns></returns>
  92. [HttpPost]
  93. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  94. public async Task<IActionResult> PostUpdateGrpScheduleDetail(Grp_ScheduleDetailUpdDto dto)
  95. {
  96. Grp_ScheduleDetailInfo _detail = _mapper.Map<Grp_ScheduleDetailInfo>(dto);
  97. var result = await _grpScheduleRep._sqlSugar.Updateable<Grp_ScheduleDetailInfo>()
  98. .SetColumns(it => it.Duty == _detail.Duty)
  99. .SetColumns(it => it.ExpectBeginDt == _detail.ExpectBeginDt)
  100. .SetColumns(it => it.ExpectEndDt == _detail.ExpectEndDt)
  101. .SetColumns(it => it.JobContent == _detail.JobContent)
  102. .SetColumns(it => it.Remark == _detail.Remark)
  103. .SetColumns(it => it.StepStatus == _detail.StepStatus)
  104. .Where(s => s.Id == dto.Id)
  105. //.UpdateColumns(s => new { s.Duty, s.ExpectBeginDt, s.ExpectEndDt, s.JobContent, s.Remark, s.StepStatus })
  106. .ExecuteCommandAsync();
  107. if (result > 0)
  108. {
  109. return Ok(JsonView(true, "保存成功!"));
  110. }
  111. return Ok(JsonView(false, "保存失败!"));
  112. }
  113. /// <summary>
  114. /// 删除团组流程管控详细表数据,删除人Id请放在Duty
  115. /// </summary>
  116. /// <param name="dto"></param>
  117. /// <returns></returns>
  118. [HttpPost]
  119. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  120. public async Task<ActionResult> PostDeleteGrpScheduleDetail(Grp_ScheduleDetailUpdDto dto)
  121. {
  122. Grp_ScheduleDetailInfo _detail = _mapper.Map<Grp_ScheduleDetailInfo>(dto);
  123. _detail.IsDel = 1;
  124. _detail.DeleteUserId = dto.Duty;
  125. _detail.DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  126. var result = await _grpScheduleRep._sqlSugar.Updateable<Grp_ScheduleDetailInfo>()
  127. .SetColumns(it => it.IsDel == _detail.IsDel)
  128. .SetColumns(it => it.DeleteUserId == _detail.DeleteUserId)
  129. .SetColumns(it => it.DeleteTime == _detail.DeleteTime)
  130. .Where(it => it.Id == dto.Id)
  131. //.UpdateColumns(s => new { s.IsDel, s.DeleteUserId, s.DeleteTime })
  132. //.WhereColumns(s => s.Id == dto.Id)
  133. .ExecuteCommandAsync();
  134. if (result > 0)
  135. {
  136. return Ok(JsonView(true, "删除成功!"));
  137. }
  138. return Ok(JsonView(false, "删除失败!"));
  139. }
  140. /// <summary>
  141. /// 增加团组流程管控详细表数据
  142. /// </summary>
  143. /// <param name="dto"></param>
  144. /// <returns></returns>
  145. [HttpPost]
  146. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  147. public async Task<ActionResult> PostInsertGrpScheduleDetail(Grp_ScheduleDetailInsertDto dto)
  148. {
  149. Grp_ScheduleDetailInfo _detail = _mapper.Map<Grp_ScheduleDetailInfo>(dto);
  150. if (DateTime.Now < _detail.ExpectBeginDt)
  151. {
  152. _detail.StepStatus = 0;
  153. }
  154. else
  155. {//若大于设置时间,不考虑设置的预计结束日期,统一视为进行中
  156. _detail.StepStatus = 1;
  157. }
  158. var result = await _grpScheduleRep._sqlSugar.Insertable(_detail).ExecuteReturnIdentityAsync();
  159. if (result > 0)
  160. {
  161. Grp_ScheduleDetailView _result = await _grpScheduleRep.GetInsertBackData(result);
  162. return Ok(JsonView(true, "添加成功!", _result));
  163. }
  164. return Ok(JsonView(false, "添加失败!"));
  165. }
  166. #endregion
  167. #region 团组基本信息
  168. /// <summary>
  169. /// 接团信息列表
  170. /// </summary>
  171. /// <param name="dto">团组列表请求dto</param>
  172. /// <returns></returns>
  173. [HttpPost]
  174. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  175. public async Task<IActionResult> GetGroupList(GroupListDto dto)
  176. {
  177. var groupData = await _groupRepository.GetGroupList(dto);
  178. if (groupData.Code != 0)
  179. {
  180. return Ok(JsonView(false, groupData.Msg));
  181. }
  182. return Ok(JsonView(groupData.Data));
  183. }
  184. /// <summary>
  185. /// 接团信息详情
  186. /// </summary>
  187. /// <param name="dto">团组info请求dto</param>
  188. /// <returns></returns>
  189. [HttpPost]
  190. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  191. public async Task<IActionResult> GetGroupInfo(GroupInfoDto dto)
  192. {
  193. var groupData = await _groupRepository.GetGroupInfo(dto);
  194. if (groupData.Code != 0)
  195. {
  196. return Ok(JsonView(false, groupData.Msg));
  197. }
  198. return Ok(JsonView(groupData.Data));
  199. }
  200. /// <summary>
  201. /// 接团信息 编辑添加
  202. /// 基础信息数据源
  203. /// </summary>
  204. /// <param name="dto"></param>
  205. /// <returns></returns>
  206. [HttpPost]
  207. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  208. public async Task<IActionResult> GroupEditBasicSource(GroupListDto dto)
  209. {
  210. var groupData = await _groupRepository.GroupEditBasicSource(dto);
  211. if (groupData.Code != 0)
  212. {
  213. return Ok(JsonView(false, groupData.Msg));
  214. }
  215. return Ok(JsonView(groupData.Data));
  216. }
  217. /// <summary>
  218. /// 接团信息 操作(增改)
  219. /// </summary>
  220. /// <param name="dto"></param>
  221. /// <returns></returns>
  222. [HttpPost]
  223. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  224. public async Task<IActionResult> GroupOperation(GroupOperationDto dto)
  225. {
  226. try
  227. {
  228. var groupData = await _groupRepository.GroupOperation(dto);
  229. if (groupData.Code != 0)
  230. {
  231. return Ok(JsonView(false, groupData.Msg));
  232. }
  233. return Ok(JsonView(true));
  234. }
  235. catch (Exception ex)
  236. {
  237. Logs("[response]" + JsonConvert.SerializeObject(dto));
  238. Logs(ex.Message);
  239. return Ok(JsonView(false, ex.Message));
  240. }
  241. }
  242. /// <summary>
  243. /// 接团信息 操作(删除)
  244. /// </summary>
  245. /// <param name="dto"></param>
  246. /// <returns></returns>
  247. [HttpPost]
  248. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  249. public async Task<IActionResult> GroupDel(GroupDelDto dto)
  250. {
  251. try
  252. {
  253. var groupData = await _groupRepository.GroupDel(dto);
  254. if (groupData.Code != 0)
  255. {
  256. return Ok(JsonView(false, groupData.Msg));
  257. }
  258. return Ok(JsonView(true));
  259. }
  260. catch (Exception ex)
  261. {
  262. Logs("[response]" + JsonConvert.SerializeObject(dto));
  263. Logs(ex.Message);
  264. return Ok(JsonView(false, ex.Message));
  265. }
  266. }
  267. /// <summary>
  268. /// 获取团组销售报价号
  269. /// 团组添加时 使用
  270. /// </summary>
  271. /// <returns></returns>
  272. [HttpPost]
  273. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  274. public async Task<IActionResult> GetGroupSalesQuoteNo()
  275. {
  276. var groupData = await _groupRepository.GetGroupSalesQuoteNo();
  277. if (groupData.Code != 0)
  278. {
  279. return Ok(JsonView(false, groupData.Msg));
  280. }
  281. object salesQuoteNo = new
  282. {
  283. SalesQuoteNo = groupData.Data
  284. };
  285. return Ok(JsonView(salesQuoteNo));
  286. }
  287. /// <summary>
  288. /// 设置确认出团
  289. /// </summary>
  290. /// <param name="dto"></param>
  291. /// <returns></returns>
  292. [HttpPost]
  293. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  294. public async Task<IActionResult> SetConfirmationGroup(ConfirmationGroupDto dto)
  295. {
  296. var groupData = await _groupRepository.ConfirmationGroup(dto);
  297. if (groupData.Code != 0)
  298. {
  299. return Ok(JsonView(false, groupData.Msg));
  300. }
  301. GroupStepForDelegation.CreateWorkStep(dto.GroupId); //创建管控流程
  302. return Ok(JsonView(groupData.Data));
  303. }
  304. /// <summary>
  305. /// 获取团组名称 List
  306. /// </summary>
  307. /// <param name="dto"></param>
  308. /// <returns></returns>
  309. [HttpPost]
  310. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  311. public async Task<IActionResult> GetGroupNameList(GroupNameDto dto)
  312. {
  313. var groupData = await _groupRepository.GetGroupNameList(dto);
  314. if (groupData.Code != 0)
  315. {
  316. return Ok(JsonView(false, groupData.Msg));
  317. }
  318. return Ok(JsonView(groupData.Data, groupData.Data.Count));
  319. }
  320. /// <summary>
  321. /// 获取团组名称data And 签证国别Data
  322. /// </summary>
  323. /// <param name="dto"></param>
  324. /// <returns></returns>
  325. [HttpPost]
  326. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  327. public async Task<IActionResult> GetGroupNameAndVisaNationality(GroupNameDto dto)
  328. {
  329. var groupData = await _groupRepository.GetGroupNameAndVisaNationality(dto);
  330. if (groupData.Code != 0)
  331. {
  332. return Ok(JsonView(false, groupData.Msg));
  333. }
  334. return Ok(JsonView(groupData.Data));
  335. }
  336. #endregion
  337. #region 团组&签证
  338. /// <summary>
  339. /// 根据团组Id获取签证客户信息List
  340. /// </summary>
  341. /// <param name="dto">请求dto</param>
  342. /// <returns></returns>
  343. [HttpPost]
  344. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  345. public async Task<IActionResult> GetCrmByGroupId(ClientByGroupIdDto dto)
  346. {
  347. var groupData = await _groupRepository.GetCrmByGroupId(dto);
  348. if (groupData.Code != 0)
  349. {
  350. return Ok(JsonView(false, groupData.Msg));
  351. }
  352. return Ok(JsonView(groupData.Data));
  353. }
  354. #endregion
  355. #region 团组任务分配
  356. /// <summary>
  357. /// 团组任务分配初始化
  358. /// </summary>
  359. /// <param name="dto"></param>
  360. /// <returns></returns>
  361. [HttpPost]
  362. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  363. public async Task<IActionResult> GetTaskAssignmen()
  364. {
  365. var groupData = await _taskAssignmentRep.GetTaskAssignmen();
  366. if (groupData.Code != 0)
  367. {
  368. return Ok(JsonView(false, groupData.Msg));
  369. }
  370. return Ok(JsonView(true, groupData.Msg, groupData.Data));
  371. }
  372. /// <summary>
  373. /// 团组任务分配查询
  374. /// </summary>
  375. /// <param name="dto"></param>
  376. /// <returns></returns>
  377. [HttpPost]
  378. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  379. public async Task<IActionResult> TaskAssignmenQuery(TaskAssignmenQueryDto dto)
  380. {
  381. var groupData = await _taskAssignmentRep.TaskAssignmenQuery(dto);
  382. if (groupData.Code != 0)
  383. {
  384. return Ok(JsonView(false, groupData.Msg));
  385. }
  386. return Ok(JsonView(true, groupData.Msg, groupData.Data));
  387. }
  388. /// <summary>
  389. /// 团组任务分配操作
  390. /// </summary>
  391. /// <param name="dto"></param>
  392. /// <returns></returns>
  393. [HttpPost]
  394. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  395. public async Task<IActionResult> GetTaskAssignmenOp(TaskAssignmenDto dto)
  396. {
  397. Result groupData = await _taskAssignmentRep.GetTaskAssignmenOp(dto);
  398. if (groupData.Code != 0)
  399. {
  400. return Ok(JsonView(false, groupData.Msg));
  401. }
  402. return Ok(JsonView(true, groupData.Msg, groupData.Data));
  403. }
  404. #endregion
  405. #region 团组费用审核
  406. /// <summary>
  407. /// 获取团组费用审核
  408. /// </summary>
  409. /// <param name="paras">参数Json字符串</param>
  410. /// <returns></returns>
  411. [HttpPost]
  412. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  413. public async Task<IActionResult> PostSearchGrpCreditCardPayment(Search_GrpCreditCardPaymentDto _dto)
  414. {
  415. if (_dto.DiId < 1)
  416. {
  417. return Ok(JsonView(false, "团组Id为空"));
  418. }
  419. Grp_CreditCardPaymentView _view = new Grp_CreditCardPaymentView();
  420. #region 团组基本信息
  421. Grp_DelegationInfo _delegation = _groupRepository.Query<Grp_DelegationInfo>(s => s.Id == _dto.DiId).First();
  422. if (_delegation != null)
  423. {
  424. _view.ClientName = _delegation.ClientName;
  425. _view.DiId = _dto.DiId;
  426. _view.TeamName = _delegation.TeamName;
  427. _view.VisitCountry = _delegation.VisitCountry;
  428. _view.VisitDate = _delegation.VisitStartDate.ToString("yyyy-MM-dd") + " ~ " + _delegation.VisitEndDate.ToString("yyyy-MM-dd");
  429. _view.VisitDays = _delegation.VisitDays;
  430. _view.VisitPNumber = _delegation.VisitPNumber;
  431. }
  432. else
  433. {
  434. return Ok(JsonView(false, "团组信息为空"));
  435. }
  436. #endregion
  437. #region 费用清单
  438. var exp = Expressionable.Create<Grp_CreditCardPayment>();
  439. exp.AndIF(_dto.AuditStatus != -1, it => it.IsAuditGM == _dto.AuditStatus);
  440. exp.AndIF(_dto.Label != -1, it => it.CTable == _dto.Label);
  441. //缺少IF的语法糖 CTable
  442. List<Grp_CreditCardPayment> entityList = _groupRepository
  443. .Query<Grp_CreditCardPayment>(s => s.DIId == _dto.DiId && s.IsDel == 0 && s.CreateUserId > 0)
  444. .Where(exp.ToExpression())
  445. .ToList();
  446. List<Grp_CreditCardPaymentDetailView> detailList = new List<Grp_CreditCardPaymentDetailView>();
  447. decimal CNY = 0;
  448. decimal PayCNY = 0;
  449. decimal BalanceCNY = 0;
  450. decimal YSFYCNY = 0;
  451. decimal USD = 0;
  452. decimal PayUSD = 0;
  453. decimal BalanceUSD = 0;
  454. decimal YSFYUSD = 0;
  455. decimal EUR = 0;
  456. decimal PayEUR = 0;
  457. decimal BalanceEUR = 0;
  458. decimal YSFYEUR = 0;
  459. foreach (var entity in entityList)
  460. {
  461. Grp_CreditCardPaymentDetailView _detail = new Grp_CreditCardPaymentDetailView();
  462. _detail.Id = entity.Id;
  463. /*
  464. * Bus名称
  465. */
  466. _detail.BusName = "";
  467. /*
  468. *费用所属
  469. */
  470. switch (entity.CTable)
  471. {
  472. case 85:
  473. Grp_AirTicketReservations jpRes = _groupRepository.Query<Grp_AirTicketReservations>(s => s.Id == entity.CId).First();
  474. if (jpRes != null)
  475. {
  476. string FlightsDescription = jpRes.FlightsDescription;
  477. string PriceDescription = jpRes.PriceDescription;
  478. _detail.PriceMsgContent = "航班号:" + jpRes.FlightsCode + "<br/>城市A-B:" + jpRes.FlightsCity + "<br/>航班描述:" + FlightsDescription.Replace("\r\n", "<br />") + "<br/>" + "价格描述:" + PriceDescription;
  479. _detail.PriceNameContent = "(" + jpRes.FlightsCode + ")";
  480. }
  481. break;
  482. case 79:
  483. _detail.BusName = "待增加";
  484. break;
  485. default:
  486. break;
  487. }
  488. /*
  489. * 费用模块
  490. */
  491. Sys_SetData sdPriceName = _groupRepository.Query<Sys_SetData>(s => s.Id == entity.CTable).First();
  492. if (sdPriceName != null)
  493. {
  494. _detail.PriceName = sdPriceName.Name;
  495. }
  496. /*
  497. * 应付款金额
  498. */
  499. Sys_SetData sdPaymentCurrency_WaitPay = _groupRepository.Query<Sys_SetData>(s => s.Id == entity.PaymentCurrency).First();
  500. string PaymentCurrency_WaitPay = "Unknown";
  501. if (sdPaymentCurrency_WaitPay != null)
  502. {
  503. PaymentCurrency_WaitPay = sdPaymentCurrency_WaitPay.Name;
  504. }
  505. _detail.WaitPay = entity.PayMoney.ToString("#0.00") + " " + PaymentCurrency_WaitPay;
  506. /*
  507. * 此次付款金额
  508. */
  509. decimal CurrPayStr = 0;
  510. if (entity.PayPercentage == 0)
  511. {
  512. if (entity.PayThenMoney != 0)
  513. CurrPayStr = entity.PayThenMoney * decimal.Parse(entity.DayRate);
  514. }
  515. else
  516. {
  517. CurrPayStr = entity.PayMoney * (decimal.Parse(entity.PayPercentage.ToString("#0.00")) / 100 * decimal.Parse(entity.DayRate));
  518. }
  519. _detail.CurrPay = CurrPayStr.ToString("#0.00") + " CNY";
  520. /*
  521. * 剩余尾款
  522. */
  523. decimal BalanceStr = 0;
  524. if (entity.PayMoney - (CurrPayStr / decimal.Parse(entity.DayRate)) < 0.01M)
  525. BalanceStr = 0;
  526. else
  527. BalanceStr = (entity.PayMoney - CurrPayStr / decimal.Parse(entity.DayRate));
  528. _detail.Balance = BalanceStr.ToString("#0.00") + " " + PaymentCurrency_WaitPay;
  529. /*
  530. * 申请人
  531. */
  532. string operatorName = "无";
  533. Sys_Users _opUser = _groupRepository.Query<Sys_Users>(s => s.Id == entity.CreateUserId).First();
  534. if (_opUser != null)
  535. {
  536. operatorName = _opUser.CnName;
  537. }
  538. _detail.OperatorName = operatorName;
  539. /*
  540. * 审核人
  541. */
  542. string auditOperatorName = "Unknown";
  543. if (entity.AuditGMOperate == 0)
  544. auditOperatorName = "无";
  545. else if (entity.AuditGMOperate == 4)
  546. auditOperatorName = "自动审核";
  547. else
  548. {
  549. Sys_Users _adUser = _groupRepository.Query<Sys_Users>(s => s.Id == entity.AuditGMOperate).First();
  550. if (_adUser != null)
  551. {
  552. auditOperatorName = _adUser.CnName;
  553. }
  554. }
  555. _detail.AuditOperatorName = auditOperatorName;
  556. /*
  557. *
  558. * *超预算比例
  559. */
  560. string overBudgetStr = "";
  561. if (entity.ExceedBudget == -1)
  562. overBudgetStr = sdPriceName.Name + "尚无预算";
  563. else if (entity.ExceedBudget == 0)
  564. overBudgetStr = "未超预算";
  565. else
  566. overBudgetStr = entity.ExceedBudget.ToString("P");
  567. _detail.OverBudget = overBudgetStr;
  568. /*
  569. * 费用总计
  570. */
  571. if (entity.PaymentCurrency == 48)
  572. {
  573. CNY += entity.PayMoney;
  574. PayCNY += CurrPayStr;
  575. BalanceCNY += BalanceStr;
  576. YSFYCNY += CurrPayStr;
  577. }
  578. if (entity.PaymentCurrency == 49)
  579. {
  580. USD += entity.PayMoney;
  581. PayUSD += CurrPayStr;
  582. BalanceUSD += BalanceStr;
  583. YSFYUSD += CurrPayStr;
  584. }
  585. if (entity.PaymentCurrency == 51)
  586. {
  587. EUR += entity.PayMoney;
  588. PayEUR += CurrPayStr;
  589. BalanceEUR += BalanceStr;
  590. YSFYEUR += CurrPayStr;
  591. }
  592. _detail.TotalStr1 = string.Format(@"应付款总金额:{0}CNY&nbsp;|&nbsp;{1}USD&nbsp;|&nbsp;{2}EUR", CNY, USD, EUR);
  593. _detail.TotalStr2 = string.Format(@"此次付款总金额:{0}CNY&nbsp;|&nbsp;{1}USD&nbsp;|&nbsp;{2}EUR", PayCNY, PayUSD, PayEUR);
  594. _detail.TotalStr3 = string.Format(@"目前剩余尾款总金额:{0}CNY&nbsp;|&nbsp;{1}USD&nbsp;|&nbsp;{2}EUR", BalanceCNY, BalanceUSD, BalanceEUR);
  595. _detail.TotalStr4 = string.Format(@"已审费用总额:{0}CNY&nbsp;|&nbsp;{1}USD&nbsp;|&nbsp;{2}EUR", YSFYCNY, YSFYUSD, YSFYEUR);
  596. detailList.Add(_detail);
  597. }
  598. #endregion
  599. _view.DetailList = new List<Grp_CreditCardPaymentDetailView>(detailList);
  600. return Ok(JsonView(_view));
  601. }
  602. /// <summary>
  603. /// 修改团组费用审核状态
  604. /// </summary>
  605. /// <param name="paras">参数Json字符串</param>
  606. /// <returns></returns>
  607. [HttpPost]
  608. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  609. public async Task<IActionResult> PostAuditGrpCreditCardPayment(Edit_GrpCreditCardPaymentDto _dto)
  610. {
  611. List<string> idList = _dto.CreditIdStr.Split(',').ToList();
  612. Grp_CreditCardPayment _detail = _mapper.Map<Grp_CreditCardPayment>(_dto);
  613. DateTime dtNow = DateTime.Now;
  614. _groupRepository.BeginTran();
  615. int rst = 0;
  616. foreach (var item in idList)
  617. {
  618. int CreditId = int.Parse(item);
  619. var result = await _grpScheduleRep._sqlSugar.Updateable<Grp_CreditCardPayment>()
  620. .SetColumns(it => it.IsAuditGM == _dto.AuditCode)
  621. .SetColumns(it => it.AuditGMOperate == _dto.User)
  622. .SetColumns(it => it.AuditGMDate == dtNow)
  623. .Where(s => s.Id == CreditId)
  624. .ExecuteCommandAsync();
  625. if (result < 1)
  626. {
  627. rst = -1;
  628. }
  629. else
  630. {
  631. _groupRepository.RollbackTran();
  632. return Ok(JsonView(false, "保存失败并回滚!"));
  633. }
  634. }
  635. _groupRepository.CommitTran();
  636. if (rst == 0)
  637. {
  638. return Ok(JsonView(true, "保存成功!"));
  639. }
  640. return Ok(JsonView(false, "保存失败!"));
  641. }
  642. #endregion
  643. #region 机票费用录入
  644. /// <summary>
  645. /// 机票录入当前登录人可操作团组
  646. /// </summary>
  647. /// <param name="dto"></param>
  648. /// <returns></returns>
  649. [HttpPost]
  650. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  651. public async Task<IActionResult> AirTicketResSelect(AirTicketResDto dto)
  652. {
  653. try
  654. {
  655. Result groupData = await _airTicketResRep.AirTicketResSelect(dto);
  656. if (groupData.Code != 0)
  657. {
  658. return Ok(JsonView(false, groupData.Msg));
  659. }
  660. return Ok(JsonView(true, groupData.Msg, groupData.Data));
  661. }
  662. catch (Exception ex)
  663. {
  664. return Ok(JsonView(false, "程序错误!"));
  665. throw;
  666. }
  667. }
  668. /// <summary>
  669. /// 机票费用录入列表
  670. /// </summary>
  671. /// <param name="dto"></param>
  672. /// <returns></returns>
  673. [HttpPost]
  674. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  675. public async Task<IActionResult> AirTicketResList(AirTicketResDto dto)
  676. {
  677. try
  678. {
  679. Result groupData = await _airTicketResRep.AirTicketResList(dto);
  680. if (groupData.Code != 0)
  681. {
  682. return Ok(JsonView(false, groupData.Msg));
  683. }
  684. return Ok(JsonView(true, groupData.Msg, groupData.Data));
  685. }
  686. catch (Exception ex)
  687. {
  688. return Ok(JsonView(false, "程序错误!"));
  689. throw;
  690. }
  691. }
  692. /// <summary>
  693. /// 根据id查询费用录入信息
  694. /// </summary>
  695. /// <param name="dto"></param>
  696. /// <returns></returns>
  697. [HttpPost]
  698. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  699. public async Task<IActionResult> AirTicketResById(AirTicketResByIdDto dto)
  700. {
  701. try
  702. {
  703. Result groupData = await _airTicketResRep.AirTicketResById(dto);
  704. if (groupData.Code != 0)
  705. {
  706. return Ok(JsonView(false, groupData.Msg));
  707. }
  708. return Ok(JsonView(true, groupData.Msg, groupData.Data));
  709. }
  710. catch (Exception ex)
  711. {
  712. return Ok(JsonView(false, "程序错误!"));
  713. throw;
  714. }
  715. }
  716. /// <summary>
  717. /// 机票费用录入操作(Status:1.新增,2.修改)
  718. /// </summary>
  719. /// <param name="dto"></param>
  720. /// <returns></returns>
  721. [HttpPost]
  722. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  723. public async Task<IActionResult> OpAirTicketRes(AirTicketResOpDto dto)
  724. {
  725. try
  726. {
  727. Result groupData = await _airTicketResRep.OpAirTicketRes(dto);
  728. if (groupData.Code != 0)
  729. {
  730. return Ok(JsonView(false, groupData.Msg));
  731. }
  732. return Ok(JsonView(true, groupData.Msg, groupData.Data));
  733. }
  734. catch (Exception ex)
  735. {
  736. return Ok(JsonView(false, "程序错误!"));
  737. throw;
  738. }
  739. }
  740. /// <summary>
  741. /// 机票费用录入,删除
  742. /// </summary>
  743. /// <param name="dto"></param>
  744. /// <returns></returns>
  745. [HttpPost]
  746. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  747. public async Task<IActionResult> DelAirTicketRes(DelBaseDto dto)
  748. {
  749. try
  750. {
  751. var res = await _airTicketResRep.SoftDeleteByIdAsync<Grp_AirTicketReservations>(dto.Id.ToString(), dto.DeleteUserId);
  752. if (!res)
  753. {
  754. return Ok(JsonView(false, "删除失败"));
  755. }
  756. return Ok(JsonView(true, "删除成功!"));
  757. }
  758. catch (Exception ex)
  759. {
  760. return Ok(JsonView(false, "程序错误!"));
  761. throw;
  762. }
  763. }
  764. /// <summary>
  765. /// 导出机票录入报表
  766. /// </summary>
  767. /// <param name="dto"></param>
  768. /// <returns></returns>
  769. [HttpPost]
  770. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  771. public async Task<IActionResult> DeriveAirTicketRes(AirTicketResDto dto)
  772. {
  773. try
  774. {
  775. Result groupData = await _airTicketResRep.DeriveAirTicketRes(dto);
  776. if (groupData.Code != 0)
  777. {
  778. return Ok(JsonView(false, groupData.Msg));
  779. }
  780. else
  781. {
  782. List<AirTicketReservationsPayView> AirTicketReservations = groupData.Data.GetType().GetProperty("AirTicketRes").GetValue(groupData.Data);
  783. if (AirTicketReservations.Count != 0)
  784. {
  785. Grp_DelegationInfo DelegationInfo = groupData.Data.GetType().GetProperty("Delegation").GetValue(groupData.Data);
  786. Sys_Users _Users = groupData.Data.GetType().GetProperty("Users").GetValue(groupData.Data);
  787. string diCode = DelegationInfo != null ? DelegationInfo.TourCode : "XXX";
  788. string diName = DelegationInfo != null ? DelegationInfo.TeamName : "XXX";
  789. WorkbookDesigner designer = new WorkbookDesigner();
  790. designer.Workbook = new Workbook(AppSettingsHelper.Get("ExcelBasePath") + "Template/机票预订费用报表模板.xlsx");
  791. decimal countCost = 0;
  792. foreach (var item in AirTicketReservations)
  793. {
  794. if (item.BankType == "其他")
  795. {
  796. item.BankNo = "--";
  797. }
  798. else
  799. {
  800. item.BankNo = item.BankType + ":" + item.BankNo.Substring(0, 3);
  801. }
  802. item.PrePrice = System.Decimal.Round(item.PrePrice, 2);
  803. item.Price = System.Decimal.Round(item.Price, 2);
  804. countCost += Convert.ToDecimal(item.Price);
  805. }
  806. designer.SetDataSource("Export", AirTicketReservations);
  807. designer.SetDataSource("ExportDiCode", diCode);
  808. designer.SetDataSource("ExportDiName", diName);
  809. designer.SetDataSource("ExportOpUserName", _Users.CnName);
  810. designer.SetDataSource("ExportCountCost", countCost + "(" + AirTicketReservations[0].CurrencyStr);
  811. designer.Process();
  812. string fileName = "AirfareStatement/" + diName + "机票费用报表" + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
  813. designer.Workbook.Save(AppSettingsHelper.Get("ExcelBasePath") + fileName);
  814. string rst = AppSettingsHelper.Get("ExcelBaseUrl") + AppSettingsHelper.Get("ExcelFtpPath") + fileName;
  815. return Ok(JsonView(true, "成功", url = rst));
  816. }
  817. else
  818. {
  819. return Ok(JsonView(false, "暂无数据!"));
  820. }
  821. }
  822. }
  823. catch (Exception ex)
  824. {
  825. return Ok(JsonView(false, "程序错误!"));
  826. throw;
  827. }
  828. }
  829. [HttpPost]
  830. [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
  831. public async Task<IActionResult> ItineraryAirTicketRes(AirTicketResDto dto)
  832. {
  833. try
  834. {
  835. Result groupData = await _airTicketResRep.ItineraryAirTicketRes(dto);
  836. if (groupData.Code != 0)
  837. {
  838. return Ok(JsonView(false, groupData.Msg));
  839. }
  840. else
  841. {
  842. List<AirTicketReservationsView> _AirTicketReservations = groupData.Data;
  843. //WorkbookDesigner designer = new WorkbookDesigner();
  844. //designer.Workbook = new Workbook(AppSettingsHelper.Get("WordBasePath") + "Template/电子客票行程单模板_CN.docx");
  845. Document doc = new Document(AppSettingsHelper.Get("WordBasePath") + "Template/电子客票行程单模板_CN.docx");
  846. DocumentBuilder builder = new DocumentBuilder();
  847. foreach (var item in _AirTicketReservations)
  848. {
  849. int tableIndex = 0;//表格索引
  850. //得到文档中的第一个表格
  851. Table table = (Table)doc.GetChild(NodeType.Table, tableIndex, true);
  852. Paragraph lastParagraph = new Paragraph(doc);
  853. //第一个表格末尾加段落
  854. table.ParentNode.InsertAfter(lastParagraph, table);
  855. //复制第一个表格
  856. Table cloneTable = (Table)table.Clone(true);
  857. //在文档末尾段落后面加入复制的表格
  858. table.ParentNode.InsertAfter(cloneTable, lastParagraph);
  859. Itinerary itinerary = new Itinerary();
  860. itinerary.ClientName = item.ClientName;
  861. itinerary.AirlineCompany = "航空公司";
  862. itinerary.TimeIssue = "2023-5-23 10:09:06";
  863. itinerary.DrawingAgent = "代理人";
  864. itinerary.AgentsAddress = "代理人地址";
  865. itinerary.AgentPhone = "代理人电话";
  866. itinerary.AgentFacsimile = "代理人传真";
  867. string[] DayArray = Regex.Split(item.FlightsDescription, "\\d+\\.", RegexOptions.IgnoreCase);
  868. DayArray = DayArray.Where(s => s != " " && s != "" && !string.IsNullOrEmpty(s)).ToArray();
  869. List<AirInfo> airInfos = new List<AirInfo>();
  870. for (int i = 0; i < DayArray.Length; i++)
  871. {
  872. string[] FlightStr = item.FlightsCode.Split('/');
  873. string[] tempstr = DayArray[i]
  874. .Replace("\r\n", string.Empty)
  875. .Replace("\\r\\n", string.Empty)
  876. .TrimStart().TrimEnd()
  877. .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  878. AirInfo air = new AirInfo();
  879. string [] city = item.FlightsCity.Split('/');
  880. string cityStr = city[i];
  881. string startCity = cityStr.Substring(0, 2);
  882. Res_ThreeCode startCityThree = _sqlSugar.Queryable<Res_ThreeCode>().First(a => a.Three == startCity && a.IsDel == 0);
  883. string endCity = cityStr.Substring(3, 5);
  884. Res_ThreeCode endCityThree = _sqlSugar.Queryable<Res_ThreeCode>().First(a => a.Three == endCity && a.IsDel == 0);
  885. air.Destination= startCityThree.City+"-"+endCityThree.City;
  886. air.Flight = FlightStr[i];
  887. air.SeatingClass = item.CTypeName;
  888. }
  889. //designer.SetDataSource("Export", AirTicketReservations);
  890. //string AirlineRecordCode = "--";//航空公司记录编码
  891. //string ReservationRecordCode = "--";//订座记录编码
  892. //string ClientName = "--";//旅客姓名
  893. //string TicketNumber = "--";//票号
  894. //string IdentificationCode = "--";//身份识别代码
  895. //string JointTicket = "--";//联票
  896. //string AirlineCompany = "--";//出票航空公司
  897. //string TimeIssue = "--";//出票时间
  898. //string DrawingAgent = "--";//代理人
  899. //string NavigationCode = "--";//航协代码
  900. //string AgentsAddress = "--";//代理人地址
  901. //string AgentPhone = "--";//代理人电话
  902. //string AgentFacsimile = "--";//代理人传真
  903. //doc.SetDataSource("AirlineRecordCode", AirlineRecordCode);
  904. //Itinerary itinerary = new Itinerary();
  905. }
  906. doc.MailMerge.Execute(new[] { "PageCount" }, new object[] { doc.PageCount });
  907. //保存合并后的文档
  908. string fileName = "AirItinerary/电子客票行程单_CN.docx";
  909. string rst = AppSettingsHelper.Get("WordBaseUrl") + AppSettingsHelper.Get("WordFtpPath") + fileName;
  910. doc.Save(AppSettingsHelper.Get("WordBasePath") + fileName);
  911. return Ok(JsonView(false, "程序错误!"));
  912. }
  913. }
  914. catch (Exception ex)
  915. {
  916. return Ok(JsonView(false, "程序错误!"));
  917. throw;
  918. }
  919. }
  920. #endregion
  921. }
  922. }