郑州市第一人民医院

DistributionAppChartRepository.cs 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. using DistributionApi.IRepositories;
  2. using MadRunFabric.Common;
  3. using MadRunFabric.Common.Options;
  4. using MadRunFabric.Model;
  5. using Microsoft.Extensions.Logging;
  6. using Microsoft.Extensions.Options;
  7. using MongoDB.Driver;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Text;
  11. using System.Linq;
  12. namespace DistributionApi.Repositories
  13. {
  14. public class DistributionAppChartRepository : BaseRepository<Pro_Project_Info, string>, IDistributionAppChartRepository
  15. {
  16. protected readonly ILogger<BaseRepository<Pro_Project_Info, string>> _logger;
  17. protected readonly IMongoCollection<Distri_Goods_Type> _collection_distri_goods_type;
  18. protected readonly IMongoCollection<Distri_Goods> _collection_distri_goods;
  19. protected readonly IMongoCollection<Distri_Workorder> _collection_distri_workorder;
  20. protected readonly IMongoCollection<Sys_Building> _collection_sys_building;
  21. protected readonly IMongoCollection<Sys_Floor> _collection_sys_floor;
  22. protected readonly IMongoCollection<Sys_Role_Info> _collection_role_info;
  23. protected readonly IMongoCollection<Sys_User_Account> _collection_sys_user_account;
  24. protected readonly IMongoCollection<Sys_DictionaryValue> _collection_sys_dictionaryvalue;
  25. protected readonly IMongoCollection<Sys_News> _collection_sys_news;
  26. public DistributionAppChartRepository(IOptions<MongodbOptions> settings,
  27. ILogger<BaseRepository<Pro_Project_Info, string>> logger) : base(settings, logger)
  28. {
  29. _collection_distri_goods_type = _context.GetCollection<Distri_Goods_Type>(); //获取集合
  30. _collection_distri_goods = _context.GetCollection<Distri_Goods>(); //获取集合
  31. _collection_distri_workorder = _context.GetCollection<Distri_Workorder>(); //获取集合
  32. _collection_sys_building = _context.GetCollection<Sys_Building>(); //获取集合
  33. _collection_sys_floor = _context.GetCollection<Sys_Floor>(); //获取集合
  34. _collection_role_info = _context.GetCollection<Sys_Role_Info>();
  35. _collection_sys_user_account = _context.GetCollection<Sys_User_Account>(); //获取集合
  36. _collection_sys_dictionaryvalue = _context.GetCollection<Sys_DictionaryValue>();
  37. _collection_sys_news = _context.GetCollection<Sys_News>();
  38. _logger = logger;
  39. }
  40. /// <summary>
  41. /// 员工运送工作量 - 统计报表
  42. /// </summary>
  43. /// <param name="projectid">项目id</param>
  44. /// <param name="usercode">用户code</param>
  45. /// <param name="stime">开始时间</param>
  46. /// <param name="etime">结束时间</param>
  47. /// <param name="userinfo">用户项目及相关信息</param>
  48. /// <returns></returns>
  49. public object GetWorkOrderCount(string projectid, string stime, string etime, UserAccountInfoModel userinfo)
  50. {
  51. #region 表查询
  52. //用户
  53. var query_user = from user in _collection_sys_user_account.AsQueryable()
  54. join r in _collection_role_info.AsQueryable() on user.role_id equals r.id into roleinfo
  55. where user.delete_flag == false && user.type != 2
  56. select new
  57. {
  58. user.id,
  59. user.head_img,
  60. user.usercode,
  61. user.username,
  62. user.projectlist,
  63. projectid = user.projectlist != null && user.projectlist.Count() > 0 ? user.projectlist.First() : null,
  64. roleid = user.role_id,
  65. rolecode = roleinfo != null && roleinfo.Count() > 0 ? roleinfo.First().role_code : null
  66. };
  67. //科室 - 楼栋
  68. var query_build = from build in _collection_sys_building.AsQueryable()
  69. where build.isdelete == 0 //&& goodstype.parent_id == null
  70. select build;
  71. //科室 - 楼层
  72. var query_floor = from floor in _collection_sys_floor.AsQueryable()
  73. where floor.isdelete == 0
  74. orderby floor.sortnum descending
  75. select floor;
  76. //物品
  77. var query_goods = from goods in _collection_distri_goods.AsQueryable()
  78. where goods.isdelete == 0
  79. select goods;
  80. //配送工单
  81. var query_wo = from wo in _collection_distri_workorder.AsQueryable()
  82. where wo.isdelete == 0
  83. select wo;
  84. #endregion
  85. #region 判断条件
  86. if (!string.IsNullOrEmpty(projectid))
  87. {
  88. query_user = query_user.Where(x => x.projectlist.Contains(projectid));
  89. query_build = query_build.Where(it => it.projectid == projectid);
  90. query_goods = query_goods.Where(it => it.projectid == projectid);
  91. query_wo = query_wo.Where(it => it.projectid == projectid);
  92. }
  93. if (userinfo.isallproject == 0)
  94. {
  95. //query_user = query_user.Where(x => x.projectlist.Contains(projectid));
  96. query_build = query_build.Where(it => userinfo.projectlist.Contains(it.projectid));
  97. query_goods = query_goods.Where(it => userinfo.projectlist.Contains(it.projectid));
  98. query_wo = query_wo.Where(it => userinfo.projectlist.Contains(it.projectid));
  99. }
  100. query_user = query_user.Where(it => it.rolecode == "SSY_DTG" || it.rolecode == "SSY_PSG");
  101. if (!string.IsNullOrEmpty(stime))
  102. query_wo = query_wo.Where(it => it.createtime >= DateTime.Parse(stime + " 00:00:00"));
  103. if (!string.IsNullOrEmpty(etime))
  104. query_wo = query_wo.Where(it => it.createtime <= DateTime.Parse(etime + " 23:59:59"));
  105. #endregion
  106. #region 统计计算
  107. //获取工单统计 - 已配送/未完成
  108. var list_Wo = query_wo.Where(it => (it.wostate == (int)EnumDistributionState.finish || it.wostate == (int)EnumDistributionState.evaluated)).ToList();
  109. int nofinish_num = query_wo.Where(it => (it.wostate < (int)EnumDistributionState.finish || it.wostate == (int)EnumDistributionState.backed)).Count();
  110. int finished_num = list_Wo.Count();
  111. //综合满意度
  112. string evaluate_rate = "";
  113. var list_Evaluate = list_Wo.Where(it => it.starnum > 0);
  114. int evaluate_all = list_Evaluate.Count();
  115. int evaluate = list_Evaluate.Where(x => x.starnum > 3).Count();
  116. if (evaluate_all > 0)
  117. evaluate_rate = Math.Round(((double)evaluate * 100 / evaluate_all), 2) + "";
  118. //各科室(楼层)下单数量
  119. int departmentwonum_all = 0;
  120. //string departmentwonum_rate = "";
  121. var buildids = query_build.Select(x => x.id).ToList();
  122. var list_Floor = query_floor.ToList().Where(x => buildids.Contains(x.buildid)).ToList();
  123. var list_dep = list_Floor.Select(p =>
  124. {
  125. var list_WoItem = list_Wo.Where(x => x.deliverylist.Count > 0 && x.deliverylist.ToList().FirstOrDefault().department_name == p.remark).ToList();
  126. int departmentwonum = list_WoItem.Count();
  127. //departmentwonum_all += departmentwonum;
  128. return new
  129. {
  130. p.id,
  131. p.floorname,
  132. departmentname = p.remark,
  133. departmentwonum,
  134. departmentwonum_rate = ""
  135. };
  136. });
  137. departmentwonum_all = list_dep.Sum(x => x.departmentwonum);
  138. if (departmentwonum_all > 0)
  139. {
  140. list_dep = list_dep.ToList().Select(p =>
  141. {
  142. string dep_rate = Math.Round(((double)p.departmentwonum * 100 / departmentwonum_all), 2) + "";
  143. return new
  144. {
  145. p.id,
  146. p.floorname,
  147. departmentname = p.departmentname,
  148. p.departmentwonum,
  149. departmentwonum_rate = dep_rate
  150. };
  151. }).OrderByDescending(x => x.departmentwonum);
  152. }
  153. //配送物品排行
  154. int goodswonum_all = 0;
  155. var list_good = query_goods.ToList();
  156. var list_goods = list_good.Select(p =>
  157. {
  158. var list_WoItem = list_Wo.Where(x => x.goodslist.Count > 0 && x.goodslist.ToList().FirstOrDefault().goodsid == p.id).ToList();
  159. int goodswonum = list_WoItem.Count();
  160. //goodswonum_all += goodswonum;
  161. return new
  162. {
  163. p.id,
  164. p.goodsname,
  165. goodswonum,
  166. goodswonum_rate = ""
  167. };
  168. });
  169. goodswonum_all = list_goods.Sum(x => x.goodswonum);
  170. if (goodswonum_all > 0)
  171. {
  172. list_goods = list_goods.Select(p =>
  173. {
  174. string goods_rate = Math.Round(((double)p.goodswonum * 100 / goodswonum_all), 2) + "";
  175. return new
  176. {
  177. p.id,
  178. p.goodsname,
  179. p.goodswonum,
  180. goodswonum_rate = goods_rate
  181. };
  182. }).OrderByDescending(p => p.goodswonum);
  183. }
  184. //配送工单量排行
  185. var list_user = query_user.ToList().Select(p =>
  186. {
  187. var list_WoItem = list_Wo.Where(x => (x.wostate == (int)EnumDistributionState.finish || x.wostate == (int)EnumDistributionState.evaluated) && (x.touser.Contains(p.usercode) || x.touser_elevator == p.usercode)).ToList();
  188. int userwonum = list_WoItem.Count();
  189. return new
  190. {
  191. p.id,
  192. p.usercode,
  193. p.username,
  194. p.head_img,
  195. userwonum
  196. };
  197. }).OrderByDescending(p => p.userwonum);
  198. #endregion
  199. var obj = new
  200. {
  201. workordernum = new { nofinish_num, finished_num },
  202. evaluatenum = new { evaluate, evaluate_all, evaluate_rate}, //综合满意度
  203. list_dep = list_dep, //各科室下单数量
  204. list_goods = list_goods, //配送物品排行
  205. list_user = list_user //配送工单量排行
  206. };
  207. return obj;
  208. }
  209. #region 公示系统
  210. /// <summary>
  211. /// 各科室下单数量
  212. /// </summary>
  213. /// <param name="projectid">项目id</param>
  214. /// <param name="usercode">用户code</param>
  215. /// <param name="stime">开始时间</param>
  216. /// <param name="etime">结束时间</param>
  217. /// <param name="userinfo">用户项目及相关信息</param>
  218. /// <returns></returns>
  219. public object GetDepartmentWOCount(string projectid, string stime, string etime, UserAccountInfoModel userinfo)
  220. {
  221. #region 表查询
  222. //科室 - 楼栋
  223. var query_build = from build in _collection_sys_building.AsQueryable()
  224. where build.isdelete == 0 //&& goodstype.parent_id == null
  225. select build;
  226. //科室 - 楼层
  227. var query_floor = from floor in _collection_sys_floor.AsQueryable()
  228. where floor.isdelete == 0
  229. orderby floor.sortnum descending
  230. select floor;
  231. //配送工单
  232. var query_wo = from wo in _collection_distri_workorder.AsQueryable()
  233. where wo.isdelete == 0
  234. select wo;
  235. #endregion
  236. #region 判断条件
  237. if (!string.IsNullOrEmpty(projectid))
  238. {
  239. query_build = query_build.Where(it => it.projectid == projectid);
  240. query_wo = query_wo.Where(it => it.projectid == projectid);
  241. }
  242. if (userinfo.isallproject == 0)
  243. {
  244. query_build = query_build.Where(it => userinfo.projectlist.Contains(it.projectid));
  245. query_wo = query_wo.Where(it => userinfo.projectlist.Contains(it.projectid));
  246. }
  247. if (!string.IsNullOrEmpty(stime))
  248. query_wo = query_wo.Where(it => it.createtime >= DateTime.Parse(stime + " 00:00:00"));
  249. if (!string.IsNullOrEmpty(etime))
  250. query_wo = query_wo.Where(it => it.createtime <= DateTime.Parse(etime + " 23:59:59"));
  251. #endregion
  252. #region 统计计算
  253. //获取工单统计 - 完结
  254. var list_Wo = query_wo.Where(x => x.wostate == (int)EnumDistributionState.finish || x.wostate == (int)EnumDistributionState.evaluated).ToList();
  255. //各科室(楼层)下单数量
  256. int departmentwonum_all = 0;
  257. var buildids = query_build.Select(x => x.id).ToList();
  258. var list_Floor = query_floor.ToList().Where(x => buildids.Contains(x.buildid)).ToList();
  259. var list_dep = list_Floor.Select(p =>
  260. {
  261. var list_WoItem = list_Wo.Where(x => x.deliverylist.Count > 0 && x.deliverylist.ToList().FirstOrDefault().department_name == p.remark).ToList();
  262. int departmentwonum = list_WoItem.Count();
  263. return new
  264. {
  265. p.id,
  266. p.floorname,
  267. departmentname = p.remark,
  268. departmentwonum,
  269. departmentwonum_rate = ""
  270. };
  271. });
  272. departmentwonum_all = list_dep.Sum(x => x.departmentwonum);
  273. if (departmentwonum_all > 0)
  274. {
  275. list_dep = list_dep.ToList().Select(p =>
  276. {
  277. string dep_rate = Math.Round(((double)p.departmentwonum * 100 / departmentwonum_all), 2) + "";
  278. return new
  279. {
  280. p.id,
  281. p.floorname,
  282. departmentname = p.departmentname,
  283. p.departmentwonum,
  284. departmentwonum_rate = dep_rate
  285. };
  286. });
  287. }
  288. #endregion
  289. var obj = new
  290. {
  291. list_dep //配送工单量排行
  292. };
  293. return obj;
  294. }
  295. /// <summary>
  296. /// 配送物品前五
  297. /// </summary>
  298. /// <param name="projectid">项目id</param>
  299. /// <param name="usercode">用户code</param>
  300. /// <param name="stime">开始时间</param>
  301. /// <param name="etime">结束时间</param>
  302. /// <param name="userinfo">用户项目及相关信息</param>
  303. /// <returns></returns>
  304. public object GetGoodsWOCount(string projectid, string stime, string etime, UserAccountInfoModel userinfo)
  305. {
  306. #region 表查询
  307. //物品
  308. var query_goods = from goods in _collection_distri_goods.AsQueryable()
  309. where goods.isdelete == 0
  310. select goods;
  311. //配送工单
  312. var query_wo = from wo in _collection_distri_workorder.AsQueryable()
  313. where wo.isdelete == 0
  314. select wo;
  315. #endregion
  316. #region 判断条件
  317. if (!string.IsNullOrEmpty(projectid))
  318. {
  319. query_goods = query_goods.Where(it => it.projectid == projectid);
  320. query_wo = query_wo.Where(it => it.projectid == projectid);
  321. }
  322. if (userinfo.isallproject == 0)
  323. {
  324. query_goods = query_goods.Where(it => userinfo.projectlist.Contains(it.projectid));
  325. query_wo = query_wo.Where(it => userinfo.projectlist.Contains(it.projectid)); }
  326. if (!string.IsNullOrEmpty(stime))
  327. query_wo = query_wo.Where(it => it.createtime >= DateTime.Parse(stime + " 00:00:00"));
  328. if (!string.IsNullOrEmpty(etime))
  329. query_wo = query_wo.Where(it => it.createtime <= DateTime.Parse(etime + " 23:59:59"));
  330. #endregion
  331. #region 统计计算
  332. //获取工单统计 - 完结
  333. var list_Wo = query_wo.Where(x => x.wostate == (int)EnumDistributionState.finish || x.wostate == (int)EnumDistributionState.evaluated).ToList();
  334. //配送物品排行
  335. int goodswonum_all = 0;
  336. var list_good = query_goods.ToList();
  337. var list_goods = list_good.Select(p =>
  338. {
  339. var list_WoItem = list_Wo.Where(x => x.goodslist.Count > 0 && x.goodslist.ToList().FirstOrDefault().goodsid == p.id).ToList();
  340. int goodswonum = list_WoItem.Count();
  341. return new
  342. {
  343. p.id,
  344. p.goodsname,
  345. goodswonum,
  346. goodswonum_rate = ""
  347. };
  348. });
  349. goodswonum_all = list_goods.Sum(x => x.goodswonum);
  350. if (goodswonum_all > 0)
  351. {
  352. list_goods = list_goods.Select(p =>
  353. {
  354. string goods_rate = Math.Round(((double)p.goodswonum * 100 / goodswonum_all), 2) + "";
  355. return new
  356. {
  357. p.id,
  358. p.goodsname,
  359. p.goodswonum,
  360. goodswonum_rate = goods_rate
  361. };
  362. }).OrderByDescending(p => p.goodswonum);
  363. }
  364. #endregion
  365. var obj = new
  366. {
  367. list_goods //配送物品排行
  368. };
  369. return obj;
  370. }
  371. #endregion
  372. }
  373. }