CgglScxmRepository.cs 105 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329
  1. using Microsoft.AspNetCore.Http;
  2. using NPOI.OpenXmlFormats.Wordprocessing;
  3. using NPOI.XWPF.UserModel;
  4. using QM.KJGH.CGGL.IRepository;
  5. using QM.KJGH.CGGL;
  6. using QM.KJGH.CGGL.Model.Cggl;
  7. using QM.KJGH.CGGL.Model.Enums;
  8. using QM.KJGH.CGGL.Model.Ghxms;
  9. using QM.KJGH.Model;
  10. using QM.KJGH.Model.KJGH;
  11. using QM.OrmSqlSugar;
  12. using QM.OrmSqlSugar.Utility;
  13. using SqlSugar;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Data;
  17. using System.Diagnostics;
  18. using System.IO;
  19. using System.IO.Compression;
  20. using System.Linq;
  21. using System.Text;
  22. using System.Text.RegularExpressions;
  23. using System.Threading.Tasks;
  24. using WS;
  25. using WS.AutoMapper;
  26. using WS.Helper;
  27. using WS.IO;
  28. using WS.IO.Upload;
  29. using WS.Orm;
  30. using QM.KJGH.CGGL.Model.CG;
  31. using System.Threading;
  32. using QM.KJGH.CGGL.NMCGHJ.QX;
  33. using QM.KJGH.CGGL.Model.QxCghj;
  34. using QM.KJGH.Model.Enums;
  35. using QM.KJGH.CGGL.NMCGHJ;
  36. using QM.KJGH.CGGL.Model.NMCghj;
  37. using QM.KJGH.CGGL.NMCGHJ.ZZQ;
  38. using QM.KJGH.Model.KJGH.CGHJ;
  39. using QM.KJGH.Utility;
  40. using QM.KJGH.CGGL.Model;
  41. namespace QM.KJGH.CGGL.Repository
  42. {
  43. public class CgglScxmRepository : SqlSugarRepository<CgglScxm>, ICgglScxmRepository
  44. {
  45. private readonly ICgzjZjrwRepository _ICgzjZjrwRepository;
  46. private readonly ICghjQxcgRepository _ICghjQxcgRepository;
  47. private readonly ICghjQxcgsbrwRepository _ICghjQxcgsbrwRepository;
  48. private readonly ICghjQxjczbRepository _ICghjQxjczbRepository;
  49. private readonly ICghjQxtjpgrwRepository _ICghjQxtjpgrwRepository;
  50. private readonly ICgzjSjbzRepository _ICgzjSjbzRepository;
  51. private readonly ICfgSettingRepository _ICfgSettingRepository;
  52. public CgglScxmRepository(
  53. ICgzjZjrwRepository ICgzjZjrwRepository
  54. , ICghjQxcgRepository ICghjQxcgRepository
  55. , ICghjQxcgsbrwRepository ICghjQxcgsbrwRepository
  56. , ICghjQxjczbRepository ICghjQxjczbRepository
  57. , ICghjQxtjpgrwRepository ICghjQxtjpgrwRepository
  58. , ICgzjSjbzRepository ICgzjSjbzRepository
  59. , ICfgSettingRepository ICfgSettingRepository
  60. )
  61. {
  62. _ICgzjZjrwRepository = ICgzjZjrwRepository;
  63. _ICghjQxcgRepository = ICghjQxcgRepository;
  64. _ICghjQxcgsbrwRepository = ICghjQxcgsbrwRepository;
  65. _ICghjQxjczbRepository = ICghjQxjczbRepository;
  66. _ICghjQxtjpgrwRepository = ICghjQxtjpgrwRepository;
  67. _ICgzjSjbzRepository = ICgzjSjbzRepository;
  68. _ICfgSettingRepository = ICfgSettingRepository;
  69. }
  70. /// <summary>
  71. /// 匹配花括号
  72. /// </summary>
  73. /// <param name="str">需要匹配的字符串</param>
  74. /// <returns></returns>
  75. private string GetTokens(string str)
  76. {
  77. Regex regex = new Regex(@"\{.*?\}", RegexOptions.IgnoreCase);
  78. MatchCollection matches = regex.Matches(str);
  79. var list = matches.Cast<Match>().Select(m => m.Value).Distinct().ToList();
  80. return string.Join("", list);
  81. }
  82. /// <summary>
  83. /// 测试使用
  84. /// </summary>
  85. /// <param name="xmbsm"></param>
  86. /// <param name="xzqdm"></param>
  87. /// <param name="xzqmc"></param>
  88. /// <param name="arrs"></param>
  89. /// <returns></returns>
  90. public List<string> FileCheck(string xmbsm, string xzqdm, string xzqmc, out List<CgglCgsj> arrs)
  91. {
  92. arrs = new List<CgglCgsj>();
  93. xzqdm = xzqdm.PadLeft(6, '0');
  94. var msgList = new List<string>();
  95. //上传文件并解压文件
  96. string path = FileManage.Instance.ToFullPath(@$"SCXM");
  97. //var file = FileUpload.SaveFile(formFile, path, "");
  98. //ZipFile.ExtractToDirectory($"{path}\\150600000鄂尔多斯市国土空间总体规划电子成果数据.zip", path, Encoding.GetEncoding("GBK"));
  99. //查询数据
  100. var db = DbClient();
  101. //查询所有目录
  102. var catalogRules = db.Queryable<CgglCgmlgz>().ToList();
  103. //所有目录标识码
  104. var list = catalogRules.Select(u => u.BSM).ToList();
  105. //取出根目录
  106. var rootDirectory = catalogRules.FirstOrDefault(u => SqlFunc.IsNullOrEmpty(u.SJML));
  107. if (rootDirectory == null)
  108. throw new UseArgumentException("查询根目录错误");
  109. //验证根目录
  110. //Regex reg = new Regex("{行政区代码:6}{行政区名称}");
  111. Regex reg = new Regex(GetTokens(rootDirectory.GZMC));
  112. string modified = reg.Replace(rootDirectory.GZMC, $"{xzqdm}{xzqmc}");
  113. //判断根目录是否存在
  114. if (FileSystem.IsExist($"{path}\\{modified}", true))
  115. {
  116. //验证根目录下得必要文件
  117. var rootDirectoryFile = db.Queryable<CgglWjgz>().Where(u => u.CGML_BSM == rootDirectory.BSM && u.YSTJ == "M").ToList();
  118. foreach (var item in rootDirectoryFile)
  119. {
  120. //验证根目录文件
  121. Regex regFile = new Regex(GetTokens(item.MMGZ));
  122. string modifiedFile = regFile.Replace(item.MMGZ, $"{xzqdm}{xzqmc}");
  123. if (FileSystem.IsExist($"{path}\\{modified}\\{modifiedFile}", false))
  124. {
  125. arrs.Add(new CgglCgsj
  126. {
  127. BSM = Guid.NewGuid().ToString("N"),
  128. XMBSM = xmbsm,
  129. MLBSM = item.BSM,
  130. MLMC = modified,
  131. CGMC = modifiedFile,
  132. CGLJ = $@"files\SCXM\{modified}\{modifiedFile}"
  133. });
  134. continue;
  135. }
  136. msgList.Add($"上传的文件不包含({modified}\\{modifiedFile})文件");
  137. }
  138. //取出所有子目录
  139. var subdirectory = catalogRules.Where(u => !SqlFunc.IsNullOrEmpty(u.SJML)).ToList();
  140. //取出子目录字典
  141. var dic = subdirectory.Where(u => !SqlFunc.IsNullOrEmpty(u.SJML)).ToDictionary(u => u.BSM);
  142. foreach (var item in subdirectory)
  143. {
  144. //判断对应得子目录是否存在
  145. if (FileSystem.IsExist($"{path}\\{modified}\\{item.MLMC}", true)) continue;
  146. msgList.Add($"{item.MLMC}目录不存在");
  147. }
  148. //取出所有子目录所需必要文件规则不包含根目录(必填和条件必填)
  149. var subdirectoryFile = db.Queryable<CgglWjgz>().Where(u => list.Contains(u.CGML_BSM) && (u.YSTJ == "M" || u.YSTJ == "C") && !u.CGML_BSM.Contains("GTKJZTGHDZCGSJ")).ToList();
  150. foreach (var item in subdirectoryFile)
  151. {
  152. if (item.YSTJ == "M")
  153. {
  154. //验证根子目录文件
  155. Regex regFile = new Regex(GetTokens(item.MMGZ));
  156. string modifiedFile = regFile.Replace(item.MMGZ, $"{xzqdm}{xzqmc}");
  157. if (dic.ContainsKey(item.CGML_BSM))
  158. {
  159. if (FileSystem.IsExist($"{path}\\{modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile}", false))
  160. {
  161. arrs.Add(new CgglCgsj
  162. {
  163. BSM = Guid.NewGuid().ToString("N"),
  164. XMBSM = xmbsm,
  165. MLBSM = item.BSM,
  166. MLMC = dic[item.CGML_BSM].MLMC,
  167. CGMC = modifiedFile,
  168. CGLJ = $@"files\SCXM\{modified}\{dic[item.CGML_BSM].MLMC}\{modifiedFile}"
  169. });
  170. continue;
  171. }
  172. msgList.Add($"上传的文件不包含({modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile})文件");
  173. }
  174. else
  175. {
  176. throw new UseArgumentException($"目录获取错误");
  177. }
  178. }
  179. else
  180. {
  181. var dt = db.Ado.GetDataTable($"SELECT * FROM {item.BZ} WHERE YSTJ='M'");
  182. foreach (DataRow dr in dt.Rows)
  183. {
  184. if (item.BZ == "t_cggl_ghwb")
  185. {
  186. Regex regFile = new Regex(GetTokens(item.MMGZ));
  187. string modifiedFile = regFile.Replace(item.MMGZ, $"{xzqdm}{xzqmc}{dr["WJMC"].ToString()}");
  188. if (dic.ContainsKey(item.CGML_BSM))
  189. {
  190. if (FileSystem.IsExist($"{path}\\{modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile}", false))
  191. {
  192. arrs.Add(new CgglCgsj
  193. {
  194. BSM = Guid.NewGuid().ToString("N"),
  195. XMBSM = xmbsm,
  196. MLBSM = item.BSM,
  197. MLMC = dic[item.CGML_BSM].MLMC,
  198. CGMC = modifiedFile,
  199. CGLJ = $@"files\SCXM\{modified}\{dic[item.CGML_BSM].MLMC}\{modifiedFile}"
  200. });
  201. continue;
  202. }
  203. msgList.Add($"上传的文件不包含({modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile})文件");
  204. }
  205. else
  206. {
  207. throw new UseArgumentException($"目录获取错误");
  208. }
  209. }
  210. else
  211. {
  212. Regex regFile = new Regex(GetTokens(item.MMGZ));
  213. string modifiedFile = regFile.Replace(item.MMGZ, $"{xzqdm}{xzqmc}{dr["XH"]}{dr["TJMC"]}");
  214. if (dic.ContainsKey(item.CGML_BSM))
  215. {
  216. if (FileSystem.IsExist($"{path}\\{modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile}", false))
  217. {
  218. arrs.Add(new CgglCgsj
  219. {
  220. BSM = Guid.NewGuid().ToString("N"),
  221. XMBSM = xmbsm,
  222. MLBSM = item.BSM,
  223. MLMC = dic[item.CGML_BSM].MLMC,
  224. CGMC = modifiedFile,
  225. CGLJ = $@"files\SCXM\{modified}\{dic[item.CGML_BSM].MLMC}\{modifiedFile}"
  226. });
  227. continue;
  228. }
  229. msgList.Add($"上传的文件不包含({modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile})文件");
  230. }
  231. else
  232. {
  233. throw new UseArgumentException($"目录获取错误");
  234. }
  235. }
  236. }
  237. }
  238. }
  239. }
  240. else
  241. {
  242. msgList.Add($"{modified}目录不存在");
  243. }
  244. return msgList;
  245. }
  246. /// <summary>
  247. /// 文件检查文件合规检查
  248. /// </summary>
  249. /// <param name="formFile"></param>
  250. /// <param name="xzqdm"></param>
  251. /// <param name="xzqmc"></param>
  252. /// <returns></returns>
  253. private List<string> FileCheck(IFormFile formFile, string xmbsm, string xzqdm, string xzqmc, out List<CgglCgsj> arrs)
  254. {
  255. arrs = new List<CgglCgsj>();
  256. xzqdm = xzqdm.PadRight(9, '0');
  257. var msgList = new List<string>();
  258. //上传文件并解压文件
  259. string path = FileManage.Instance.ToFullPath(@$"SCXM");
  260. if (!formFile.FileName.Contains($"{xzqdm}{xzqmc}")) throw new UseArgumentException("上传的文件有误");
  261. var file = FileUpload.SaveFile(formFile, path);
  262. ZipFile.ExtractToDirectory($"{path}\\{file.Name}", path, Encoding.GetEncoding("GBK"));
  263. //查询数据
  264. var db = DbClient();
  265. //查询所有目录
  266. var catalogRules = db.Queryable<CgglCgmlgz>().ToList();
  267. //所有目录标识码
  268. var list = catalogRules.Select(u => u.BSM).ToList();
  269. //取出根目录
  270. var rootDirectory = catalogRules.FirstOrDefault(u => SqlFunc.IsNullOrEmpty(u.SJML));
  271. if (rootDirectory == null)
  272. throw new UseArgumentException("查询根目录错误");
  273. //验证根目录
  274. //Regex reg = new Regex("{行政区代码:6}{行政区名称}");
  275. Regex reg = new Regex(GetTokens(rootDirectory.GZMC));
  276. string modified = reg.Replace(rootDirectory.GZMC, $"{xzqdm}{xzqmc}");
  277. //判断根目录是否存在
  278. if (FileSystem.IsExist($"{path}\\{modified}", true))
  279. {
  280. //验证根目录下得必要文件
  281. var rootDirectoryFile = db.Queryable<CgglWjgz>().Where(u => u.CGML_BSM == rootDirectory.BSM && u.YSTJ == "M").ToList();
  282. foreach (var item in rootDirectoryFile)
  283. {
  284. //验证根目录文件
  285. Regex regFile = new Regex(GetTokens(item.MMGZ));
  286. string modifiedFile = regFile.Replace(item.MMGZ, $"{xzqdm}{xzqmc}");
  287. if (FileSystem.IsExist($"{path}\\{modified}\\{modifiedFile}", false))
  288. {
  289. arrs.Add(new CgglCgsj
  290. {
  291. BSM = Guid.NewGuid().ToString("N"),
  292. XMBSM = xmbsm,
  293. MLBSM = item.BSM,
  294. MLMC = modified,
  295. CGMC = modifiedFile,
  296. CGLJ = $@"files\SCXM\{modified}\{modifiedFile}"
  297. });
  298. continue;
  299. }
  300. msgList.Add($"上传的文件不包含({modified}\\{modifiedFile})文件");
  301. }
  302. //取出所有子目录
  303. var subdirectory = catalogRules.Where(u => !SqlFunc.IsNullOrEmpty(u.SJML)).ToList();
  304. //取出子目录字典
  305. var dic = subdirectory.Where(u => !SqlFunc.IsNullOrEmpty(u.SJML)).ToDictionary(u => u.BSM);
  306. foreach (var item in subdirectory)
  307. {
  308. //判断对应得子目录是否存在
  309. if (FileSystem.IsExist($"{path}\\{modified}\\{item.MLMC}", true)) continue;
  310. msgList.Add($"{item.MLMC}目录不存在");
  311. }
  312. //取出所有子目录所需必要文件规则不包含根目录(必填和条件必填)
  313. var subdirectoryFile = db.Queryable<CgglWjgz>().Where(u => list.Contains(u.CGML_BSM) & (u.YSTJ == "M" || u.YSTJ == "C") & !u.CGML_BSM.Contains("GTKJZTGHDZCGSJ")).ToList();
  314. foreach (var item in subdirectoryFile)
  315. {
  316. if (item.YSTJ == "M")
  317. {
  318. //验证根子目录文件
  319. Regex regFile = new Regex(GetTokens(item.MMGZ));
  320. string modifiedFile = regFile.Replace(item.MMGZ, $"{xzqdm}{xzqmc}");
  321. if (dic.ContainsKey(item.CGML_BSM))
  322. {
  323. if (FileSystem.IsExist($"{path}\\{modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile}", false))
  324. {
  325. arrs.Add(new CgglCgsj
  326. {
  327. BSM = Guid.NewGuid().ToString("N"),
  328. XMBSM = xmbsm,
  329. MLBSM = item.BSM,
  330. MLMC = dic[item.CGML_BSM].MLMC,
  331. CGMC = modifiedFile,
  332. CGLJ = $@"files\SCXM\{modified}\{dic[item.CGML_BSM].MLMC}\{modifiedFile}"
  333. });
  334. continue;
  335. }
  336. msgList.Add($"上传的文件不包含({modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile})文件");
  337. }
  338. else
  339. {
  340. throw new UseArgumentException($"目录获取错误");
  341. }
  342. }
  343. else
  344. {
  345. var dt = db.Ado.GetDataTable($"SELECT * FROM {item.BZ} WHERE YSTJ='M'");
  346. foreach (DataRow dr in dt.Rows)
  347. {
  348. if (item.BZ == "t_cggl_ghwb")
  349. {
  350. Regex regFile = new Regex(GetTokens(item.MMGZ));
  351. string modifiedFile = regFile.Replace(item.MMGZ, $"{xzqdm}{xzqmc}{dr["WJMC"].ToString()}");
  352. if (dic.ContainsKey(item.CGML_BSM))
  353. {
  354. if (FileSystem.IsExist($"{path}\\{modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile}", false))
  355. {
  356. arrs.Add(new CgglCgsj
  357. {
  358. BSM = Guid.NewGuid().ToString("N"),
  359. XMBSM = xmbsm,
  360. MLBSM = item.BSM,
  361. MLMC = dic[item.CGML_BSM].MLMC,
  362. CGMC = modifiedFile,
  363. CGLJ = $@"files\SCXM\{modified}\{dic[item.CGML_BSM].MLMC}\{modifiedFile}"
  364. });
  365. continue;
  366. }
  367. msgList.Add($"上传的文件不包含({modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile})文件");
  368. }
  369. else
  370. {
  371. throw new UseArgumentException($"目录获取错误");
  372. }
  373. }
  374. else
  375. {
  376. Regex regFile = new Regex(GetTokens(item.MMGZ));
  377. string modifiedFile = regFile.Replace(item.MMGZ, $"{xzqdm}{xzqmc}{dr["XH"]}{dr["TJMC"]}");
  378. if (dic.ContainsKey(item.CGML_BSM))
  379. {
  380. if (FileSystem.IsExist($"{path}\\{modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile}", false))
  381. {
  382. arrs.Add(new CgglCgsj
  383. {
  384. BSM = Guid.NewGuid().ToString("N"),
  385. XMBSM = xmbsm,
  386. MLBSM = item.BSM,
  387. MLMC = dic[item.CGML_BSM].MLMC,
  388. CGMC = modifiedFile,
  389. CGLJ = $@"files\SCXM\{modified}\{dic[item.CGML_BSM].MLMC}\{modifiedFile}"
  390. });
  391. continue;
  392. }
  393. msgList.Add($"上传的文件不包含({modified}\\{dic[item.CGML_BSM].MLMC}\\{modifiedFile})文件");
  394. }
  395. else
  396. {
  397. throw new UseArgumentException($"目录获取错误");
  398. }
  399. }
  400. }
  401. }
  402. }
  403. }
  404. else
  405. {
  406. msgList.Add($"{modified}目录不存在");
  407. }
  408. return msgList;
  409. }
  410. /// <summary>
  411. /// 检查
  412. /// </summary>
  413. /// <param name="bsm">标识码</param>
  414. /// <returns></returns>
  415. public async Task<CgglScxm> CheckId(string bsm)
  416. {
  417. var model = await GetAsync(t => t.BSM == bsm);
  418. if (model == null)
  419. throw new UseArgumentException("数据不存在,请检查标识码是否正确");
  420. return model;
  421. }
  422. /// <summary>
  423. /// 添加数据
  424. /// </summary>
  425. /// <param name="cgglScxm"></param>
  426. /// <param name="files"></param>
  427. /// <returns></returns>
  428. public async Task<bool> Add(CgglScxm cgglScxm, IFormFileCollection files)
  429. {
  430. var db = DbClient();
  431. //如果集合不为空表示文件验证不通过
  432. List<string> passOrNot = null;
  433. List<CgglCgsj> arrs = null;
  434. if (files != null && files.Count > 0)
  435. passOrNot = FileCheck(files.FirstOrDefault(), cgglScxm.BSM, cgglScxm.XZQDM, cgglScxm.XZQMC, out arrs);
  436. //文件验证成功开始入库
  437. if (passOrNot == null)
  438. {
  439. try
  440. {
  441. db.BeginTran();
  442. await db.Insertable(cgglScxm).ExecuteCommandAsync();
  443. if (files != null && files.Count > 0)
  444. await db.Insertable(arrs).ExecuteCommandAsync();
  445. db.CommitTran();
  446. }
  447. catch (Exception ex)
  448. {
  449. db.RollbackTran();
  450. WS.Log.RunLog.Error(ex);
  451. throw new UseArgumentException("服务器错误");
  452. }
  453. }
  454. return passOrNot == null ? true : throw new UseArgumentException(string.Join(",", passOrNot)); ;
  455. }
  456. /// <summary>
  457. /// 添加数据(从质检转入)
  458. /// </summary>
  459. /// <returns></returns>
  460. public async Task<bool> ZjToAdd(CgglScxmToRgDto input)
  461. {
  462. var zjrw = await _ICgzjZjrwRepository.GetAsync(t => t.BSM == input.JS_BSM);
  463. var cg = await Db.Queryable<CgglCg>().Where(t => t.BSM == zjrw.CG_BSM).FirstAsync();
  464. CgglScxm scxm = new CgglScxm()
  465. {
  466. BSM = Guid.NewGuid().ToStringN(),
  467. XMMC = zjrw.RWMC,
  468. GHLX = zjrw.GHLX,
  469. XZQDM = zjrw.XZQDM,
  470. XZQMC = zjrw.XZQMC,
  471. SCZT = "待审",
  472. GZL_BSM = input.GZL_BSM,
  473. QXCG_BSM = zjrw.QXCG_BSM,
  474. CG_BSM = zjrw.CG_BSM,
  475. ZJ_BSM = zjrw.BSM,
  476. CJRY = input.CJRY,
  477. CJSJ = DateTime.Now,
  478. SCSJ_KS = DateTime.Now,
  479. };
  480. var delList = new List<string>();
  481. //添加流程
  482. List<CgglGzlsp> splc = NextLc(input.GZL_BSM, scxm.BSM, null, null, ref delList);
  483. try
  484. {
  485. cg.ZT = KJGH.Model.Enums.EnumCgglCgZT.人工审查;
  486. cg.ZT_RGSC = KJGH.Model.Enums.EnumCgscZT.审查中;
  487. Db.BeginTran();
  488. await Db.Insertable(scxm).ExecuteCommandIdentityIntoEntityAsync();
  489. await Db.Updateable(cg).ExecuteCommandAsync();
  490. if (splc != null && splc.Count > 0)
  491. await Db.Insertable(splc).ExecuteCommandIdentityIntoEntityAsync();
  492. Db.CommitTran();
  493. }
  494. catch (Exception ex)
  495. {
  496. Db.RollbackTran();
  497. WS.Log.RunLog.Error(ex);
  498. throw new UseArgumentException("操作失败");
  499. }
  500. return true;
  501. }
  502. /// <summary>
  503. /// 添加数据(从成果跳过)
  504. /// </summary>
  505. /// <returns></returns>
  506. public async Task<bool> ZjToAddByTg(CgglScxmToRgDto input)
  507. {
  508. var cg = await Db.Queryable<CgglCg>().Where(t => t.BSM == input.JS_BSM).FirstAsync();
  509. #region 检查目录
  510. //检查目录
  511. var cgpath = FileManage.Instance.ToFullPath(cg.CGML);
  512. var sjbz_bsm = cg.GHJB + cg.GHLX;
  513. if (cg.GHLX == EnumGHLX.村庄规划)
  514. {
  515. sjbz_bsm = cg.GHLX + cg.CGXS;
  516. }
  517. var errorFile = await _ICgzjSjbzRepository.FileCheck(sjbz_bsm, cg.XZQDM, cg.XZQMC, cgpath);
  518. //检查文文件
  519. var errorStr = string.Empty;
  520. var config = await _ICfgSettingRepository.GetSetting<CgglConfig>("CGGL");
  521. if (config.CheckLack && errorFile.lack.Count > 0)
  522. {
  523. errorStr += @$"成果数据缺少以下目录或文件:{"\n"}{errorFile.lack.Join("\n")}{"\n"}";
  524. }
  525. if (config.CheckMany && errorFile.many.Count > 0)
  526. {
  527. errorStr += @$"成果数据多出以下文件,多的文档可放到其他文件中:{"\n"}{errorFile.many.Join("\n")}";
  528. }
  529. if (!string.IsNullOrWhiteSpace(errorStr))
  530. throw new UseMassageException(errorStr);
  531. #endregion
  532. //var zjrw = await _ICgzjZjrwRepository.GetAsync(t => t.BSM == input.JS_BSM);
  533. CgglScxm scxm = new CgglScxm()
  534. {
  535. BSM = Guid.NewGuid().ToStringN(),
  536. XMMC = cg.XMMC,
  537. GHLX = cg.GHLX,
  538. XZQDM = cg.XZQDM,
  539. XZQMC = cg.XZQMC,
  540. SCZT = "待审",
  541. GZL_BSM = input.GZL_BSM,
  542. QXCG_BSM = cg.QXCG_BSM,
  543. CG_BSM = cg.BSM,
  544. ZJ_BSM = cg.BSM,
  545. CJRY = input.CJRY,
  546. CJSJ = DateTime.Now,
  547. SCSJ_KS = DateTime.Now,
  548. };
  549. var delList = new List<string>();
  550. //添加流程
  551. List<CgglGzlsp> splc = NextLc(input.GZL_BSM, scxm.BSM, null, null, ref delList);
  552. try
  553. {
  554. cg.ZT = KJGH.Model.Enums.EnumCgglCgZT.人工审查;
  555. cg.ZT_JQSC = KJGH.Model.Enums.EnumCgscZT.未提交;
  556. cg.ZT_RGSC = KJGH.Model.Enums.EnumCgscZT.审查中;
  557. Db.BeginTran();
  558. await Db.Insertable(scxm).ExecuteCommandIdentityIntoEntityAsync();
  559. await Db.Updateable(cg).ExecuteCommandAsync();
  560. if (splc != null && splc.Count > 0)
  561. await Db.Insertable(splc).ExecuteCommandIdentityIntoEntityAsync();
  562. Db.CommitTran();
  563. }
  564. catch (Exception ex)
  565. {
  566. Db.RollbackTran();
  567. WS.Log.RunLog.Error(ex);
  568. throw new UseArgumentException("操作失败");
  569. }
  570. return true;
  571. }
  572. /// <summary>
  573. /// 添加数据(区县上报-跳过机检查)
  574. /// </summary>
  575. /// <returns></returns>
  576. public async Task<bool> ZjToAddByCg(CgglScxmToRgDto input)
  577. {
  578. var cg = await Db.Queryable<CgglCg>().Where(t => t.BSM == input.JS_BSM).FirstAsync();
  579. if (cg != null)
  580. {
  581. throw new UseArgumentException("成果管理中存在相同的成果数据");
  582. }
  583. //区县成果
  584. var model = await _ICghjQxcgRepository.GetAsync(t => t.BSM == input.JS_BSM);
  585. model.SCZT = "审查中";
  586. model.SCSJ_KS = DateTime.Now;
  587. //区县任务
  588. var qxrw = await Db.Queryable<CghjQxcgsbrw>().Where(t => t.BSM == model.BSM).FirstAsync();
  589. var cgml = FileManage.Instance.ToFullPath(model.CGLJ, false);
  590. var txtInfo = PathHelper.GetFiles(cgml).Where(t => t.EndsWith("基本信息.txt")).FirstOrDefault();
  591. var info = GhcgInfoHelper.ReadFile(txtInfo);
  592. var cgglCg = info.MapTo<CgglCg>();
  593. cgglCg.BSM = model.BSM;
  594. cgglCg.CGB = model.CGB;
  595. cgglCg.CGML = model.CGLJ;
  596. cgglCg.ZT = KJGH.Model.Enums.EnumCgglCgZT.人工审查;
  597. cgglCg.ZT_JQSC = KJGH.Model.Enums.EnumCgscZT.未提交;
  598. cgglCg.ZT_RGSC = KJGH.Model.Enums.EnumCgscZT.审查中;
  599. cgglCg.QXCG_BSM = model.BSM;
  600. cgglCg.CGFPS = qxrw.TOTAL;
  601. cgglCg.INSTID = model.INSTID;
  602. CgglScxm scxm = new CgglScxm()
  603. {
  604. BSM = Guid.NewGuid().ToStringN(),
  605. XMMC = cgglCg.XMMC,
  606. GHLX = cgglCg.GHLX,
  607. XZQDM = cgglCg.XZQDM,
  608. XZQMC = cgglCg.XZQMC,
  609. SCZT = "待审",
  610. GZL_BSM = input.GZL_BSM,
  611. QXCG_BSM = cgglCg.BSM,
  612. CG_BSM = cgglCg.BSM,
  613. ZJ_BSM = cgglCg.BSM,
  614. CJRY = input.CJRY,
  615. CJSJ = DateTime.Now,
  616. SCSJ_KS = DateTime.Now,
  617. };
  618. var delList = new List<string>();
  619. //添加流程
  620. List<CgglGzlsp> splc = NextLc(input.GZL_BSM, scxm.BSM, null, null, ref delList);
  621. try
  622. {
  623. Db.BeginTran();
  624. await Db.Insertable(cgglCg).ExecuteCommandIdentityIntoEntityAsync();
  625. await Db.Updateable(model).ExecuteCommandAsync();
  626. await Db.Insertable(scxm).ExecuteCommandIdentityIntoEntityAsync();
  627. if (splc != null && splc.Count > 0)
  628. await Db.Insertable(splc).ExecuteCommandIdentityIntoEntityAsync();
  629. Db.CommitTran();
  630. }
  631. catch (Exception ex)
  632. {
  633. Db.RollbackTran();
  634. WS.Log.RunLog.Error(ex);
  635. throw new UseArgumentException("操作失败");
  636. }
  637. return true;
  638. }
  639. /// <summary>
  640. /// 成果审批
  641. /// </summary>
  642. public async Task<bool> SpLc(CgspInput sp)
  643. {
  644. List<CgglGzlsp> nextLcList = new List<CgglGzlsp>();
  645. bool endlc = false;
  646. if (string.IsNullOrWhiteSpace(sp.SPZT))
  647. {
  648. return await AuditStatus(sp);
  649. }
  650. //当前审批流程
  651. var splc = await Db.Queryable<CgglGzlsp>().Where(t => t.ID == sp.ID).FirstAsync();
  652. //当前审批节点
  653. var spjd = await Db.Queryable<CgglGzljd, CgglGzllc>((a, b) => new JoinQueryInfos(
  654. JoinType.Inner, a.ID == b.DQJD))
  655. .Where((a, b) => b.ID == splc.LC_BSM)
  656. .FirstAsync();
  657. splc.SPSJ = DateTime.Now;
  658. splc.SPYJ = sp.SPYJ;
  659. splc.SPZT = sp.SPZT;
  660. var delList = new List<string>();
  661. CgglScxm scxm = null;
  662. CgglCg cgglCg = null;
  663. if (splc.SPZT == "通过")
  664. {
  665. nextLcList = NextLc(spjd.GZL_ID, splc.RW_BSM, spjd.ID, splc.SPR, ref delList);
  666. endlc = nextLcList == null;//报告
  667. }
  668. else if (splc.SPZT == "审查中")
  669. {
  670. scxm = Db.Queryable<CgglScxm>().Where(t => t.BSM == splc.RW_BSM).First();
  671. scxm.SCZT = splc.SPZT;
  672. if (scxm.SCSJ_KS == null)
  673. scxm.SCSJ_KS = DateTime.Now;
  674. }
  675. else if (splc.SPZT == "退回")
  676. {
  677. scxm = Db.Queryable<CgglScxm>().Where(t => t.BSM == splc.RW_BSM).First();
  678. scxm.SCZT = splc.SPZT;
  679. scxm.SCJG = splc.ID;
  680. scxm.SCSJ_JS = DateTime.Now;
  681. cgglCg = Db.Queryable<CgglCg>().Where(t => t.BSM == scxm.CG_BSM).First();
  682. cgglCg.ZT_RGSC = EnumCgscZT.退回;
  683. }
  684. try
  685. {
  686. Db.BeginTran();
  687. await Db.Updateable(splc).ExecuteCommandAsync();
  688. if(nextLcList != null && nextLcList.Count > 0)
  689. await Db.Insertable(nextLcList).ExecuteCommandIdentityIntoEntityAsync();
  690. if (delList != null && delList.Count > 0)
  691. await Db.Deleteable<CgglGzlsp>().Where(t => delList.Contains(t.ID)).ExecuteCommandAsync();
  692. if (scxm != null)
  693. await Db.Updateable(scxm).ExecuteCommandAsync();
  694. if (cgglCg != null)
  695. await Db.Updateable(cgglCg).ExecuteCommandAsync();
  696. //结束
  697. if (endlc)
  698. {
  699. await EndscLc(new CgspEndInput()
  700. {
  701. SCXM_BSM = splc.RW_BSM,
  702. SCJG = string.Empty,
  703. SCZT = "完结",
  704. });
  705. }
  706. Db.CommitTran();
  707. }
  708. catch (Exception ex)
  709. {
  710. Db.RollbackTran();
  711. WS.Log.RunLog.Error(ex);
  712. throw new UseArgumentException("操作失败");
  713. }
  714. return true;
  715. }
  716. /// <summary>
  717. /// 获取下一流程
  718. /// </summary>
  719. /// <param name="lcid">流程编码</param>
  720. /// <param name="rwid">任务编码</param>
  721. /// <param name="jdid">当前完成节点</param>
  722. /// <param name="jdid">审批人</param>
  723. /// <returns>null结束 []没有下审批完 否则返回下一流程</returns>
  724. public List<CgglGzlsp> NextLc(string lcid, string rwid, string jdid, string user, ref List<string> delsp)
  725. {
  726. List<CgglGzlsp> splcList = new List<CgglGzlsp>();
  727. //1.获取下一流程
  728. var xylcs = Db.Queryable<CgglGzllc>().Where(t => t.GZL_ID == lcid)
  729. .WhereIF(string.IsNullOrWhiteSpace(jdid), t => string.IsNullOrWhiteSpace(t.SYJD))
  730. .WhereIF(!string.IsNullOrWhiteSpace(jdid),t => t.SYJD == jdid)
  731. .ToList();
  732. //2.获取所有审批流程
  733. var splc = Db.Queryable<CgglGzlsp>().Where(t => t.RW_BSM == rwid).ToList();
  734. //3.获取当前流程所涉及的所有审批人
  735. var sprs = Db.Queryable<CgglGzljdspyh, CgglGzllc>((a, b) => new JoinQueryInfos(
  736. JoinType.Inner, a.JD_ID == b.DQJD))
  737. .Where((a, b) => b.GZL_ID == lcid)
  738. //.WhereIF(string.IsNullOrWhiteSpace(jdid),(a,b)=>string.IsNullOrWhiteSpace(b.SYJD))
  739. //.WhereIF(!string.IsNullOrWhiteSpace(jdid),(a,b)=> b.SYJD == jdid)
  740. .Select((a,b)=>a)
  741. .ToList();
  742. //第一次
  743. if (string.IsNullOrWhiteSpace(jdid))
  744. {
  745. if (xylcs == null || xylcs.Count < 1)
  746. throw new UseMassageException("流程错误");
  747. splcList = new List<CgglGzlsp>();
  748. foreach (var item in xylcs)
  749. {
  750. var jsapr = sprs.Where(t => t.JD_ID == item.DQJD).ToList();
  751. foreach (var spr in jsapr)
  752. {
  753. CgglGzlsp lc = new CgglGzlsp()
  754. {
  755. SPZT = "待审",
  756. ID = Guid.NewGuid().ToStringN(),
  757. IS_DELETE = KJGH.Model.EnumDelete.Mormal,
  758. RW_BSM = rwid,
  759. RECEIVE_TIME = DateTime.Now,
  760. LC_BSM = item.ID,
  761. SPR = spr.SPR,
  762. SPRMC = spr.SPRMC
  763. };
  764. splcList.Add(lc);
  765. }
  766. }
  767. }
  768. else
  769. {
  770. //1.获取当前流程
  771. var dqlcs = Db.Queryable<CgglGzllc>().Where(t => t.DQJD == jdid && t.GZL_ID == lcid).First();
  772. //获取当前节点
  773. var jd = Db.Queryable<CgglGzljd>().Where(t => t.ID == jdid && t.GZL_ID == lcid).First();
  774. //检查当前节点是否全部审批完成
  775. var wwcSP = splc.Where(t => t.LC_BSM == dqlcs.ID && t.SPZT == "待审" && t.SPR != user).ToList();
  776. if (jd.SFQB == EnumBool.Yes && wwcSP.Count > 0)
  777. {
  778. //未完成所有审批,返回
  779. return splcList;
  780. }
  781. else if(wwcSP.Count > 0)
  782. {
  783. //不要求全部审批,删除没有审批的任务
  784. delsp.AddRange(wwcSP.Select(t => t.ID));
  785. }
  786. //结束
  787. if(jd.JDLX == KJGH.Model.Enums.EnumGzljdLX.结束)
  788. {
  789. return null;
  790. }
  791. ///子流程
  792. foreach (var item in xylcs)
  793. {
  794. var jsapr = sprs.Where(t => t.JD_ID == item.DQJD).ToList();
  795. foreach (var spr in jsapr)
  796. {
  797. CgglGzlsp lc = new CgglGzlsp()
  798. {
  799. SPZT = "待审",
  800. ID = Guid.NewGuid().ToStringN(),
  801. IS_DELETE = KJGH.Model.EnumDelete.Mormal,
  802. RW_BSM = rwid,
  803. RECEIVE_TIME = DateTime.Now,
  804. LC_BSM = item.ID,
  805. SPR = spr.SPR,
  806. SPRMC = spr.SPRMC
  807. };
  808. splcList.Add(lc);
  809. }
  810. }
  811. }
  812. return splcList;
  813. }
  814. /// <summary>
  815. /// 结束流程
  816. /// </summary>
  817. public async Task<bool> EndscLc(CgspEndInput input)
  818. {
  819. CgglScxm cgglScxm = await GetAsync(t => t.BSM == input.SCXM_BSM);
  820. cgglScxm.SCZT = input.SCZT;
  821. cgglScxm.SCSJ_JS = DateTime.Now;
  822. cgglScxm.SCJG = input.SCJG;
  823. //cgglScxm.SCBG = input.SCBG;//TODO:报告
  824. CgglCg cgglCg = Db.Queryable<CgglCg>().Where(t => t.BSM == cgglScxm.CG_BSM).First();
  825. cgglCg.ZT = KJGH.Model.Enums.EnumCgglCgZT.成果上报;
  826. cgglCg.ZT_RGSC = input.SCZT == "完结" ? KJGH.Model.Enums.EnumCgscZT.审查通过 : KJGH.Model.Enums.EnumCgscZT.退回; //TODO:不通过
  827. await Db.Updateable(cgglScxm).ExecuteCommandAsync();
  828. await Db.Updateable(cgglCg).ExecuteCommandAsync();
  829. #region 报告
  830. var filePath = await CreateReport(cgglScxm);
  831. #endregion
  832. return true;
  833. }
  834. /// <summary>
  835. /// 结束流程
  836. /// </summary>
  837. public async Task<bool> EndLc(CgspEndInput input)
  838. {
  839. try
  840. {
  841. Db.BeginTran();
  842. await EndscLc(input);
  843. Db.CommitTran();
  844. }
  845. catch (Exception ex)
  846. {
  847. Db.RollbackTran();
  848. WS.Log.RunLog.Error(ex);
  849. throw new UseArgumentException("操作失败");
  850. }
  851. return true;
  852. }
  853. /// <summary>
  854. ///
  855. /// </summary>
  856. /// <param name="list"></param>
  857. /// <param name="trees"></param>
  858. /// <param name="sjml"></param>
  859. private void ParseTree(List<CgglCgmlgz> list, List<Tree> trees, List<Tree> files, string sjml)
  860. {
  861. List<CgglCgmlgz> result = list.Where(a => a.SJML == sjml).ToList();
  862. foreach (var item in result)
  863. {
  864. var treeModel = new Tree();
  865. treeModel.label = item.MLMC;
  866. treeModel.value = item.BSM;
  867. treeModel.parent = item.SJML;
  868. treeModel.IsParent = true;
  869. treeModel.children = files.Where(u => u.parent == item.BSM).ToList();
  870. //递归
  871. ParseTree(list, treeModel.children, files, treeModel.value);
  872. trees.Add(treeModel);
  873. }
  874. }
  875. /// <summary>
  876. /// 根据标识码查看详细信息
  877. /// </summary>
  878. /// <param name="bsm"></param>
  879. /// <returns></returns>
  880. public async Task<CgglScxmView> QueryById(string bsm)
  881. {
  882. var model = (await CheckId(bsm)).MapTo<CgglScxmView>();
  883. var cgModel = Db.Queryable<CgglCg>().Where(t => t.BSM == model.CG_BSM).First();
  884. //查询审查意见列表
  885. var db = DbClient();
  886. var scyj = db.Queryable<CgglScyj, SysUser>((a, b) => new JoinQueryInfos(
  887. JoinType.Left, a.SCYH == b.ID && b.IS_DELETE == KJGH.Model.EnumBool.Yes)).Where((a, b) => a.CG_BSM == model.BSM).Select((a, b) => new CgglScyjDetailDto
  888. {
  889. BSM = a.BSM,
  890. CG_BSM = a.CG_BSM,
  891. SCYH = b.NAME,
  892. SCSJ = a.SCSJ,
  893. SCYJ = a.SCYJ,
  894. STATUS = a.STATUS
  895. }).ToList();
  896. //查询树结构
  897. var catalogRules = db.Queryable<CgglCgmlgz>().ToList();
  898. //递归解析数据
  899. var path = FileManage.Instance.ToFullPath(cgModel.CGB, false);
  900. var treeModels = FileHelp.FileCatalog(path.Substring(0,path.LastIndexOf('.')));
  901. //var files = db.Queryable<CgglWjgz, CgglCgsj>((a, b) => new JoinQueryInfos(
  902. // JoinType.Inner, a.BSM == b.MLBSM && b.XMBSM == model.BSM))
  903. // .Select((a, b) => new Tree { value = a.BSM, parent = a.CGML_BSM, label = b.CGMC, filepath = b.CGLJ, IsParent = false })
  904. // .ToList();
  905. //ParseTree(catalogRules, treeModels, files, null);
  906. //审查报告
  907. if (!string.IsNullOrWhiteSpace(model.SCJG))
  908. {
  909. var filePath = FileManage.Instance.ToFullPath(model.SCJG, false);
  910. var pdfFile = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + ".pdf");
  911. if (!File.Exists(pdfFile))
  912. {
  913. var pdfExe = ConfigHelper.Configuration["File:PdfExe"];
  914. var exeFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, pdfExe);
  915. var p = Process.Start(exeFile, $"\"{filePath}\" \"{pdfFile}\"");
  916. p.WaitForExit();
  917. }
  918. treeModels.Add(new Tree()
  919. {
  920. label = Path.GetFileName(pdfFile),
  921. filepath = FileManage.Instance.ToRelativePath(pdfFile),
  922. IsParent = false,
  923. value = model.BSM + "SCBG"
  924. });
  925. }
  926. model.cgglScyj = scyj;
  927. model.Trees = treeModels;
  928. return model;
  929. }
  930. /// <summary>
  931. /// 成果标识码获取
  932. /// </summary>
  933. /// <param name="bsm">成果标识码</param>
  934. /// <returns></returns>
  935. public async Task<CgglGzlsp> QueryByCgbsm(string bsm)
  936. {
  937. var model = (await Db.Queryable<CgglScxm>().Where(t=>t.CG_BSM == bsm).FirstAsync()).MapTo<CgglScxmView>();
  938. var splc = await Db.Queryable<CgglGzlsp>().Where(t => t.ID == model.SCJG).FirstAsync();
  939. return splc;
  940. }
  941. /// <summary>
  942. /// 修改审核意见
  943. /// </summary>
  944. /// <param name="bsm"></param>
  945. /// <returns></returns>
  946. public async Task<bool> AuditStatus(CgspInput input)
  947. {
  948. return await Db.Updateable<CgglGzlsp>().SetColumns(u => new CgglGzlsp { SPYJ = input.SPYJ })
  949. .Where(u=>u.ID == input.ID).ExecuteCommandHasChangeAsync();
  950. }
  951. /// <summary>
  952. /// 分页查询审查数据
  953. /// </summary>
  954. /// <param name="input"></param>
  955. /// <returns></returns>
  956. public async Task<PageData> QueryList(CgglScxmPage input)
  957. {
  958. PageData page = null;
  959. if (input.SCZT == "完成")
  960. {
  961. var query = DbClient().Queryable<CgglScxm, CgglCg, CghjQxcg>((t, b, c) => new JoinQueryInfos(
  962. JoinType.Inner, t.CG_BSM == b.BSM, JoinType.Left, b.BSM == c.BSM));
  963. if (!string.IsNullOrWhiteSpace(input.XZQDM))
  964. query.Where((t, b, c) => t.XZQDM.StartsWith(input.XZQDM));
  965. if (!string.IsNullOrWhiteSpace(input.XMMC))
  966. query.Where((t, b, c) => t.XMMC.Contains(input.XMMC));
  967. if (!string.IsNullOrWhiteSpace(input.GHLX))
  968. query.Where((t, b, c) => t.GHLX == input.GHLX);
  969. query.WhereIF(input.SBZT != null, (t, b, c) => b.ZT_CGSB == (EnumCgsbZT)input.SBZT);
  970. query.WhereIF(input.INSTID == "0", (t, b, c) => string.IsNullOrEmpty(b.INSTID));
  971. query.WhereIF(input.INSTID == "1", (t, b, c) => b.INSTID != null);
  972. query.WhereIF(!string.IsNullOrWhiteSpace(input.GHJB), (t, b, c) => b.GHJB.Contains(input.GHJB));
  973. query.Where((t, b, c) => t.SCZT == "完结");
  974. query.OrderBy((t, b, c) => t.SCSJ_JS, OrderByType.Desc);
  975. page = await query.Select((t, b, c) =>
  976. new CgglScxmView()
  977. {
  978. BSM = t.BSM,
  979. CG_BSM = t.CG_BSM,
  980. GHLX = t.GHLX,
  981. GZL_BSM = t.GZL_BSM,
  982. QXCG_BSM = t.QXCG_BSM,
  983. SCBG = t.SCBG,
  984. SCJG = t.SCJG,
  985. SCSJ_JS = t.SCSJ_JS,
  986. SCSJ_KS = t.SCSJ_KS,
  987. SCZT = t.SCZT,
  988. XMBH = t.XMBH,
  989. XMMC = t.XMMC,
  990. XZQDM = t.XZQDM,
  991. XZQMC = t.XZQMC,
  992. ZJ_BSM = t.ZJ_BSM,
  993. CGB = b.CGB,
  994. ZT = b.ZT,
  995. ZT_CGSB = b.ZT_CGSB,
  996. SBSJ_ZT = c.SBSJ_ZT,
  997. SBSJ_JD = c.SBSJ_JD,
  998. SBSJ_SBYY = c.SBSJ_SBYY,
  999. SBSJ_SJ = c.SBSJ_SJ,
  1000. SBSJ_YH = c.SBSJ_YH,
  1001. SBSJ_YHM = c.SBSJ_YHM,
  1002. INSTID = b.INSTID,
  1003. GHJB = b.GHJB
  1004. }).ToPageAsync(input.page, input.limit);
  1005. }
  1006. else
  1007. {
  1008. var query = Db.Queryable<CgglGzlsp, CgglScxm, CgglCg>((t, b, c) => new JoinQueryInfos(
  1009. JoinType.Inner, t.RW_BSM == b.BSM, JoinType.Inner, b.CG_BSM == c.BSM))
  1010. .Where((t, b, c) => t.SPR == input.USER)
  1011. .WhereIF(!string.IsNullOrWhiteSpace(input.XZQDM), (t, b, c) => c.XZQDM.StartsWith(input.XZQDM))
  1012. .WhereIF(!string.IsNullOrWhiteSpace(input.XMMC), (t, b, c) => b.XMMC.Contains(input.XMMC))
  1013. .WhereIF(input.INSTID == "0", (t, b, c) => string.IsNullOrEmpty(c.INSTID))
  1014. .WhereIF(input.INSTID == "1", (t, b, c) => c.INSTID != null)
  1015. .WhereIF(!string.IsNullOrWhiteSpace(input.GHJB), (t, b, c) => c.GHJB.Contains(input.GHJB));
  1016. if (input.SCZT == "通过" || input.SCZT == "已审查")
  1017. {
  1018. query.Where((t, b, c) => t.SPZT == "通过" || t.SPZT == "退回");
  1019. }
  1020. else
  1021. {
  1022. query.Where((t, b, c) => t.SPZT == input.SCZT);
  1023. }
  1024. page = await query.OrderBy((t, b, c) => t.RECEIVE_TIME, OrderByType.Desc)
  1025. .Select((t, b, c) => new CgglGzlspView
  1026. {
  1027. IS_DELETE = t.IS_DELETE,
  1028. LC_BSM = t.LC_BSM,
  1029. ID = t.ID,
  1030. FJ = t.FJ,
  1031. RECEIVE_TIME = t.RECEIVE_TIME,
  1032. REMARKS = t.REMARKS,
  1033. RW_BSM = t.RW_BSM,
  1034. SPR = t.SPR,
  1035. SPRMC = t.SPRMC,
  1036. SPSJ = t.SPSJ,
  1037. SPYJ = t.SPYJ,
  1038. SPZT = t.SPZT,
  1039. CG_BSM = c.BSM,
  1040. CGB = c.CGB,
  1041. GHJB = c.GHJB,
  1042. GHLX = c.GHLX,
  1043. QXCG_BSM = c.QXCG_BSM,
  1044. XMMC = c.XMMC,
  1045. XZQDM = c.XZQDM,
  1046. XZQMC = c.XZQMC,
  1047. ZT = c.ZT,
  1048. ZT_RGSC = c.ZT_RGSC,
  1049. INSTID = c.INSTID,
  1050. })
  1051. .ToPageAsync(input.page, input.limit);
  1052. }
  1053. return page;
  1054. }
  1055. /// <summary>
  1056. /// 根据审核状态查询总条数
  1057. /// </summary>
  1058. /// <returns></returns>
  1059. public List<CgglScxmCount> QueryCount(string uid)
  1060. {
  1061. var list = Db.Queryable<CgglGzlsp, CgglScxm, CgglCg>((t, b, c) => new JoinQueryInfos(
  1062. JoinType.Left, t.RW_BSM == b.BSM, JoinType.Left, b.CG_BSM == c.BSM))
  1063. .Where((t, b, c) => t.SPR == uid)
  1064. .GroupBy((t, b, c) => t.SPZT)
  1065. .Select((t, b, c) => new CgglScxmCount
  1066. {
  1067. ztmc = t.SPZT,
  1068. count = SqlFunc.AggregateCount(t.ID)
  1069. }).ToList();
  1070. return list;
  1071. }
  1072. /// <summary>
  1073. /// 获取审查列表
  1074. /// </summary>
  1075. /// <param name="bsm"></param>
  1076. /// <returns></returns>
  1077. public async Task<List<CgglScyjView>> GetScyj(string bsm)
  1078. {
  1079. var list = await Db.Queryable<CgglGzlsp>().Where(t => t.RW_BSM == bsm).OrderBy(t => t.SPSJ).ToListAsync();
  1080. return list.Select(t => new CgglScyjView()
  1081. {
  1082. BSM = t.ID,
  1083. CG_BSM = t.RW_BSM,
  1084. SCSJ = t.SPSJ,
  1085. SCYH = t.SPR,
  1086. SCYJ = t.SPYJ,
  1087. SPZT = t.SPZT,
  1088. SCYHMC=t.SPRMC,
  1089. }).ToList();
  1090. }
  1091. #region 报告
  1092. /// <summary>
  1093. /// 审核完成
  1094. /// </summary>
  1095. /// <param name="bsm">标识码</param>
  1096. /// <param name="sczt">审查状态</param>
  1097. /// <returns></returns>
  1098. public async Task<string> AuditCompleted(string bsm, string sczt = "通过")
  1099. {
  1100. var model = await GetAsync(t => t.BSM == bsm);
  1101. if (model == null)
  1102. throw new UseArgumentException("数据不存在,请检查标识码是否正确");
  1103. var pdf = string.Empty;
  1104. try
  1105. {
  1106. Db.BeginTran();
  1107. var filePath = await CreateReport(model);
  1108. var pdfFile = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + ".pdf");
  1109. pdf = FileManage.Instance.ToRelativePath(pdfFile);
  1110. Db.CommitTran();
  1111. }
  1112. catch (Exception ex)
  1113. {
  1114. Db.RollbackTran();
  1115. WS.Log.RunLog.Error(ex);
  1116. throw new UseArgumentException("服务器错误");
  1117. }
  1118. return pdf;
  1119. }
  1120. /// <summary>
  1121. /// 创建报告
  1122. /// </summary>
  1123. /// <param name="cgglScxm"></param>
  1124. /// <returns></returns>
  1125. private async Task<string> CreateReport(CgglScxm cgglScxm)
  1126. {
  1127. //查询审查意见列表
  1128. var list = Db.Queryable<CgglGzlsp>()
  1129. .Where(t => t.RW_BSM == cgglScxm.BSM)
  1130. .Select(t => new CgglScyjView
  1131. {
  1132. BSM = t.ID,
  1133. SCSJ = t.SPSJ,
  1134. SCYH = t.SPR,
  1135. SCYHMC = t.SPRMC,
  1136. SCYJ = t.SPYJ,
  1137. SPZT = t.SPZT,
  1138. })
  1139. .ToList();
  1140. //创建word返回保存地址
  1141. var filePath = Word($"{cgglScxm.XMMC}成果审查报告_{DateTime.Now:yyyyMMddHHmmss}", list);
  1142. var pdf = string.Empty;
  1143. var pdfExe = ConfigHelper.Configuration["File:PdfExe"];
  1144. var pdfFile = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + ".pdf");
  1145. var exeFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, pdfExe);
  1146. var p = Process.Start(exeFile, $"\"{filePath}\" \"{pdfFile}\"");
  1147. p.WaitForExit();
  1148. pdf = FileManage.Instance.ToRelativePath(pdfFile);
  1149. //PDF
  1150. await UpdateAsync(u => new CgglScxm { SCZT = cgglScxm.SCZT, SCSJ_JS = DateTime.Now, SCBG = FileManage.Instance.ToRelativePath(filePath) }, t => t.BSM == cgglScxm.BSM);
  1151. //更新区县
  1152. if (!string.IsNullOrWhiteSpace(cgglScxm.QXCG_BSM))
  1153. {
  1154. await Db.Updateable<CghjQxcg>().SetColumns(it => new CghjQxcg()
  1155. { SCZT = cgglScxm.SCZT == "完结"?"通过": cgglScxm.SCZT, SCJG = FileManage.Instance.ToRelativePath(pdf), SCSJ_JS = DateTime.Now })
  1156. .Where(it => it.BSM == cgglScxm.QXCG_BSM).ExecuteCommandAsync();
  1157. }
  1158. return filePath;
  1159. }
  1160. /// <summary>
  1161. ///
  1162. /// </summary>
  1163. /// <param name="title">标题</param>
  1164. /// <param name="list">审查意见</param>
  1165. private string Word(string title, List<CgglScyjView> list)
  1166. {
  1167. //创建生成word文档
  1168. string path = $"{FileManage.Instance.ToFullPath(@$"成果审查")}\\{title}.docx";
  1169. XWPFDocument doc = new XWPFDocument();
  1170. // 添加段落
  1171. XWPFParagraph gp = doc.CreateParagraph();
  1172. gp.Alignment = ParagraphAlignment.CENTER;//水平居中
  1173. XWPFRun gr = gp.CreateRun();
  1174. gr.GetCTR().AddNewRPr().AddNewRFonts().ascii = "黑体";
  1175. gr.GetCTR().AddNewRPr().AddNewRFonts().eastAsia = "黑体";
  1176. gr.GetCTR().AddNewRPr().AddNewRFonts().hint = ST_Hint.eastAsia;
  1177. gr.GetCTR().AddNewRPr().AddNewSz().val = (ulong)44;//2号字体
  1178. gr.GetCTR().AddNewRPr().AddNewSzCs().val = (ulong)44;
  1179. gr.GetCTR().AddNewRPr().AddNewB().val = true; //加粗
  1180. //gr.GetCTR().AddNewRPr().AddNewColor().val = "red";//字体颜色
  1181. gr.SetText(title);
  1182. gp = doc.CreateParagraph();
  1183. gp.Alignment = ParagraphAlignment.CENTER;//水平剧中
  1184. gr = gp.CreateRun();
  1185. CT_RPr rpr = gr.GetCTR().AddNewRPr();
  1186. CT_Fonts rfonts = rpr.AddNewRFonts();
  1187. rfonts.ascii = "宋体";
  1188. rfonts.eastAsia = "宋体";
  1189. rpr.AddNewSz().val = (ulong)35;//4号字体
  1190. rpr.AddNewSzCs().val = (ulong)35;
  1191. gr.SetText("成果审查报告");
  1192. gp = doc.CreateParagraph();
  1193. gp = doc.CreateParagraph();
  1194. gr = gp.CreateRun();
  1195. rfonts.ascii = "宋体";
  1196. rfonts.eastAsia = "宋体";
  1197. rpr.AddNewSz().val = (ulong)21;//5号字体
  1198. rpr.AddNewSzCs().val = (ulong)21;
  1199. gr.SetText($"{DateTime.Now.ToLongDateString()}完成对《{title}》的成果审查工作,审查意见如下:");
  1200. gp = doc.CreateParagraph();
  1201. var number = new string[] { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "二十一", "二十二", "二十三", "二十四", "二十五", "二十六", "二十七", "二十八", "二十九", "三十" };
  1202. int i = 0;
  1203. foreach (var item in list)
  1204. {
  1205. gp = doc.CreateParagraph();
  1206. gr = gp.CreateRun();
  1207. rfonts.ascii = "宋体";
  1208. rfonts.eastAsia = "宋体";
  1209. rpr.AddNewSz().val = (ulong)21;//5号字体
  1210. rpr.AddNewSzCs().val = (ulong)21;
  1211. gr.SetText($"意见{number[i]}({item.SCYHMC}):{item.SCYJ}");
  1212. gp = doc.CreateParagraph();
  1213. i++;
  1214. }
  1215. gp = doc.CreateParagraph();
  1216. gp.Alignment = ParagraphAlignment.RIGHT;//靠左
  1217. gr = gp.CreateRun();
  1218. rfonts.ascii = "宋体";
  1219. rfonts.eastAsia = "宋体";
  1220. rpr.AddNewSz().val = (ulong)21;//5号字体
  1221. rpr.AddNewSzCs().val = (ulong)21;
  1222. gr.SetText(ConfigHelper.Configuration["Dwmc"]);
  1223. gp = doc.CreateParagraph();
  1224. gp = doc.CreateParagraph();
  1225. gp.Alignment = ParagraphAlignment.RIGHT;//靠左
  1226. gr = gp.CreateRun();
  1227. rfonts.ascii = "宋体";
  1228. rfonts.eastAsia = "宋体";
  1229. rpr.AddNewSz().val = (ulong)21;//5号字体
  1230. rpr.AddNewSzCs().val = (ulong)21;
  1231. gr.SetText(DateTime.Now.ToLongDateString());
  1232. gp = doc.CreateParagraph();
  1233. using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
  1234. {
  1235. doc.Write(fs);
  1236. }
  1237. return path;
  1238. }
  1239. #endregion
  1240. #region 成果包上报
  1241. /// <summary>
  1242. /// 成果上报(县 --> 市)
  1243. /// </summary>
  1244. /// <returns></returns>
  1245. public async Task<bool> Cgsb(CgsbIo input)
  1246. {
  1247. CgglCg cgglCg = await Db.Queryable<CgglCg>().Where(t=>t.BSM == input.ID).FirstAsync();
  1248. if(cgglCg.ZT_CGSB != KJGH.Model.Enums.EnumCgsbZT.未提交 && cgglCg.ZT_CGSB != KJGH.Model.Enums.EnumCgsbZT.上报失败)
  1249. {
  1250. //throw new UseMassageException("当前成果已经上报,不能重复提交!");
  1251. }
  1252. cgglCg.ZT = KJGH.Model.Enums.EnumCgglCgZT.成果上报;
  1253. cgglCg.ZT_CGSB = KJGH.Model.Enums.EnumCgsbZT.上报中;
  1254. var path = FileManage.Instance.ToFullPath(Path.GetDirectoryName(cgglCg.CGB), false);
  1255. var fileList = Directory.GetFiles(path).Where(t=> Path.GetFileName(t).StartsWith("_"))
  1256. .ToDictionary(t => Path.GetFileName(t).Replace("_","").ToInt(), t => t).OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
  1257. if(fileList.Count != cgglCg.CGFPS)
  1258. {
  1259. throw new UseMassageException("成果包有误,分包数据不全!");
  1260. }
  1261. var rk = await _ICghjQxcgRepository.IsExistAsync(t => t.BSM == cgglCg.BSM);
  1262. CghjQxcg cghjQxcg = new CghjQxcg()
  1263. {
  1264. BSM = cgglCg.BSM,
  1265. XMMC = cgglCg.XMMC,
  1266. XZQDM = cgglCg.XZQDM,
  1267. XZQMC = cgglCg.XZQMC,
  1268. GHLX = cgglCg.GHLX,
  1269. GHJB = cgglCg.GHJB,
  1270. CGBB = cgglCg.CGBB,
  1271. CGXS = cgglCg.CGXS,
  1272. BZQK = cgglCg.BZQK,
  1273. CGB = cgglCg.CGB,
  1274. CGLJ = cgglCg.CGML,
  1275. SJLY = "1",
  1276. HJSJ = DateTime.Now,
  1277. SCZT = EnumCghjQxcgsbSC.待审.Description(),
  1278. SBSJ_SJ = DateTime.Now,
  1279. SBSJ_YH = input.SBSJ_YH,
  1280. SBSJ_YHM = input.SBSJ_YHM,
  1281. SBSJ_JD = $"0/{cgglCg.CGFPS}",
  1282. SBSJ_ZT = "上报中",
  1283. INSTID = cgglCg.INSTID
  1284. };
  1285. var view = QXApi.Md5(new CghjQxcgsbrwIo()
  1286. {
  1287. MD5 = cgglCg.BSM,
  1288. GHLX = cgglCg.GHLX,
  1289. New = true,
  1290. SIZE = cgglCg.CGFPS
  1291. });
  1292. try
  1293. {
  1294. Db.BeginTran();
  1295. if (rk)
  1296. {
  1297. await Db.Deleteable<CghjQxcg>().Where(t => t.BSM == cgglCg.BSM).ExecuteCommandAsync();
  1298. await Db.Deleteable<CghjQxcgsbrw>().Where(t => t.BSM == cgglCg.BSM).ExecuteCommandAsync();
  1299. await Db.Deleteable<CghjQxcgsbrwfp>().Where(t => t.MD5 == cgglCg.BSM).ExecuteCommandAsync();
  1300. Db.CommitTran();
  1301. }
  1302. Db.BeginTran();
  1303. await _ICghjQxcgsbrwRepository.QXAddRw(view);
  1304. await Db.Updateable(cgglCg).ExecuteCommandHasChangeAsync();
  1305. await Db.Insertable(cghjQxcg).ExecuteCommandAsync();
  1306. Db.CommitTran();
  1307. }
  1308. catch (Exception ex)
  1309. {
  1310. Db.RollbackTran();
  1311. WS.Log.RunLog.Error(ex);
  1312. throw new UseMassageException("成果上报失败");
  1313. }
  1314. CghjQxcgsbrw rwModel = Db.Queryable<CghjQxcgsbrw>().Where(t=>t.BSM == cgglCg.BSM).First();
  1315. Thread thread = new Thread(() =>
  1316. {
  1317. WS.Log.RunLog.Debug($"开始上传成果:{cgglCg.BSM} ,{rwModel == null}");
  1318. try
  1319. {
  1320. rwModel.CGLJ = cgglCg.CGML;
  1321. rwModel.CGWJ = cgglCg.CGB;
  1322. rwModel.XMMC = cgglCg.XMMC;
  1323. Db.Updateable(rwModel).ExecuteCommand();
  1324. WS.Log.RunLog.Debug($"开始上传rwModel:{rwModel.ToJson()}");
  1325. //分片上传
  1326. var index = 1;
  1327. foreach (var chunk in fileList.Keys)
  1328. {
  1329. CghjQxcgsbrwfp rwfp = new CghjQxcgsbrwfp()
  1330. {
  1331. BSM = Guid.NewGuid().ToString("N"),
  1332. MD5 = cgglCg.BSM,
  1333. CHUNK = chunk,
  1334. PATH = FileManage.Instance.ToRelativePath(fileList[chunk])
  1335. };
  1336. Db.Deleteable<CghjQxcgsbrwfp>().Where(t => t.MD5 == cgglCg.BSM && t.CHUNK == chunk).ExecuteCommand();
  1337. Db.Insertable(rwfp).ExecuteCommand();
  1338. //更新主表
  1339. rwModel.RWZT = EnumCghjQxcgsbrw.NoHb;
  1340. rwModel.TIME = rwfp.SCSJ;
  1341. Db.Updateable(rwModel).ExecuteCommand();
  1342. WS.Log.RunLog.Debug($"更新主表11111111111");
  1343. QXApi.Upload(new CghjQxcgsbrwfpIo_QY()
  1344. {
  1345. token = view.token,
  1346. //MD5 = ApiHelper.GetMD5HashFromFile(fileList[chunk]),//乌兰察布 鄂尔多斯 不传分包MD5
  1347. MD5 = rwfp.MD5,
  1348. chunk = chunk,
  1349. }, fileList[chunk]);
  1350. WS.Log.RunLog.Debug($"更新主表22222222222");
  1351. //更新进度
  1352. Db.Updateable<CghjQxcg>().SetColumns(it => it.SBSJ_JD == $"{index}/{cgglCg.CGFPS}").Where(it => it.BSM == cghjQxcg.BSM).ExecuteCommand();
  1353. index++;
  1354. }
  1355. //合包
  1356. var mst = QXApi.Complete(new CghjQxcgsbrwhbIo_QY()
  1357. {
  1358. fileName = Path.GetFileName(cghjQxcg.CGB),
  1359. MD5 = cgglCg.BSM,
  1360. token = view.token,
  1361. SPSJ = DateTime.Now,
  1362. type = "0",
  1363. INSTID = cghjQxcg.INSTID
  1364. });
  1365. cgglCg.ZT_CGSB = EnumCgsbZT.已上报;
  1366. rwModel.RWZT = EnumCghjQxcgsbrw.Complete;
  1367. Db.BeginTran();
  1368. Db.Updateable(cgglCg).ExecuteCommand();
  1369. Db.Updateable(rwModel).ExecuteCommand();
  1370. Db.Updateable<CghjQxcg>().SetColumns(it => new CghjQxcg() { SBSJ_JD = $"{cgglCg.CGFPS}/{cgglCg.CGFPS}", SBSJ_ZT = "上报完成" }).Where(it => it.BSM == cghjQxcg.BSM).ExecuteCommand();
  1371. Db.CommitTran();
  1372. }
  1373. catch (Exception ex)
  1374. {
  1375. Db.RollbackTran();
  1376. try
  1377. {
  1378. _ICghjQxcgsbrwRepository.QXError(cgglCg.BSM, ex.Message);
  1379. }
  1380. catch (Exception ex2)
  1381. {
  1382. WS.Log.RunLog.Debug($"结束上传失败入库异常:{ex2.Message}");
  1383. }
  1384. WS.Log.RunLog.Error(ex);
  1385. return;
  1386. //throw new UseMassageException("操作失败");
  1387. }
  1388. WS.Log.RunLog.Debug($"结束上传成果:{cgglCg.XMMC}");
  1389. });
  1390. thread.Start();
  1391. return true;
  1392. }
  1393. /// <summary>
  1394. /// 成果上报(县 --> 巴彦淖尔市)
  1395. /// </summary>
  1396. /// <returns></returns>
  1397. public async Task<bool> CgsbBYNE(IFormFile formFile, CgsbByneIo input)
  1398. {
  1399. CgglCg cgglCg = await Db.Queryable<CgglCg>().Where(t => t.BSM == input.ID).FirstAsync();
  1400. if (cgglCg.ZT_CGSB != EnumCgsbZT.未提交 && cgglCg.ZT_CGSB != EnumCgsbZT.上报失败)
  1401. {
  1402. //throw new UseMassageException("当前成果已经上报,不能重复提交!");
  1403. }
  1404. cgglCg.ZT = EnumCgglCgZT.成果上报;
  1405. cgglCg.ZT_CGSB = EnumCgsbZT.上报中;
  1406. var path = FileManage.Instance.ToFullPath(Path.GetDirectoryName(cgglCg.CGB), false);
  1407. //先保存质检报告
  1408. var zjbgFile =FileUpload.SaveFile(formFile, path, null);
  1409. if (zjbgFile.Size == 0)
  1410. throw new UseMassageException("质检报上传失败(0kb),请重新上传");
  1411. var fileList = Directory.GetFiles(path).Where(t => Path.GetFileName(t).StartsWith("_"))
  1412. .ToDictionary(t => Path.GetFileName(t).Replace("_", "").ToInt(), t => t).OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
  1413. if (fileList.Count != cgglCg.CGFPS)
  1414. {
  1415. throw new UseMassageException("成果包有误,分包数据不全!");
  1416. }
  1417. var rk = await _ICghjQxcgRepository.IsExistAsync(t => t.BSM == cgglCg.BSM);
  1418. CghjQxcg cghjQxcg = new CghjQxcg()
  1419. {
  1420. BSM = cgglCg.BSM,
  1421. XMMC = cgglCg.XMMC,
  1422. XZQDM = cgglCg.XZQDM,
  1423. XZQMC = cgglCg.XZQMC,
  1424. GHLX = cgglCg.GHLX,
  1425. GHJB = cgglCg.GHJB,
  1426. CGBB = cgglCg.CGBB,
  1427. CGXS = cgglCg.CGXS,
  1428. BZQK = cgglCg.BZQK,
  1429. CGB = cgglCg.CGB,
  1430. CGLJ = cgglCg.CGML,
  1431. SJLY = "1",
  1432. HJSJ = DateTime.Now,
  1433. SCZT = EnumCghjQxcgsbSC.待审.Description(),
  1434. SBSJ_SJ = DateTime.Now,
  1435. SBSJ_YH = input.SBSJ_YH,
  1436. SBSJ_YHM = input.SBSJ_YHM,
  1437. SBSJ_JD = $"0/{cgglCg.CGFPS}",
  1438. SBSJ_ZT = "上报中",
  1439. INSTID = cgglCg.INSTID
  1440. };
  1441. WS.Log.RunLog.Debug($"文件MD5检查,{cgglCg.BSM},入库:{rk}");
  1442. var view = BYNEApi.Md5(new BYNECghjMd5Io()
  1443. {
  1444. fileMd5 = cgglCg.BSM,
  1445. fileName = Path.GetFileName(cghjQxcg.CGB)
  1446. });
  1447. try
  1448. {
  1449. Db.BeginTran();
  1450. if (rk)
  1451. {
  1452. await Db.Deleteable<CghjQxcg>().Where(t => t.BSM == cgglCg.BSM).ExecuteCommandAsync();
  1453. await Db.Deleteable<CghjQxcgsbrw>().Where(t => t.BSM == cgglCg.BSM).ExecuteCommandAsync();
  1454. await Db.Deleteable<CghjQxcgsbrwfp>().Where(t => t.MD5 == cgglCg.BSM).ExecuteCommandAsync();
  1455. Db.CommitTran();
  1456. }
  1457. Db.BeginTran();
  1458. CghjQxcgsbrwView_QX cghjQxcgsbrw = new CghjQxcgsbrwView_QX()
  1459. {
  1460. MD5 = cghjQxcg.BSM,
  1461. SIZE = cgglCg.CGFPS,
  1462. New = true,
  1463. token = view.token,
  1464. XZQDM = cghjQxcg.XZQDM,
  1465. XZQMC = cghjQxcg.XZQMC,
  1466. GHLX = cghjQxcg.GHLX,
  1467. TIME = DateTime.Now
  1468. };
  1469. await _ICghjQxcgsbrwRepository.QXAddRw(cghjQxcgsbrw);
  1470. await Db.Updateable(cgglCg).ExecuteCommandHasChangeAsync();
  1471. await Db.Insertable(cghjQxcg).ExecuteCommandAsync();
  1472. Db.CommitTran();
  1473. }
  1474. catch (Exception ex)
  1475. {
  1476. Db.RollbackTran();
  1477. WS.Log.RunLog.Error(ex);
  1478. throw new UseMassageException("成果上报失败");
  1479. }
  1480. CghjQxcgsbrw rwModel = Db.Queryable<CghjQxcgsbrw>().Where(t => t.BSM == cgglCg.BSM).First();
  1481. Thread thread = new Thread(() =>
  1482. {
  1483. WS.Log.RunLog.Debug($"开始上传成果:{cgglCg.XMMC}");
  1484. try
  1485. {
  1486. rwModel.CGLJ = cgglCg.CGML;
  1487. rwModel.CGWJ = cgglCg.CGB;
  1488. rwModel.XMMC = cgglCg.XMMC;
  1489. Db.Updateable(rwModel).ExecuteCommand();
  1490. //分片上传
  1491. var index = 1;
  1492. var fileName = Path.GetFileName(cghjQxcg.CGB);
  1493. FileInfo cgFile = new FileInfo(FileManage.Instance.ToFullPath(cgglCg.CGB, false));
  1494. var fpFilePath = string.Empty;
  1495. foreach (var chunk in fileList.Keys)
  1496. {
  1497. WS.Log.RunLog.Debug($"分片上传:【{chunk}】{fileList[chunk]}");
  1498. CghjQxcgsbrwfp rwfp = new CghjQxcgsbrwfp()
  1499. {
  1500. BSM = Guid.NewGuid().ToString("N"),
  1501. MD5 = cgglCg.BSM,
  1502. CHUNK = chunk, // 当前文件块编号(分片索引),从1开始
  1503. PATH = FileManage.Instance.ToRelativePath(fileList[chunk])
  1504. };
  1505. Db.Deleteable<CghjQxcgsbrwfp>().Where(t => t.MD5 == cgglCg.BSM && t.CHUNK == chunk).ExecuteCommand();
  1506. Db.Insertable(rwfp).ExecuteCommand();
  1507. //更新主表
  1508. rwModel.RWZT = EnumCghjQxcgsbrw.NoHb;
  1509. rwModel.TIME = rwfp.SCSJ;
  1510. Db.Updateable(rwModel).ExecuteCommand();
  1511. FileInfo fileInfo = new FileInfo(fileList[chunk]);
  1512. fpFilePath = BYNEApi.Upload(new BYNECghjFpIo_QX()
  1513. {
  1514. token = view.token,
  1515. chunkFileMd5 = ApiHelper.GetMD5HashFromFile(fileList[chunk]),//巴彦淖尔-当前文件的MD5
  1516. chunkSize = 10 * 1024 * 1024,
  1517. currentChunk = rwfp.CHUNK,
  1518. currentChunkSize = (int)fileInfo.Length,
  1519. fileMd5 = rwfp.MD5,
  1520. fileName = fileName,
  1521. totalChunk = cgglCg.CGFPS,
  1522. totalSize = cgFile.Length
  1523. }, fileList[chunk]);
  1524. //更新进度
  1525. Db.Updateable<CghjQxcg>().SetColumns(it => it.SBSJ_JD == $"{index}/{cgglCg.CGFPS}").Where(it => it.BSM == cghjQxcg.BSM).ExecuteCommand();
  1526. index++;
  1527. }
  1528. //合包
  1529. WS.Log.RunLog.Debug($"合包请求,{cgglCg.BSM}");
  1530. var fileInfoId = BYNEApi.Merge(new BYNECghjMergeIo()
  1531. {
  1532. fileName = Path.GetFileName(cghjQxcg.CGB),
  1533. fileMd5 = cgglCg.BSM,
  1534. filePath = fpFilePath,
  1535. fileSize = cgFile.Length
  1536. }, view.token);
  1537. //上报
  1538. var type = "0";
  1539. switch (cgglCg.GHLX)
  1540. {
  1541. case EnumGHLX.乡镇规划:
  1542. type = "1";
  1543. break;
  1544. case EnumGHLX.专项规划:
  1545. type = "2";
  1546. break;
  1547. case EnumGHLX.总体规划:
  1548. default:
  1549. type = "0";
  1550. break;
  1551. }
  1552. WS.Log.RunLog.Debug($"上报请求,{cgglCg.BSM}");
  1553. BYNEApi.Complete(new BYNECghjIo()
  1554. {
  1555. fileInfoId = fileInfoId,
  1556. name = cgglCg.XMMC,
  1557. phone = input.phone,
  1558. remark = input.remark,
  1559. type = type,
  1560. wdbh = input.wdbh,
  1561. year = input.year,
  1562. xzqdm = cgglCg.XZQDM,
  1563. xzqmc = cgglCg.XZQMC,
  1564. instid = cgglCg.INSTID,
  1565. }, zjbgFile.FullPath, view.token);
  1566. cgglCg.ZT_CGSB = EnumCgsbZT.已上报;
  1567. rwModel.RWZT = EnumCghjQxcgsbrw.Complete;
  1568. Db.BeginTran();
  1569. Db.Updateable(cgglCg).ExecuteCommand();
  1570. Db.Updateable(rwModel).ExecuteCommand();
  1571. Db.Updateable<CghjQxcg>().SetColumns(it => new CghjQxcg() { SBSJ_JD = $"{cgglCg.CGFPS}/{cgglCg.CGFPS}", SBSJ_ZT = "上报完成" }).Where(it => it.BSM == cghjQxcg.BSM).ExecuteCommand();
  1572. Db.CommitTran();
  1573. WS.Log.RunLog.Debug($"上报完成,{cgglCg.BSM}");
  1574. Thread.Sleep(1000);
  1575. }
  1576. catch (Exception ex)
  1577. {
  1578. Db.RollbackTran();
  1579. try
  1580. {
  1581. _ICghjQxcgsbrwRepository.QXError(cgglCg.BSM, ex.Message);
  1582. }
  1583. catch (Exception ex2)
  1584. {
  1585. WS.Log.RunLog.Debug($"结束上传失败入库异常:{ex2.Message}");
  1586. }
  1587. WS.Log.RunLog.Error(ex);
  1588. return;
  1589. }
  1590. WS.Log.RunLog.Debug($"结束上传成果:{cgglCg.XMMC}");
  1591. });
  1592. thread.Start();
  1593. return true;
  1594. }
  1595. /// <summary>
  1596. /// 成果上报(市 --> 省/自治区)
  1597. /// </summary>
  1598. /// <returns></returns>
  1599. public async Task<bool> SCgsbByQxcgBSM(CgsbIo input)
  1600. {
  1601. CghjQxcg cghjQxcg = await Db.Queryable<CghjQxcg>().Where(t => t.BSM == input.ID).FirstAsync();
  1602. if (cghjQxcg.SBSJ_ZT != "未上报" && cghjQxcg.SBSJ_ZT != "上报失败")
  1603. {
  1604. //throw new UseMassageException("当前成果已经上报,不能重复提交!");
  1605. }
  1606. CgglCg cgglCg = await Db.Queryable<CgglCg>().Where(t => t.QXCG_BSM == input.ID).FirstAsync();
  1607. input.ID = cghjQxcg.BSM;
  1608. return await SCgsb(input);
  1609. }
  1610. /// <summary>
  1611. /// 成果上报(巴彦淖尔县 --> 省/自治区)
  1612. /// </summary>
  1613. public async Task<bool> SCgsbBYNE(CgsbIo input)
  1614. {
  1615. CgglCg cgglCg = await Db.Queryable<CgglCg>().Where(t => t.BSM == input.ID).FirstAsync();
  1616. if (cgglCg.ZT_CGSB != EnumCgsbZT.未提交 && cgglCg.ZT_CGSB != EnumCgsbZT.上报失败)
  1617. {
  1618. //throw new UseMassageException("当前成果已经上报,不能重复提交!");
  1619. }
  1620. cgglCg.ZT = EnumCgglCgZT.成果上报;
  1621. cgglCg.ZT_CGSB = EnumCgsbZT.上报中;
  1622. var path = FileManage.Instance.ToFullPath(Path.GetDirectoryName(cgglCg.CGB), false);
  1623. var fileList = Directory.GetFiles(path).Where(t => Path.GetFileName(t).StartsWith("_"))
  1624. .ToDictionary(t => Path.GetFileName(t).Replace("_", "").ToInt(), t => t).OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
  1625. if (fileList.Count != cgglCg.CGFPS)
  1626. {
  1627. throw new UseMassageException("成果包有误,分包数据不全!");
  1628. }
  1629. var rk = await _ICghjQxcgRepository.IsExistAsync(t => t.BSM == cgglCg.BSM);
  1630. CghjQxcg cghjQxcg = new CghjQxcg()
  1631. {
  1632. BSM = cgglCg.BSM,
  1633. XMMC = cgglCg.XMMC,
  1634. XZQDM = cgglCg.XZQDM,
  1635. XZQMC = cgglCg.XZQMC,
  1636. GHLX = cgglCg.GHLX,
  1637. GHJB = cgglCg.GHJB,
  1638. CGBB = cgglCg.CGBB,
  1639. CGXS = cgglCg.CGXS,
  1640. BZQK = cgglCg.BZQK,
  1641. CGB = cgglCg.CGB,
  1642. CGLJ = cgglCg.CGML,
  1643. SJLY = "1",
  1644. HJSJ = DateTime.Now,
  1645. SCZT = EnumCghjQxcgsbSC.待审.Description(),
  1646. SBSJ_SJ = DateTime.Now,
  1647. SBSJ_YH = input.SBSJ_YH,
  1648. SBSJ_YHM = input.SBSJ_YHM,
  1649. SBSJ_JD = $"0/{cgglCg.CGFPS}",
  1650. SBSJ_ZT = "上报中",
  1651. INSTID = cgglCg.INSTID
  1652. };
  1653. //WS.Log.RunLog.Debug($"文件MD5检查,{cgglCg.BSM},入库:{rk}");
  1654. //var view = BYNEApi.Md5(new BYNECghjMd5Io()
  1655. //{
  1656. // fileMd5 = cgglCg.BSM,
  1657. // fileName = Path.GetFileName(cghjQxcg.CGB)
  1658. //});
  1659. try
  1660. {
  1661. Db.BeginTran();
  1662. if (rk)
  1663. {
  1664. await Db.Deleteable<CghjQxcg>().Where(t => t.BSM == cgglCg.BSM).ExecuteCommandAsync();
  1665. await Db.Deleteable<CghjQxcgsbrw>().Where(t => t.BSM == cgglCg.BSM).ExecuteCommandAsync();
  1666. await Db.Deleteable<CghjQxcgsbrwfp>().Where(t => t.MD5 == cgglCg.BSM).ExecuteCommandAsync();
  1667. Db.CommitTran();
  1668. }
  1669. Db.BeginTran();
  1670. CghjQxcgsbrwView_QX cghjQxcgsbrw = new CghjQxcgsbrwView_QX()
  1671. {
  1672. MD5 = cghjQxcg.BSM,
  1673. SIZE = cgglCg.CGFPS,
  1674. New = true,
  1675. //token = view.token,
  1676. XZQDM = cghjQxcg.XZQDM,
  1677. XZQMC = cghjQxcg.XZQMC,
  1678. GHLX = cghjQxcg.GHLX,
  1679. TIME = DateTime.Now
  1680. };
  1681. await _ICghjQxcgsbrwRepository.QXAddRw(cghjQxcgsbrw);
  1682. await Db.Updateable(cgglCg).ExecuteCommandHasChangeAsync();
  1683. await Db.Insertable(cghjQxcg).ExecuteCommandAsync();
  1684. Db.CommitTran();
  1685. }
  1686. catch (Exception ex)
  1687. {
  1688. Db.RollbackTran();
  1689. WS.Log.RunLog.Error(ex);
  1690. throw new UseMassageException("成果上报失败");
  1691. }
  1692. CghjQxcgsbrw rwModel = Db.Queryable<CghjQxcgsbrw>().Where(t => t.BSM == cgglCg.BSM).First();
  1693. Thread thread = new Thread(() =>
  1694. {
  1695. WS.Log.RunLog.Debug($"开始上传成果(县-->省/自治区):{cgglCg.XMMC}");
  1696. try
  1697. {
  1698. var md5Data = ZZQApi.Md5(new NmCgMd5Io()
  1699. {
  1700. fileMd5 = cgglCg.BSM,
  1701. fileSize = 10 * 1024 * 1024,
  1702. fileName = Path.GetFileName(cgglCg.CGB),
  1703. totalSliceNum = cgglCg.CGFPS,
  1704. curSliceOrder = 0,
  1705. resetSliceOrder2Zero = !input.xc,
  1706. instId = cgglCg.INSTID
  1707. });
  1708. //分片上传
  1709. var index = 1;
  1710. var chazhi = fileList.Keys.First() == 0 ? 0 : 1;
  1711. foreach (var chunk in fileList.Keys)
  1712. {
  1713. var curOrder = chunk - chazhi;
  1714. if (input.xc && curOrder < md5Data.curSliceOrder)
  1715. {
  1716. continue;
  1717. }
  1718. WS.Log.RunLog.Debug($"分片上传:【{chunk}】{fileList[chunk]}");
  1719. FileInfo fileInfo = new FileInfo(fileList[chunk]);
  1720. NmCgUploadSplitIo inputU = new NmCgUploadSplitIo()
  1721. {
  1722. xmmc = cgglCg.XMMC,
  1723. XZQDM = cgglCg.XZQDM,
  1724. XZQMC = cgglCg.XZQMC,
  1725. token = md5Data.token,
  1726. ghlx = cgglCg.GHLX,
  1727. year = string.IsNullOrWhiteSpace(input.year) ? DateTime.Now.Year.ToString() : input.year,
  1728. name = Path.GetFileName(cgglCg.CGB),
  1729. zipMd5 = cgglCg.BSM,
  1730. totalSliceNum = cgglCg.CGFPS,
  1731. curSliceOrder = curOrder,
  1732. curSliceSize = 10 * 1024 * 1024,
  1733. resetSliceOrder2Zero = !input.xc,
  1734. instId = cgglCg.INSTID
  1735. };
  1736. WS.Log.RunLog.Debug($"分片上传参数:{inputU.ToJson()}");
  1737. bool res = false;
  1738. switch (inputU.ghlx)
  1739. {
  1740. case EnumGHLX.总体规划:
  1741. case EnumGHLX.专项规划:
  1742. res = ZZQApi.Upload(inputU, fileList[chunk]);
  1743. break;
  1744. case EnumGHLX.村庄规划:
  1745. case EnumGHLX.乡镇规划:
  1746. res = ZZQApi.TownUpload(inputU, fileList[chunk]);
  1747. break;
  1748. default:
  1749. throw new UseMassageException($"暂未实现{inputU.ghlx}成果数据的上传");
  1750. }
  1751. WS.Log.RunLog.Debug($"分片上传:【{chunk}】{res}");
  1752. //更新进度
  1753. Db.Updateable<CghjQxcg>().SetColumns(it => it.SBSJ_JD == $"{index}/{cgglCg.CGFPS}").Where(it => it.BSM == cgglCg.BSM).ExecuteCommand();
  1754. index++;
  1755. Thread.Sleep(1000);
  1756. }
  1757. Db.BeginTran();
  1758. Db.Updateable<CgglCg>().SetColumns(it => new CgglCg() { ZT_CGSB = EnumCgsbZT.已上报 }).Where(it => it.BSM == cgglCg.BSM).ExecuteCommand();
  1759. Db.Updateable<CghjQxcg>().SetColumns(it => new CghjQxcg() { SBSJ_JD = $"{cgglCg.CGFPS}/{cgglCg.CGFPS}", SBSJ_ZT = "上报完成" }).Where(it => it.BSM == cghjQxcg.BSM).ExecuteCommand();
  1760. Db.CommitTran();
  1761. WS.Log.RunLog.Debug($"上传完成:{cgglCg.XMMC}");
  1762. }
  1763. catch (Exception ex)
  1764. {
  1765. Db.RollbackTran();
  1766. try
  1767. {
  1768. _ICghjQxcgsbrwRepository.QXError(cgglCg.BSM, ex.Message);
  1769. }
  1770. catch (Exception ex2)
  1771. {
  1772. WS.Log.RunLog.Debug($"结束上传失败入库异常:{ex2.Message}");
  1773. }
  1774. WS.Log.RunLog.Error(ex);
  1775. return;
  1776. }
  1777. WS.Log.RunLog.Debug($"结束上传成果:{cgglCg.XMMC}");
  1778. });
  1779. thread.Start();
  1780. return true;
  1781. }
  1782. #endregion
  1783. #region 市平台
  1784. public class xzqdm
  1785. {
  1786. public string BSM { set; get; }
  1787. public string XZQDM { set; get; }
  1788. public string XZQMC { set; get; }
  1789. public string XMMC { set; get; }
  1790. public int RW { set; get; }
  1791. }
  1792. /// <summary>
  1793. /// 分页查询审查数据
  1794. /// </summary>
  1795. /// <param name="input"></param>
  1796. /// <returns></returns>
  1797. public async Task<PageData> QueryListCity(CgglScxmPage input)
  1798. {
  1799. PageData page = null;
  1800. if (input.SCZT == "完成")
  1801. {
  1802. //用例1:连写
  1803. var exp = Expressionable.Create<CgglScxmView>() //创建表达式
  1804. .And(t => t.SCZT == "完结")
  1805. .AndIF(!string.IsNullOrWhiteSpace(input.XZQDM), t => t.XZQDM.StartsWith(input.XZQDM))
  1806. .AndIF(!string.IsNullOrWhiteSpace(input.XMMC), t => t.XMMC.Contains(input.XMMC))
  1807. .AndIF(!string.IsNullOrWhiteSpace(input.GHLX), t => t.GHLX == input.GHLX)
  1808. .AndIF(!string.IsNullOrWhiteSpace(input.XMLY) && input.XMLY == "0", t => string.IsNullOrWhiteSpace(t.QXCG_BSM))
  1809. .AndIF(!string.IsNullOrWhiteSpace(input.XMLY) && input.XMLY == "1", t => t.QXCG_BSM != null)
  1810. .AndIF(input.SBZT != null, t => t.ZT_CGSB == (EnumCgsbZT)input.SBZT)
  1811. .AndIF(input.KSSJ != null, t => t.SBSJ_SJ >= input.KSSJ.Value)
  1812. .AndIF(input.JSSJ != null, t => t.SBSJ_SJ <= input.JSSJ.Value)
  1813. .AndIF(input.INSTID == "0", t => string.IsNullOrEmpty(t.INSTID))
  1814. .AndIF(input.INSTID == "1", t => t.INSTID != null)
  1815. .AndIF(!string.IsNullOrWhiteSpace(input.GHJB), t => t.GHJB.Contains(input.GHJB))
  1816. .ToExpression();//注意 这一句 不能少
  1817. var query = DbClient().Queryable<CgglScxmView>().Where(exp);
  1818. //只查重复
  1819. if (input.SJCC == "0")
  1820. {
  1821. //var query2 = Db.SqlQueryable<xzqdm>("select XZQDM from V_CGSCXM group by XZQDM having count(XZQDM) > 1");
  1822. //var query2 = Db.SqlQueryable<xzqdm>($"select {input.CCZD} from V_CGSCXM where group by {input.CCZD} having count(*) > 1");
  1823. var query2 = DbClient().Queryable<CgglScxmView>().Where(exp).Select(input.CCZD).GroupBy($"{input.CCZD} having count(*) > 1");
  1824. if (input.CCZD.Contains("XZQDM") && input.CCZD.Contains("XZQMC") && input.CCZD.Contains("XMMC"))
  1825. query = query.InnerJoin(query2, (t, d) => t.XZQDM == d.XZQDM && t.XZQMC == d.XZQMC && t.XMMC == d.XMMC).OrderBy(t => t.XZQDM);
  1826. else if (input.CCZD.Contains("XZQDM") && input.CCZD.Contains("XZQMC"))
  1827. query = query.InnerJoin(query2, (t, d) => t.XZQDM == d.XZQDM && t.XZQMC == d.XZQMC).OrderBy(t => t.XZQDM).OrderBy(t => t.XZQMC);
  1828. else if (input.CCZD.Contains("XZQDM") && input.CCZD.Contains("XMMC"))
  1829. query = query.InnerJoin(query2, (t, d) => t.XZQDM == d.XZQDM && t.XMMC == d.XMMC).OrderBy(t => t.XZQDM).OrderBy(t => t.XMMC);
  1830. else if (input.CCZD.Contains("XZQDM"))
  1831. query = query.InnerJoin(query2, (t, d) => t.XZQDM == d.XZQDM).OrderBy(t => t.XZQDM);
  1832. else if (input.CCZD.Contains("XZQMC"))
  1833. query = query.InnerJoin(query2, (t, d) => t.XZQMC == d.XZQMC).OrderBy(t => t.XZQMC);
  1834. else if (input.CCZD.Contains("XMMC"))
  1835. query = query.InnerJoin(query2, (t, d) => t.XMMC == d.XMMC).OrderBy(t => t.XMMC);
  1836. }
  1837. //去重查询
  1838. else if (input.SJCC == "1")
  1839. {
  1840. //var query2 = Db.SqlQueryable<xzqdm>($"SELECT A.BSM,ROW_NUMBER() OVER(PARTITION BY {input.CCZD} ORDER BY SCSJ_KS DESC) RW FROM V_CGSCXM A");
  1841. var query2 = DbClient().Queryable<CgglScxmView>().Where(exp).Select<xzqdm>($"BSM,ROW_NUMBER() OVER(PARTITION BY {input.CCZD} ORDER BY SCSJ_KS DESC) RW");
  1842. query = query.InnerJoin(query2, (t, d) => t.BSM == d.BSM && d.RW == 1);
  1843. }
  1844. page = await query.OrderBy(t => t.SCSJ_JS, OrderByType.Desc)
  1845. .ToPageAsync(input.page, input.limit);
  1846. var sql = query.ToSqlString();
  1847. }
  1848. else
  1849. {
  1850. var query = Db.Queryable<CgglGzlsp, CgglScxm, CgglCg>((t, b, c) => new JoinQueryInfos(
  1851. JoinType.Inner, t.RW_BSM == b.BSM, JoinType.Inner, b.CG_BSM == c.BSM))
  1852. .Where((t, b, c) => t.SPR == input.USER)
  1853. .WhereIF(!string.IsNullOrWhiteSpace(input.XZQDM), (t, b, c) => c.XZQDM.StartsWith(input.XZQDM))
  1854. .WhereIF(!string.IsNullOrWhiteSpace(input.XMMC), (t, b, c) => b.XMMC.Contains(input.XMMC))
  1855. .WhereIF(input.INSTID == "0", (t, b, c) => string.IsNullOrEmpty(c.INSTID))
  1856. .WhereIF(input.INSTID == "1", (t, b, c) => c.INSTID != null)
  1857. .WhereIF(!string.IsNullOrWhiteSpace(input.GHJB), (t, b, c) => c.GHJB == input.GHJB)
  1858. .WhereIF(!string.IsNullOrWhiteSpace(input.GHLX), (t, b, c) => c.GHLX == input.GHLX);
  1859. if (input.SCZT == "通过" || input.SCZT == "已审查")
  1860. {
  1861. query.Where((t, b, c) => t.SPZT == "通过" || t.SPZT == "退回");
  1862. }
  1863. else
  1864. {
  1865. query.Where((t, b, c) => t.SPZT == input.SCZT);
  1866. }
  1867. page = await query.OrderBy((t, b, c) => t.RECEIVE_TIME, OrderByType.Desc)
  1868. .Select((t, b, c) => new CgglGzlspView
  1869. {
  1870. IS_DELETE = t.IS_DELETE,
  1871. LC_BSM = t.LC_BSM,
  1872. ID = t.ID,
  1873. FJ = t.FJ,
  1874. RECEIVE_TIME = t.RECEIVE_TIME,
  1875. REMARKS = t.REMARKS,
  1876. RW_BSM = t.RW_BSM,
  1877. SPR = t.SPR,
  1878. SPRMC = t.SPRMC,
  1879. SPSJ = t.SPSJ,
  1880. SPYJ = t.SPYJ,
  1881. SPZT = t.SPZT,
  1882. CG_BSM = c.BSM,
  1883. CGB = c.CGB,
  1884. GHJB = c.GHJB,
  1885. GHLX = c.GHLX,
  1886. QXCG_BSM = c.QXCG_BSM,
  1887. XMMC = c.XMMC,
  1888. XZQDM = c.XZQDM,
  1889. XZQMC = c.XZQMC,
  1890. ZT = c.ZT,
  1891. ZT_RGSC = c.ZT_RGSC,
  1892. INSTID = c.INSTID
  1893. })
  1894. .ToPageAsync(input.page, input.limit);
  1895. var ssss = query.ToSqlString();
  1896. }
  1897. return page;
  1898. }
  1899. /// <summary>
  1900. /// 成果上报(市 --> 省/自治区)
  1901. /// </summary>
  1902. /// <returns></returns>
  1903. public async Task<bool> SCgsb(CgsbIo input)
  1904. {
  1905. //input.ID // T_CGHJ_QXCG.BSM
  1906. CgglCg cgglCg = await Db.Queryable<CgglCg>().Where(t => t.BSM == input.ID).FirstAsync();
  1907. if (cgglCg.ZT_CGSB != KJGH.Model.Enums.EnumCgsbZT.未提交 && cgglCg.ZT_CGSB != KJGH.Model.Enums.EnumCgsbZT.上报失败)
  1908. {
  1909. //throw new UseMassageException("当前成果已经上报,不能重复提交!");
  1910. }
  1911. //本地上传
  1912. if (cgglCg.QXCG_BSM == null)
  1913. {
  1914. WS.Log.RunLog.Debug($"本地成果上传到自治区,{cgglCg.BSM}");
  1915. cgglCg.ZT = KJGH.Model.Enums.EnumCgglCgZT.成果上报;
  1916. cgglCg.ZT_CGSB = KJGH.Model.Enums.EnumCgsbZT.上报中;
  1917. var path = FileManage.Instance.ToFullPath(Path.GetDirectoryName(cgglCg.CGB), false);
  1918. var fileList = Directory.GetFiles(path).Where(t => Path.GetFileName(t).StartsWith("_"))
  1919. .ToDictionary(t => Path.GetFileName(t).Replace("_", "").ToInt(), t => t).OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
  1920. if (fileList.Count != cgglCg.CGFPS)
  1921. {
  1922. throw new UseMassageException("成果包有误,分包数据不全!");
  1923. }
  1924. //市本地上报记录
  1925. var cityCghjCgsbrw = Db.Queryable<CityCghjCgsbrw>().Where(t => t.FILEMD5 == cgglCg.BSM).First();
  1926. bool isNew = false;
  1927. if (cityCghjCgsbrw == null)
  1928. {
  1929. isNew = true;
  1930. cityCghjCgsbrw = new CityCghjCgsbrw()
  1931. {
  1932. ID = cgglCg.BSM,
  1933. XZQDM = cgglCg.XZQDM,
  1934. XZQMC = cgglCg.XZQMC,
  1935. GHLX = cgglCg.GHLX,
  1936. CGWJ = cgglCg.CGB,
  1937. CGLJ = cgglCg.CGML,
  1938. CREATETIME = DateTime.Now,
  1939. TOTALSLICENUM = cgglCg.CGFPS,
  1940. FILEMD5 = cgglCg.BSM,
  1941. FILENAME = cgglCg.XMMC,
  1942. CREATOR = input.SBSJ_YH,
  1943. CREATORMC = input.SBSJ_YHM,
  1944. SBNF = string.IsNullOrWhiteSpace(input.year) ? DateTime.Now.Year.ToString() : input.year,
  1945. RWZT = EnumCgsbrw.上报中,
  1946. SBJD = $"0/{cgglCg.CGFPS}",
  1947. };
  1948. }
  1949. else
  1950. {
  1951. cityCghjCgsbrw.MODIFIER = input.SBSJ_YH;
  1952. cityCghjCgsbrw.MODIFIERMC = input.SBSJ_YHM;
  1953. cityCghjCgsbrw.MODIFYTIME = DateTime.Now;
  1954. cityCghjCgsbrw.SBJD = $"0/{cityCghjCgsbrw.TOTALSLICENUM}";
  1955. cityCghjCgsbrw.RWZT = EnumCgsbrw.上报中;
  1956. }
  1957. try
  1958. {
  1959. Db.BeginTran();
  1960. if (isNew) await Db.Insertable(cityCghjCgsbrw).ExecuteCommandAsync();
  1961. else await Db.Updateable(cityCghjCgsbrw).ExecuteCommandHasChangeAsync();
  1962. await Db.Updateable(cgglCg).ExecuteCommandHasChangeAsync();
  1963. Db.CommitTran();
  1964. }
  1965. catch (Exception ex)
  1966. {
  1967. Db.RollbackTran();
  1968. WS.Log.RunLog.Error(ex);
  1969. throw new UseMassageException("成果上报失败");
  1970. }
  1971. Thread thread = new Thread(() =>
  1972. {
  1973. WS.Log.RunLog.Debug($"开始上传成果(市-->省/自治区):{cgglCg.XMMC}");
  1974. try
  1975. {
  1976. var md5Data = ZZQApi.Md5(new NmCgMd5Io()
  1977. {
  1978. fileMd5 = cgglCg.BSM,
  1979. fileSize = 10 * 1024 * 1024,
  1980. fileName = Path.GetFileName(cgglCg.CGB),
  1981. totalSliceNum = cgglCg.CGFPS,
  1982. curSliceOrder = 0,
  1983. resetSliceOrder2Zero = !input.xc,
  1984. instId = cgglCg.INSTID
  1985. });
  1986. //分片上传
  1987. var index = 1;
  1988. var chazhi = fileList.Keys.First() == 0 ? 0 : 1;
  1989. foreach (var chunk in fileList.Keys)
  1990. {
  1991. var curOrder = chunk - chazhi;
  1992. if (input.xc && curOrder < md5Data.curSliceOrder)
  1993. {
  1994. continue;
  1995. }
  1996. WS.Log.RunLog.Debug($"分片上传:【{chunk}】{fileList[chunk]}");
  1997. FileInfo fileInfo = new FileInfo(fileList[chunk]);
  1998. NmCgUploadSplitIo inputU = new NmCgUploadSplitIo()
  1999. {
  2000. xmmc = cgglCg.XMMC,
  2001. XZQDM = cityCghjCgsbrw.XZQDM,
  2002. XZQMC = cityCghjCgsbrw.XZQMC,
  2003. token = md5Data.token,
  2004. ghlx = cityCghjCgsbrw.GHLX,
  2005. year = cityCghjCgsbrw.SBNF,
  2006. name = Path.GetFileName(cgglCg.CGB),
  2007. zipMd5 = cgglCg.BSM,
  2008. totalSliceNum = cityCghjCgsbrw.TOTALSLICENUM,
  2009. curSliceOrder = curOrder,
  2010. curSliceSize = 10 * 1024 * 1024,
  2011. resetSliceOrder2Zero = !input.xc,
  2012. instId = cgglCg.INSTID
  2013. };
  2014. WS.Log.RunLog.Debug($"分片上传参数:{inputU.ToJson()}");
  2015. bool res = false;
  2016. switch (inputU.ghlx)
  2017. {
  2018. case EnumGHLX.总体规划:
  2019. case EnumGHLX.专项规划:
  2020. res = ZZQApi.Upload(inputU, fileList[chunk]);
  2021. break;
  2022. case EnumGHLX.村庄规划:
  2023. case EnumGHLX.乡镇规划:
  2024. res = ZZQApi.TownUpload(inputU, fileList[chunk]);
  2025. break;
  2026. default:
  2027. throw new UseMassageException($"暂未实现{inputU.ghlx}成果数据的上传");
  2028. }
  2029. WS.Log.RunLog.Debug($"分片上传:【{chunk}】{res}");
  2030. //更新进度
  2031. Db.Updateable<CityCghjCgsbrw>().SetColumns(it => it.SBJD == $"{index}/{cityCghjCgsbrw.TOTALSLICENUM}").Where(it => it.ID == cgglCg.BSM).ExecuteCommand();
  2032. index++;
  2033. Thread.Sleep(1000);
  2034. }
  2035. Db.BeginTran();
  2036. Db.Updateable<CgglCg>().SetColumns(it => new CgglCg() { ZT_CGSB = EnumCgsbZT.已上报 }).Where(it => it.BSM == cgglCg.BSM).ExecuteCommand();
  2037. Db.Updateable<CityCghjCgsbrw>().SetColumns(it => new CityCghjCgsbrw() { SBJD = $"{cityCghjCgsbrw.TOTALSLICENUM}/{cityCghjCgsbrw.TOTALSLICENUM}", RWZT = EnumCgsbrw.待审批 }).Where(it => it.ID == cgglCg.BSM).ExecuteCommand();
  2038. Db.CommitTran();
  2039. WS.Log.RunLog.Debug($"上传完成:{cgglCg.XMMC}");
  2040. }
  2041. catch (Exception ex)
  2042. {
  2043. Db.RollbackTran();
  2044. Db.Updateable<CgglCg>().SetColumns(it => new CgglCg() { ZT_CGSB = EnumCgsbZT.上报失败 }).Where(it => it.BSM == cgglCg.BSM).ExecuteCommand();
  2045. try
  2046. {
  2047. Db.Updateable<CityCghjCgsbrw>().SetColumns(it => new CityCghjCgsbrw() { SBSBYY = ex.Message, RWZT = EnumCgsbrw.上报失败 }).Where(it => it.ID == cgglCg.BSM).ExecuteCommand();
  2048. }
  2049. catch (Exception ex2)
  2050. {
  2051. WS.Log.RunLog.Debug($"结束上传失败入库异常:{ex2.Message}");
  2052. }
  2053. WS.Log.RunLog.Error(ex);
  2054. return;
  2055. }
  2056. WS.Log.RunLog.Debug($"结束上传成果:{cgglCg.XMMC}");
  2057. });
  2058. thread.Start();
  2059. }
  2060. //旗县上报
  2061. else
  2062. {
  2063. WS.Log.RunLog.Debug($"旗县上报成果上传到自治区,{cgglCg.BSM}");
  2064. CghjQxcg cghjQxcg = await Db.Queryable<CghjQxcg>().Where(t => t.BSM == cgglCg.QXCG_BSM).FirstAsync();
  2065. cgglCg.ZT = KJGH.Model.Enums.EnumCgglCgZT.成果上报;
  2066. cgglCg.ZT_CGSB = KJGH.Model.Enums.EnumCgsbZT.上报中;
  2067. cghjQxcg.SBSJ_ZT = "上报中";
  2068. cghjQxcg.SBSJ_YH = input.SBSJ_YH;
  2069. cghjQxcg.SBSJ_YHM = input.SBSJ_YHM;
  2070. cghjQxcg.SBSJ_SJ = DateTime.Now;
  2071. cghjQxcg.SBSJ_JD = $"0/{cgglCg.CGFPS}";
  2072. var path = FileManage.Instance.ToFullPath(Path.GetDirectoryName(cgglCg.CGB), false);
  2073. var fileList = Db.Queryable<CghjQxcgsbrwfp>().Where(t => t.MD5 == cghjQxcg.BSM).OrderBy(t => t.CHUNK).Select(t => new { t.CHUNK, t.PATH }).ToList()
  2074. .ToDictionary(t => t.CHUNK, t => FileManage.Instance.ToFullPath(t.PATH, false)).OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
  2075. if (fileList.Count != cgglCg.CGFPS)
  2076. {
  2077. throw new UseMassageException("成果包有误,分包数据不全!");
  2078. }
  2079. try
  2080. {
  2081. Db.BeginTran();
  2082. await Db.Updateable(cgglCg).ExecuteCommandHasChangeAsync();
  2083. await Db.Updateable(cghjQxcg).ExecuteCommandAsync();
  2084. Db.CommitTran();
  2085. }
  2086. catch (Exception ex)
  2087. {
  2088. Db.RollbackTran();
  2089. WS.Log.RunLog.Error(ex);
  2090. throw new UseMassageException("成果上报失败");
  2091. }
  2092. Thread thread = new Thread(() =>
  2093. {
  2094. WS.Log.RunLog.Debug($"开始上传成果(市-->省/自治区):{cgglCg.XMMC}");
  2095. try
  2096. {
  2097. var md5Data = ZZQApi.Md5(new NmCgMd5Io()
  2098. {
  2099. fileMd5 = cghjQxcg.BSM,
  2100. fileSize = 10 * 1024 * 1024,
  2101. fileName = Path.GetFileName(cghjQxcg.CGB),
  2102. totalSliceNum = cgglCg.CGFPS,
  2103. curSliceOrder = 0,
  2104. resetSliceOrder2Zero = !input.xc,
  2105. instId = cghjQxcg.INSTID
  2106. });
  2107. //分片上传
  2108. var index = 1;
  2109. var chazhi = fileList.Keys.First() == 0 ? 0 : 1;
  2110. foreach (var chunk in fileList.Keys)
  2111. {
  2112. var curOrder = chunk - chazhi;
  2113. if (input.xc && curOrder < md5Data.curSliceOrder)
  2114. {
  2115. continue;
  2116. }
  2117. FileInfo fileInfo = new FileInfo(fileList[chunk]);
  2118. NmCgUploadSplitIo inputU = new NmCgUploadSplitIo()
  2119. {
  2120. xmmc = cghjQxcg.XMMC,
  2121. XZQDM = cghjQxcg.XZQDM,
  2122. XZQMC = cghjQxcg.XZQMC,
  2123. token = md5Data.token,
  2124. ghlx = cghjQxcg.GHLX,
  2125. year = string.IsNullOrWhiteSpace(input.year) ? DateTime.Now.Year.ToString() : input.year,
  2126. name = Path.GetFileName(cghjQxcg.CGB),
  2127. zipMd5 = cghjQxcg.BSM,
  2128. totalSliceNum = cgglCg.CGFPS,
  2129. curSliceOrder = curOrder,
  2130. curSliceSize = 10 * 1024 * 1024,
  2131. resetSliceOrder2Zero = !input.xc,
  2132. instId = cghjQxcg.INSTID
  2133. };
  2134. bool res = false;
  2135. switch (inputU.ghlx)
  2136. {
  2137. case EnumGHLX.总体规划:
  2138. case EnumGHLX.专项规划:
  2139. res = ZZQApi.Upload(inputU, fileList[chunk]);
  2140. break;
  2141. case EnumGHLX.村庄规划:
  2142. case EnumGHLX.乡镇规划:
  2143. res = ZZQApi.TownUpload(inputU, fileList[chunk]);
  2144. break;
  2145. default:
  2146. throw new UseMassageException($"暂未实现{inputU.ghlx}成果数据的上传");
  2147. }
  2148. //更新进度
  2149. Db.Updateable<CghjQxcg>().SetColumns(it => it.SBSJ_JD == $"{index}/{cgglCg.CGFPS}").Where(it => it.BSM == cghjQxcg.BSM).ExecuteCommand();
  2150. index++;
  2151. Thread.Sleep(1000);
  2152. }
  2153. Db.BeginTran();
  2154. Db.Updateable<CgglCg>().SetColumns(it => new CgglCg() { ZT_CGSB = EnumCgsbZT.已上报 }).Where(it => it.BSM == cgglCg.BSM).ExecuteCommand();
  2155. Db.Updateable<CghjQxcg>().SetColumns(it => new CghjQxcg() { SBSJ_JD = $"{cgglCg.CGFPS}/{cgglCg.CGFPS}", SBSJ_ZT = "上报完成" }).Where(it => it.BSM == cghjQxcg.BSM).ExecuteCommand();
  2156. Db.CommitTran();
  2157. }
  2158. catch (Exception ex)
  2159. {
  2160. Db.RollbackTran();
  2161. Db.Updateable<CgglCg>().SetColumns(it => new CgglCg() { ZT_CGSB = EnumCgsbZT.上报失败 }).Where(it => it.BSM == cgglCg.BSM).ExecuteCommand();
  2162. try
  2163. {
  2164. Db.Updateable<CghjQxcg>().SetColumns(it => new CghjQxcg() { SBSJ_SBYY = ex.Message, SBSJ_ZT = "上报失败" }).Where(it => it.BSM == cghjQxcg.BSM).ExecuteCommand();
  2165. }
  2166. catch (Exception ex2)
  2167. {
  2168. WS.Log.RunLog.Debug($"结束上传失败入库异常:{ex2.Message}");
  2169. }
  2170. WS.Log.RunLog.Error(ex);
  2171. return;
  2172. }
  2173. WS.Log.RunLog.Debug($"结束上传成果:{cgglCg.XMMC}");
  2174. });
  2175. thread.Start();
  2176. }
  2177. return true;
  2178. }
  2179. #endregion
  2180. /// <summary>
  2181. /// 厅结果更新ID
  2182. /// </summary>
  2183. /// <returns></returns>
  2184. public async Task<bool> UpdateMd5Id()
  2185. {
  2186. List<CgglCg> cggls = Db.Queryable<CgglCg>().Where(t => t.TID == null).ToList();
  2187. foreach (var item in cggls)
  2188. {
  2189. //item.TID = ZZQApi.GetToken
  2190. }
  2191. return true;
  2192. }
  2193. }
  2194. }