CghjQxtjpgrwRepository.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. using Microsoft.AspNetCore.Http;
  2. using QM.KJGH.CGGL.IRepository;
  3. using QM.KJGH.CGGL.Model.QxCghj;
  4. using QM.KJGH.Model.Enums;
  5. using QM.KJGH.Model.KJGH;
  6. using QM.OrmSqlSugar;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Data;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Reflection;
  13. using System.Threading.Tasks;
  14. using WS;
  15. using WS.AutoMapper;
  16. using WS.IO;
  17. using WS.IO.Office;
  18. using WS.IO.Upload;
  19. using WS.IO.Zip;
  20. using WS.Orm;
  21. namespace QM.KJGH.CGGL.Repositories
  22. {
  23. /// <summary>
  24. ///
  25. /// </summary>
  26. public class CghjQxtjpgrwRepository : SqlSugarRepository<CghjQxtjpgrw>, ICghjQxtjpgrwRepository
  27. {
  28. /// <summary>
  29. /// 获取体检评估上报任务
  30. /// </summary>
  31. /// <returns></returns>
  32. public async Task<List<CghjQxtjpgrwView>> GetTask(CghjQxtjpgrwQuery input)
  33. {
  34. if (input.reportYear != null) input.reportYear = input.reportYear.Where(t => !string.IsNullOrWhiteSpace(t)).ToList();
  35. EnumCghjQxtjpgStatus rwzt = EnumCghjQxtjpgStatus.全部;
  36. if (!string.IsNullOrWhiteSpace(input.status))
  37. {
  38. try
  39. {
  40. rwzt = input.status.ToInt().ToEnum<EnumCghjQxtjpgStatus>();
  41. }
  42. catch (Exception)
  43. {
  44. throw new UseMassageException("状态编码错误");
  45. }
  46. }
  47. var user = await Db.Queryable<SysOpenUser>().Where(t => t.APPID == input.appid).FirstAsync();
  48. var list = await Db.Queryable<CghjQxtjpgrw>()
  49. .Where(t => t.XZQDM == user.XZQDM)
  50. .WhereIF(input.reportYear != null && input.reportYear.Count > 0, t => input.reportYear.Contains(t.SBNF.ToString()))
  51. .WhereIF(!string.IsNullOrWhiteSpace(input.status), t => t.ZTBM == rwzt)
  52. .ToListAsync();
  53. var rlist = list
  54. .Select(t =>
  55. {
  56. return new CghjQxtjpgrwView()
  57. {
  58. id = t.BSM,
  59. name = t.RWMC,
  60. divisionCode = t.XZQDM,
  61. divisionName = t.XZQMC,
  62. reportDate = t.SBRQ == null ? null : t.SBRQ.Value.ToString("yyyy-MM-dd HH:mm:ss"),
  63. reportEndDate = t.SBJSRQ.ToString("yyyy-MM-dd"),
  64. reportYear = t.SBNF == 0 ? "" : t.SBNF.ToString(),
  65. status = t.ZTBM.GetHashCode().ToString(),
  66. statusName = t.ZTMC,
  67. auditNodes = Db.Queryable<CghjQxtjpgrwsc>().Where(t => t.RWBSM == t.BSM)
  68. .OrderBy(t => t.SBRQ, SqlSugar.OrderByType.Desc).Select(t => new AuditNode()
  69. {
  70. auditTime = t.SBRQ,
  71. statusName = t.ZTMC,
  72. status = t.ZTBM.ToString(),
  73. nodeName = t.SPJG,
  74. }).ToList(),
  75. };
  76. })
  77. .ToList();
  78. return rlist;
  79. }
  80. /// <summary>
  81. /// 上报体检评估任务结果
  82. /// </summary>
  83. /// <returns></returns>
  84. public async Task<bool> Upload(IFormFile formFile, string id)
  85. {
  86. var rwModel = await GetAsync(t => t.BSM == id);
  87. if (rwModel == null)
  88. throw new UseMassageException("任务不存在,请先调用【获取体检评估上报任务接口(/api/open/checkup/template)】获取任务");
  89. if (rwModel.ZTBM == EnumCghjQxtjpgStatus.待审查 || rwModel.ZTBM == EnumCghjQxtjpgStatus.审查通过)
  90. throw new UseMassageException($"当前任务已处于{rwModel.ZTBM.Description()}状态,不允许进行修改");
  91. string path = FileManage.Instance.ToFullPath(@$"旗县成果上报\{rwModel.XZQDM}\体检评估");
  92. var zipFile = FileUpload.SaveFile(formFile, path, $"体检评估报告_{rwModel.XZQDM}_{DateTime.Now.ToTimeStamp()}");
  93. if (zipFile.Size == 0)
  94. throw new UseMassageException("文件上传失败(0kb),请重新上传");
  95. //解压
  96. var cgpath = WinRAR.UnRarOrZip(zipFile.FullPath);
  97. //检查Excel
  98. List<string> files = new List<string>();
  99. GetFiles(cgpath, files);
  100. #region 规划目标表
  101. var ghmb = files.FirstOrDefault(t => t.Contains("规划目标表.xls"));
  102. if (string.IsNullOrWhiteSpace(ghmb))
  103. throw new UseMassageException("文件“规划目标表.xls”必须上传");
  104. var tableGhmb = ExcelHelper.ReadExcelToDataTable(ghmb, true);
  105. //头
  106. var colDic = typeof(CghjQxtjghmbb).GetProperties()
  107. .Where(t => t.GetCustomAttributes(typeof(ExportAttribute), false).FirstOrDefault() != null)
  108. .ToDictionary(t => (t.GetCustomAttribute(typeof(ExportAttribute)) as ExportAttribute).name, t => t.Name);
  109. foreach (DataColumn col in tableGhmb.Columns)
  110. {
  111. col.ColumnName = colDic[col.ColumnName.Trim()];
  112. }
  113. List<CghjQxtjghmbb> listGhmb = tableGhmb.ToList<CghjQxtjghmbb>().Where(t => !string.IsNullOrWhiteSpace(t.ZBMC)).ToList();
  114. #endregion
  115. #region 评估指标表
  116. var pbzb = files.FirstOrDefault(t => t.Contains("评估指标表.xls"));
  117. if (string.IsNullOrWhiteSpace(pbzb))
  118. throw new UseMassageException("文件“评估指标表.xls”必须上传");
  119. var tablePbzb = ExcelHelper.ReadExcelToDataTable(pbzb, true);
  120. var colPbzb = typeof(CghjQxtjbgzbb).GetProperties()
  121. .Where(t => t.GetCustomAttributes(typeof(ExportAttribute), false).FirstOrDefault() != null)
  122. .ToDictionary(t => (t.GetCustomAttribute(typeof(ExportAttribute)) as ExportAttribute).name, t => t.Name);
  123. foreach (DataColumn col in tablePbzb.Columns)
  124. {
  125. col.ColumnName = colPbzb[col.ColumnName.Trim()];
  126. }
  127. List<CghjQxtjbgzbb> listPbzb = tablePbzb.ToList<CghjQxtjbgzbb>().Where(t => !string.IsNullOrWhiteSpace(t.ZBMC)).ToList();
  128. #endregion
  129. //评估指标表
  130. var zblist = await Db.Queryable<CghjTjzb>().ToListAsync();//指标验证
  131. List<string> errorMsg = new List<string>();
  132. List<string> errorMsgPg = new List<string>();
  133. List<CghjQxtjghmbb> cgbmAdds = new List<CghjQxtjghmbb>();
  134. List<CghjQxtjbgzbb> pgzbAdds = new List<CghjQxtjbgzbb>();
  135. foreach (var item in zblist)
  136. {
  137. //规划目标表
  138. var cgmb = listGhmb.FirstOrDefault(t => t.ZBMC.Trim() == item.ZBMC && t.XZQDM == rwModel.XZQDM);
  139. if (cgmb == null) errorMsg.Add(item.ZBMC);
  140. else
  141. {
  142. cgmb.BSM = Guid.NewGuid().ToString("N");
  143. cgmb.ZBBH = item.ZBBH;
  144. cgmb.ZBLX = item.ZBLX;
  145. cgmb.YJFL = item.YJFL;
  146. cgmb.XZQMC = rwModel.XZQMC;
  147. cgmb.RWBSM = rwModel.BSM;
  148. cgbmAdds.Add(cgmb);
  149. }
  150. //评估指标表
  151. var pgzb = listPbzb.FirstOrDefault(t => t.ZBMC.Trim() == item.ZBMC && t.XZQDM == rwModel.XZQDM);
  152. if (pgzb == null) errorMsgPg.Add(item.ZBMC);
  153. else
  154. {
  155. pgzb.BSM = Guid.NewGuid().ToString("N");
  156. pgzb.ZBBH = item.ZBBH;
  157. pgzb.ZBLX = item.ZBLX;
  158. pgzb.YJFL = item.YJFL;
  159. pgzb.XZQMC = rwModel.XZQMC;
  160. pgzb.RWBSM = rwModel.BSM;
  161. pgzbAdds.Add(pgzb);
  162. }
  163. }
  164. List<string> msg = new List<string>();
  165. if (errorMsg.Count > 0)
  166. msg.Add($"规划目标表中缺失指标:{errorMsg.Join("、")}");
  167. if (errorMsgPg.Count > 0)
  168. msg.Add($"评估指标表中缺失指标:{errorMsgPg.Join("、")}");
  169. if(msg.Count > 0)
  170. {
  171. throw new UseMassageException(msg.Join(";"));
  172. }
  173. try
  174. {
  175. Db.BeginTran();
  176. rwModel.SBRQ = DateTime.Now;
  177. rwModel.ZTBM = EnumCghjQxtjpgStatus.待审查;
  178. rwModel.ZTMC = EnumCghjQxtjpgStatus.待审查.Description();
  179. rwModel.CGWJ = zipFile.Path;
  180. await Db.Updateable(rwModel).ExecuteCommandAsync();
  181. await Db.Deleteable<CghjQxtjghmbb>().Where(t => t.RWBSM == rwModel.BSM).ExecuteCommandAsync();
  182. await Db.Deleteable<CghjQxtjbgzbb>().Where(t => t.RWBSM == rwModel.BSM).ExecuteCommandAsync();
  183. if (cgbmAdds.Count > 0) await Db.Insertable(cgbmAdds).ExecuteCommandAsync();
  184. if (pgzbAdds.Count > 0) await Db.Insertable(pgzbAdds).ExecuteCommandAsync();
  185. Db.CommitTran();
  186. }
  187. catch (Exception ex)
  188. {
  189. Db.RollbackTran();
  190. WS.Log.RunLog.Error(ex);
  191. throw new UseMassageException(ex.Message);
  192. }
  193. return true;
  194. }
  195. /// <summary>
  196. /// 将指定目录内的所有文件存入容器
  197. /// </summary>
  198. /// <param name="dir"></param>
  199. /// <param name="files"></param>
  200. private List<string> GetFiles(string dir, List<string> files = null)
  201. {
  202. if (files == null) files = new List<string>();
  203. files.AddRange(Directory.GetFiles(dir));
  204. foreach (var item in Directory.GetDirectories(dir))
  205. GetFiles(item, files);
  206. return files;
  207. }
  208. /// <summary>
  209. /// 分页查询
  210. /// </summary>
  211. /// <param name="input"></param>
  212. /// <returns></returns>
  213. public async Task<PageData> GetPage(CghjQzTjzbPage input)
  214. {
  215. EnumCghjQxtjpgStatus rwzt = EnumCghjQxtjpgStatus.全部;
  216. if (!string.IsNullOrWhiteSpace(input.ZTBM))
  217. {
  218. try
  219. {
  220. rwzt = input.ZTBM.ToInt().ToEnum<EnumCghjQxtjpgStatus>();
  221. }
  222. catch (Exception ex)
  223. {
  224. throw new UseMassageException("状态编码错误");
  225. }
  226. }
  227. var query = DbClient().Queryable<CghjQxtjpgrw>();
  228. query.WhereIF(!string.IsNullOrWhiteSpace(input.XZQDM), t => t.XZQDM == input.XZQDM);
  229. query.WhereIF(!string.IsNullOrWhiteSpace(input.SBNF), t => t.SBNF.ToString() == input.SBNF);
  230. query.WhereIF(rwzt != EnumCghjQxtjpgStatus.全部, t => t.ZTBM == rwzt);
  231. var page = await query.OrderBy(t => t.ZTBM).ToPageAsync(input.page, input.limit);
  232. return page;
  233. }
  234. # region 旗县
  235. /// <summary>
  236. /// 任务同步更新(旗县)
  237. /// </summary>
  238. /// <returns></returns>
  239. public async Task<bool> QXTaskUpdate(List<CghjQxtjpgrwView> list)
  240. {
  241. if (list == null)
  242. throw new UseMassageException("空数据");
  243. List<CghjQxtjpgrw> update = new List<CghjQxtjpgrw>();
  244. List<CghjQxtjpgrw> add = new List<CghjQxtjpgrw>();
  245. var gxid = list.Select(t => t.id);
  246. var outlist = await GetListAsync(t => gxid.Contains(t.BSM));
  247. foreach (var item in list)
  248. {
  249. var outmodel = outlist.FirstOrDefault(t => t.BSM == item.id);
  250. var newmodel = new CghjQxtjpgrw()
  251. {
  252. BSM = item.id,
  253. XZQDM = item.divisionCode,
  254. XZQMC = item.divisionName,
  255. SBRQ = string.IsNullOrWhiteSpace(item.reportDate) ? null : DateTime.ParseExact(item.reportDate, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.CurrentCulture),
  256. SBJSRQ = DateTime.ParseExact(item.reportEndDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture),
  257. SBNF = item.reportYear.ToInt(),
  258. ZTBM = item.status.ToInt().ToEnum<EnumCghjQxtjpgStatus>(),
  259. RWMC = item.name,
  260. ZTMC = item.statusName
  261. };
  262. if (outmodel == null)
  263. {
  264. add.Add(newmodel);
  265. }
  266. else
  267. {
  268. update.Add(newmodel);
  269. }
  270. }
  271. try
  272. {
  273. Db.BeginTran();
  274. if (add.Count > 0) await Db.Insertable(add).ExecuteCommandAsync();
  275. if (update.Count > 0) await Db.Updateable(update).ExecuteCommandAsync();
  276. Db.CommitTran();
  277. }
  278. catch (Exception ex)
  279. {
  280. Db.RollbackTran();
  281. WS.Log.RunLog.Error(ex);
  282. throw new UseMassageException(ex.Message);
  283. }
  284. return true;
  285. }
  286. /// <summary>
  287. /// 上报体检评估任务结果(旗县)
  288. /// </summary>
  289. /// <returns></returns>
  290. public async Task<string> QXUpload(UploadFile zipFile, string id)
  291. {
  292. var rwModel = await GetAsync(t => t.BSM == id);
  293. if (rwModel == null)
  294. throw new UseMassageException("任务不存在");
  295. if (rwModel.ZTBM == EnumCghjQxtjpgStatus.待审查 || rwModel.ZTBM == EnumCghjQxtjpgStatus.审查通过)
  296. throw new UseMassageException($"当前任务已处于{rwModel.ZTBM.Description()}状态,不允许进行修改");
  297. //解压
  298. var cgpath =WinRAR.UnRarOrZip(zipFile.FullPath, true);
  299. //检查Excel
  300. List<string> files = new List<string>();
  301. GetFiles(cgpath, files);
  302. WS.Log.RunLog.Info($"规划目标表开始分析。。。");
  303. #region 规划目标表
  304. var ghmb = files.FirstOrDefault(t => t.Contains("规划目标表.xls"));
  305. if (string.IsNullOrWhiteSpace(ghmb))
  306. throw new UseMassageException("文件“规划目标表.xls”必须上传");
  307. var tableGhmb = ExcelHelper.ReadExcelToDataTable(ghmb, true);
  308. //头
  309. var colDic = typeof(CghjQxtjghmbb).GetProperties()
  310. .Where(t => t.GetCustomAttributes(typeof(ExportAttribute), false).FirstOrDefault() != null)
  311. .ToDictionary(t => (t.GetCustomAttribute(typeof(ExportAttribute)) as ExportAttribute).name, t => t.Name);
  312. foreach (DataColumn col in tableGhmb.Columns)
  313. {
  314. col.ColumnName = colDic[col.ColumnName.Trim()];
  315. }
  316. List<CghjQxtjghmbb> listGhmb = tableGhmb.ToList<CghjQxtjghmbb>().Where(t => !string.IsNullOrWhiteSpace(t.ZBMC)).ToList();
  317. #endregion
  318. #region 评估指标表
  319. WS.Log.RunLog.Info($"评估指标表开始分析。。。");
  320. var pbzb = files.FirstOrDefault(t => t.Contains("评估指标表.xls"));
  321. if (string.IsNullOrWhiteSpace(pbzb))
  322. throw new UseMassageException("文件“评估指标表.xls”必须上传");
  323. var tablePbzb = ExcelHelper.ReadExcelToDataTable(pbzb, true);
  324. var colPbzb = typeof(CghjQxtjbgzbb).GetProperties()
  325. .Where(t => t.GetCustomAttributes(typeof(ExportAttribute), false).FirstOrDefault() != null)
  326. .ToDictionary(t => (t.GetCustomAttribute(typeof(ExportAttribute)) as ExportAttribute).name, t => t.Name);
  327. foreach (DataColumn col in tablePbzb.Columns)
  328. {
  329. col.ColumnName = colPbzb[col.ColumnName.Trim()];
  330. }
  331. List<CghjQxtjbgzbb> listPbzb = tablePbzb.ToList<CghjQxtjbgzbb>().Where(t => !string.IsNullOrWhiteSpace(t.ZBMC)).ToList();
  332. #endregion
  333. WS.Log.RunLog.Info($"Excel 分析完成。。。");
  334. //评估指标表
  335. var zblist = await Db.Queryable<CghjTjzb>().ToListAsync();//指标验证
  336. List<string> errorMsg = new List<string>();
  337. List<string> errorMsgPg = new List<string>();
  338. List<CghjQxtjghmbb> cgbmAdds = new List<CghjQxtjghmbb>();
  339. List<CghjQxtjbgzbb> pgzbAdds = new List<CghjQxtjbgzbb>();
  340. foreach (var item in zblist)
  341. {
  342. //规划目标表
  343. var cgmb = listGhmb.FirstOrDefault(t => t.ZBMC.Trim() == item.ZBMC && t.XZQDM == rwModel.XZQDM);
  344. if (cgmb == null) errorMsg.Add(item.ZBMC);
  345. else
  346. {
  347. cgmb.BSM = Guid.NewGuid().ToString("N");
  348. cgmb.ZBBH = item.ZBBH;
  349. cgmb.ZBLX = item.ZBLX;
  350. cgmb.XZQMC = rwModel.XZQMC;
  351. cgmb.RWBSM = rwModel.BSM;
  352. cgbmAdds.Add(cgmb);
  353. }
  354. //评估指标表
  355. var pgzb = listPbzb.FirstOrDefault(t => t.ZBMC.Trim() == item.ZBMC && t.XZQDM == rwModel.XZQDM);
  356. if (pgzb == null) errorMsgPg.Add(item.ZBMC);
  357. else
  358. {
  359. pgzb.BSM = Guid.NewGuid().ToString("N");
  360. pgzb.ZBBH = item.ZBBH;
  361. pgzb.ZBLX = item.ZBLX;
  362. pgzb.XZQMC = rwModel.XZQMC;
  363. pgzb.RWBSM = rwModel.BSM;
  364. pgzbAdds.Add(pgzb);
  365. }
  366. }
  367. List<string> msg = new List<string>();
  368. if (errorMsg.Count > 0)
  369. msg.Add($"规划目标表中缺失指标:{errorMsg.Join("、")}");
  370. if (errorMsgPg.Count > 0)
  371. msg.Add($"评估指标表中缺失指标:{errorMsgPg.Join("、")}");
  372. if (msg.Count > 0)
  373. {
  374. throw new UseMassageException(msg.Join(";"));
  375. }
  376. try
  377. {
  378. Db.BeginTran();
  379. rwModel.SBRQ = DateTime.Now;
  380. rwModel.ZTBM = EnumCghjQxtjpgStatus.待审查;
  381. rwModel.ZTMC = EnumCghjQxtjpgStatus.待审查.Description();
  382. rwModel.CGWJ = zipFile.Path;
  383. await Db.Updateable(rwModel).ExecuteCommandAsync();
  384. await Db.Deleteable<CghjQxtjghmbb>().Where(t => t.RWBSM == rwModel.BSM).ExecuteCommandAsync();
  385. await Db.Deleteable<CghjQxtjbgzbb>().Where(t => t.RWBSM == rwModel.BSM).ExecuteCommandAsync();
  386. if (cgbmAdds.Count > 0) await Db.Insertable(cgbmAdds).ExecuteCommandAsync();
  387. if (pgzbAdds.Count > 0) await Db.Insertable(pgzbAdds).ExecuteCommandAsync();
  388. Db.CommitTran();
  389. }
  390. catch (Exception ex)
  391. {
  392. Db.RollbackTran();
  393. WS.Log.RunLog.Error(ex);
  394. throw new UseMassageException(ex.Message);
  395. }
  396. return zipFile.FullPath;
  397. }
  398. #endregion
  399. }
  400. }