CgzjSjbzRepository.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. using QM.KJGH.CGGL.IRepository;
  2. using QM.KJGH.CGGL.Model.Cggl;
  3. using QM.KJGH.Model;
  4. using QM.KJGH.Model.KJGH;
  5. using QM.OrmSqlSugar;
  6. using System.Collections.Generic;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Text.RegularExpressions;
  10. using System.Threading.Tasks;
  11. using WS;
  12. namespace QM.KJGH.CGGL.Repository
  13. {
  14. /// <summary>
  15. ///
  16. /// </summary>
  17. public class CgzjSjbzRepository : SqlSugarRepository<CgglSjbz>, ICgzjSjbzRepository
  18. {
  19. /// <summary>
  20. /// 获取目录数
  21. /// </summary>
  22. /// <returns></returns>
  23. public async Task<List<Tree>> GetMlTree(string sjbz_bsm)
  24. {
  25. List<Tree> tree = new List<Tree>();
  26. var list = await Db.Queryable<CgglSjbzmlwj>().Where(t => t.SJBZ_BSM == sjbz_bsm).OrderBy(t => t.PX).ToListAsync();
  27. //根目录
  28. var roots = list.Where(t => string.IsNullOrWhiteSpace(t.SJML)).ToList();
  29. if (roots == null || roots.Count < 1)
  30. return tree;
  31. tree = ParseTree(list, null);
  32. return tree;
  33. }
  34. /// <summary>
  35. ///
  36. /// </summary>
  37. /// <param name="list"></param>
  38. /// <param name="sjml"></param>
  39. private List<Tree> ParseTree(List<CgglSjbzmlwj> list, string sjml)
  40. {
  41. List<Tree> tree = new List<Tree>();
  42. List<CgglSjbzmlwj> result = new List<CgglSjbzmlwj>();
  43. if (string.IsNullOrWhiteSpace(sjml))
  44. {
  45. result = list.Where(t => string.IsNullOrWhiteSpace(t.SJML)).OrderBy(t => t.PX).ToList();
  46. }
  47. else {
  48. result = list.Where(t => t.SJML == sjml).OrderBy(t => t.PX).ToList();
  49. }
  50. foreach (var item in result)
  51. {
  52. var treeModel = new Tree() {
  53. value = item.BSM,
  54. label = item.MLMC,
  55. parent = item.SJML,
  56. IsParent = item.LX == 1,
  57. Add = item
  58. };
  59. if (treeModel.IsParent)
  60. {
  61. treeModel.children = ParseTree(list, treeModel.value);
  62. }
  63. tree.Add(treeModel);
  64. }
  65. return tree;
  66. }
  67. /// <summary>
  68. /// 检查数据目录
  69. /// </summary>
  70. /// <param name="sjbz_bsm">数据标准</param>
  71. /// <param name="xzqdm">行政区代码</param>
  72. /// <param name="root">检查路径</param>
  73. /// <returns></returns>
  74. public async Task<CgglSjbzCheck> FileCheck(string sjbz_bsm, string xzqdm, string xzqmc, string root)
  75. {
  76. //150925凉城县县级行政区县级国土空间总体规划电子成果数据/2栅格图件/150925凉城县县级行政区13综合防灾减灾规划图.jpg
  77. CgglSjbzCheck errors = new CgglSjbzCheck();
  78. var sjbz = await Db.Queryable<CgglSjbz>().FirstAsync(t => t.BSM == sjbz_bsm);
  79. var list = await Db.Queryable<CgglSjbzmlwj>().Where(t => t.SJBZ_BSM == sjbz_bsm).OrderBy(t => t.PX).ToListAsync();
  80. //根目录
  81. var roots = list.Where(t => string.IsNullOrWhiteSpace(t.SJML)).ToList();
  82. if (sjbz == null || roots == null || roots.Count < 1)
  83. throw new UseArgumentException($"未授权的数据,请联系管理人员,{sjbz_bsm}{sjbz == null }{ roots == null}{ roots.Count < 1}");
  84. FileCheckSub(null, root, root, xzqdm, xzqmc, list, errors);
  85. return errors;
  86. }
  87. /// <summary>
  88. /// 子目录
  89. /// </summary>
  90. /// <param name="pid"></param>
  91. /// <param name="list"></param>
  92. /// <param name="errors"></param>
  93. private void FileCheckSub(string pid, string path, string root, string xzqdm, string xzqmc, List<CgglSjbzmlwj> list, CgglSjbzCheck errors) {
  94. List<CgglSjbzmlwj> subList = new List<CgglSjbzmlwj>();
  95. if(string.IsNullOrWhiteSpace(pid))
  96. subList = list.Where(t => string.IsNullOrWhiteSpace(t.SJML)).ToList();
  97. else
  98. subList = list.Where(t => t.SJML == pid).OrderBy(t => t.PX).ToList();
  99. //标准文档要求
  100. var bzfiles = new List<string>();
  101. foreach (var item in subList)
  102. {
  103. string pathFull = string.Empty;
  104. if (string.IsNullOrWhiteSpace(item.GZMC))
  105. pathFull = Path.Combine(path, item.MLMC);
  106. else
  107. {
  108. pathFull = FormatPath(path, xzqdm, xzqmc, item.GZMC);
  109. bzfiles.Add(Path.GetFileName(pathFull));
  110. }
  111. if (item.YSTJ == "M")
  112. {
  113. if (pathFull.Contains("|"))
  114. {
  115. var keylist = GetTokens(pathFull).Where(t=>t.Contains("|")).ToList();
  116. //是否全通过
  117. var fullOk = true;
  118. foreach (var keys in keylist)
  119. {
  120. var values = keys.Split("|");
  121. //是否有一个通过
  122. var isOk = false;
  123. foreach (var value in values)
  124. {
  125. var value2 = value.Replace("{", "").Replace("}", "");
  126. var temp = pathFull.Replace(keys, value2);
  127. //类型(0目录)
  128. if (item.LX == 0 && Directory.Exists(temp))
  129. {
  130. isOk = true;
  131. if (temp.EndsWith(".gdb"))
  132. {
  133. break;
  134. }
  135. FileCheckSub(item.BSM, temp, root, xzqdm, xzqmc, list, errors);
  136. break;
  137. }
  138. //类型(1文件)
  139. if (item.LX == 1 && File.Exists(temp))
  140. {
  141. isOk = true;
  142. break;
  143. }
  144. }
  145. //如果都没有过就要报错,并跳出整个循环
  146. if(!isOk)
  147. {
  148. fullOk = false; //因为报错所以fullOk就不能为true
  149. break;
  150. }
  151. }
  152. //如果都没有过,报错
  153. if (!fullOk)
  154. {
  155. errors.lack.Add(pathFull.Replace(root, ""));
  156. }
  157. else
  158. {
  159. continue;
  160. }
  161. }
  162. else
  163. {
  164. //类型(0目录)
  165. if (item.LX == 0 && Directory.Exists(pathFull))
  166. {
  167. if (pathFull.EndsWith(".gdb"))
  168. continue;
  169. FileCheckSub(item.BSM, pathFull, root, xzqdm, xzqmc, list, errors);
  170. continue;
  171. }
  172. //类型(1文件)
  173. if (item.LX == 1 && File.Exists(pathFull))
  174. {
  175. continue;
  176. }
  177. errors.lack.Add(pathFull.Replace(root, ""));
  178. }
  179. }
  180. }
  181. //检查文件数量是否相同(可选)
  182. var files = Directory.GetFiles(path);
  183. foreach (var item in files)
  184. {
  185. if (!bzfiles.Contains(Path.GetFileName(item)))
  186. {
  187. errors.many.Add(item.Replace(root, ""));
  188. }
  189. }
  190. }
  191. /// <summary>
  192. /// 检查数据目录
  193. /// </summary>
  194. /// <param name="root">根目录</param>
  195. /// <param name="xzqdm">行政区代码</param>
  196. /// <param name="xzqdm">行政区名称</param>
  197. /// <param name="path">检查路径</param>
  198. /// <returns></returns>
  199. private string FormatPath(string root, string xzqdm, string xzqmc, string path)
  200. {
  201. var keys = GetTokens(path);
  202. foreach (var item in keys)
  203. {
  204. if (item.Contains("行政区代码"))
  205. {
  206. var index = item.IndexOf(":");
  207. var len = xzqdm.Length;
  208. if(index >= 0)
  209. {
  210. len = (item.Split(':')[1].Replace("}", "").ToInt());
  211. }
  212. if(xzqdm.Length < len)
  213. {
  214. throw new UseArgumentException($"基本信息文件中的行政区代码长度与数据标准不符");
  215. }
  216. xzqdm = xzqdm.Substring(0, len);
  217. path = path.Replace(item, xzqdm);
  218. continue;
  219. }
  220. if (item.Contains("行政区名称"))
  221. {
  222. path = path.Replace(item, xzqmc);
  223. continue;
  224. }
  225. }
  226. var fullPath = Path.Combine(root, path);
  227. return fullPath;
  228. }
  229. /// <summary>
  230. /// 匹配花括号
  231. /// </summary>
  232. /// <param name="str">需要匹配的字符串</param>
  233. /// <returns></returns>
  234. private List<string> GetTokens(string str)
  235. {
  236. Regex regex = new Regex(@"\{.*?\}", RegexOptions.IgnoreCase);
  237. MatchCollection matches = regex.Matches(str);
  238. var list = matches.Cast<Match>().Select(m => m.Value).Distinct().ToList();
  239. return list;
  240. }
  241. }
  242. }