Export.cshtml.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.AspNetCore.Mvc.RazorPages;
  7. using Microsoft.EntityFrameworkCore;
  8. using WZExport.Data;
  9. using WZExport.Models;
  10. using System.IO;
  11. using System.IO.Compression;
  12. using System.Xml;
  13. using System.Text;
  14. using WZExport.Utilitys;
  15. namespace WZExport.Pages.Wzs
  16. {
  17. public class ExportModel : PageModel
  18. {
  19. private readonly WZContext _context;
  20. public ExportModel(WZContext context)
  21. {
  22. _context = context;
  23. }
  24. public IActionResult OnGet()
  25. {
  26. return Page();
  27. }
  28. [BindProperty]
  29. public string Type { get; set; }
  30. public readonly string _type1 = "导出文章";
  31. public readonly string _type2 = "导出元数据文章";
  32. static readonly string[] _image = { "jpg", "gif", "png", "bmp","jpeg" };
  33. static readonly string[] _flash = { "swf","avi","flash","mp4" };
  34. static readonly string[] _attach = { "ceb","doc","xls","rar","docx","pdf","zip","txt","xlsx","ppt","htm","cebx","pptx","dot" };
  35. public async Task<IActionResult> OnPostAsync()
  36. {
  37. string basePath = $"/temp/{nameof(Ptwd)}/{Type}/";
  38. string floderPath = $"{basePath}{DateTime.Now:yyyyMMdd}";
  39. if (Directory.Exists(floderPath) is false)
  40. {
  41. Directory.CreateDirectory(floderPath);
  42. if(Type==_type1) await CreateDefault(floderPath);
  43. else if (Type == _type2) await CreateYSJ(floderPath);
  44. DeleteEmptyFloder(floderPath);
  45. Replace(floderPath);
  46. }
  47. string zipfileName = $"{Type}-{DateTime.Now:yyyyMMddHHmmss}.zip";
  48. string zipFilePath = $"{basePath}{zipfileName}";
  49. ZipFile.CreateFromDirectory(floderPath, zipFilePath);
  50. return File(System.IO.File.OpenRead(zipFilePath), "application/x-zip-compressed", zipfileName);
  51. }
  52. public async Task CreateDefault(string path)
  53. {
  54. string joinStr = "SELECT lm.Channelid,wz.DocID, " +
  55. " fj.Srcfile,fj.Fileext " +
  56. " from lm inner JOIN ptwd as wz ON lm.CHANNELID=wz.DOCCHANNEL LEFT JOIN fj on wz.DOCID=fj.APPDOCID";
  57. string wzStr = "SELECT Doctitle, Subdoctitle,Docauthor,Docsourcename,Doceditor," +
  58. " Dockeywords,Docabstract,Dochtmlcon,Crtime,Docpubtime " +
  59. " from ptwd where DOCID={0} ";
  60. using var context = DatabaseService.Current.GetDbContext();
  61. var wzData = await context.SqlQueryAsync<Join>(joinStr);
  62. foreach (var wz in wzData)
  63. {
  64. var wzNew = context.SqlQuery<Join>(string.Format(wzStr, wz.DocID)).First();
  65. wz.Covert(wzNew);
  66. }
  67. CreateXml(path,wzData);
  68. }
  69. /// <summary>
  70. /// 元数据
  71. /// </summary>
  72. /// <param name="path"></param>
  73. /// <returns></returns>
  74. public async Task CreateYSJ(string path)
  75. {
  76. string joinStr = "SELECT lm.Channelid,wz.WCMMetaTablegovInfoID as DocID, " +
  77. " fj.Srcfile,fj.Fileext " +
  78. " from lm inner JOIN stqy as wz ON lm.CHANNELID=wz.ChannelId LEFT JOIN fj on wz.WCMMetaTablegovInfoID=fj.APPENDIXID";
  79. string wzStr = "SELECT Doctitle, title2 as Subdoctitle,CrUser as Docauthor,docsourcename as Docsourcename,CrUser as Doceditor," +
  80. " Dockeywords,CONTENT_GS as Docabstract,dochtmlcon as Dochtmlcon,Crtime,DATE_SC as Docpubtime,fbjg " +
  81. " from stqy where WCMMetaTablegovInfoID={0} ";
  82. using var context = DatabaseService.Current.GetDbContext();
  83. var wzData = await context.SqlQueryAsync<Join>(joinStr);
  84. foreach (var wz in wzData)
  85. {
  86. var wzNew = context.SqlQuery<Join>(string.Format(wzStr, wz.DocID)).First();
  87. wz.Covert(wzNew);
  88. }
  89. var dics = await context.Query<Dictionary>().ToListAsync();
  90. var pzDics = dics.Where(dic => dic.Type == 1);
  91. var jdDics = dics.Where(dic => dic.Type == 2);
  92. Action<int,Join,XmlDocument,XmlElement> action = (channelid, wz,doc,article) =>
  93. {
  94. var b_xxgk = doc.CreateElement("b_xxgk");
  95. b_xxgk.InnerText = UseTemp("1");
  96. var vc_number = doc.CreateElement("vc_number");
  97. vc_number.InnerText = UseTemp(pzDics.FirstOrDefault(dic=>dic.Key== channelid)?.Value??"");
  98. var vc_openmodel = doc.CreateElement("vc_openmodel");
  99. vc_openmodel.InnerText = UseTemp("主动公开");
  100. var vc_filenumber = doc.CreateElement("vc_filenumber");
  101. vc_filenumber.InnerText = UseTemp();
  102. var c_complatedate = doc.CreateElement("c_complatedate");
  103. c_complatedate.InnerText = UseTemp(wz.Docpubtime?.ToString("yyyy-MM-dd HH:mm:ss"));
  104. var vc_opentimelimit = doc.CreateElement("vc_opentimelimit");
  105. vc_opentimelimit.InnerText = UseTemp("长期公开");
  106. var vc_auditprogram = doc.CreateElement("vc_auditprogram");
  107. vc_auditprogram.InnerText = UseTemp("单位审核公开");
  108. var vc_ztflid = doc.CreateElement("vc_ztflid");
  109. vc_ztflid.InnerText = UseTemp();
  110. var vc_ztflname = doc.CreateElement("vc_ztflname");
  111. vc_ztflname.InnerText = UseTemp();
  112. var vc_serviceid = doc.CreateElement("vc_serviceid");
  113. vc_serviceid.InnerText = UseTemp();
  114. var vc_servicename = doc.CreateElement("vc_servicename");
  115. vc_servicename.InnerText = UseTemp();
  116. var vc_fbjg = doc.CreateElement("vc_fbjg");
  117. vc_fbjg.InnerText = UseTemp(wz.fbjg??"");
  118. var vc_service = doc.CreateElement("vc_service");
  119. vc_service.InnerText = UseTemp();
  120. var vc_area = doc.CreateElement("vc_area");
  121. vc_area.InnerText = UseTemp(jdDics.FirstOrDefault(dic => dic.Key == channelid)?.Value ?? "");
  122. var validend = doc.CreateElement("validend");
  123. validend.InnerText = UseTemp();
  124. article.AppendChild(b_xxgk);
  125. article.AppendChild(vc_number);
  126. article.AppendChild(vc_openmodel);
  127. article.AppendChild(vc_filenumber);
  128. article.AppendChild(c_complatedate);
  129. article.AppendChild(vc_opentimelimit);
  130. article.AppendChild(vc_auditprogram);
  131. article.AppendChild(vc_ztflid);
  132. article.AppendChild(vc_ztflname);
  133. article.AppendChild(vc_serviceid);
  134. article.AppendChild(vc_servicename);
  135. article.AppendChild(vc_fbjg);
  136. article.AppendChild(vc_service);
  137. article.AppendChild(vc_area);
  138. article.AppendChild(validend);
  139. };
  140. CreateXml(path, wzData, action);
  141. string UseTemp(string info = "")
  142. {
  143. return $"<![CDATA[{info}]]>";
  144. }
  145. }
  146. private void CreateXml(string path,List<Join> wzData,Action<int,Join,XmlDocument,XmlElement> action=null)
  147. {
  148. var wzGroupData = wzData.GroupBy(data => data.Channelid).Select(gpData => new { Channelid = gpData.Key, wzs = gpData.AsEnumerable() });
  149. var lms = _context.Lm.AsEnumerable();
  150. var parentLms = lms.Where(lm => lm.Parentid == 0).OrderByDescending(lm => lm.Chnlorder);
  151. foreach (var parentLm in parentLms)
  152. {
  153. FindSon(parentLm, path);
  154. }
  155. void FindSon(Lm parentLm, string lmPath)
  156. {
  157. var sonLms = lms.Where(lm => lm.Parentid == parentLm.Channelid).OrderByDescending(lm => lm.Chnlorder);
  158. var currentFilePath = $"{lmPath}/{parentLm.Chnldesc}";
  159. WriteWZXml(parentLm, currentFilePath);
  160. if (sonLms.Count() > 0)
  161. {
  162. // parentLm.Childrens = sonLms;
  163. if (Directory.Exists(currentFilePath) is false) Directory.CreateDirectory(currentFilePath);
  164. foreach (var sonLm in sonLms)
  165. {
  166. FindSon(sonLm, currentFilePath);
  167. }
  168. }
  169. }
  170. void WriteWZXml(Lm lm, string lmPath)
  171. {
  172. var wzs = wzGroupData.FirstOrDefault(wzGp => wzGp.Channelid == lm.Channelid)?.wzs?.Reverse();
  173. if (wzs is null) return;
  174. if (Directory.Exists(lmPath) is false) Directory.CreateDirectory(lmPath);
  175. const int onceNumber = 100;
  176. GetNumberOfCycle(out int cs, out int ys);
  177. for (int i = 1; i <= cs; i++)
  178. {
  179. XmlDocument doc = new XmlDocument();
  180. var docDec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
  181. var book = doc.CreateElement("book");
  182. doc.AppendChild(docDec);
  183. doc.AppendChild(book);
  184. var edition = doc.CreateElement("edition");
  185. edition.InnerText = "1.0";
  186. var edition1 = doc.CreateElement("edition");
  187. edition1.InnerText = "1.0";
  188. var copyright = doc.CreateElement("copyright");
  189. copyright.InnerText = "大汉网络";
  190. book.AppendChild(edition);
  191. book.AppendChild(edition1);
  192. book.AppendChild(copyright);
  193. var wzOfCycle = (i == cs ? wzs.TakeLast(ys) : wzs.Skip((i - 1) * onceNumber).Take(onceNumber));
  194. foreach (var wz in wzOfCycle)
  195. {
  196. var article = doc.CreateElement("article");
  197. book.AppendChild(article);
  198. var title = doc.CreateElement("title");
  199. title.InnerText = UseTemp(wz.Doctitle);
  200. var caption = doc.CreateElement("caption");
  201. caption.InnerText = UseTemp(wz.Subdoctitle);
  202. var leadtitle = doc.CreateElement("leadtitle");
  203. leadtitle.InnerText = UseTemp();
  204. var linktitle = doc.CreateElement("linktitle");
  205. linktitle.InnerText = UseTemp();
  206. var href = doc.CreateElement("href");
  207. href.InnerText = UseTemp();
  208. var author = doc.CreateElement("author");
  209. author.InnerText = UseTemp(wz.Docauthor);
  210. var source = doc.CreateElement("source");
  211. source.InnerText = UseTemp(wz.Docsourcename);
  212. var userid = doc.CreateElement("userid");
  213. userid.InnerText = UseTemp();
  214. var editor = doc.CreateElement("editor");
  215. editor.InnerText = UseTemp(wz.Doceditor);
  216. var keyword = doc.CreateElement("keyword");
  217. keyword.InnerText = UseTemp(wz.Dockeywords);
  218. var classname = doc.CreateElement("classname");
  219. classname.InnerText = UseTemp();
  220. var describe = doc.CreateElement("describe");
  221. describe.InnerText = UseTemp(wz.Docabstract);
  222. var text = doc.CreateElement("text");
  223. text.InnerText = UseTemp(wz.Dochtmlcon);
  224. var datetime = doc.CreateElement("datetime");
  225. datetime.InnerText = UseTemp(wz.Crtime?.ToString("yyyy-MM-dd HH:mm:ss"));
  226. var deploytime = doc.CreateElement("deploytime");
  227. deploytime.InnerText = UseTemp(wz.Docpubtime?.ToString("yyyy-MM-dd HH:mm:ss"));
  228. var image = doc.CreateElement("image");
  229. image.InnerText = UseTemp(IdentifyFileExt(wz.Srcfile, wz.Fileext, nameof(_image)));
  230. var flash = doc.CreateElement("flash");
  231. flash.InnerText = UseTemp(IdentifyFileExt(wz.Srcfile, wz.Fileext, nameof(_flash)));
  232. var media = doc.CreateElement("media");
  233. media.InnerText = UseTemp();
  234. var attach = doc.CreateElement("attach");
  235. attach.InnerText = UseTemp(IdentifyFileExt(wz.Srcfile, wz.Fileext, nameof(_attach)));
  236. article.AppendChild(title);
  237. article.AppendChild(caption);
  238. article.AppendChild(leadtitle);
  239. article.AppendChild(linktitle);
  240. article.AppendChild(href);
  241. article.AppendChild(author);
  242. article.AppendChild(source);
  243. article.AppendChild(userid);
  244. article.AppendChild(edition);
  245. article.AppendChild(keyword);
  246. article.AppendChild(classname);
  247. article.AppendChild(describe);
  248. article.AppendChild(text);
  249. article.AppendChild(datetime);
  250. article.AppendChild(deploytime);
  251. article.AppendChild(image);
  252. article.AppendChild(flash);
  253. article.AppendChild(media);
  254. article.AppendChild(attach);
  255. action?.Invoke(lm.Channelid,wz,doc,article);
  256. }
  257. doc.Save($"{lmPath}/{lm.Chnldesc}-文章-{i}.xml");
  258. }
  259. string UseTemp(string info = "")
  260. {
  261. return $"<![CDATA[{info}]]>";
  262. }
  263. string IdentifyFileExt(string file, string ext, string type)
  264. {
  265. file = $"/picture/old/{file}";
  266. if (_image.Contains(ext) && type == nameof(_image)) return file;
  267. else if (_flash.Contains(ext) && type == nameof(_flash)) return file;
  268. else if (_attach.Contains(ext) && type == nameof(_attach)) return file;
  269. //else if (type == nameof(_attach)) return file;
  270. else return "";
  271. }
  272. void GetNumberOfCycle(out int cs, out int ys)
  273. {
  274. int count = wzs.Count();
  275. if (count == 0)
  276. {
  277. cs = 0;
  278. ys = 0;
  279. }
  280. else if (count <= onceNumber)
  281. {
  282. cs = 1;
  283. ys = count;
  284. }
  285. else
  286. {
  287. ys = count % onceNumber;
  288. cs = ((count - ys) / onceNumber) + 1;
  289. }
  290. }
  291. }
  292. }
  293. private void DeleteEmptyFloder(string path)
  294. {
  295. var floders = Directory.GetDirectories(path);
  296. foreach (string floder in floders)
  297. {
  298. var hasFile = Directory.GetFileSystemEntries(floder, "*.xml", SearchOption.AllDirectories).Count()>0;
  299. if (hasFile is false) Directory.Delete(floder,true);
  300. else DeleteEmptyFloder(floder);
  301. }
  302. }
  303. private void Replace(string path)
  304. {
  305. var files = Directory.GetFileSystemEntries(path, "*.xml", SearchOption.AllDirectories);
  306. foreach (var filePath in files)
  307. {
  308. String xmlStr = "";
  309. using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8))
  310. {
  311. xmlStr = reader.ReadToEnd();
  312. }
  313. xmlStr = xmlStr.Replace("&lt;", "<")
  314. .Replace("&gt;", ">")
  315. .Replace("&amp;", "&")
  316. .Replace("src=\"W", "src=\"/picture/old/W");
  317. using StreamWriter readTxt = new StreamWriter(filePath, false, Encoding.UTF8);
  318. readTxt.Write(xmlStr);
  319. }
  320. }
  321. }
  322. }