Home.cs 164 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. using System.Threading.Tasks;
  8. using System.Windows.Forms;
  9. using Newtonsoft.Json.Linq;
  10. using Newtonsoft.Json;
  11. using System.Net.Http;
  12. using System.Drawing;
  13. using Aspose.Words;
  14. using System.IO;
  15. using System.Threading;
  16. using travelExport.utility;
  17. using DiffMatchPatch;
  18. using Aspose.Words.Tables;
  19. using System.Configuration;
  20. namespace travelExport
  21. {
  22. public partial class Home : Form
  23. {
  24. // 使用工厂模式创建数据库上下文
  25. private oa2023DBEntities CreateDbContext()
  26. {
  27. var db = new oa2023DBEntities();
  28. // 禁用延迟加载
  29. db.Configuration.LazyLoadingEnabled = false;
  30. // 禁用代理创建
  31. db.Configuration.ProxyCreationEnabled = false;
  32. return db;
  33. }
  34. // 封装数据库操作方法
  35. private T ExecuteDbContext<T>(Func<oa2023DBEntities, T> action)
  36. {
  37. using (var db = CreateDbContext())
  38. {
  39. return action(db);
  40. }
  41. }
  42. //db上下文问题/。。。。
  43. //readonly static oa2023DBEntities db = new oa2023DBEntities();
  44. static List<Grp_DelegationInfo> soure = new List<Grp_DelegationInfo>();
  45. readonly static string[] weekdays = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
  46. const decimal conversion = 1.61M;
  47. readonly static string[] excludeArr = new string[] { "[中转]", "[转机]" };
  48. public List<TripItem> dropDownItem = new List<TripItem>
  49. {
  50. new TripItem
  51. {
  52. Id = 1,
  53. Name = "默认行程模板",
  54. Path = "C:\\日行程3.docx#D:\\日行程3.docx"
  55. },
  56. new TripItem
  57. {
  58. Id = 2,
  59. Name = "贵州行程模板",
  60. Path = "C:\\贵州行程模板.docx#D:\\贵州行程模板.docx"
  61. },
  62. new TripItem
  63. {
  64. Id = 1,
  65. Name = "重庆行程模板",
  66. Path = "C:\\日行程3.docx#D:\\日行程3.docx"
  67. },
  68. };
  69. public class TripItem
  70. {
  71. public int Id { get; set; }
  72. public string Name { get; set; }
  73. public string Path { get; set; }
  74. }
  75. public enum textTypeEnum
  76. {
  77. 标题 = 0, 内容 = 1
  78. };
  79. public class textType
  80. {
  81. public textTypeEnum Type { get; set; }
  82. public string Value { get; set; }
  83. }
  84. public Home()
  85. {
  86. InitializeComponent();
  87. Task.Run(() =>
  88. {
  89. if (versions.checkVersions())
  90. {
  91. // 在主线程中显示消息框
  92. this.Invoke((MethodInvoker)delegate
  93. {
  94. var result = MessageBoxEx.Show(this, "有新版本可用,是否更新!", "更新提示!", MessageBoxButtons.YesNo);
  95. // 这里可以处理用户点击按钮后的逻辑
  96. HandleUpdateResponse(result);
  97. });
  98. }
  99. });
  100. }
  101. private void HandleUpdateResponse(DialogResult result)
  102. {
  103. // 处理用户的选择
  104. if (result == DialogResult.Yes)
  105. {
  106. // 用户选择"是",进行更新
  107. }
  108. else
  109. {
  110. // 用户选择"否",不进行更新
  111. }
  112. }
  113. private void Form1_Load(object sender, EventArgs e)
  114. {
  115. airCheckbox.AutoCheck = false;
  116. gwCheckbox.AutoCheck = false;
  117. hotelCheckbox.AutoCheck = false;
  118. // 使用封装的方法执行查询
  119. soure = ExecuteDbContext(db =>
  120. db.Grp_DelegationInfo
  121. .AsNoTracking()
  122. .Where(x => x.IsDel == 0)
  123. .ToList()
  124. );
  125. comb_Delegation.ValueMember = "Id";
  126. comb_Delegation.DisplayMember = "TeamName";
  127. comb_Delegation.Items.AddRange(soure.ToArray());
  128. comb_Delegation.DropDownHeight = 200;
  129. comb_Delegation.MouseClick += comb_Delegation_MouseClick;
  130. comb_Delegation.TextUpdate += comb_Delegation_TextUpdate;
  131. comb_Delegation.SelectedValueChanged += comb_Delegation_SelectedValueChanged;
  132. FormBorderStyle = FormBorderStyle.FixedSingle;
  133. MinimizeBox = false;
  134. MaximizeBox = false;
  135. tripItemSelect.DataSource = dropDownItem;
  136. tripItemSelect.ValueMember = "Id";
  137. tripItemSelect.DisplayMember = "Name";
  138. tripItemSelect.DropDownStyle = ComboBoxStyle.DropDownList;
  139. }
  140. private void comb_Delegation_SelectedValueChanged(object sender, EventArgs e)
  141. {
  142. var diid = -1;
  143. try
  144. {
  145. var dele = (comb_Delegation.SelectedItem as Grp_DelegationInfo);
  146. diid = dele.Id;
  147. QueryDbData(diid);
  148. }
  149. catch (Exception)
  150. {
  151. return;
  152. }
  153. }
  154. private void comb_Delegation_MouseClick(object sender, MouseEventArgs e)
  155. {
  156. comb_Delegation.Text = "";
  157. comb_Delegation_TextUpdate(sender, e);
  158. comb_Delegation.DropDownHeight = 200;
  159. comb_Delegation.DroppedDown = true;
  160. }
  161. private void comb_Delegation_TextUpdate(object sender, EventArgs e)
  162. {
  163. ComboBox cb = (ComboBox)sender;
  164. cb.DataSource = null;
  165. cb.Items.Clear();
  166. string s = cb.Text;
  167. var bindList = soure.Where(item => item.TeamName != null && item.TeamName.Contains(s)).ToList();
  168. if (bindList.Count >= 1) // 存在符合条件的内容
  169. {
  170. this.comb_Delegation.Items.AddRange(bindList.ToArray());
  171. }
  172. else
  173. {
  174. this.comb_Delegation.Items.Add(new Grp_DelegationInfo { TeamName = "", Id = -1 });
  175. }
  176. cb.SelectionStart = cb.Text.Length; // 设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列
  177. cb.Cursor = Cursors.Default; //保持鼠标指针原来状态,有时候鼠标指针会被下拉框覆盖,所以要进行一次设置
  178. cb.MaxDropDownItems = 8; // 自动弹出下拉框
  179. }
  180. //导入简要行程
  181. private async void btnImport_Click(object sender, EventArgs e)
  182. {
  183. var tripTempValue = tripItemSelect.SelectedValue;
  184. if (!int.TryParse(tripTempValue.ToString(), out int tempValue))
  185. {
  186. MessageBoxEx.Show("请选择模板类型!");
  187. return;
  188. }
  189. var diid = -1;
  190. try
  191. {
  192. var dele = (comb_Delegation.SelectedItem as Grp_DelegationInfo);
  193. diid = dele.Id;
  194. }
  195. catch (Exception)
  196. {
  197. //lblImport.Text = "请正确的选择团组!";
  198. //lblImport.ForeColor = Color.Black;
  199. MessageBoxEx.Show(this, "请正确的选择团组!", "提示");
  200. return;
  201. }
  202. var selectTemp = tripItemSelect.SelectedItem as TripItem;
  203. var isChongQing = selectTemp.Name == "重庆行程模板";
  204. var codeId = -1;
  205. try
  206. {
  207. if (!int.TryParse(SublevelComboBox.SelectedValue.ToString(), out codeId))
  208. {
  209. throw new Exception();
  210. }
  211. }
  212. catch (Exception)
  213. {
  214. MessageBoxEx.Show(this, "请正确的选择黑屏代码!", "提示");
  215. return;
  216. }
  217. //GetAllCity(diid);
  218. DataTable resultTable = null;
  219. try
  220. {
  221. resultTable = GetTableByBlackCode(diid, codeId);
  222. }
  223. catch (Exception ex)
  224. {
  225. MessageBoxEx.Show(this, "黑屏代码有误!" + ex.Message, "提示");
  226. return;
  227. }
  228. if (resultTable.Rows.Count == 0 || string.IsNullOrWhiteSpace(resultTable.Rows[0][1].ToString()))
  229. {
  230. MessageBoxEx.Show(this, "黑屏代码有误! ", "提示");
  231. return;
  232. }
  233. foreach (DataRow row in resultTable.Rows)
  234. {
  235. if (!string.IsNullOrWhiteSpace(row["Error"].ToString()))
  236. {
  237. MessageBoxEx.Show(this, "黑屏代码有误! " + row["Error"].ToString(), "提示");
  238. return;
  239. }
  240. }
  241. var isVPN = await Task.Run(() =>
  242. {
  243. var isVpn = GetDirectionByGoogleApi("北京", "上海");
  244. if (Convert.ToInt32(isVpn["code"]) == -1)
  245. {
  246. return false;
  247. }
  248. return true;
  249. });
  250. if (!isVPN) { MessageBoxEx.Show(this, "请打开VPN!"); return; }
  251. var timeArr = GetTimeListByDataTable(resultTable);
  252. ChildThreadExceptionHandler wt = new
  253. ChildThreadExceptionHandler((msg) =>
  254. {
  255. if (this.InvokeRequired)
  256. {
  257. this.Invoke(new Action(() =>
  258. {
  259. MessageBoxEx.Show(this, msg);
  260. }));
  261. }
  262. else
  263. {
  264. MessageBoxEx.Show(this, msg);
  265. }
  266. });
  267. //本团行程单数据
  268. List<Grp_TravelList> listTravel = ExecuteDbContext((db => { return db.Grp_TravelList.AsNoTracking().Where(x => x.Diid == diid && x.IsDel == 0).ToList(); }));
  269. var tags = CheckAndCenterTags(diid);
  270. Thread threadExec = new Thread(() =>
  271. {
  272. var lockTaken = Monitor.TryEnter(Key, TimeSpan.FromMilliseconds(1));
  273. if (lockTaken)
  274. {
  275. try
  276. {
  277. using (var db = new oa2023DBEntities())
  278. {
  279. using (var sw = db.Database.BeginTransaction())
  280. {
  281. var NewListTravel = new List<Grp_TravelList>();
  282. var index = 1;
  283. var stopCity = string.Empty;
  284. var nextDayNum = 0;
  285. var nextTrip = string.Empty;
  286. Res_ThreeCode stopCity_Object = null;
  287. Res_ThreeCode playCity_Object = null;
  288. bool isTrade = false;
  289. foreach (var item in timeArr)
  290. {
  291. string tripGuiZhou = string.Empty;
  292. string trip = string.Empty;
  293. string weekDay = string.Empty;
  294. DateTime time = DateTime.Now;
  295. if (DateTime.TryParse(item, out time))
  296. {
  297. weekDay = weekdays[(int)time.DayOfWeek];
  298. }
  299. else
  300. {
  301. weekDay = "日期格式不正确!";
  302. }
  303. var empty = "【未收入该三字码!请机票同事录入】";
  304. var tabSelect = resultTable.Select(string.Format("Day = '{0}'", item));
  305. var isMoreTraffic = false;
  306. if (nextDayNum > 0)
  307. {
  308. trip += nextTrip;
  309. nextDayNum--;
  310. if (nextDayNum > 0)
  311. {
  312. NewListTravel.Add(new Grp_TravelList
  313. {
  314. CreateTime = DateTime.Now,
  315. CreateUserId = 0,
  316. Diid = diid,
  317. Date = Convert.ToDateTime(item).ToString("M月d日"),
  318. Trip = $"{playCity_Object.City}/{stopCity_Object.City}\r\n飞行中",
  319. WeekDay = weekDay,
  320. Days = index,
  321. Traffic_First = "飞机",
  322. Traffic_Second = "汽车",
  323. Diffgroup = 1,
  324. Issel = 1,
  325. IsDel = 0,
  326. });
  327. index++;
  328. continue;
  329. }
  330. else
  331. {
  332. nextTrip = string.Empty;
  333. }
  334. }
  335. if (tabSelect.Length > 0)
  336. {
  337. isMoreTraffic = true;
  338. var takeOffTime = DateTime.Parse(item);
  339. var fallToTime = DateTime.Parse(item);
  340. Res_ThreeCode start_Object = null;
  341. Res_ThreeCode end_Object = null;
  342. foreach (var tabRow in tabSelect)
  343. {
  344. if (nextDayNum == 0)
  345. {
  346. nextDayNum = Convert.ToInt32(tabRow["Sign"]);
  347. }
  348. takeOffTime = DateTime.Parse(item);
  349. fallToTime = DateTime.Parse(item);
  350. var takeOff = tabRow["StartTime"].ToString();
  351. var fallTo = tabRow["EndTime"].ToString();
  352. takeOffTime = takeOffTime.AddHours(int.Parse(takeOff.Substring(0, 2)));
  353. takeOffTime = takeOffTime.AddMinutes(int.Parse(takeOff.Substring(2, 2)));
  354. fallToTime = fallToTime.AddHours(int.Parse(fallTo.Substring(0, 2)));
  355. fallToTime = fallToTime.AddMinutes(int.Parse(fallTo.Substring(2, 2)));
  356. var threeCode = tabRow["Three"].ToString();
  357. var start = threeCode.Substring(0, 3);
  358. var end = threeCode.Substring(3, 3);
  359. stopCity = end;
  360. start_Object = db.Res_ThreeCode.FirstOrDefault(x => x.Three.ToUpper() == start.ToUpper());
  361. end_Object = db.Res_ThreeCode.FirstOrDefault(x => x.Three.ToUpper() == end.ToUpper());
  362. if (start_Object == null)
  363. {
  364. start_Object = new Res_ThreeCode()
  365. {
  366. AirPort = empty,
  367. AirPort_En = empty,
  368. City = empty,
  369. Country = empty,
  370. Four = empty,
  371. Three = empty,
  372. };
  373. }
  374. if (end_Object == null)
  375. {
  376. end_Object = new Res_ThreeCode()
  377. {
  378. AirPort = empty,
  379. AirPort_En = empty,
  380. City = empty,
  381. Country = empty,
  382. Four = empty,
  383. Three = empty,
  384. };
  385. }
  386. stopCity_Object = end_Object;
  387. playCity_Object = start_Object;
  388. //航班号
  389. string flightcode = tabRow["Fliagtcode"].ToString();
  390. if (isTrade && !trip.EndsWith("\r\n") && !string.IsNullOrWhiteSpace(trip))
  391. {
  392. trip += "\r\n";
  393. }
  394. if (!string.IsNullOrWhiteSpace(trip) && tabSelect.First().Equals(item))
  395. {
  396. trip = trip.Insert(0, $"{start_Object.City}/{end_Object.City}\r\n");
  397. }
  398. else
  399. {
  400. trip += $"{start_Object.City}/{end_Object.City}\r\n";
  401. }
  402. if (!isTrade)
  403. {
  404. var dayBeforeTrip = string.Empty;
  405. if (index == 1)
  406. {
  407. if (takeOffTime.AddHours(-3).Day < takeOffTime.Day)
  408. {
  409. dayBeforeTrip += $"{takeOffTime.AddHours(-3).ToString("HH:mm")} 抵达{start_Object.AirPort}{tabRow["StartBuilding"].ToString().Trim()}航站楼,办理登机手续:";
  410. }
  411. else
  412. {
  413. trip += $"{takeOffTime.AddHours(-3).ToString("HH:mm")} 抵达{start_Object.AirPort}{tabRow["StartBuilding"].ToString().Trim()}航站楼,办理登机手续:\r\n";
  414. }
  415. }
  416. else if (index == timeArr.Count)
  417. {
  418. if (takeOffTime.AddHours(-3).Hour > 9 && takeOffTime.AddHours(-3).Day == takeOffTime.Day)
  419. {
  420. trip += "08:00 早餐于酒店;\r\n";
  421. }
  422. if (takeOffTime.AddHours(-3).Day == takeOffTime.Day)
  423. {
  424. trip += $"{takeOffTime.AddHours(-3).ToString("HH:mm")} 抵达{start_Object.AirPort}{tabRow["StartBuilding"].ToString().Trim()}航站楼,办理登机手续:\r\n";
  425. }
  426. else
  427. {
  428. foreach (var newTravel in NewListTravel)
  429. {
  430. if (newTravel.Days == --index)
  431. {
  432. newTravel.Trip += $"\r\n{takeOffTime.AddHours(-3).ToString("HH:mm")} 抵达{start_Object.AirPort}{tabRow["StartBuilding"].ToString().Trim()}航站楼,办理登机手续:";
  433. break;
  434. }
  435. }
  436. }
  437. }
  438. else
  439. {
  440. if (takeOffTime.AddHours(-2).Hour > 9 && takeOffTime.AddHours(-2).Day == takeOffTime.Day)
  441. {
  442. trip += "08:00 早餐于酒店;\r\n";
  443. }
  444. if (takeOffTime.Hour >= 12)
  445. {
  446. trip += "09:00 公务活动;\r\n";
  447. }
  448. if (takeOffTime.Hour > 14)
  449. {
  450. trip += "10:30 公务活动;\r\n";
  451. }
  452. if (takeOffTime.Hour > 15)
  453. {
  454. trip += "12:00 午餐于当地餐厅;\r\n";
  455. trip += "14:00 公务活动;\r\n";
  456. }
  457. if (takeOffTime.Hour > 17)
  458. {
  459. trip += "16:00 公务活动;\r\n";
  460. }
  461. //--提前俩个小时
  462. trip += $"{takeOffTime.AddHours(-2).ToString("HH:mm")} 抵达{start_Object.AirPort}{tabRow["StartBuilding"].ToString().Trim()}航站楼,办理登机手续:\r\n";
  463. }
  464. if (!string.IsNullOrWhiteSpace(dayBeforeTrip))
  465. {
  466. {
  467. NewListTravel.Insert(0, new Grp_TravelList
  468. {
  469. CreateTime = DateTime.Now,
  470. CreateUserId = 0,
  471. Diid = diid,
  472. Date = Convert.ToDateTime(item).AddDays(-1).ToString("M月d日"),
  473. Trip = $"{start_Object.City}\r\n{dayBeforeTrip}",
  474. WeekDay = weekdays[(int)time.AddDays(-1).DayOfWeek],
  475. Days = 0,
  476. Traffic_First = "汽车",
  477. Traffic_Second = "",
  478. Diffgroup = 1,
  479. Issel = 1,
  480. IsDel = 0,
  481. });
  482. }
  483. }
  484. }
  485. var aircompany = db.Res_AirCompany.FirstOrDefault(x => x.ShortCode.ToUpper() == flightcode.Substring(0, 2).ToUpper() && x.IsDel == 0);
  486. var hsEmpty = "【此航司" + flightcode.Substring(0, 2).ToUpper() + "未收录,请机票同事录入】";
  487. if (aircompany == null)
  488. {
  489. aircompany = new Res_AirCompany
  490. {
  491. CnName = hsEmpty,
  492. EnName = hsEmpty,
  493. ShortCode = hsEmpty,
  494. };
  495. }
  496. //机型判断
  497. string airModel = tabRow["AirModel"].ToString();
  498. airModel = GetLonger(airModel.Substring(0, 1)) + airModel;
  499. string flightTime = tabRow["FlightTime"].ToString();
  500. #region 旧时间处理
  501. //if (flightTime.Contains(":"))
  502. //{
  503. // flightTime = flightTime.Replace(":", "小时");
  504. // flightTime += "分钟";
  505. //}
  506. //if (flightTime.Contains("H"))
  507. //{
  508. // flightTime = flightTime.Replace("H", "小时");
  509. //}
  510. //if (flightTime.Contains("M"))
  511. //{
  512. // flightTime = flightTime.Replace("M", "分钟");
  513. //}
  514. #endregion
  515. flightTime = ParseBlackTime(flightTime);
  516. trip += $"{takeOffTime.ToString("HH:mm")} 搭乘{aircompany.CnName}{tabRow[0].ToString().Trim()}航班,由{start_Object.City}飞往{end_Object.City};\r\n ({start_Object.AirPort}/{end_Object.AirPort} 机型:{airModel} 飞行时间{flightTime});\r\n";
  517. tripGuiZhou += $"{takeOffTime.ToString("HH:mm")} 乘坐{aircompany.CnName}从{start_Object.City}{start_Object.AirPort}飞往{end_Object.City}{end_Object.AirPort};\r\n";
  518. isTrade = Convert.ToBoolean(tabRow["isTransitShipment"]);
  519. tripGuiZhou += $"{fallToTime.ToString("HH:mm")} 到达{end_Object.AirPort}\r\n";
  520. if (isTrade)
  521. {
  522. if (nextDayNum > 0)
  523. {
  524. nextTrip += $"{fallToTime.ToString("HH:mm")} 抵达{end_Object.AirPort}{tabRow["EndBuilding"].ToString().Trim()}航站楼(中转时间:行李直达);\r\n";
  525. }
  526. else
  527. {
  528. trip += $"{fallToTime.ToString("HH:mm")} 抵达{end_Object.AirPort}{tabRow["EndBuilding"].ToString().Trim()}航站楼(中转时间:行李直达);\r\n";
  529. }
  530. }
  531. else
  532. {
  533. if (nextDayNum > 0)
  534. {
  535. nextTrip += $"{fallToTime.ToString("HH:mm")} 抵达{end_Object.AirPort}{tabRow["EndBuilding"].ToString().Trim()}航站楼,办理入境手续,之后前往提取行李;\r\n";
  536. if (timeArr.Last().Equals(item))
  537. {
  538. nextTrip = $"{fallToTime.ToString("HH:mm")} 抵达{end_Object.AirPort}{tabRow["EndBuilding"].ToString().Trim()}航站楼,办理入境手续,之后前往提取行李,圆满结束此次访问之行!";
  539. }
  540. }
  541. else
  542. {
  543. trip += $"{fallToTime.ToString("HH:mm")} 抵达{end_Object.AirPort}{tabRow["EndBuilding"].ToString().Trim()}航站楼,办理入境手续,之后前往提取行李;\r\n";
  544. }
  545. }
  546. }
  547. //var airArrive = fallToTime; //航班落地时间
  548. time = fallToTime.AddHours(1.5); //出机场一个半小时
  549. string Time = string.Empty;
  550. string Distance = string.Empty;
  551. int GetGoogleResult = 0;
  552. int GetDistResult = 0;
  553. JObject Result = null;
  554. try
  555. {
  556. Result = GetDirectionByGoogleApi(end_Object.AirPort, end_Object.City + "市区");
  557. Time = Result["routes"][0]["legs"][0]["duration"]["text"].ToString().Replace(" ", "").Trim();
  558. Distance = Result["routes"][0]["legs"][0]["distance"]["text"].ToString().Replace(" ", "").Trim();
  559. #region 旧Google时间路程处理
  560. //if (Time.Contains("hours"))
  561. //{
  562. // Time = Time.Replace("hours", "小时");
  563. //}
  564. //if (Time.Contains("hour"))
  565. //{
  566. // Time = Time.Replace("hour", "小时");
  567. //}
  568. //Time = Time.Replace("mins", "分钟");
  569. //if (Distance.Contains("mi"))
  570. //{
  571. // var distSp = Regex.Split(Distance, "mi");
  572. // if (distSp.Length > 0)
  573. // {
  574. // Distance = (decimal.Parse(distSp[0]) * conversion).ToString("#0.00") + " 公里";
  575. // }
  576. //}
  577. //if (Distance.Contains("km"))
  578. //{
  579. // Distance = Distance.Replace("km", "公里");
  580. //}
  581. //if (Time.Contains("小时"))
  582. //{
  583. // var xs = Regex.Split(Time, "小时");
  584. // var xsValue = int.Parse(xs[0]);
  585. // var fz = Regex.Split(xs[1], "分钟");
  586. // var fzValue = int.Parse(fz[0]);
  587. // GetGoogleResult = xsValue * 60;
  588. // GetGoogleResult += fzValue;
  589. //}
  590. //else if (Time.Contains("分钟"))
  591. //{
  592. // GetGoogleResult = int.Parse(Regex.Split(Time, "分钟")[0]);
  593. //}
  594. //if (Distance.Contains("公里"))
  595. //{
  596. // GetDistResult = (int)decimal.Parse(Regex.Split(Distance, "公里")[0]);
  597. //}
  598. //if (GetGoogleResult > 0 && GetGoogleResult % 5 != 0)
  599. //{
  600. // while (GetGoogleResult % 5 != 0)
  601. // {
  602. // GetGoogleResult++;
  603. // }
  604. //}
  605. //if (GetDistResult % 5 != 0 && GetDistResult > 0)
  606. //{
  607. // while (GetDistResult % 5 != 0)
  608. // {
  609. // GetDistResult++;
  610. // }
  611. //}
  612. //int H = (GetGoogleResult / 60);
  613. //int m = (GetGoogleResult % 60);
  614. //string TimeStr = string.Empty;
  615. //if (H != 0)
  616. //{
  617. // if (H < 10)
  618. // {
  619. // TimeStr += "0" + H + "小时";
  620. // }
  621. // else
  622. // {
  623. // TimeStr += H + "小时";
  624. // }
  625. //}
  626. //if (m < 10)
  627. //{
  628. // TimeStr += "0" + m + "分钟";
  629. //}
  630. //else
  631. //{
  632. // TimeStr += m + "分钟";
  633. //}
  634. //Time = TimeStr;
  635. //Distance = GetDistResult.ToString() + "公里";
  636. #endregion
  637. // 替换单位为中文
  638. Time = Time.Replace("hours", "小时").Replace("hour", "小时").Replace("mins", "分钟");
  639. Distance = Distance.Contains("mi")
  640. ? (decimal.Parse(Distance.Split(new string[] { "mi" }, StringSplitOptions.None)[0]) * conversion).ToString("#0.00") + " 公里"
  641. : Distance.Replace("km", "公里");
  642. // 提取时间和距离的数值部分,并向上取5的倍数
  643. int timeMinutes = (int.Parse(ExtractDigitsBeforeDecimal(Time)) + 4) / 5 * 5;
  644. int distanceKm = (int.Parse(ExtractDigitsBeforeDecimal(Distance)) + 4) / 5 * 5;
  645. // 格式化时间
  646. string formattedTime = string.Empty;
  647. if (timeMinutes / 60 > 0) formattedTime = $"{(timeMinutes / 60):D2}小时{(timeMinutes % 60):D2}分钟";
  648. else formattedTime = $"{(timeMinutes % 60):D2}分钟";
  649. // 更新结果
  650. Time = formattedTime;
  651. Distance = $"{distanceKm}公里";
  652. GetGoogleResult = timeMinutes;
  653. }
  654. catch (Exception ex)
  655. {
  656. Time = "未知!";
  657. Distance = "未知!";
  658. }
  659. if (nextDayNum == 0)
  660. {
  661. if (index != timeArr.Count)
  662. {
  663. trip += $"{time.ToString("HH:mm")} 搭乘专车前往市区({end_Object.AirPort} - {end_Object.City}市区 路程{Distance},耗时{Time});";
  664. }
  665. if ((time > new DateTime(time.Year, time.Month, time.Day, 20, 30, 00) || time.AddMinutes(GetGoogleResult).Day > time.Day) && index != timeArr.Count)
  666. {
  667. trip += $"\r\n{time.AddMinutes(GetGoogleResult).ToString("HH:mm")} 入住酒店休息;";
  668. }
  669. time = time.AddMinutes(GetGoogleResult); //到达市区时间
  670. if (index != timeArr.Count)
  671. {
  672. tripGuiZhou += $"{fallToTime.AddMinutes(10).ToString("HH:mm")} ";
  673. tripGuiZhou += "从机场赴入住酒店";
  674. }
  675. if (index == timeArr.Count)
  676. {
  677. trip = trip.RemoveEnd("\r\n");
  678. if (trip.EndsWith(";"))
  679. {
  680. trip = trip.RemoveEnd(";");
  681. trip += ",";
  682. }
  683. trip += "圆满结束此次访问之行!";
  684. NewListTravel.Add(new Grp_TravelList
  685. {
  686. CreateTime = DateTime.Now,
  687. CreateUserId = 0,
  688. Diid = diid,
  689. Date = Convert.ToDateTime(item).ToString("M月d日"),
  690. Trip = tempValue == 1 ? trip : tempValue == 2 ? tripGuiZhou : "",
  691. WeekDay = weekDay,
  692. Days = index,
  693. Traffic_First = "飞机",
  694. Traffic_Second = "汽车",
  695. Diffgroup = 1,
  696. Issel = 1,
  697. IsDel = 0,
  698. });
  699. //if (footIsAddDay)
  700. //{
  701. // NewListTravel.Add(new Grp_TravelList
  702. // {
  703. // CreateTime = DateTime.Now,
  704. // CreateUserId = 0,
  705. // Diid = diid,
  706. // Date = Convert.ToDateTime(item).AddDays(1).ToString("M月d日"),
  707. // Trip = "",
  708. // WeekDay = weekdays[(int)time.AddDays(1).DayOfWeek],
  709. // Days = ++index,
  710. // Traffic_First = "飞机",
  711. // Traffic_Second = "汽车",
  712. // Diffgroup = 1,
  713. // Issel = 1,
  714. // IsDel = 0,
  715. // });
  716. //}
  717. continue;
  718. }
  719. if (time.Day != fallToTime.Day) //超出一天
  720. {
  721. NewListTravel.Add(new Grp_TravelList
  722. {
  723. CreateTime = DateTime.Now,
  724. CreateUserId = 0,
  725. Diid = diid,
  726. Date = Convert.ToDateTime(item).ToString("M月d日"),
  727. Trip = tempValue == 1 ? trip : tempValue == 2 ? tripGuiZhou : "",
  728. WeekDay = weekDay,
  729. Days = index,
  730. Traffic_First = "飞机",
  731. Traffic_Second = "汽车",
  732. Diffgroup = 1,
  733. Issel = 1,
  734. IsDel = 0,
  735. });
  736. index++;
  737. continue;
  738. }
  739. if (time.Hour < 9) // && (airArrive < new DateTime(airArrive.Year,airArrive.Month,airArrive.Day,6, 30, 0))
  740. {
  741. trip += @"
  742. 09:00 公务活动;
  743. 10:30 公务活动;";
  744. }
  745. else if (time.Hour < 10)
  746. {
  747. trip += @"
  748. 10:30 公务活动;";
  749. }
  750. if (time.Hour < 12)
  751. {
  752. trip += $"\r\n12:00 午餐于当地餐厅;";
  753. }
  754. if (time < new DateTime(time.Year, time.Month, time.Day, 14, 30, 0))
  755. {
  756. trip += @"
  757. 14:00 公务活动;
  758. 16:00 公务活动;";
  759. }
  760. else if (time.Hour < 16)
  761. {
  762. trip += @"
  763. 16:00 公务活动;";
  764. }
  765. if (time.Hour < 18)
  766. {
  767. trip += $"\r\n18:00 晚餐于当地餐厅;";
  768. }
  769. if (time.Hour < 19)
  770. {
  771. trip += $"\r\n19:00 入住酒店休息;";
  772. }
  773. }
  774. //time = time.AddHours(1);
  775. //trip += $"\r\n{time.ToString("HH:mm")} 搭乘专车前往酒店,抵达后办理入住;";
  776. }
  777. else
  778. {
  779. var end_Object = db.Res_ThreeCode.FirstOrDefault(x => x.Three.ToUpper() == stopCity.ToUpper());
  780. if (end_Object == null)
  781. {
  782. end_Object = new Res_ThreeCode()
  783. {
  784. AirPort = empty,
  785. AirPort_En = empty,
  786. City = empty,
  787. Country = empty,
  788. Four = empty,
  789. Three = empty,
  790. };
  791. }
  792. trip += $"{end_Object.City}\r\n";
  793. trip += @"08:00 早餐于酒店;
  794. 09:00 公务活动;
  795. 10:30 公务活动;
  796. 12:00 午餐于当地餐厅;
  797. 14:00 公务活动;
  798. 16:00 公务活动;
  799. 18:00 晚餐于当地餐厅;
  800. 19:00 入住酒店休息;";
  801. tripGuiZhou += $"上午\r\n08:30 从酒店出发\r\n09:00 公务活动\r\n12:00 返回酒店\r\n\r\n下午\r\n14:00 公务活动\r\n18:00 返回酒店";
  802. }
  803. string[] traffic = new string[] { "汽车", "飞机" };
  804. if (!isMoreTraffic)
  805. {
  806. traffic = new string[] { "汽车", "" };
  807. }
  808. NewListTravel.Add(new Grp_TravelList
  809. {
  810. CreateTime = DateTime.Now,
  811. CreateUserId = 0,
  812. Diid = diid,
  813. Date = Convert.ToDateTime(item).ToString("M月d日"),
  814. Trip = tempValue == 1 ? trip.RemoveEnd("\r\n") : tempValue == 2 ? tripGuiZhou : "",
  815. WeekDay = weekDay,
  816. Days = index,
  817. Traffic_First = traffic[0],
  818. Traffic_Second = traffic[1],
  819. Diffgroup = 1,
  820. Issel = 1,
  821. IsDel = 0,
  822. });
  823. index++;
  824. }
  825. if (nextDayNum > 0)
  826. {
  827. for (int i = 0; i < nextDayNum; i++)
  828. {
  829. NewListTravel.Add(new Grp_TravelList
  830. {
  831. CreateTime = DateTime.Now,
  832. CreateUserId = 0,
  833. Diid = diid,
  834. Date = Convert.ToDateTime(timeArr[timeArr.Count - 1]).AddDays(i + 1).ToString("M月d日"),
  835. Trip = $"{stopCity_Object.City}\r\n{nextTrip}",
  836. WeekDay = weekdays[(int)Convert.ToDateTime(timeArr[timeArr.Count - 1]).AddDays(i + 1).DayOfWeek],
  837. Days = index,
  838. Traffic_First = "飞机",
  839. Traffic_Second = "",
  840. Diffgroup = 1,
  841. Issel = 1,
  842. IsDel = 0,
  843. });
  844. }
  845. }
  846. //处理标记
  847. foreach (var item in tags)
  848. {
  849. bool isEnter = false;
  850. string QueryTag = item.QueryTag;
  851. if (QueryTag.Contains("\r\n\r\n"))
  852. {
  853. QueryTag = QueryTag.Replace("\r\n\r\n", "\r\n");
  854. isEnter = true;
  855. }
  856. var NewListTravelToTags = NewListTravel
  857. .Where(x => x.Trip.Contains(QueryTag)
  858. && x.Date == item.Date.ToString("M月d日"))
  859. .ToList();
  860. if (NewListTravelToTags.Count > 0 && !item.IsFinally)
  861. {
  862. foreach (var x in NewListTravelToTags)
  863. {
  864. var tagIndex = x.Trip.IndexOf(QueryTag);
  865. tagIndex += tagContent.tagLength;
  866. var insertStr = tagContent.TagFormat.Item1 + item.Content + tagContent.TagFormat.Item2;
  867. if (isEnter)
  868. {
  869. insertStr += "\r\n";
  870. }
  871. x.Trip = x.Trip.Insert(tagIndex, insertStr);
  872. NewListTravel.ForEach(x1 => { if (x.Date == x1.Date) { x1.Trip = x.Trip; } });
  873. break;
  874. }
  875. }
  876. else
  877. {
  878. foreach (var x in NewListTravel)
  879. {
  880. if (x.Date == item.Date.ToString("M月d日"))
  881. {
  882. x.Trip += "\r\n" + tagContent.TagFormat.Item1 + item.Content + tagContent.TagFormat.Item2;
  883. break;
  884. }
  885. }
  886. }
  887. }
  888. //比较上一次的文本
  889. //foreach (var newItem in NewListTravel)
  890. //{
  891. // foreach (var oldItem in listTravel)
  892. // {
  893. // if (newItem.Date == oldItem.Date)
  894. // {
  895. // oldItem.Trip = ReplaceNewlineIfNeeded(oldItem.Trip);
  896. // var str = CheckStr(oldItem.Trip, newItem.Trip);
  897. // newItem.Trip = str;
  898. // break;
  899. // }
  900. // }
  901. //}
  902. db.Grp_TravelList.RemoveRange(db.Grp_TravelList.Where(x => x.IsDel == 0 && x.Diid == diid));
  903. if (isChongQing)
  904. {
  905. foreach (var item in NewListTravel)
  906. {
  907. item.Trip = item.Trip.Replace("\r\n10:30 公务活动", "");
  908. }
  909. }
  910. db.Grp_TravelList.AddRange(NewListTravel);
  911. db.SaveChanges();
  912. sw.Commit();
  913. wt.Invoke("数据导入完成!");
  914. }
  915. }
  916. }
  917. catch (Exception ex)
  918. {
  919. wt.Invoke("ERROR!" + ex.Message);
  920. }
  921. finally
  922. {
  923. if (lockTaken)
  924. {
  925. Monitor.Exit(Key);
  926. }
  927. }
  928. }
  929. else
  930. {
  931. wt.Invoke("请勿重复点击!");
  932. }
  933. });
  934. threadExec.Start();
  935. }
  936. private void QueryDbData(int diid)
  937. {
  938. Task.Run(() =>
  939. {
  940. using (var db = CreateDbContext())
  941. {
  942. //机票行程数据
  943. var listAir = db.Air_TicketBlackCode
  944. .Where(x => x.DiId == diid && x.IsDel == 0)
  945. .ToList();
  946. var count = 1;
  947. foreach (var item in listAir)
  948. {
  949. if (string.IsNullOrWhiteSpace(item.Title))
  950. {
  951. item.Title = "未设置名称数据" + count;
  952. }
  953. count++;
  954. }
  955. //本团酒店信息
  956. var listht = db.Grp_HotelReservations.Where(x => x.DiId == diid && x.IsDel == 0).ToList();
  957. //公务出访信息
  958. var listgw = db.Res_OfficialActivities.Where(x => x.DiId == diid && x.IsDel == 0).ToList();
  959. // 更新 UI
  960. this.Invoke(new Action(() =>
  961. {
  962. airCheckbox.Checked = listAir.Count > 0;
  963. airLable.Text = $"机票数据条数:{listAir.Count}";
  964. hotelCheckbox.Checked = listht.Count > 0;
  965. hotelLable.Text = $"酒店数据条数:{listht.Count}";
  966. gwCheckbox.Checked = listgw.Count > 0;
  967. gwLabel.Text = $"公务数据条数:{listgw.Count}";
  968. this.SublevelComboBox.Text = "";
  969. this.SublevelComboBox.DisplayMember = "Title";
  970. this.SublevelComboBox.ValueMember = "Id";
  971. this.SublevelComboBox.DataSource = listAir;
  972. }));
  973. }
  974. });
  975. }
  976. private void execTemp(int tempValue, int diid, Grp_DelegationInfo di)
  977. {
  978. var dropItem = dropDownItem.FirstOrDefault(x => x.Id == tempValue);
  979. var pathArr = Regex.Split(dropItem.Path, "#").ToList();
  980. var UsePath = string.Empty;
  981. foreach (var itemF in pathArr)
  982. {
  983. if (File.Exists(itemF))
  984. {
  985. UsePath = itemF;
  986. break;
  987. }
  988. }
  989. if (string.IsNullOrWhiteSpace(UsePath))
  990. {
  991. var txtPath = GetApplicationPath() + "\\path.txt";
  992. if (File.Exists(txtPath))
  993. {
  994. //建立文件读取流对象
  995. StreamReader str = new StreamReader(txtPath);
  996. List<string> list = new List<string>();
  997. //获取每行字符
  998. string line;
  999. while ((line = str.ReadLine()) != null)
  1000. {
  1001. list.Add(line);
  1002. }
  1003. str.Close();
  1004. foreach (var item in list)
  1005. {
  1006. if (File.Exists(item))
  1007. {
  1008. UsePath = item;
  1009. break;
  1010. }
  1011. }
  1012. }
  1013. else
  1014. {
  1015. using (var sw = File.CreateText(txtPath))
  1016. {
  1017. sw.WriteLine("path"); // 写入字符串
  1018. }
  1019. MessageBoxEx.Show(this, "创建成功!", "请配置文件路径!");
  1020. return;
  1021. }
  1022. }
  1023. var _travelList = ExecuteDbContext((db => { return db.Grp_TravelList.AsNoTracking().Where(x => x.Diid == diid && x.IsDel == 0).ToList(); }));
  1024. //设置源文件
  1025. Document doc = new Document(UsePath);
  1026. // 创建 DocumentBuilder 对象
  1027. DocumentBuilder builder = new DocumentBuilder(doc);
  1028. var titleCount = 1;
  1029. var conterCount = 1;
  1030. var index = 1;
  1031. foreach (var item in _travelList)
  1032. {
  1033. //移动到文档的最后一个段落之后
  1034. builder.MoveToDocumentEnd();
  1035. builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
  1036. // 开始书签
  1037. builder.StartBookmark("title" + titleCount);
  1038. // 设置文本格式为加粗
  1039. builder.Font.Bold = true;
  1040. builder.Font.Name = "KaiTi";
  1041. builder.Font.Size = 18;
  1042. // 插入加粗的文本
  1043. builder.Writeln($"{item.Date}({item.WeekDay},第{index}天)");
  1044. // 结束书签
  1045. builder.EndBookmark("title" + titleCount);
  1046. titleCount++;
  1047. // 在文档末尾插入一个空段落
  1048. builder.Writeln();
  1049. builder.MoveToDocumentEnd();
  1050. builder.ParagraphFormat.Alignment = ParagraphAlignment.Left;
  1051. // 取消文本格加粗
  1052. builder.Font.Bold = false;
  1053. builder.Font.Name = "仿宋";
  1054. // 开始书签
  1055. builder.StartBookmark("conter" + conterCount);
  1056. // 插入文本
  1057. //builder.Writeln(item.Trip);
  1058. // 解析字符串中的时间和内容部分
  1059. string[] lines = item.Trip.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
  1060. // 使用正则表达式匹配时间格式
  1061. Regex timeRegex = new Regex(@"^\d{2}:\d{2}");
  1062. // 遍历每一行并格式化
  1063. foreach (string line in lines)
  1064. {
  1065. // 使用正则表达式提取时间
  1066. Match match = timeRegex.Match(line.Trim());
  1067. if (match.Success)
  1068. {
  1069. string timePart = match.Value; // 时间部分
  1070. string descriptionPart = line.Substring(match.Length).Trim(); // 描述部分
  1071. // 设置段落格式(制表符分隔时间和描述)
  1072. builder.ParagraphFormat.TabStops.Clear();
  1073. builder.ParagraphFormat.TabStops.Add(new TabStop(50)); // 设置制表符位置为50
  1074. // 插入时间
  1075. builder.Write(timePart + "\t");
  1076. if (descriptionPart.Length > 19)
  1077. {
  1078. builder.Writeln(descriptionPart.Substring(0, 19));
  1079. builder.Writeln(" " + descriptionPart.Substring(19));
  1080. }
  1081. else
  1082. {
  1083. // 插入描述并换行
  1084. builder.Writeln(descriptionPart);
  1085. }
  1086. }
  1087. else
  1088. {
  1089. // 如果没有时间,直接插入整段文字
  1090. builder.Writeln(line);
  1091. }
  1092. }
  1093. // 结束书签
  1094. builder.EndBookmark("conter" + conterCount);
  1095. conterCount++;
  1096. builder.Writeln();
  1097. index++;
  1098. }
  1099. CheckAndCenterParagraphs(doc);
  1100. string strFileName = "C:\\OP行程单\\" + di.TeamName + "贵州行程.docx";
  1101. try
  1102. {
  1103. doc.Save(strFileName, Aspose.Words.SaveFormat.Docx);
  1104. MessageBoxEx.Show(this, "文件导出完成!");
  1105. System.Diagnostics.Process.Start("Explorer.exe", "/select," + strFileName);
  1106. }
  1107. catch (Exception ex)
  1108. {
  1109. MessageBoxEx.Show(this, "请关闭打开的文件后重试!");
  1110. }
  1111. }
  1112. private static string GetApplicationPath()
  1113. {
  1114. string path = System.Windows.Forms.Application.StartupPath;
  1115. string folderName = String.Empty;
  1116. while (folderName.ToLower() != "bin")
  1117. {
  1118. path = path.Substring(0, path.LastIndexOf("\\"));
  1119. folderName = path.Substring(path.LastIndexOf("\\") + 1);
  1120. }
  1121. return path.Substring(0, path.LastIndexOf("\\") + 1);
  1122. }
  1123. private async Task<object> QueryOfficialActivitiesById(int id, int diid)
  1124. {
  1125. var clientHelper = new HttpClientHelper();
  1126. var postData = new { Id = id, DiId = diid };
  1127. string postResponse = await clientHelper.PostAsync("http://132.232.92.186:8888/api/Resource/QueryOfficialActivitiesById", postData);
  1128. var ApiResult_JObject = JObject.Parse(postResponse);
  1129. if (int.TryParse(ApiResult_JObject["code"].ToString(), out int code_int) && code_int == 200)
  1130. {
  1131. try
  1132. {
  1133. ApiResult_JObject = JObject.Parse(ApiResult_JObject["data"].ToString());
  1134. ApiResult_JObject = JObject.Parse(ApiResult_JObject["translatorInfo"].ToString());
  1135. return new
  1136. {
  1137. Name = ApiResult_JObject["name"].ToString(),
  1138. Success = true,
  1139. Tel = ApiResult_JObject["tel"].ToString(),
  1140. };
  1141. }
  1142. catch (Exception)
  1143. {
  1144. return new
  1145. {
  1146. Name = "",
  1147. Success = true,
  1148. Tel = "",
  1149. };
  1150. }
  1151. }
  1152. return new
  1153. {
  1154. Success = false,
  1155. };
  1156. }
  1157. //导入详细行程
  1158. public async void btnImportInfo()
  1159. {
  1160. var diid = -1;
  1161. try
  1162. {
  1163. var dele = (comb_Delegation.SelectedItem as Grp_DelegationInfo);
  1164. diid = dele.Id;
  1165. }
  1166. catch (Exception)
  1167. {
  1168. //lblImport.Text = "请正确的选择团组!";
  1169. //lblImport.ForeColor = Color.Black;
  1170. MessageBoxEx.Show(this, "请正确的选择团组!", "提示");
  1171. return;
  1172. }
  1173. var codeId = -1;
  1174. try
  1175. {
  1176. if (!int.TryParse(SublevelComboBox.SelectedValue.ToString(), out codeId))
  1177. {
  1178. throw new Exception();
  1179. }
  1180. }
  1181. catch (Exception)
  1182. {
  1183. MessageBoxEx.Show(this, "请正确的选择黑屏代码!", "提示");
  1184. return;
  1185. }
  1186. DataTable resultTable = null;
  1187. try
  1188. {
  1189. resultTable = GetTableByBlackCode(diid, codeId);
  1190. }
  1191. catch (Exception ex)
  1192. {
  1193. MessageBoxEx.Show(this, "黑屏代码有误!", "提示");
  1194. return;
  1195. }
  1196. if (resultTable.Rows.Count == 0 || string.IsNullOrWhiteSpace(resultTable.Rows[0][1].ToString()))
  1197. {
  1198. MessageBoxEx.Show(this, "黑屏代码有误! ", "提示");
  1199. return;
  1200. }
  1201. foreach (DataRow row in resultTable.Rows)
  1202. {
  1203. if (!string.IsNullOrWhiteSpace(row["Error"].ToString()))
  1204. {
  1205. MessageBoxEx.Show(this, "黑屏代码有误! " + row["Error"].ToString(), "提示");
  1206. return;
  1207. }
  1208. }
  1209. if (!int.TryParse(tripItemSelect.SelectedValue.ToString(), out int selectValue) || selectValue != 1)
  1210. {
  1211. var find = dropDownItem.Find(x => x.Id == selectValue) ?? new TripItem
  1212. {
  1213. Name = "Error"
  1214. };
  1215. MessageBoxEx.Show(find.Name + "暂无详细行程!");
  1216. return;
  1217. }
  1218. var isVPN = await Task.Run(() =>
  1219. {
  1220. var isVpn = GetDirectionByGoogleApi("北京", "上海");
  1221. if (Convert.ToInt32(isVpn["code"]) == -1)
  1222. {
  1223. return false;
  1224. }
  1225. return true;
  1226. });
  1227. if (!isVPN) { MessageBoxEx.Show(this, "请打开VPN!"); return; }
  1228. var timeArr = GetTimeListByDataTable(resultTable);
  1229. //本团行程单数据
  1230. List<Grp_TravelList> listTravel = ExecuteDbContext((db => { return db.Grp_TravelList.AsNoTracking().Where(x => x.Diid == diid && x.IsDel == 0).ToList(); }));
  1231. var tags = CheckAndCenterTags(diid);
  1232. ChildThreadExceptionHandler wt = new
  1233. ChildThreadExceptionHandler((msg) =>
  1234. {
  1235. if (this.InvokeRequired)
  1236. {
  1237. this.Invoke(new Action(() =>
  1238. {
  1239. MessageBoxEx.Show(this, msg);
  1240. }));
  1241. }
  1242. else
  1243. {
  1244. MessageBoxEx.Show(this, msg);
  1245. }
  1246. });
  1247. Thread threadExec = new Thread(() =>
  1248. {
  1249. var lockTaken = Monitor.TryEnter(Key, TimeSpan.FromMilliseconds(1));
  1250. try
  1251. {
  1252. if (lockTaken)
  1253. {
  1254. using (var db = CreateDbContext())
  1255. {
  1256. using (var sw = db.Database.BeginTransaction())
  1257. {
  1258. var NewListTravel = new List<Grp_TravelList>();
  1259. var index = 1;
  1260. var stopCity = string.Empty;
  1261. var nextDayNum = 0;
  1262. var nextTrip = string.Empty;
  1263. Res_ThreeCode stopCity_Object = null;
  1264. Res_ThreeCode playCity_Object = null;
  1265. bool isTrade = false;
  1266. //本团车导地接信息
  1267. //var listctg = db.Grp_CarTouristGuideGroundReservations.Where(x => x.DiId == diid && x.IsDel == 0).ToList();
  1268. //本团酒店信息
  1269. var listht = db.Grp_HotelReservations.Where(x => x.DiId == diid && x.IsDel == 0).ToList();
  1270. //公务出访信息
  1271. var listgw = db.Res_OfficialActivities.Where(x => x.DiId == diid && x.IsDel == 0).ToList();
  1272. //邀请公务资料
  1273. //var listgwzl = db.Grp_InvitationOfficialActivities.Where(x => x.DiId == diid && x.IsDel == 0).ToList();
  1274. //团组餐食信息
  1275. var listMeal = db.Grp_RestaurantInfo.Where(x => x.GroupId == diid && x.IsDel == 0).ToList();
  1276. Grp_HotelReservations lastHotel = null;
  1277. foreach (var item in timeArr)
  1278. {
  1279. string trip = string.Empty;
  1280. string weekDay = string.Empty;
  1281. DateTime time = DateTime.Now;
  1282. var footIsAddDay = false;
  1283. if (DateTime.TryParse(item, out time))
  1284. {
  1285. weekDay = weekdays[(int)time.DayOfWeek];
  1286. }
  1287. else
  1288. {
  1289. weekDay = "日期格式不正确!";
  1290. }
  1291. var empty = "【未收入该三字码!请机票同事录入】";
  1292. var tabSelect = resultTable.Select(string.Format("Day = '{0}'", item));
  1293. var isMoreTraffic = false;
  1294. if (nextDayNum > 0)
  1295. {
  1296. trip += nextTrip;
  1297. nextDayNum--;
  1298. if (nextDayNum > 0)
  1299. {
  1300. NewListTravel.Add(new Grp_TravelList
  1301. {
  1302. CreateTime = DateTime.Now,
  1303. CreateUserId = 0,
  1304. Diid = diid,
  1305. Date = Convert.ToDateTime(item).ToString("M月d日"),
  1306. Trip = $"{playCity_Object.City}/{stopCity_Object.City}\r\n飞行中",
  1307. WeekDay = weekDay,
  1308. Days = index,
  1309. Traffic_First = "飞机",
  1310. Traffic_Second = "汽车",
  1311. Diffgroup = 1,
  1312. Issel = 1,
  1313. IsDel = 0,
  1314. });
  1315. index++;
  1316. continue;
  1317. }
  1318. else
  1319. {
  1320. nextTrip = string.Empty;
  1321. }
  1322. }
  1323. if (tabSelect.Length > 0)
  1324. {
  1325. isMoreTraffic = true;
  1326. var takeOffTime = DateTime.Parse(item);
  1327. var fallToTime = DateTime.Parse(item);
  1328. Res_ThreeCode start_Object = null;
  1329. Res_ThreeCode end_Object = null;
  1330. foreach (var tabRow in tabSelect)
  1331. {
  1332. if (nextDayNum == 0)
  1333. {
  1334. nextDayNum = Convert.ToInt32(tabRow["Sign"]);
  1335. }
  1336. takeOffTime = DateTime.Parse(item);
  1337. fallToTime = DateTime.Parse(item);
  1338. var takeOff = tabRow["StartTime"].ToString();
  1339. var fallTo = tabRow["EndTime"].ToString();
  1340. takeOffTime = takeOffTime.AddHours(int.Parse(takeOff.Substring(0, 2)));
  1341. takeOffTime = takeOffTime.AddMinutes(int.Parse(takeOff.Substring(2, 2)));
  1342. fallToTime = fallToTime.AddHours(int.Parse(fallTo.Substring(0, 2)));
  1343. fallToTime = fallToTime.AddMinutes(int.Parse(fallTo.Substring(2, 2)));
  1344. var threeCode = tabRow["Three"].ToString();
  1345. var start = threeCode.Substring(0, 3);
  1346. var end = threeCode.Substring(3, 3);
  1347. stopCity = end;
  1348. start_Object = db.Res_ThreeCode.FirstOrDefault(x => x.Three.ToUpper() == start.ToUpper());
  1349. end_Object = db.Res_ThreeCode.FirstOrDefault(x => x.Three.ToUpper() == end.ToUpper());
  1350. if (start_Object == null)
  1351. {
  1352. start_Object = new Res_ThreeCode()
  1353. {
  1354. AirPort = empty,
  1355. AirPort_En = empty,
  1356. City = empty,
  1357. Country = empty,
  1358. Four = empty,
  1359. Three = empty,
  1360. };
  1361. }
  1362. if (end_Object == null)
  1363. {
  1364. end_Object = new Res_ThreeCode()
  1365. {
  1366. AirPort = empty,
  1367. AirPort_En = empty,
  1368. City = empty,
  1369. Country = empty,
  1370. Four = empty,
  1371. Three = empty,
  1372. };
  1373. }
  1374. stopCity_Object = end_Object;
  1375. playCity_Object = start_Object;
  1376. //航班号
  1377. string flightcode = tabRow["Fliagtcode"].ToString();
  1378. if (isTrade && !trip.EndsWith("\r\n") && !string.IsNullOrWhiteSpace(trip))
  1379. {
  1380. trip += "\r\n";
  1381. }
  1382. if (!string.IsNullOrWhiteSpace(trip) && tabSelect.First().Equals(item))
  1383. {
  1384. trip = trip.Insert(0, $"{start_Object.City}/{end_Object.City}\r\n");
  1385. }
  1386. else
  1387. {
  1388. trip += $"{start_Object.City}/{end_Object.City}\r\n";
  1389. }
  1390. if (!isTrade)
  1391. {
  1392. var dayBeforeTrip = string.Empty;
  1393. if (index == 1)
  1394. {
  1395. if (takeOffTime.AddHours(-3).Day < takeOffTime.Day)
  1396. {
  1397. dayBeforeTrip += $"{takeOffTime.AddHours(-3).ToString("HH:mm")} 抵达{start_Object.AirPort}{tabRow["StartBuilding"].ToString().Trim()}航站楼,办理登机手续:";
  1398. }
  1399. else
  1400. {
  1401. trip += $"{takeOffTime.AddHours(-3).ToString("HH:mm")} 抵达{start_Object.AirPort}{tabRow["StartBuilding"].ToString().Trim()}航站楼,办理登机手续:\r\n";
  1402. }
  1403. }
  1404. else if (index == timeArr.Count)
  1405. {
  1406. trip += $"{takeOffTime.AddHours(-3).ToString("HH:mm")} 抵达{start_Object.AirPort}{tabRow["StartBuilding"].ToString().Trim()}航站楼,办理登机手续:\r\n";
  1407. if (takeOffTime.AddHours(-3).Hour > 9)
  1408. {
  1409. trip += "08:00 早餐于酒店;\r\n";
  1410. }
  1411. }
  1412. else
  1413. {
  1414. if (takeOffTime.AddHours(-2).Hour > 9)
  1415. {
  1416. trip += "08:00 早餐于酒店;\r\n";
  1417. }
  1418. if (takeOffTime.Hour >= 12)
  1419. {
  1420. trip += "09:00 公务活动;\r\n";
  1421. }
  1422. if (takeOffTime.Hour > 14)
  1423. {
  1424. trip += "10:30 公务活动;\r\n";
  1425. }
  1426. if (takeOffTime.Hour > 15)
  1427. {
  1428. trip += "12:00 午餐于当地餐厅;\r\n";
  1429. trip += "14:00 公务活动;\r\n";
  1430. }
  1431. if (takeOffTime.Hour > 17)
  1432. {
  1433. trip += "16:00 公务活动;\r\n";
  1434. }
  1435. var nineTime = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 09, 00, 00));
  1436. var halfPasTen = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 10, 30, 00));
  1437. var twoPointsPM = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 14, 00, 00));
  1438. var fourPointsPM = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 16, 00, 00));
  1439. if (!string.IsNullOrWhiteSpace(nineTime))
  1440. {
  1441. trip = trip.Replace("09:00 公务活动", nineTime);
  1442. }
  1443. if (!string.IsNullOrWhiteSpace(halfPasTen))
  1444. {
  1445. trip = trip.Replace("10:30 公务活动", halfPasTen);
  1446. }
  1447. if (!string.IsNullOrWhiteSpace(twoPointsPM))
  1448. {
  1449. trip = trip.Replace("14:00 公务活动", twoPointsPM);
  1450. }
  1451. if (!string.IsNullOrWhiteSpace(fourPointsPM))
  1452. {
  1453. trip = trip.Replace("16:00 公务活动", fourPointsPM);
  1454. }
  1455. var mealInfo = GetTimeMealInfo(ref listMeal, new DateTime(time.Year, time.Month, time.Day, 12, 00, 00));
  1456. if (!string.IsNullOrWhiteSpace(mealInfo))
  1457. {
  1458. trip = trip.Replace("12:00 午餐于当地餐厅", mealInfo);
  1459. }
  1460. //--提前俩个小时
  1461. trip += $"{takeOffTime.AddHours(-2).ToString("HH:mm")} 抵达{start_Object.AirPort}{tabRow["StartBuilding"].ToString().Trim()}航站楼,办理登机手续:\r\n";
  1462. }
  1463. if (!string.IsNullOrWhiteSpace(dayBeforeTrip))
  1464. {
  1465. {
  1466. NewListTravel.Insert(0, new Grp_TravelList
  1467. {
  1468. CreateTime = DateTime.Now,
  1469. CreateUserId = 0,
  1470. Diid = diid,
  1471. Date = Convert.ToDateTime(item).AddDays(-1).ToString("M月d日"),
  1472. Trip = $"{start_Object.City}\r\n{dayBeforeTrip}",
  1473. WeekDay = weekdays[(int)time.AddDays(-1).DayOfWeek],
  1474. Days = 0,
  1475. Traffic_First = "汽车",
  1476. Traffic_Second = "",
  1477. Diffgroup = 1,
  1478. Issel = 1,
  1479. IsDel = 0,
  1480. });
  1481. }
  1482. }
  1483. }
  1484. var aircompany = db.Res_AirCompany.FirstOrDefault(x => x.ShortCode.ToUpper() == flightcode.Substring(0, 2).ToUpper() && x.IsDel == 0);
  1485. var hsEmpty = "【此航司" + flightcode.Substring(0, 2).ToUpper() + "未收录,请机票同事录入】";
  1486. if (aircompany == null)
  1487. {
  1488. aircompany = new Res_AirCompany
  1489. {
  1490. CnName = hsEmpty,
  1491. EnName = hsEmpty,
  1492. ShortCode = hsEmpty,
  1493. };
  1494. }
  1495. //机型判断
  1496. string airModel = tabRow["AirModel"].ToString();
  1497. airModel = GetLonger(airModel.Substring(0, 1)) + airModel;
  1498. string flightTime = tabRow["FlightTime"].ToString();
  1499. flightTime = ParseBlackTime(flightTime);
  1500. trip += $"{takeOffTime.ToString("HH:mm")} 搭乘{aircompany.CnName}{tabRow[0].ToString().Trim()}航班,由{start_Object.City}飞往{end_Object.City};\r\n ({start_Object.AirPort}/{end_Object.AirPort} 机型:{airModel} 飞行时间{flightTime});\r\n";
  1501. isTrade = Convert.ToInt32(tabRow["isTransitShipment"]) == 1;
  1502. if (isTrade)
  1503. {
  1504. if (nextDayNum > 0)
  1505. {
  1506. nextTrip += $"{fallToTime.ToString("HH:mm")} 抵达{end_Object.AirPort}{tabRow["EndBuilding"].ToString().Trim()}航站楼(中转时间:行李直达);\r\n";
  1507. }
  1508. else
  1509. {
  1510. trip += $"{fallToTime.ToString("HH:mm")} 抵达{end_Object.AirPort}{tabRow["EndBuilding"].ToString().Trim()}航站楼(中转时间:行李直达);\r\n";
  1511. }
  1512. }
  1513. else
  1514. {
  1515. if (nextDayNum > 0)
  1516. {
  1517. nextTrip += $"{fallToTime.ToString("HH:mm")} 抵达{end_Object.AirPort}{tabRow["EndBuilding"].ToString().Trim()}航站楼,办理入境手续,之后前往提取行李;\r\n";
  1518. if (timeArr.Last().Equals(item))
  1519. {
  1520. nextTrip = $"{fallToTime.ToString("HH:mm")} 抵达{end_Object.AirPort}{tabRow["EndBuilding"].ToString().Trim()}航站楼,办理入境手续,之后前往提取行李,圆满结束此次访问之行!";
  1521. }
  1522. }
  1523. else
  1524. {
  1525. trip += $"{fallToTime.ToString("HH:mm")} 抵达{end_Object.AirPort}{tabRow["EndBuilding"].ToString().Trim()}航站楼,办理入境手续,之后前往提取行李;\r\n";
  1526. }
  1527. }
  1528. }
  1529. //var airArrive = fallToTime; //航班落地时间
  1530. time = fallToTime.AddHours(1.5); //出机场一个半小时
  1531. string Time = string.Empty;
  1532. string Distance = string.Empty;
  1533. int GetGoogleResult = 0;
  1534. int GetDistResult = 0;
  1535. JObject Result = null;
  1536. try
  1537. {
  1538. Result = GetDirectionByGoogleApi(end_Object.AirPort, end_Object.City + "市区");
  1539. Time = Result["routes"][0]["legs"][0]["duration"]["text"].ToString().Replace(" ", "").Trim();
  1540. Distance = Result["routes"][0]["legs"][0]["distance"]["text"].ToString().Replace(" ", "").Trim();
  1541. // 替换单位为中文
  1542. Time = Time.Replace("hours", "小时").Replace("hour", "小时").Replace("mins", "分钟");
  1543. Distance = Distance.Contains("mi")
  1544. ? (decimal.Parse(Distance.Split(new string[] { "mi" }, StringSplitOptions.None)[0]) * conversion).ToString("#0.00") + " 公里"
  1545. : Distance.Replace("km", "公里");
  1546. // 提取时间和距离的数值部分,并向上取5的倍数
  1547. int timeMinutes = (int.Parse(ExtractDigitsBeforeDecimal(Time)) + 4) / 5 * 5;
  1548. int distanceKm = (int.Parse(ExtractDigitsBeforeDecimal(Distance)) + 4) / 5 * 5;
  1549. // 格式化时间
  1550. string formattedTime = string.Empty;
  1551. if (timeMinutes / 60 > 0) formattedTime = $"{(timeMinutes / 60):D2}小时{(timeMinutes % 60):D2}分钟";
  1552. else formattedTime = $"{(timeMinutes % 60):D2}分钟";
  1553. // 更新结果
  1554. Time = formattedTime;
  1555. Distance = $"{distanceKm}公里";
  1556. GetGoogleResult = timeMinutes;
  1557. }
  1558. catch (Exception ex)
  1559. {
  1560. Time = "未知!";
  1561. Distance = "未知!";
  1562. }
  1563. if (nextDayNum == 0)
  1564. {
  1565. if (index != timeArr.Count)
  1566. {
  1567. trip += $"{time.ToString("HH:mm")} 搭乘专车前往市区({end_Object.AirPort} - {end_Object.City}市区 路程{Distance},耗时{Time});";
  1568. }
  1569. time = time.AddMinutes(GetGoogleResult); //到达市区时间
  1570. if (index == timeArr.Count)
  1571. {
  1572. trip = trip.RemoveEnd("\r\n");
  1573. if (trip.EndsWith(";"))
  1574. {
  1575. trip = trip.RemoveEnd(";");
  1576. trip += ",";
  1577. }
  1578. trip += "圆满结束此次访问之行!";
  1579. NewListTravel.Add(new Grp_TravelList
  1580. {
  1581. CreateTime = DateTime.Now,
  1582. CreateUserId = 0,
  1583. Diid = diid,
  1584. Date = Convert.ToDateTime(item).ToString("M月d日"),
  1585. Trip = trip,
  1586. WeekDay = weekDay,
  1587. Days = index,
  1588. Traffic_First = "飞机",
  1589. Traffic_Second = "汽车",
  1590. Diffgroup = 1,
  1591. Issel = 1,
  1592. IsDel = 0,
  1593. });
  1594. continue;
  1595. }
  1596. if (time.Day != fallToTime.Day) //超出一天
  1597. {
  1598. NewListTravel.Add(new Grp_TravelList
  1599. {
  1600. CreateTime = DateTime.Now,
  1601. CreateUserId = 0,
  1602. Diid = diid,
  1603. Date = Convert.ToDateTime(item).ToString("M月d日"),
  1604. Trip = trip,
  1605. WeekDay = weekDay,
  1606. Days = index,
  1607. Traffic_First = "飞机",
  1608. Traffic_Second = "汽车",
  1609. Diffgroup = 1,
  1610. Issel = 1,
  1611. IsDel = 0,
  1612. });
  1613. continue;
  1614. }
  1615. if (time.Hour < 9) // && (airArrive < new DateTime(airArrive.Year,airArrive.Month,airArrive.Day,6, 30, 0))
  1616. {
  1617. var nineTime = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 09, 00, 00));
  1618. var halfPasTen = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 10, 30, 00));
  1619. trip += @"
  1620. 09:00 公务活动;
  1621. 10:30 公务活动;";
  1622. if (!string.IsNullOrWhiteSpace(nineTime))
  1623. {
  1624. trip = trip.Replace("09:00 公务活动", nineTime);
  1625. }
  1626. if (!string.IsNullOrWhiteSpace(halfPasTen))
  1627. {
  1628. trip = trip.Replace("10:30 公务活动", halfPasTen);
  1629. }
  1630. }
  1631. else if (time.Hour < 10)
  1632. {
  1633. var halfPasTen = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 10, 30, 00));
  1634. trip += @"
  1635. 10:30 公务活动;";
  1636. if (!string.IsNullOrWhiteSpace(halfPasTen))
  1637. {
  1638. trip = trip.Replace("10:30 公务活动", halfPasTen);
  1639. }
  1640. }
  1641. if (time.Hour < 12)
  1642. {
  1643. var mealInfo = GetTimeMealInfo(ref listMeal, new DateTime(time.Year, time.Month, time.Day, 12, 00, 00));
  1644. if (!string.IsNullOrWhiteSpace(mealInfo))
  1645. {
  1646. trip += $"\r\n{mealInfo}";
  1647. }
  1648. else
  1649. {
  1650. trip += $"\r\n{time.ToString("HH:mm")} 午餐于当地餐厅;";
  1651. }
  1652. }
  1653. if (time < new DateTime(time.Year, time.Month, time.Day, 14, 30, 0))
  1654. {
  1655. var twoPointsPM = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 14, 00, 00));
  1656. var fourPointsPM = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 16, 00, 00));
  1657. trip += @"
  1658. 14:00 公务活动;
  1659. 16:00 公务活动;";
  1660. if (!string.IsNullOrWhiteSpace(twoPointsPM))
  1661. {
  1662. trip = trip.Replace("14:00 公务活动", twoPointsPM);
  1663. }
  1664. if (!string.IsNullOrWhiteSpace(fourPointsPM))
  1665. {
  1666. trip = trip.Replace("16:00 公务活动", fourPointsPM);
  1667. }
  1668. }
  1669. else if (time.Hour < 16)
  1670. {
  1671. var fourPointsPM = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 16, 00, 00));
  1672. trip += @"
  1673. 16:00 公务活动;";
  1674. if (!string.IsNullOrWhiteSpace(fourPointsPM))
  1675. {
  1676. trip = trip.Replace("16:00 公务活动", fourPointsPM);
  1677. }
  1678. }
  1679. if (time.Hour < 18)
  1680. {
  1681. var mealInfo = GetTimeMealInfo(ref listMeal, new DateTime(time.Year, time.Month, time.Day, 18, 00, 00));
  1682. if (!string.IsNullOrWhiteSpace(mealInfo))
  1683. {
  1684. trip += $"\r\n{mealInfo}";
  1685. }
  1686. else
  1687. {
  1688. trip += $"\r\n18:00 晚餐于当地餐厅;";
  1689. }
  1690. time = new DateTime(time.Year, time.Month, time.Day, 18, 0, 0);
  1691. }
  1692. if (time.Hour < 19)
  1693. {
  1694. trip += $"\r\n19:00 入住酒店休息;";
  1695. }
  1696. //time = time.AddHours(1);
  1697. //trip += $"\r\n{time.ToString("HH:mm")} 搭乘专车前往酒店,抵达后办理入住;";
  1698. var htTime = DateTime.Now;
  1699. var htTimeOut = DateTime.Now;
  1700. foreach (var h in listht)
  1701. {
  1702. if (DateTime.TryParse(h.CheckInDate, out htTime) && DateTime.TryParse(h.CheckOutDate, out htTimeOut))
  1703. {
  1704. if (htTime <= Convert.ToDateTime(item) && htTimeOut >= Convert.ToDateTime(item))
  1705. {
  1706. lastHotel = h;
  1707. listht.Remove(h);
  1708. trip = trip.Replace("\r\n19:00 入住酒店休息;", string.Empty);
  1709. #region 酒店详细信息
  1710. trip += $"\r\n{time.AddHours(1).ToString("HH:mm")} 乘车前往酒店";
  1711. trip += $"\r\n{time.AddHours(2).ToString("HH:mm")} 抵达酒店办理入住手续";
  1712. trip = trip + "\r\n"
  1713. + " 酒店名称:" + h.HotelName + "\r\n"
  1714. + " 酒店地址:" + h.HotelAddress + "\r\n"
  1715. + " 酒店电话:" + h.HotelTel + " 酒店传真:" + (string.IsNullOrWhiteSpace(h.HotelFax) ? "-" : h.HotelFax);
  1716. break;
  1717. #endregion
  1718. }
  1719. }
  1720. }
  1721. }
  1722. }
  1723. else
  1724. {
  1725. var end_Object = db.Res_ThreeCode.FirstOrDefault(x => x.Three.ToUpper() == stopCity.ToUpper());
  1726. if (end_Object == null)
  1727. {
  1728. end_Object = new Res_ThreeCode()
  1729. {
  1730. AirPort = empty,
  1731. AirPort_En = empty,
  1732. City = empty,
  1733. Country = empty,
  1734. Four = empty,
  1735. Three = empty,
  1736. };
  1737. }
  1738. trip += $"{end_Object.City}\r\n";
  1739. trip += $@"08:00 早餐于酒店;{(lastHotel != null ? $"(酒店名称:{lastHotel.HotelName})" : "")}
  1740. 09:00 公务活动;
  1741. 10:30 公务活动;
  1742. 12:00 午餐于当地餐厅;
  1743. 14:00 公务活动;
  1744. 16:00 公务活动;
  1745. 18:00 晚餐于当地餐厅;
  1746. 19:00 入住酒店休息;";
  1747. var nineTime = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 09, 00, 00));
  1748. var halfPasTen = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 10, 30, 00));
  1749. var twoPointsPM = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 14, 00, 00));
  1750. var fourPointsPM = GetTimeGwInfo(ref listgw, new DateTime(time.Year, time.Month, time.Day, 16, 00, 00));
  1751. var mealInfo = GetTimeMealInfo(ref listMeal, new DateTime(time.Year, time.Month, time.Day, 12, 00, 00));
  1752. var mealInfoPM = GetTimeMealInfo(ref listMeal, new DateTime(time.Year, time.Month, time.Day, 18, 00, 00));
  1753. if (!string.IsNullOrWhiteSpace(mealInfo))
  1754. {
  1755. trip = trip.Replace("12:00 午餐于当地餐厅", mealInfo);
  1756. }
  1757. if (!string.IsNullOrWhiteSpace(mealInfoPM))
  1758. {
  1759. trip = trip.Replace("18:00 晚餐于当地餐厅", mealInfoPM);
  1760. }
  1761. if (!string.IsNullOrWhiteSpace(nineTime))
  1762. {
  1763. trip = trip.Replace("09:00 公务活动", nineTime);
  1764. }
  1765. if (!string.IsNullOrWhiteSpace(halfPasTen))
  1766. {
  1767. trip = trip.Replace("10:30 公务活动", halfPasTen);
  1768. }
  1769. if (!string.IsNullOrWhiteSpace(twoPointsPM))
  1770. {
  1771. trip = trip.Replace("14:00 公务活动", twoPointsPM);
  1772. }
  1773. if (!string.IsNullOrWhiteSpace(fourPointsPM))
  1774. {
  1775. trip = trip.Replace("16:00 公务活动", fourPointsPM);
  1776. }
  1777. }
  1778. string[] traffic = new string[] { "汽车", "飞机" };
  1779. if (!isMoreTraffic)
  1780. {
  1781. traffic = new string[] { "汽车", "" };
  1782. }
  1783. NewListTravel.Add(new Grp_TravelList
  1784. {
  1785. CreateTime = DateTime.Now,
  1786. CreateUserId = 0,
  1787. Diid = diid,
  1788. Date = Convert.ToDateTime(item).ToString("M月d日"),
  1789. Trip = trip.RemoveEnd("\r\n"),
  1790. WeekDay = weekDay,
  1791. Days = index,
  1792. Traffic_First = traffic[0],
  1793. Traffic_Second = traffic[1],
  1794. Diffgroup = 1,
  1795. Issel = 1,
  1796. IsDel = 0,
  1797. });
  1798. index++;
  1799. }
  1800. //NewListTravel.ForEach(x =>
  1801. //{
  1802. // x.Trip = x.Trip.Replace("\r\n14:00 公务活动;", string.Empty)
  1803. // .Replace("\r\n16:00 公务活动;", string.Empty)
  1804. // .Replace("\r\n09:00 公务活动;", string.Empty)
  1805. // .Replace("\r\n10:30 公务活动;", string.Empty);
  1806. //});
  1807. if (nextDayNum > 0)
  1808. {
  1809. for (int i = 0; i < nextDayNum; i++)
  1810. {
  1811. NewListTravel.Add(new Grp_TravelList
  1812. {
  1813. CreateTime = DateTime.Now,
  1814. CreateUserId = 0,
  1815. Diid = diid,
  1816. Date = Convert.ToDateTime(timeArr[timeArr.Count - 1]).AddDays(i + 1).ToString("M月d日"),
  1817. Trip = $"{stopCity_Object.City}\r\n{nextTrip}",
  1818. WeekDay = weekdays[(int)Convert.ToDateTime(timeArr[timeArr.Count - 1]).AddDays(i + 1).DayOfWeek],
  1819. Days = index,
  1820. Traffic_First = "飞机",
  1821. Traffic_Second = "",
  1822. Diffgroup = 1,
  1823. Issel = 1,
  1824. IsDel = 0,
  1825. });
  1826. }
  1827. }
  1828. //处理标记
  1829. foreach (var item in tags)
  1830. {
  1831. bool isEnter = false;
  1832. string QueryTag = item.QueryTag;
  1833. if (QueryTag.Contains("\r\n\r\n"))
  1834. {
  1835. QueryTag = QueryTag.Replace("\r\n\r\n", "\r\n");
  1836. isEnter = true;
  1837. }
  1838. var NewListTravelToTags = NewListTravel
  1839. .Where(x => x.Trip.Contains(QueryTag)
  1840. && x.Date == item.Date.ToString("M月d日"))
  1841. .ToList();
  1842. if (NewListTravelToTags.Count > 0 && !item.IsFinally)
  1843. {
  1844. foreach (var x in NewListTravelToTags)
  1845. {
  1846. var tagIndex = x.Trip.IndexOf(QueryTag);
  1847. tagIndex += tagContent.tagLength;
  1848. var insertStr = tagContent.TagFormat.Item1 + item.Content + tagContent.TagFormat.Item2;
  1849. if (isEnter)
  1850. {
  1851. insertStr += "\r\n";
  1852. }
  1853. x.Trip = x.Trip.Insert(tagIndex, insertStr);
  1854. NewListTravel.ForEach(x1 => { if (x.Date == x1.Date) { x1.Trip = x.Trip; } });
  1855. break;
  1856. }
  1857. }
  1858. else
  1859. {
  1860. foreach (var x in NewListTravel)
  1861. {
  1862. if (x.Date == item.Date.ToString("M月d日"))
  1863. {
  1864. x.Trip += "\r\n" + tagContent.TagFormat.Item1 + item.Content + tagContent.TagFormat.Item2;
  1865. break;
  1866. }
  1867. }
  1868. }
  1869. }
  1870. //比较上一次的文本
  1871. //foreach (var newItem in NewListTravel)
  1872. //{
  1873. // foreach (var oldItem in listTravel)
  1874. // {
  1875. // if (newItem.Date == oldItem.Date)
  1876. // {
  1877. // var str = CheckStr(oldItem.Trip, newItem.Trip);
  1878. // break;
  1879. // }
  1880. // }
  1881. //}
  1882. db.Grp_TravelList.RemoveRange(db.Grp_TravelList.Where(x => x.IsDel == 0 && x.Diid == diid));
  1883. db.Grp_TravelList.AddRange(NewListTravel);
  1884. db.SaveChanges();
  1885. sw.Commit();
  1886. wt.Invoke("数据导入完成!");
  1887. }
  1888. }
  1889. }
  1890. else
  1891. {
  1892. wt.Invoke("请勿重复点击!");
  1893. }
  1894. }
  1895. catch (Exception ex)
  1896. {
  1897. wt.Invoke("请等待程序执行!");
  1898. }
  1899. finally
  1900. {
  1901. if (lockTaken)
  1902. {
  1903. Monitor.Exit(Key);
  1904. }
  1905. }
  1906. });
  1907. threadExec.Start();
  1908. }
  1909. private delegate void ChildThreadExceptionHandler(string message);
  1910. //导出文件
  1911. private void btnOutput_Click(object sender, EventArgs e)
  1912. {
  1913. var diid = -1;
  1914. try
  1915. {
  1916. var dele = (comb_Delegation.SelectedItem as Grp_DelegationInfo);
  1917. diid = dele.Id;
  1918. }
  1919. catch (Exception)
  1920. {
  1921. //lblImport.Text = "请正确的选择团组!";
  1922. //lblImport.ForeColor = Color.Black;
  1923. MessageBoxEx.Show(this, "请正确的选择团组!", "提示");
  1924. return;
  1925. }
  1926. Grp_DelegationInfo di = ExecuteDbContext((db => db.Grp_DelegationInfo.FirstOrDefault(x => x.Id == diid && x.IsDel == 0)));
  1927. if (di == null)
  1928. {
  1929. MessageBoxEx.Show(this, "请选择正确的团组!");
  1930. return;
  1931. }
  1932. var tripTempValue = tripItemSelect.SelectedValue;
  1933. if (!int.TryParse(tripTempValue.ToString(), out int tempValue))
  1934. {
  1935. MessageBoxEx.Show("请选择模板类型!");
  1936. return;
  1937. }
  1938. // 指定的文字
  1939. var targetTextDic = new Dictionary<string, List<string>>();
  1940. if (tempValue != 1)
  1941. {
  1942. execTemp(tempValue, diid, di);
  1943. return;
  1944. }
  1945. var codeId = -1;
  1946. try
  1947. {
  1948. if (!int.TryParse(SublevelComboBox.SelectedValue.ToString(), out codeId))
  1949. {
  1950. throw new Exception();
  1951. }
  1952. }
  1953. catch (Exception)
  1954. {
  1955. MessageBoxEx.Show(this, "请正确的选择黑屏代码!", "提示");
  1956. return;
  1957. }
  1958. var _travelList = ExecuteDbContext((db => { return db.Grp_TravelList.AsNoTracking().Where(x => x.Diid == diid && x.IsDel == 0).ToList(); }));
  1959. var city = GetAllCity(diid, codeId);
  1960. //创建数据源Table
  1961. DataTable dtSource = new DataTable();
  1962. dtSource.Columns.Add("Days", typeof(string));
  1963. dtSource.Columns.Add("Date", typeof(string));
  1964. dtSource.Columns.Add("Week", typeof(string));
  1965. dtSource.Columns.Add("Traffic", typeof(string));
  1966. dtSource.Columns.Add("Trip", typeof(string));
  1967. //获取数据,放到datatable
  1968. foreach (var item in _travelList)
  1969. {
  1970. targetTextDic.Add(item.Date, ExtractContentBetweenTags(item.Trip, "[++]"));
  1971. item.Trip = item.Trip.Replace(tagContent.TagFormat.Item1, string.Empty)
  1972. .Replace(tagContent.TagFormat.Item2, string.Empty)
  1973. .Replace("[++]", string.Empty);
  1974. DataRow dr = dtSource.NewRow();
  1975. dr["Days"] = item.Days;
  1976. dr["Date"] = item.Date;
  1977. dr["Week"] = item.WeekDay;
  1978. dr["Traffic"] = item.Traffic_First
  1979. + "\r\n"
  1980. + item.Traffic_Second;
  1981. dr["Trip"] = item.Trip;
  1982. dtSource.Rows.Add(dr);
  1983. }
  1984. Dictionary<string, string> dic = new Dictionary<string, string>();
  1985. dic.Add("Dele", di.TeamName.ToString()); //+ GetNum(di.VisitDays.ToString())
  1986. dic.Add("City", city);
  1987. dic.Add("Days", di.VisitDays.ToString());
  1988. dic.Add("DeleCode", di.TourCode);
  1989. dic.Add("Pnum", di.VisitPNumber.ToString());
  1990. dic.Add("Pnum2", di.VisitPNumber.ToString());
  1991. //模板路径
  1992. string tempPath = @"C:\日行程3.docx";
  1993. //载入模板
  1994. Document doc = null;
  1995. DocumentBuilder builder = null;
  1996. try
  1997. {
  1998. //载入模板
  1999. doc = new Document(tempPath);
  2000. builder = new DocumentBuilder(doc);
  2001. }
  2002. catch (Exception)
  2003. {
  2004. //载入模板
  2005. doc = new Document(@"D:\日行程3.docx");
  2006. builder = new DocumentBuilder(doc);
  2007. }
  2008. foreach (var key in dic.Keys)
  2009. {
  2010. Bookmark bookmark = doc.Range.Bookmarks[key];
  2011. if (bookmark != null)
  2012. {
  2013. builder.MoveToBookmark(key);
  2014. builder.Write(dic[key]);
  2015. }
  2016. }
  2017. //获取word里所有表格
  2018. NodeCollection allTables = doc.GetChildNodes(NodeType.Table, true);
  2019. //获取所填表格的序数
  2020. Aspose.Words.Tables.Table tableOne = allTables[0] as Aspose.Words.Tables.Table;
  2021. try
  2022. {
  2023. //循环赋值
  2024. for (int i = 0; i < dtSource.Rows.Count; i++)
  2025. {
  2026. builder.MoveToCell(0, i + 1, 0, 0);
  2027. builder.Write(dtSource.Rows[i]["Days"].ToString());
  2028. builder.MoveToCell(0, i + 1, 1, 0);
  2029. builder.Write(dtSource.Rows[i]["Date"].ToString() + "\r\n" + dtSource.Rows[i]["Week"].ToString());
  2030. builder.MoveToCell(0, i + 1, 2, 0);
  2031. builder.Write(dtSource.Rows[i]["Traffic"].ToString());
  2032. var trip = dtSource.Rows[i]["Trip"].ToString();
  2033. builder.MoveToCell(0, i + 1, 3, 0);
  2034. builder.Write(trip);
  2035. var cell = (Aspose.Words.Tables.Cell)doc.GetChild(NodeType.Cell, ((i + 2) * 4) - 1, true);
  2036. var paragraphs = cell.GetChildNodes(NodeType.Paragraph, true);
  2037. // 获取特定索引的段落
  2038. Paragraph paragraph = (Paragraph)paragraphs[0];
  2039. Run run = paragraph.Runs[0];
  2040. if (run != null)
  2041. {
  2042. Aspose.Words.Font font = run.Font;
  2043. font.Name = "黑体";
  2044. //设置双休红色
  2045. cell = (Aspose.Words.Tables.Cell)doc.GetChild(NodeType.Cell, ((i + 2) * 4) - 3, true);
  2046. paragraphs = cell.GetChildNodes(NodeType.Paragraph, true);
  2047. paragraph = (Paragraph)paragraphs[1];
  2048. if (paragraph.GetText().Contains("星期六") || paragraph.GetText().Contains("星期日"))
  2049. {
  2050. run = paragraph.Runs[0];
  2051. font = run.Font;
  2052. font.Color = Color.Red;
  2053. }
  2054. }
  2055. else
  2056. {
  2057. cell = (Aspose.Words.Tables.Cell)doc.GetChild(NodeType.Cell, ((i + 2) * 4) - 3, true);
  2058. paragraphs = cell.GetChildNodes(NodeType.Paragraph, true);
  2059. paragraph = (Paragraph)paragraphs[1];
  2060. if (paragraph.GetText().Contains("星期六") || paragraph.GetText().Contains("星期日"))
  2061. {
  2062. paragraph.Runs[0].Font.Color = Color.Red;
  2063. }
  2064. }
  2065. }
  2066. }
  2067. catch (Exception ex)
  2068. {
  2069. MessageBoxEx.Show(this, "错误!" + ex.Message);
  2070. return;
  2071. }
  2072. //删除多余行
  2073. while (tableOne.Rows.Count > 1 + dtSource.Rows.Count)
  2074. {
  2075. tableOne.Rows.RemoveAt(1 + dtSource.Rows.Count);//(1+dtSource.Rows.Count + 1)-1
  2076. }
  2077. var targetTextList = new List<string>();
  2078. // 遍历文档中的表格
  2079. foreach (Table table in doc.GetChildNodes(NodeType.Table, true))
  2080. {
  2081. foreach (Row row in table.Rows)
  2082. {
  2083. var cellIndex = 0;
  2084. foreach (Cell cell in row.Cells)
  2085. {
  2086. if (cellIndex == 1 && row.Cells.Count == 4)
  2087. {
  2088. foreach (var target in targetTextDic.Keys)
  2089. {
  2090. if (cell.GetText().Contains(target))
  2091. {
  2092. targetTextList = targetTextDic[target];
  2093. break;
  2094. }
  2095. }
  2096. }
  2097. // 遍历单元格中的所有段落
  2098. foreach (Paragraph paragraph in cell.Paragraphs)
  2099. {
  2100. // 使用临时列表存储原始 Runs,避免修改时影响遍历
  2101. List<Run> runs = new List<Run>();
  2102. foreach (Run run in paragraph.Runs)
  2103. {
  2104. runs.Add(run);
  2105. }
  2106. foreach (Run run in runs)
  2107. {
  2108. foreach (var targetText in targetTextList)
  2109. {
  2110. // 检查文字是否包含指定文字
  2111. if (run.Text.Contains(targetText))
  2112. {
  2113. // 将包含的部分设置为红色
  2114. HighlightText(run, targetText, Color.Red);
  2115. }
  2116. }
  2117. }
  2118. }
  2119. cellIndex++;
  2120. }
  2121. }
  2122. }
  2123. string savePath = "C:\\OP行程单\\";
  2124. if (!Directory.Exists(savePath))
  2125. {
  2126. try
  2127. {
  2128. Directory.CreateDirectory(savePath);
  2129. }
  2130. catch
  2131. {
  2132. }
  2133. }
  2134. string strFileName = savePath + di.TeamName + "出访日程.docx";
  2135. try
  2136. {
  2137. doc.Save(strFileName, Aspose.Words.SaveFormat.Docx);
  2138. MessageBoxEx.Show(this, "文件导出完成!");
  2139. System.Diagnostics.Process.Start("Explorer.exe", "/select," + strFileName);
  2140. }
  2141. catch (Exception ex)
  2142. {
  2143. MessageBoxEx.Show(this, "请关闭打开的文件后重试!");
  2144. }
  2145. }
  2146. List<string> ExtractContentBetweenTags(string input, string tag)
  2147. {
  2148. List<string> results = new List<string>();
  2149. // 构造正则表达式,匹配形如 [++]内容[++] 的部分
  2150. string pattern = $@"{Regex.Escape(tag)}(.*?){Regex.Escape(tag)}";
  2151. // 添加 RegexOptions.Singleline 选项使 . 匹配包括换行符在内的所有字符
  2152. MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.Singleline);
  2153. string[] strValueArr = new string[1];
  2154. foreach (Match match in matches)
  2155. {
  2156. var strValue = match.Groups[1].Value;
  2157. strValueArr = Regex.Split(strValue, @"\r\n|\n");
  2158. }
  2159. results.AddRange(strValueArr.Where(x => !string.IsNullOrWhiteSpace(x)));
  2160. return results;
  2161. }
  2162. private string GetAllCity(int diid, int codeId)
  2163. {
  2164. //城市缓存
  2165. string CityStr = string.Empty;
  2166. DataTable dtBlack = null;
  2167. try
  2168. {
  2169. dtBlack = GetTableByBlackCode(diid, codeId);
  2170. }
  2171. catch (Exception ex)
  2172. {
  2173. MessageBoxEx.Show(this, "黑屏代码有误!", "提示");
  2174. return CityStr;
  2175. }
  2176. if (dtBlack.Rows.Count != 0 && (!string.IsNullOrWhiteSpace(dtBlack.Rows[0][0].ToString())))
  2177. {
  2178. var cityThree = new List<string>();
  2179. foreach (DataRow item in dtBlack.Rows)
  2180. {
  2181. var three = item["Three"].ToString();
  2182. if (three.Length == 6)
  2183. {
  2184. var start = three.Substring(0, 3);
  2185. var end = three.Substring(3, 3);
  2186. var lastEnd = string.Empty;
  2187. if (cityThree.Count != 0)
  2188. {
  2189. lastEnd = cityThree[cityThree.Count - 1];
  2190. if (lastEnd != start)
  2191. {
  2192. cityThree.Add(start);
  2193. cityThree.Add(end);
  2194. }
  2195. else
  2196. {
  2197. cityThree.Add(end);
  2198. }
  2199. }
  2200. else
  2201. {
  2202. cityThree.Add(start);
  2203. cityThree.Add(end);
  2204. }
  2205. }
  2206. }
  2207. string sql = "select * from Res_ThreeCode a where a.isdel = 0 ";
  2208. if (cityThree.Count == 0)
  2209. {
  2210. sql += "and a.id in (0)";
  2211. }
  2212. else
  2213. {
  2214. sql += $"and a.Three in ('{string.Join("','", cityThree)}')";
  2215. }
  2216. List<Res_ThreeCode> resultArr = new List<Res_ThreeCode>();
  2217. using (var db = new oa2023DBEntities())
  2218. {
  2219. resultArr = db.Res_ThreeCode.SqlQuery(sql).ToList();
  2220. }
  2221. cityThree.ForEach(x =>
  2222. {
  2223. var find = resultArr.Find(p => p.Three.ToUpper() == x.ToUpper());
  2224. CityStr += find == null ? $"【{x}三字码未收录】/" : find.City + "/";
  2225. });
  2226. CityStr = CityStr.TrimEnd('/');
  2227. }
  2228. return CityStr;
  2229. }
  2230. /// <summary>
  2231. ///根据机票黑屏代码整理DataTable
  2232. /// </summary>
  2233. /// <param name="diid"></param>
  2234. /// <returns></returns>
  2235. public DataTable GetTableByBlackCode(int diid, int codeId)
  2236. {
  2237. // 使用封装的方法执行查询
  2238. var listcode = ExecuteDbContext(db =>
  2239. db.Air_TicketBlackCode
  2240. .Where(x => x.DiId == diid && x.IsDel == 0 && x.Id == codeId)
  2241. .ToList()
  2242. );
  2243. //测试数据为序号,航班号,起飞日期,三字码,起飞时刻,到达时刻,出发航站楼,到达航站楼,机型,飞行时间
  2244. //1.3U8391 TU17NOV CTUCAI 0220 0715 T1 T2 330 10H55M
  2245. DataTable dt = new DataTable();
  2246. dt.Columns.Add("Fliagtcode", typeof(string)); //航班号
  2247. dt.Columns.Add("Date", typeof(string));//起飞日期
  2248. dt.Columns.Add("Three", typeof(string));//三字码
  2249. dt.Columns.Add("StartTime", typeof(string));//起飞时刻
  2250. dt.Columns.Add("EndTime", typeof(string));//到达时刻
  2251. dt.Columns.Add("StartBuilding", typeof(string));//出发航站楼
  2252. dt.Columns.Add("EndBuilding", typeof(string));//到达航站楼
  2253. dt.Columns.Add("AirModel", typeof(string)); //机型
  2254. dt.Columns.Add("FlightTime", typeof(string));//飞行时间
  2255. dt.Columns.Add("Day", typeof(string));//整理的起飞日期;作为排序依据
  2256. dt.Columns.Add("ArrivedDate", typeof(string));//整理的到达日期
  2257. dt.Columns.Add("Error", typeof(string));//整理的到达日期
  2258. dt.Columns.Add("Sign", typeof(string));//标识:0表示为原生黑屏代码、1表示"+"新增的黑屏代码
  2259. //添加转机标识 (中转写在第一趟航班)
  2260. dt.Columns.Add("isTransitShipment", typeof(bool));
  2261. //判断是否录入黑屏代码
  2262. if (listcode.Count() == 0 || listcode == null)
  2263. {
  2264. dt.Rows.Add(null, null, null, null, null, null, null, null, null, null, null, "黑屏代码未录入!", null, false);
  2265. }
  2266. else
  2267. {
  2268. //读取单段黑屏代码
  2269. for (int i = 0; i < listcode.Count; i++)
  2270. {
  2271. //去除序号
  2272. string[] CodeList = Regex.Split(listcode[i].BlackCode, "\\d+\\.", RegexOptions.IgnoreCase);
  2273. //去除多余空格,方法一Linq扩展方法
  2274. CodeList = CodeList.Where(str => !string.IsNullOrWhiteSpace(str)).ToArray();
  2275. //读取单条黑屏代码
  2276. for (int j = 0; j < CodeList.Count(); j++)
  2277. {
  2278. //去除多余空格,方法二使用Split()方法进行分割,分割有一个选项是RemoveEmptyEntries
  2279. CodeList[j] = CodeList[j].Replace("\r\n", string.Empty).Replace("\\r\\n", string.Empty).TrimStart().TrimEnd();
  2280. string[] Info = CodeList[j].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  2281. //去除多余空格
  2282. Info = Info.Where(str => !string.IsNullOrWhiteSpace(str)).ToArray();
  2283. //判断黑屏代码是否正确拆分; 理应拆成9段
  2284. if (Info.TakeWhile((x) => { return !excludeArr.Contains(x); }).Count() != 9)
  2285. {
  2286. dt.Rows.Add(null, null, null, null, null, null, null, null, null, null, null, listcode[i].Title + "黑屏代码中第" + (j + 1) + " 条有误,请联系机票同事核对", null, false);
  2287. //MessageBoxEx.Show("第" + (i + 1) + "段黑屏代码中第" + (j + 1) + " 条有误, 请联系机票同事核对");
  2288. return dt;
  2289. }
  2290. else
  2291. {
  2292. try
  2293. {
  2294. var monthEn = Info[1].Substring(4, 3);
  2295. //月
  2296. int month = Convert.ToInt32(GetLonger(monthEn));
  2297. //日
  2298. int day = Convert.ToInt32(Info[1].Substring(2, 2));
  2299. //年
  2300. string ConfigYear = ConfigurationManager.AppSettings["ConfigYear"];
  2301. int YearInt = DateTime.Now.Year;
  2302. int.TryParse(ConfigYear, out YearInt);
  2303. var time = new DateTime(YearInt, month, day);
  2304. var isExist = Info.Contains("[中转]");
  2305. if (!isExist)
  2306. {
  2307. isExist = Info.Contains("[转机]");
  2308. }
  2309. dt.Rows.Add(Info[0],
  2310. Info[1],
  2311. Info[2],
  2312. Info[3],
  2313. Info[4],
  2314. Info[5],
  2315. Info[6],
  2316. Info[7],
  2317. Info[8],
  2318. time.ToString("yyyy-MM-dd"),
  2319. time.ToString("yyyy-MM-dd"),
  2320. "",
  2321. ExtractNumberAfterPlus(Info[4]),
  2322. isExist
  2323. );
  2324. }
  2325. catch (Exception ex)
  2326. { }
  2327. }
  2328. }
  2329. //排序
  2330. dt.DefaultView.Sort = "Day asc";
  2331. dt = dt.DefaultView.ToTable();
  2332. }
  2333. }
  2334. return dt;
  2335. }
  2336. public string GetLonger(string temp)
  2337. {
  2338. string str = "";
  2339. switch (temp.ToUpper())
  2340. {
  2341. case "美元":
  2342. str = "USD";
  2343. break;
  2344. case "日元":
  2345. str = "JPY";
  2346. break;
  2347. case "英镑":
  2348. str = "GBP";
  2349. break;
  2350. case "欧元":
  2351. str = "EUR";
  2352. break;
  2353. case "港币":
  2354. str = "HKD";
  2355. break;
  2356. case "MO":
  2357. str = "星期一";
  2358. break;
  2359. case "TU":
  2360. str = "星期二";
  2361. break;
  2362. case "WE":
  2363. str = "星期三";
  2364. break;
  2365. case "TH":
  2366. str = "星期四";
  2367. break;
  2368. case "FR":
  2369. str = "星期五";
  2370. break;
  2371. case "SA":
  2372. str = "星期六";
  2373. break;
  2374. case "SU":
  2375. str = "星期天";
  2376. break;
  2377. case "JAN":
  2378. str = "01";
  2379. break;
  2380. case "FEB":
  2381. str = "02";
  2382. break;
  2383. case "MAR":
  2384. str = "03";
  2385. break;
  2386. case "APR":
  2387. str = "04";
  2388. break;
  2389. case "MAY":
  2390. str = "05";
  2391. break;
  2392. case "JUN":
  2393. str = "06";
  2394. break;
  2395. case "JUL":
  2396. str = "07";
  2397. break;
  2398. case "AUG":
  2399. str = "08";
  2400. break;
  2401. case "SEP":
  2402. str = "09";
  2403. break;
  2404. case "OCT":
  2405. str = "10";
  2406. break;
  2407. case "NOV":
  2408. str = "11";
  2409. break;
  2410. case "DEC":
  2411. str = "12";
  2412. break;
  2413. case "MONDAY":
  2414. str = "星期一";
  2415. break;
  2416. case "TUESDAY":
  2417. str = "星期二";
  2418. break;
  2419. case "WEDNESDAY":
  2420. str = "星期三";
  2421. break;
  2422. case "THURSDAY":
  2423. str = "星期四";
  2424. break;
  2425. case "FRIDAY":
  2426. str = "星期五";
  2427. break;
  2428. case "SATURDAY":
  2429. str = "星期六";
  2430. break;
  2431. case "SUNDAY":
  2432. str = "星期日";
  2433. break;
  2434. case "01":
  2435. str = "JAN";
  2436. break;
  2437. case "02":
  2438. str = "FEB";
  2439. break;
  2440. case "03":
  2441. str = "MAR";
  2442. break;
  2443. case "04":
  2444. str = "APR";
  2445. break;
  2446. case "05":
  2447. str = "MAY";
  2448. break;
  2449. case "06":
  2450. str = "JUN";
  2451. break;
  2452. case "07":
  2453. str = "JUL";
  2454. break;
  2455. case "08":
  2456. str = "AUG";
  2457. break;
  2458. case "09":
  2459. str = "SEP";
  2460. break;
  2461. case "10":
  2462. str = "OCT";
  2463. break;
  2464. case "11":
  2465. str = "NOV";
  2466. break;
  2467. case "12":
  2468. str = "DEC";
  2469. break;
  2470. case "2":
  2471. str = "空客A";
  2472. break;
  2473. case "3":
  2474. str = "空客A";
  2475. break;
  2476. case "7":
  2477. str = "波音";
  2478. break;
  2479. }
  2480. return str;
  2481. }
  2482. public List<string> GetTimeListByDataTable(DataTable dt)
  2483. {
  2484. DateTime datestart = Convert.ToDateTime(dt.Rows[0]["Day"].ToString());
  2485. DateTime dateend = Convert.ToDateTime(dt.Rows[dt.Rows.Count - 1]["ArrivedDate"].ToString());
  2486. List<string> timeList = new List<string>();
  2487. while (datestart <= dateend)
  2488. {
  2489. timeList.Add(datestart.ToString("yyyy-MM-dd"));
  2490. datestart = datestart.AddDays(1);
  2491. }
  2492. return timeList;
  2493. }
  2494. public JObject GetDirectionByGoogleApi(string Origin, string Destination)
  2495. {
  2496. string appkey = "AIzaSyBdLf8u8DinXQWVPLEkdrxOJpClXSqEnho";
  2497. string url = "https://maps.googleapis.com/maps/api/directions/json?origin=" + Origin
  2498. + "&destination=" + Destination + "&key=" + appkey;
  2499. JObject result = null;
  2500. try
  2501. {
  2502. #region 利用HttpWebRequest访问API
  2503. ////创建Web访问对象
  2504. //HttpWebRequest req = HttpWebRequest.Create(url) as HttpWebRequest;
  2505. //req.Method = "GET";
  2506. //req.ContentType = "application/json";
  2507. ////创建web响应对象
  2508. //HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
  2509. ////通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
  2510. //StreamReader reader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
  2511. ////如果有编码问题就用这个方法
  2512. ////string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());
  2513. ////利用StreamReader就可以从响应内容从头读到尾
  2514. //string returnJson = reader.ReadToEnd();
  2515. ////反序列化
  2516. //result = JsonConvert.DeserializeObject(returnJson) as JObject;
  2517. #endregion
  2518. #region 利用HttpClient访问API
  2519. HttpClient myHttpClient = new HttpClient();
  2520. myHttpClient.Timeout = new TimeSpan(0, 0, 3);
  2521. HttpResponseMessage response = myHttpClient.GetAsync(url).Result;
  2522. //var content = response.Content.ReadAsAsync<object>().Result;
  2523. var content = response.Content.ReadAsStringAsync().Result;
  2524. result = JObject.Parse(content);
  2525. #endregion
  2526. return result;
  2527. }
  2528. catch (Exception e)
  2529. {
  2530. result = new JObject();
  2531. result.Add("code", -1);
  2532. result.Add("msg", e.Message);
  2533. return result;
  2534. }
  2535. }
  2536. bool IsShengGenGuo(string country, string toCountry)
  2537. {
  2538. bool isTrue = false;
  2539. string[] countries = {
  2540. "德国", "奥地利", "比利时", "捷克共和国", "丹麦", "斯洛伐克", "斯洛文尼亚", "西班牙",
  2541. "爱沙尼亚", "芬兰", "法国", "希腊", "匈牙利", "冰岛", "意大利", "拉脱维亚", "列支敦士登",
  2542. "立陶宛", "卢森堡", "马耳他", "荷兰", "挪威", "波兰", "葡萄牙", "瑞典", "瑞士"
  2543. };
  2544. if (countries.Contains(country) && countries.Contains(toCountry))
  2545. {
  2546. isTrue = true;
  2547. }
  2548. return isTrue;
  2549. }
  2550. private object Key = new object();
  2551. private void btnOutputInfo_Click(object sender, EventArgs e)
  2552. {
  2553. btnImportInfo();
  2554. }
  2555. /// <summary>
  2556. /// 根据大写数字返回小写数字或根据小写数字返回大写数字
  2557. /// </summary>
  2558. /// <param name="num"></param>
  2559. /// <returns></returns>
  2560. public string GetNum(string num)
  2561. {
  2562. string str = "";
  2563. switch (num)
  2564. {
  2565. case "1":
  2566. str = "一";
  2567. break;
  2568. case "2":
  2569. str = "二";
  2570. break;
  2571. case "3":
  2572. str = "三";
  2573. break;
  2574. case "4":
  2575. str = "四";
  2576. break;
  2577. case "5":
  2578. str = "五";
  2579. break;
  2580. case "6":
  2581. str = "六";
  2582. break;
  2583. case "7":
  2584. str = "七";
  2585. break;
  2586. case "8":
  2587. str = "八";
  2588. break;
  2589. case "9":
  2590. str = "九";
  2591. break;
  2592. case "10":
  2593. str = "十";
  2594. break;
  2595. case "11":
  2596. str = "十一";
  2597. break;
  2598. case "12":
  2599. str = "十二";
  2600. break;
  2601. case "一":
  2602. str = "1";
  2603. break;
  2604. case "二":
  2605. str = "2";
  2606. break;
  2607. case "三":
  2608. str = "3";
  2609. break;
  2610. case "四":
  2611. str = "4";
  2612. break;
  2613. case "五":
  2614. str = "5";
  2615. break;
  2616. case "六":
  2617. str = "6";
  2618. break;
  2619. case "七":
  2620. str = "7";
  2621. break;
  2622. case "八":
  2623. str = "8";
  2624. break;
  2625. case "九":
  2626. str = "9";
  2627. break;
  2628. case "十":
  2629. str = "10";
  2630. break;
  2631. case "十一":
  2632. str = "11";
  2633. break;
  2634. case "十二":
  2635. str = "12";
  2636. break;
  2637. }
  2638. return str;
  2639. }
  2640. string GetTimeGwInfo(ref List<Res_OfficialActivities> listgw, DateTime gwTime)
  2641. {
  2642. List<Res_OfficialActivitiesFormat> formatResGw = listgw.Select(x => new Res_OfficialActivitiesFormat
  2643. {
  2644. Address = x.Address,
  2645. Attendees = x.Attendees,
  2646. Client = x.Client,
  2647. Contact = x.Contact,
  2648. Date = x.Date,
  2649. DiId = x.DiId,
  2650. CreateTime = x.CreateTime,
  2651. CreateUserId = x.CreateUserId,
  2652. DeleteTime = x.DeleteTime,
  2653. DeleteUserId = x.DeleteUserId,
  2654. Dresscode = x.Dresscode,
  2655. Id = x.Id,
  2656. IsDel = x.IsDel,
  2657. IsNeedTrans = x.IsNeedTrans,
  2658. IsPay = x.IsPay,
  2659. IsSubmitApproval = x.IsSubmitApproval,
  2660. Job = x.Job,
  2661. Language = x.Language,
  2662. OfficialForm = x.OfficialForm,
  2663. Remark = x.Remark,
  2664. Setting = x.Setting,
  2665. Tel = x.Tel,
  2666. Time = x.Time,
  2667. Translators = x.Translators,
  2668. Trip = x.Trip,
  2669. Type = x.Type,
  2670. Area = x.Area,
  2671. Country = x.Country,
  2672. Field = x.Field,
  2673. ReqSample = x.ReqSample,
  2674. ConfirmTheInvitation = x.ConfirmTheInvitation,
  2675. DataId = x.DataId,
  2676. DataSource = x.DataSource,
  2677. EmailOrWeChat = x.EmailOrWeChat,
  2678. Nature = x.Nature,
  2679. ScreenshotOfMailUrl = x.ScreenshotOfMailUrl,
  2680. Website = x.Website,
  2681. }).ToList();
  2682. string info = string.Empty;
  2683. List<Res_OfficialActivitiesFormat> dayArr = new List<Res_OfficialActivitiesFormat>();
  2684. Res_OfficialActivitiesFormat gl = null;
  2685. DateTime newGwTime = DateTime.Now;
  2686. foreach (var g in formatResGw)
  2687. {
  2688. var parseTime = g.GetDateTime;
  2689. if (parseTime.Year == gwTime.Year && parseTime.Month == gwTime.Month && parseTime.Day == gwTime.Day)
  2690. {
  2691. dayArr.Add(g);
  2692. }
  2693. }
  2694. var isFindTimeGw = false;
  2695. foreach (var g in dayArr)
  2696. {
  2697. var thisData = g.GetDateTime;
  2698. if (thisData.Hour == gwTime.Hour && thisData.Minute == gwTime.Minute)
  2699. {
  2700. isFindTimeGw = true;
  2701. newGwTime = thisData;
  2702. var ApiResult = QueryOfficialActivitiesById(g.Id, Convert.ToInt32(g.DiId)).Result;
  2703. var success = Convert.ToBoolean(ApiResult.GetType().GetProperty("Success").GetValue(ApiResult));
  2704. var nameAndTel = string.Empty;
  2705. if (success)
  2706. {
  2707. var name = ApiResult.GetType().GetProperty("Name").GetValue(ApiResult).ToString();
  2708. var tel = ApiResult.GetType().GetProperty("Tel").GetValue(ApiResult).ToString();
  2709. nameAndTel = $" {name}{tel}";
  2710. }
  2711. info += $@"{thisData.ToString("HH:mm")} 拜访{g.Client};
  2712. 翻译:{(g.IsNeedTrans == null || g.IsNeedTrans == 0 ? "不需要翻译人员" : g.Language + nameAndTel)} 着装:{g.Dresscode}
  2713. 联系人:{g.Contact} 联系方式:{g.Tel}
  2714. 地址:{g.Address}";
  2715. listgw.Remove(listgw.Find(x => x.Id == g.Id));
  2716. gl = g;
  2717. break;
  2718. }
  2719. }
  2720. //查询时间最接近的
  2721. if (!isFindTimeGw)
  2722. {
  2723. var g = dayArr.OrderBy(x =>
  2724. {
  2725. return (x.GetDateTime - gwTime).Duration();
  2726. }).FirstOrDefault();
  2727. if (g != null)
  2728. {
  2729. var thisData = g.GetDateTime;
  2730. if ((thisData - gwTime) < new TimeSpan(1, 30, 0))
  2731. {
  2732. isFindTimeGw = true;
  2733. newGwTime = thisData;
  2734. var ApiResult = QueryOfficialActivitiesById(g.Id, Convert.ToInt32(g.DiId)).Result;
  2735. var success = Convert.ToBoolean(ApiResult.GetType().GetProperty("Success").GetValue(ApiResult));
  2736. var nameAndTel = string.Empty;
  2737. if (success)
  2738. {
  2739. var name = ApiResult.GetType().GetProperty("Name").GetValue(ApiResult).ToString();
  2740. var tel = ApiResult.GetType().GetProperty("Tel").GetValue(ApiResult).ToString();
  2741. nameAndTel = $" {name}{tel}";
  2742. }
  2743. info += $@"{thisData.ToString("HH:mm")} 拜访{g.Client};
  2744. 翻译:{(g.IsNeedTrans == null || g.IsNeedTrans == 0 ? "不需要翻译人员" : g.Language + nameAndTel)} 着装:{g.Dresscode}
  2745. 联系人:{g.Contact} 联系方式:{g.Tel}
  2746. 地址:{g.Address}";
  2747. listgw.Remove(listgw.Find(x => x.Id == g.Id));
  2748. gl = g;
  2749. }
  2750. }
  2751. }
  2752. //1335 客人
  2753. //1334 公司
  2754. if (isFindTimeGw)
  2755. {
  2756. if (gl.DataSource == 0 || gl.DataSource == 1334 || gl.DataSource == null)
  2757. {
  2758. info += "【泛美资源】";
  2759. }
  2760. else
  2761. {
  2762. info += "【客人资源】";
  2763. }
  2764. }
  2765. return info;
  2766. }
  2767. string GetTimeMealInfo(ref List<Grp_RestaurantInfo> listMeal, DateTime mealTime)
  2768. {
  2769. string info = string.Empty;
  2770. List<Grp_RestaurantInfo> dayArr = new List<Grp_RestaurantInfo>();
  2771. Grp_RestaurantInfo gl = null;
  2772. var startStr = "午餐于当地餐厅";
  2773. if (mealTime.Hour == 18 && mealTime.Minute == 0)
  2774. {
  2775. startStr = "晚餐于当地餐厅";
  2776. }
  2777. foreach (var g in listMeal)
  2778. {
  2779. var parseTime_Bool = DateTime.TryParse(g.Date, out DateTime parseTime);
  2780. if (parseTime_Bool && parseTime.Year == mealTime.Year && parseTime.Month == mealTime.Month && parseTime.Day == mealTime.Day)
  2781. {
  2782. dayArr.Add(g);
  2783. }
  2784. }
  2785. var isFindTimeGw = false;
  2786. foreach (var g in dayArr)
  2787. {
  2788. var thisData = DateTime.Parse(g.StartTime);
  2789. if (thisData.Hour == mealTime.Hour && thisData.Minute == mealTime.Minute)
  2790. {
  2791. isFindTimeGw = true;
  2792. info += $"{g.StartTime}{(!string.IsNullOrWhiteSpace(g.EndTime) ? "-" + g.EndTime + " " : " ")}{startStr}" +
  2793. $"{(!string.IsNullOrWhiteSpace(g.Name) ? "(" + g.Name + ") " : "")}{(!string.IsNullOrWhiteSpace(g.Address) ? "(地址: " + g.Address + " " : "")}" +
  2794. $"{(!string.IsNullOrWhiteSpace(g.Tel) ? "联系电话:" + g.Tel + " " : "")}" +
  2795. $"{(!string.IsNullOrWhiteSpace(g.Remark) ? "其他信息:" + g.Remark : "")}" + ")";
  2796. listMeal.Remove(listMeal.Find(x => x.Id == g.Id));
  2797. gl = g;
  2798. break;
  2799. }
  2800. }
  2801. //查询时间最接近的
  2802. if (!isFindTimeGw)
  2803. {
  2804. var g = dayArr.OrderBy(x =>
  2805. {
  2806. return (DateTime.Parse(x.StartTime) - mealTime).Duration();
  2807. }).FirstOrDefault();
  2808. if (g != null)
  2809. {
  2810. var thisData = DateTime.Parse(g.StartTime);
  2811. if ((thisData - mealTime) < new TimeSpan(3, 0, 0))
  2812. {
  2813. isFindTimeGw = true;
  2814. info += $"{g.StartTime}{(!string.IsNullOrWhiteSpace(g.EndTime) ? "-" + g.EndTime + " " : " ")}{startStr}" +
  2815. $"{(!string.IsNullOrWhiteSpace(g.Name) ? "(" + g.Name + ") " : "")}{(!string.IsNullOrWhiteSpace(g.Address) ? "(地址: " + g.Address + " " : "")}" +
  2816. $"{(!string.IsNullOrWhiteSpace(g.Tel) ? "联系电话:" + g.Tel + " " : "")}" +
  2817. $"{(!string.IsNullOrWhiteSpace(g.Remark) ? "其他信息:" + g.Remark : "")}" + ")";
  2818. listMeal.Remove(listMeal.Find(x => x.Id == g.Id));
  2819. gl = g;
  2820. }
  2821. }
  2822. }
  2823. return info;
  2824. }
  2825. void CheckAndCenterParagraphs(Document doc)
  2826. {
  2827. // 遍历文档中的所有段落
  2828. foreach (Paragraph para in doc.GetChildNodes(NodeType.Paragraph, true))
  2829. {
  2830. // 获取段落的文本
  2831. string paragraphText = para.GetText();
  2832. // 检查段落的文本是否为"下午"或"上午"
  2833. if (paragraphText.Trim().Equals("下午") || paragraphText.Trim().Equals("上午"))
  2834. {
  2835. // 设置段落格式为居中对齐
  2836. para.ParagraphFormat.Alignment = ParagraphAlignment.Center;
  2837. }
  2838. }
  2839. }
  2840. List<tagContent> CheckAndCenterTags(int diid)
  2841. {
  2842. List<tagContent> tags = new List<tagContent>();
  2843. //本团行程单数据
  2844. List<Grp_TravelList> listTravel = ExecuteDbContext((db => { return db.Grp_TravelList.AsNoTracking().Where(x => x.Diid == diid && x.IsDel == 0).ToList(); }));
  2845. foreach (var item in listTravel)
  2846. {
  2847. item.Trip = item.Trip.Replace("[++]", string.Empty);
  2848. item.Trip = item.Trip.Replace("\r\n", "\n");
  2849. item.Trip = item.Trip.Replace("\n", "\r\n");
  2850. var tempTags = CheckAndCenterTagsStr(item.Trip);
  2851. var dt = DateTime.Parse(item.Date);
  2852. if (tempTags.Any())
  2853. {
  2854. tempTags.ForEach(x => x.Date = dt);
  2855. }
  2856. tags.AddRange(tempTags);
  2857. }
  2858. return tags;
  2859. }
  2860. List<tagContent> CheckAndCenterTagsStr(string input)
  2861. {
  2862. List<tagContent> tags = new List<tagContent>();
  2863. List<string> results = new List<string>();
  2864. int startIndex = input.IndexOf(tagContent.TagFormat.Item1);
  2865. int endIndex = -1;
  2866. while (startIndex != -1)
  2867. {
  2868. // 找到结束标记
  2869. endIndex = input.IndexOf(tagContent.TagFormat.Item2, startIndex);
  2870. if (endIndex != -1)
  2871. {
  2872. // 确保结束标记在开始标记之后
  2873. if (endIndex < startIndex)
  2874. {
  2875. // 移动到下一个起始位置
  2876. startIndex = input.IndexOf(tagContent.TagFormat.Item1, endIndex + 1);
  2877. continue;
  2878. }
  2879. tagContent tag = new tagContent();
  2880. tag.IsFinally = true;
  2881. // 获取标记内容以及前后字符串
  2882. if (startIndex >= tagContent.tagLength && input.Length > endIndex + tagContent.tagLength)
  2883. {
  2884. string before = input.Substring(startIndex - tagContent.tagLength, tagContent.tagLength);
  2885. string after = input.Substring(endIndex + tagContent.TagFormat.Item2.Length, tagContent.tagLength);
  2886. string content = input.Substring(startIndex + tagContent.TagFormat.Item1.Length, endIndex - startIndex - tagContent.TagFormat.Item1.Length);
  2887. tag.IsFinally = false;
  2888. tag.EndTag = after;
  2889. tag.Content = content;
  2890. tag.StartTag = before;
  2891. }
  2892. else
  2893. {
  2894. string content = input.Substring(startIndex + tagContent.TagFormat.Item1.Length, endIndex - startIndex - tagContent.TagFormat.Item1.Length);
  2895. tag.Content = content;
  2896. }
  2897. tags.Add(tag);
  2898. // 移动到下一个起始位置
  2899. startIndex = input.IndexOf(tagContent.TagFormat.Item1, endIndex + 1);
  2900. }
  2901. else
  2902. {
  2903. break;
  2904. }
  2905. }
  2906. return tags;
  2907. }
  2908. string CheckStr(string original, string changed)
  2909. {
  2910. // 创建diff_match_patch对象
  2911. var dmp = new diff_match_patch();
  2912. // 计算差异
  2913. List<Diff> diffs = dmp.diff_main(original, changed);
  2914. // 清理和合并差异
  2915. dmp.diff_cleanupSemantic(diffs);
  2916. // 使用StringBuilder构建最终的字符串
  2917. StringBuilder finalString = new StringBuilder();
  2918. // 输出差异结果,并构建变动后的字符串
  2919. foreach (Diff diff in diffs)
  2920. {
  2921. switch (diff.operation)
  2922. {
  2923. case Operation.EQUAL:
  2924. // 相等的部分,直接添加到最终字符串
  2925. finalString.Append(diff.text);
  2926. break;
  2927. case Operation.INSERT:
  2928. // 插入的部分,添加标记并添加到最终字符串
  2929. finalString.Append("[++]" + diff.text + "[++]");
  2930. break;
  2931. case Operation.DELETE:
  2932. // 删除的部分,不添加到最终字符串
  2933. finalString.Append("[++]" + diff.text + "[++]");
  2934. break;
  2935. }
  2936. }
  2937. // 输出变动后的字符串
  2938. return finalString.ToString();
  2939. }
  2940. private Popover popover;
  2941. private void airLable_Click(object sender, EventArgs e)
  2942. {
  2943. // 创建新的弹出框
  2944. popover = new Popover
  2945. {
  2946. Size = new Size(150, 150) // 设置弹出框大小
  2947. };
  2948. // 调整弹出框位置
  2949. popover.AdjustPosition(airLable);
  2950. popover.Show(); // 显示弹出框
  2951. }
  2952. // 高亮包含指定文字的部分
  2953. void HighlightText(Run run, string targetText, Color color)
  2954. {
  2955. string text = run.Text;
  2956. int startIndex = text.IndexOf(targetText, StringComparison.Ordinal);
  2957. if (startIndex >= 0)
  2958. {
  2959. Paragraph parentParagraph = (Paragraph)run.ParentNode;
  2960. // 前部分
  2961. if (startIndex > 0)
  2962. {
  2963. Run beforeRun = (Run)run.Clone(true);
  2964. beforeRun.Text = text.Substring(0, startIndex);
  2965. parentParagraph.InsertBefore(beforeRun, run);
  2966. }
  2967. // 匹配部分
  2968. Run matchRun = (Run)run.Clone(true);
  2969. matchRun.Text = text.Substring(startIndex, targetText.Length);
  2970. matchRun.Font.Color = color;
  2971. parentParagraph.InsertBefore(matchRun, run);
  2972. // 后部分
  2973. if (startIndex + targetText.Length < text.Length)
  2974. {
  2975. Run afterRun = (Run)run.Clone(true);
  2976. afterRun.Text = text.Substring(startIndex + targetText.Length);
  2977. parentParagraph.InsertBefore(afterRun, run);
  2978. }
  2979. // 删除原始Run
  2980. run.Remove();
  2981. }
  2982. }
  2983. string ReplaceNewlineIfNeeded(string input)
  2984. {
  2985. if (!input.Contains("\r\n") && input.Contains("\n"))
  2986. {
  2987. input = input.Replace("\n", "\r\n");
  2988. }
  2989. return input;
  2990. }
  2991. string ParseBlackTime(string time)
  2992. {
  2993. if (string.IsNullOrWhiteSpace(time))
  2994. return "未知时长";
  2995. string pattern = @"^(?:(\d+)[Hh])?(?:(\d+)[Mm])?$";
  2996. Match match = Regex.Match(time, pattern, RegexOptions.IgnoreCase);
  2997. if (match.Success && match.Length > 0)
  2998. {
  2999. string hours = match.Groups[1].Value;
  3000. string minutes = match.Groups[2].Value;
  3001. if (string.IsNullOrEmpty(hours) && string.IsNullOrEmpty(minutes))
  3002. return "未知时长";
  3003. if (string.IsNullOrEmpty(hours))
  3004. return $"{minutes}分钟";
  3005. if (string.IsNullOrEmpty(minutes))
  3006. return $"{hours}小时";
  3007. return $"{hours}小时{minutes}分钟";
  3008. }
  3009. return "未知时长";
  3010. }
  3011. string ExtractDigitsBeforeDecimal(string input)
  3012. {
  3013. Match match = Regex.Match(input, @"^\d+");
  3014. return match.Success ? match.Value : string.Empty;
  3015. }
  3016. int ExtractNumberAfterPlus(string input)
  3017. {
  3018. int value = 0;
  3019. if (string.IsNullOrEmpty(input))
  3020. {
  3021. return value;
  3022. }
  3023. string pattern = @"\+\d+"; // 匹配“+”及其后的数字
  3024. Match match = Regex.Match(input, pattern);
  3025. if (match.Success)
  3026. {
  3027. int.TryParse(match.Value.Substring(1), out value); // 去掉“+”符号,只保留数字部分
  3028. }
  3029. return value;
  3030. }
  3031. }
  3032. public class GoogleApiFormat
  3033. {
  3034. public bool isTrue { get; set; } = false;
  3035. public string Time { get; set; }
  3036. public string Distance { get; set; }
  3037. public int GetDistResult { get; set; }
  3038. public int GetGoogleResult { get; set; }
  3039. }
  3040. public class tagContent
  3041. {
  3042. public DateTime Date { get; set; }
  3043. public string StartTag { get; set; }
  3044. public string EndTag { get; set; }
  3045. public string Content { get; set; }
  3046. public static int tagLength { get { return 3; } }
  3047. public static Tuple<string, string> TagFormat { get { return new Tuple<string, string>("【#", "#】"); } }
  3048. public string QueryTag { get { return this.StartTag + this.EndTag; } }
  3049. public bool IsFinally { get; set; }
  3050. }
  3051. public class Res_OfficialActivitiesFormat : Res_OfficialActivities
  3052. {
  3053. public DateTime GetDateTime
  3054. {
  3055. get
  3056. {
  3057. DateTime.TryParse(this.Date, out DateTime Data);
  3058. //if (this.Date.Contains("T16:"))
  3059. //{
  3060. // Data = Data.AddDays(1);
  3061. //}
  3062. Regex rg = new Regex("[0-9]+");
  3063. var gwTimeHHMM = this.Time;
  3064. var gwTimeHHMMMatch = rg.Matches(gwTimeHHMM);
  3065. if (gwTimeHHMMMatch.Count > 1)
  3066. {
  3067. Data = Data.AddHours(int.Parse(gwTimeHHMMMatch[0].Value));
  3068. Data = Data.AddMinutes(int.Parse(gwTimeHHMMMatch[1].Value));
  3069. }
  3070. return Data;
  3071. }
  3072. }
  3073. }
  3074. public static class ExpansionString
  3075. {
  3076. public static string RemoveEnd(this string input, string suffix)
  3077. {
  3078. if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(suffix))
  3079. return input;
  3080. if (input.EndsWith(suffix))
  3081. {
  3082. return input.Substring(0, input.Length - suffix.Length);
  3083. }
  3084. return input;
  3085. }
  3086. }
  3087. }