郑州市第一人民医院

Distri_WorkorderRepository.cs 49KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  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. using DistributionApi.Model.Dto;
  13. using DistributionApi.Model;
  14. namespace DistributionApi.Repositories
  15. {
  16. public class Distri_WorkorderRepository : BaseRepository<Distri_Workorder, string>, IDistri_WorkorderRepository
  17. {
  18. protected readonly ILogger<BaseRepository<Distri_Workorder, string>> _logger;
  19. protected readonly IMongoCollection<Distri_Workorder_PlanTask> _collection_distri_workorder_planworkorder;
  20. protected readonly IMongoCollection<Sys_DictionaryValue> _collection_sys_dictionaryvalue;
  21. protected readonly IMongoCollection<Pro_Project_Info> _collection_pro_project_info;
  22. protected readonly IMongoCollection<Distri_Workorder_PlanTask> _collection_distri_workorder_plantask;
  23. protected readonly IMongoCollection<Distri_Workorder_Plan> _collection_distri_workorder_plan;
  24. protected readonly IMongoCollection<Distri_Workorder_Exception> _collection_distri_workorder_exception;
  25. protected readonly IMongoCollection<Distri_Workorder_OffenceRecord> _collection_distri_workorder_offencerecord;
  26. protected readonly IMongoCollection<Distri_Workorder_UpdateRecord> _collection_distri_workorder_updaterecord;
  27. protected readonly IMongoCollection<Sys_ClassGroup> _collection_sys_classgroup;
  28. protected readonly IMongoCollection<Sys_ClassGroup_User_Map> _collection_sys_classgroup_user_map;
  29. protected readonly IMongoCollection<Sys_SystemConfig> _collection_sys_systemconfig;
  30. public Distri_WorkorderRepository(IOptions<MongodbOptions> settings, ILogger<BaseRepository<Distri_Workorder, string>> logger) : base(settings, logger)
  31. {
  32. _collection_distri_workorder_planworkorder = _context.GetCollection<Distri_Workorder_PlanTask>(); //获取集合
  33. _collection_sys_dictionaryvalue = _context.GetCollection<Sys_DictionaryValue>(); //获取集合
  34. _collection_pro_project_info = _context.GetCollection<Pro_Project_Info>(); //获取集合
  35. _collection_distri_workorder_plantask = _context.GetCollection<Distri_Workorder_PlanTask>(); //获取集合
  36. _collection_distri_workorder_plan = _context.GetCollection<Distri_Workorder_Plan>(); //获取集合
  37. _collection_distri_workorder_exception = _context.GetCollection<Distri_Workorder_Exception>(); //获取集合
  38. _collection_distri_workorder_offencerecord = _context.GetCollection<Distri_Workorder_OffenceRecord>(); //获取集合
  39. _collection_distri_workorder_updaterecord = _context.GetCollection<Distri_Workorder_UpdateRecord>(); //获取集合
  40. _collection_sys_classgroup = _context.GetCollection<Sys_ClassGroup>(); //获取集合
  41. _collection_sys_classgroup_user_map = _context.GetCollection<Sys_ClassGroup_User_Map>(); //获取集合
  42. _collection_sys_systemconfig = _context.GetCollection<Sys_SystemConfig>();
  43. _logger = logger;
  44. }
  45. /// <summary>
  46. /// 列表 - Linq 关联查询 分页
  47. /// </summary>
  48. /// <param name="keyword"></param>
  49. /// <param name="stime"></param>
  50. /// <param name="etime"></param>
  51. /// <param name="pageIndex"></param>
  52. /// <param name="pageSize"></param>
  53. /// <param name="recordCount"></param>
  54. /// <returns></returns>
  55. public IEnumerable<object> GetListsByPage(string keyword, string projectid,int wosorts, int wostate, int wxstate, string stime, string etime,string rolecode,string usercode, UserAccountInfoModel userinfo, int pageIndex, int pageSize, out int recordCount)
  56. {
  57. //关联查询
  58. var query =
  59. from goods in _collection.AsQueryable()
  60. join proje in _collection_pro_project_info.AsQueryable() on goods.projectid equals proje.id into proje_Defa
  61. join exception in _collection_distri_workorder_exception.AsQueryable() on goods.id equals exception.woid into exception_Defa
  62. join offencerecord in _collection_distri_workorder_offencerecord.AsQueryable() on goods.id equals offencerecord.woid into offencerecord_Defa
  63. join updaterecord in _collection_distri_workorder_updaterecord.AsQueryable() on goods.id equals updaterecord.woid into updaterecord_Defa
  64. join plan in _collection_distri_workorder_plan.AsQueryable() on goods.planid equals plan.id into plan_Defa
  65. where goods.isdelete == 0
  66. orderby goods.createtime descending
  67. select new
  68. {
  69. goods.id,
  70. goods.wocode,
  71. goods.wosorts,
  72. goods.planid,
  73. goods.channel,
  74. goods.emergencyid,
  75. goods.projectid,
  76. projectname = proje_Defa != null && proje_Defa.Count() > 0 ? proje_Defa.First().project_name : null,
  77. planname = plan_Defa != null && plan_Defa.Count() > 0 ? plan_Defa.First().planname : null,
  78. goods.wostate,
  79. goods.detail,
  80. exceptions = exception_Defa != null && exception_Defa.Count() > 0 ? exception_Defa.First().content : null,
  81. sended = exception_Defa != null && exception_Defa.Count() > 0 ? exception_Defa.First().isback_sended : 0,
  82. goods.goodslist,
  83. goods.receiverlist,
  84. goods.deliverylist,
  85. goods.deliveryname,
  86. goods.deliverytel,
  87. goods.assigtime,
  88. goods.assigtime_elevator,
  89. goods.touser_elevator,
  90. goods.touser,
  91. goods.dealby,
  92. goods.dealtime,
  93. goods.islast,
  94. goods.isoffence,
  95. isaudit_offence = offencerecord_Defa != null && offencerecord_Defa.Count() > 0 ? offencerecord_Defa.First().isaudit : 0,
  96. content_offence = offencerecord_Defa != null && offencerecord_Defa.Count() > 0 ? offencerecord_Defa.First().content : "",
  97. isagree = updaterecord_Defa != null && updaterecord_Defa.Count() > 0 ? updaterecord_Defa.First().isagree : 0,
  98. isupdate = updaterecord_Defa != null && updaterecord_Defa.Count() > 0 ? updaterecord_Defa.First().isupdate : 0,
  99. isupdatetype = updaterecord_Defa != null && updaterecord_Defa.Count() > 0 ? updaterecord_Defa.First().isupdatetype : 0,
  100. goods.isexceptions,
  101. goods.signbypic,
  102. goods.planwopic,
  103. goods.createtby,
  104. goods.createname,
  105. goods.createtime,
  106. goods.isdelete,
  107. goods.apptype
  108. };
  109. #region 查询条件
  110. if (!string.IsNullOrEmpty(keyword))
  111. query = query.Where(it => it.wocode.Contains(keyword) || it.touser.Contains(keyword)); //工单编号
  112. if (!string.IsNullOrEmpty(projectid))
  113. query = query.Where(it => it.projectid == projectid);
  114. if (!string.IsNullOrEmpty(stime))
  115. query = query.Where(it => it.createtime >= Convert.ToDateTime(stime + " 00:00:00"));
  116. if (!string.IsNullOrEmpty(etime))
  117. query = query.Where(it => it.createtime <= Convert.ToDateTime(etime + " 23:59:59"));
  118. //我的工单(已完结/已评价)
  119. if (wostate >= 0)
  120. {
  121. //if (wostate == 44)
  122. // query = query.Where(it => it.wostate == 4 || it.wostate == 9);
  123. //else
  124. query = query.Where(it => it.wostate == wostate);
  125. }
  126. //微信工单状态:1未完成,2待评价,3已评价
  127. if (wxstate >= 0)
  128. {
  129. switch (wxstate)
  130. {
  131. case 1:
  132. query = query.Where(it => it.wostate < (int)EnumDistributionState.finish || it.wostate == (int)EnumDistributionState.backed);
  133. break;
  134. case 2:
  135. query = query.Where(it => it.wostate == (int)EnumDistributionState.finish);
  136. break;
  137. case 3:
  138. query = query.Where(it => it.wostate == (int)EnumDistributionState.evaluated);
  139. break;
  140. }
  141. //只有微信看自己的
  142. if (userinfo.isallproject == 1)
  143. {
  144. query = query.Where(it => (it.createtby.Contains(usercode)));
  145. }
  146. }
  147. if (wosorts >= 0)
  148. query = query.Where(it => it.wosorts == wosorts);
  149. if (userinfo.isallproject == 0) {
  150. query = query.Where(it => userinfo.projectlist.Contains(it.projectid));
  151. //运维员工只能看到自己的工单
  152. if (string.IsNullOrWhiteSpace(rolecode))
  153. {
  154. if (rolecode.Equals("SSY_PSG") || rolecode.Equals("SSY_DTG"))
  155. {
  156. //配送岗 和 电梯岗
  157. query = query.Where(it => it.touser.Contains(usercode) || it.touser_elevator == usercode);
  158. }
  159. }
  160. }
  161. #endregion
  162. //var lists = query.ToList();
  163. recordCount = query.Count();
  164. var list = query.Skip((pageIndex - 1) * pageSize).Take(pageSize);
  165. return list;
  166. }
  167. /// <summary>
  168. /// Linq 关联查询详情
  169. /// </summary>
  170. /// <param name="id"></param>
  171. /// <returns></returns>
  172. public object GetDetails(string id)
  173. {
  174. //关联查询
  175. var query =
  176. from goods in _collection.AsQueryable()
  177. join proje in _collection_pro_project_info.AsQueryable() on goods.projectid equals proje.id into proje_Defa
  178. join exception in _collection_distri_workorder_exception.AsQueryable() on goods.id equals exception.woid into exception_Defa
  179. join offencerecord in _collection_distri_workorder_offencerecord.AsQueryable() on goods.id equals offencerecord.woid into offencerecord_Defa
  180. join updaterecord in _collection_distri_workorder_updaterecord.AsQueryable() on goods.id equals updaterecord.woid into updaterecord_Defa
  181. join plan in _collection_distri_workorder_plan.AsQueryable() on goods.planid equals plan.id into plan_Defa
  182. where goods.isdelete == 0 && goods.id == id
  183. orderby goods.createtime descending
  184. select new
  185. {
  186. goods.id,
  187. goods.wocode,
  188. goods.wosorts,
  189. goods.planid,
  190. goods.channel,
  191. goods.emergencyid,
  192. goods.projectid,
  193. projectname = proje_Defa != null && proje_Defa.Count() > 0 ? proje_Defa.First().project_name : null,
  194. planname = plan_Defa != null && plan_Defa.Count() > 0 ? plan_Defa.First().planname : null,
  195. goods.wostate,
  196. goods.detail,
  197. //exceptions = exception_Defa != null && exception_Defa.Count() > 0 ? exception_Defa.First(x => x.type == 1).content : null,
  198. //sended = exception_Defa != null && exception_Defa.Count() > 0 ? exception_Defa.First().isback_sended : 0,
  199. goods.goodslist,
  200. goods.receiverlist,
  201. goods.deliverylist,
  202. goods.deliveryname,
  203. goods.deliverytel,
  204. goods.assigtime,
  205. goods.assigtime_elevator,
  206. goods.touser,
  207. goods.dealby,
  208. goods.dealtime,
  209. goods.islast,
  210. goods.isoffence,
  211. isaudit_offence = offencerecord_Defa != null && offencerecord_Defa.Count() > 0 ? offencerecord_Defa.First().isaudit : 0,
  212. content_offence = offencerecord_Defa != null && offencerecord_Defa.Count() > 0 ? offencerecord_Defa.First().content : "",
  213. isagree = updaterecord_Defa != null && updaterecord_Defa.Count() > 0 ? updaterecord_Defa.First().isagree : 0,
  214. isupdate = updaterecord_Defa != null && updaterecord_Defa.Count() > 0 ? updaterecord_Defa.First().isupdate : 0,
  215. isupdatetype = updaterecord_Defa != null && updaterecord_Defa.Count() > 0 ? updaterecord_Defa.First().isupdatetype : 0,
  216. goods.isexceptions,
  217. goods.signbypic,
  218. goods.planwopic,
  219. goods.createtby,
  220. goods.createname,
  221. goods.createtime,
  222. goods.isdelete,
  223. goods.apptype
  224. };
  225. var model = query.FirstOrDefault();
  226. if (model != null)
  227. {
  228. return model;
  229. }
  230. return null;
  231. }
  232. /// <summary>
  233. /// 获取累积待配送量最大值
  234. /// </summary>
  235. /// <param name="usercode"></param>
  236. /// <returns></returns>
  237. public int GetLimitMaxCount(string usercode)
  238. {
  239. int n = 0;
  240. // 配送岗 累积待配送量最大值 5个(超过这个数值不能进行抢单)
  241. var model = _collection_sys_systemconfig.Find(p => p.paramcode == "Distribution_MaxNum").FirstOrDefault();
  242. if (model != null)
  243. {
  244. int m = Int32.Parse(model.paramvalue);
  245. if (m != 0)
  246. {
  247. long num = _collection.Count(p => p.touser.Contains(usercode) && p.wosorts == (int)EnumDistributionWoSorts.random && p.wostate == (int)EnumDistributionState.assign && p.isdelete == 0);
  248. if (num >= m) n = Int32.Parse(num.ToString());
  249. }
  250. }
  251. return n;
  252. }
  253. /// <summary>
  254. /// 获取评价规定时间间隔
  255. /// </summary>
  256. /// <returns></returns>
  257. public int GetEvaluateHour()
  258. {
  259. int n = 0;
  260. var model = _collection_sys_systemconfig.Find(p => p.paramcode == "Evaluate_TimeoutNum").FirstOrDefault();
  261. if (model != null)
  262. {
  263. int m = Int32.Parse(model.paramvalue);
  264. if (m > 0)
  265. {
  266. n = m;
  267. }
  268. }
  269. return n;
  270. }
  271. /// <summary>
  272. /// 获取用户当前角色 - 根据排班
  273. /// </summary>
  274. /// <returns></returns>
  275. public string GetUserCodeByClassMap(string usercode)
  276. {
  277. #region 获取用户符合条件的用户
  278. DateTime dtnow = DateTime.Now;
  279. string nowDay = dtnow.ToString("yyyy-MM-dd");
  280. //关联查询
  281. var query =
  282. from user_map in _collection_sys_classgroup_user_map.AsQueryable()
  283. where user_map.isdelete == 0 && user_map.isstatus == 1 && user_map.date == nowDay
  284. orderby user_map.createtime descending
  285. select user_map;
  286. //班别列表
  287. var query_Class = from classgroup in _collection_sys_classgroup.AsQueryable()
  288. where classgroup.isdelete == 0
  289. orderby classgroup.createtime descending
  290. select classgroup;
  291. //获取当天排班列表
  292. var rolecode_ByUserMap = string.Empty; //排班后 角色
  293. var listClassUser = query.ToList();
  294. var listClass = query_Class.ToList();
  295. //var listUser = (await _sys_user_accountrepository.Get(x => x.delete_flag == false && x.lock_flag == false)).ToList();
  296. List<string> listUserCode_ByPlan = new List<string>();
  297. List<string> listUserCode = new List<string>();
  298. foreach (var item in listClassUser)
  299. {
  300. //获取条件 - 日期和班别code
  301. var list_code = new List<string> { }; //班别code
  302. var dayone = item.date;
  303. var list_r = item.classgroupList.ToList();
  304. foreach (var item_r in list_r)
  305. {
  306. if (item_r.roleList != null && item_r.roleList.Count > 0)
  307. {
  308. //角色 - 班别
  309. var mode_r = item_r.roleList.FirstOrDefault(x => x.ischeck == true); // && x.rolecode == rolecode // && x.rolecode == "SSY_PSG"
  310. if (mode_r != null)
  311. {
  312. list_code.Add(item_r.code); //班次list
  313. rolecode_ByUserMap = mode_r.rolecode; //当前角色code
  314. }
  315. }
  316. }
  317. }
  318. #endregion
  319. return rolecode_ByUserMap;
  320. }
  321. #region 所有我的任务工单 - 随机工单 和 计划分送工单 - App
  322. /// <summary>
  323. /// 抢单时效 / 待配送工单滞留时效
  324. /// </summary>
  325. /// <param name="code">编号</param>
  326. /// <returns></returns>
  327. public int GetLimitCount(string code)
  328. {
  329. int m = 0;
  330. //1、配送岗 抢单时效 3分钟(某单子此时间内没人抢,系统强制分配)
  331. var model = _collection_sys_systemconfig.Find(p => p.paramcode == code).FirstOrDefault();
  332. if (model != null)
  333. {
  334. m = Int32.Parse(model.paramvalue);
  335. }
  336. return m;
  337. }
  338. /// <summary>
  339. /// 列表 - Linq 关联查询 分页
  340. /// </summary>
  341. /// <param name="keyword"></param>
  342. /// <param name="stime"></param>
  343. /// <param name="etime"></param>
  344. /// <param name="pageIndex"></param>
  345. /// <param name="pageSize"></param>
  346. /// <param name="recordCount"></param>
  347. /// <returns></returns>
  348. public IEnumerable<Distri_PlanAndOrderDto> GetPlanAndTaskListByPage(string keyword, string projectid, int isfinish,int wosorts, int wostate, string stime, string etime, string rolecode,string usercode, UserAccountInfoModel userinfo, int pageIndex, int pageSize, out int recordCount)
  349. {
  350. //关联查询 - 随机工单和分送工单
  351. var query =
  352. from woder in _collection.AsQueryable()
  353. join proje in _collection_pro_project_info.AsQueryable() on woder.projectid equals proje.id into proje_Defa
  354. join exception in _collection_distri_workorder_exception.AsQueryable() on woder.id equals exception.woid into exception_Defa
  355. where woder.isdelete == 0 //&& woder.wostate <= 2
  356. orderby woder.createtime descending
  357. select new Distri_WorkorderDto
  358. {
  359. id = woder.id,
  360. wocode=woder.wocode,
  361. wosorts = woder.wosorts,
  362. planid=woder.planid,
  363. plantaskid=woder.plantaskid,
  364. emergencyid=woder.emergencyid,
  365. projectid=woder.projectid,
  366. projectname = proje_Defa != null && proje_Defa.Count() > 0 ? proje_Defa.First().project_name : null,
  367. wostate=woder.wostate,
  368. touser=woder.touser,
  369. touser_elevator=woder.touser_elevator,
  370. wostate_elevator=woder.wostate_elevator,
  371. assigtime= woder.assigtime,
  372. assigtime_elevator=woder.assigtime_elevator,
  373. dealtime=woder.dealtime,
  374. goodslist=woder.goodslist,
  375. receiverlist=woder.receiverlist,
  376. deliverylist=woder.deliverylist,
  377. exceptions = exception_Defa != null && exception_Defa.Count() > 0 ? exception_Defa.First().content : null,
  378. sended = exception_Defa != null && exception_Defa.Count() > 0 ? exception_Defa.First().isback_sended : 0,
  379. isoffence=woder.isoffence,
  380. isexceptions=woder.isexceptions,
  381. createtby=woder.createtby,
  382. createtime= woder.createtime,
  383. isdelete= woder.isdelete
  384. //woder.apptype
  385. };
  386. //关联查询 - 计划工单
  387. var query_planorder =
  388. from plan_woder in _collection_distri_workorder_planworkorder.AsQueryable()
  389. join proje in _collection_pro_project_info.AsQueryable() on plan_woder.projectid equals proje.id into proje_Defa
  390. where plan_woder.isdelete == 0 //&& plan_woder.planwostate <= 1
  391. orderby plan_woder.createtime descending
  392. select new Distri_Workorder_TaskDto
  393. {
  394. id=plan_woder.id,
  395. wocode=plan_woder.wocode,
  396. name=plan_woder.name,
  397. planid=plan_woder.planid,
  398. projectid=plan_woder.projectid,
  399. projectname = proje_Defa != null && proje_Defa.Count() > 0 ? proje_Defa.First().project_name : null,
  400. planwostate=plan_woder.planwostate,
  401. statetime=plan_woder.statetime,
  402. dealtime=plan_woder.dealtime,
  403. joinuserlist=plan_woder.joinuserlist,
  404. goodslist=plan_woder.goodslist,
  405. receiverlist=plan_woder.receiverlist,
  406. deliverylist= plan_woder.deliverylist,
  407. createtby=plan_woder.createtby,
  408. createtime=plan_woder.createtime,
  409. isdelete=plan_woder.isdelete
  410. //plan_woder.apptype
  411. };
  412. //班次
  413. var query_classgroup = from classgroup in _collection_sys_classgroup.AsQueryable()
  414. where classgroup.isdelete == 0
  415. select classgroup;
  416. //排班
  417. var query_usermap = from usermap in _collection_sys_classgroup_user_map.AsQueryable()
  418. where usermap.isdelete == 0 && usermap.isstatus == 1
  419. select usermap;
  420. //1、配送岗 抢单时效 3分钟(某单子此时间内没人抢,系统强制分配)
  421. //抢单时效 - 分钟数
  422. int receive_Time = GetLimitCount("ReceiveOrder_Time");
  423. ////累积待配送量最大值
  424. //int limit_Max = GetLimitCount("Distribution_MaxNum");
  425. //待配送工单滞留时效 - 分钟数
  426. int stuck_Time = GetLimitCount("StuckOrder_Time");
  427. List<Distri_PlanAndOrderDto> list = new List<Distri_PlanAndOrderDto>();
  428. #region 查询条件
  429. // 随机工单 / 计划工单
  430. if (!string.IsNullOrEmpty(keyword))
  431. {
  432. query = query.Where(it => it.wocode.Contains(keyword)); //工单
  433. query_planorder = query_planorder.Where(it => it.wocode.Contains(keyword)); //工单
  434. }
  435. if (!string.IsNullOrEmpty(projectid))
  436. {
  437. query = query.Where(it => it.projectid == projectid);
  438. query_planorder = query_planorder.Where(it => it.projectid == projectid);
  439. }
  440. if (userinfo.isallproject == 0)
  441. {
  442. query = query.Where(it => userinfo.projectlist.Contains(it.projectid));
  443. query_planorder = query_planorder.Where(it => userinfo.projectlist.Contains(it.projectid));
  444. }
  445. #region 排班条件
  446. var rolecode_ByUserMap = string.Empty; //排班后 角色
  447. //随机工单
  448. DateTime dtnow = DateTime.Now;
  449. string nowDay = dtnow.ToString("yyyy-MM-dd");
  450. var listClassUser = query_usermap.Where(x => x.date == nowDay).ToList(); //.Where(x=>x.date == nowDay)
  451. var query_result = new List<Distri_WorkorderDto>();
  452. var query_planorder_result = new List<Distri_Workorder_TaskDto>();
  453. //此法写的原因是要查询对应时间段的工单,需要或||拼接 ----------------------------------------------
  454. var query1 = new List<Distri_WorkorderDto>();
  455. var query_planorder1 = new List<Distri_Workorder_TaskDto>();
  456. ////条件拼接(时间段查询) -----------------
  457. var listClass = query_classgroup.ToList();
  458. if (rolecode.Equals("SSY_DTG"))
  459. listClass = query_classgroup.ToList().Where(x => x.iswork == false).ToList();
  460. if (listClass != null && listClass.Count > 0)
  461. {
  462. #region 获取新工单 by 排班/班次 - 电梯岗 -----------------------------------------
  463. //获取新工单
  464. var query_zero = query.Where(x => x.wostate == (int)EnumDistributionState.create).ToList();
  465. var ddd = query_planorder.ToList();
  466. var query_planorder_zero = query_planorder.Where(x => x.planwostate == (int)EnumDistriWorkOrderPlanWOstate.create && x.joinuserlist.Count <= 0).ToList();
  467. var model_ClassUser = listClassUser.FirstOrDefault(x => x.usercode == usercode);
  468. if (model_ClassUser != null)
  469. {
  470. #region 调用条件 - 日期和班别code
  471. //获取条件 - 日期和班别code
  472. var list_code = new List<string> { }; //班别code
  473. var dayone = model_ClassUser.date;
  474. var list_r = model_ClassUser.classgroupList.ToList();
  475. foreach (var item_r in list_r)
  476. {
  477. if (item_r.roleList != null && item_r.roleList.Count > 0)
  478. {
  479. //角色 - 班别
  480. var mode_r = item_r.roleList.FirstOrDefault(x => x.ischeck == true); //rolecode SSY_DTG // && x.rolecode == rolecode
  481. if (mode_r != null)
  482. {
  483. list_code.Add(item_r.code); //班次list
  484. rolecode_ByUserMap = mode_r.rolecode; //当前角色code
  485. }
  486. }
  487. }
  488. if (list_code != null && list_code.Count > 0)
  489. {
  490. listClass = listClass.Where(x => list_code.Contains(x.code)).ToList();
  491. var model_Class = listClass.FirstOrDefault(x => dtnow >= DateTime.Parse(dayone + " " + x.starttime) && dtnow <= DateTime.Parse(dayone + " " + x.endtime));
  492. if (model_Class != null)
  493. {
  494. query1 = query1.Union(query_zero.Where(x => x.createtime >= DateTime.Parse(dayone + " " + model_Class.starttime) && x.createtime <= DateTime.Parse(dayone + " " + model_Class.endtime))).ToList();
  495. query_planorder1 = query_planorder1.Union(query_planorder_zero.Where(x => x.createtime >= DateTime.Parse(dayone + " " + model_Class.starttime) && x.createtime <= DateTime.Parse(dayone + " " + model_Class.endtime))).ToList();
  496. }
  497. //foreach (var item_Class in listClass)
  498. //{
  499. // query1 = query1.Union(query_zero.Where(x => x.createtime >= DateTime.Parse(dayone + " " + item_Class.starttime) && x.createtime <= DateTime.Parse(dayone + " " + item_Class.endtime))).ToList();
  500. // query_planorder1 = query_planorder1.Union(query_planorder_zero.Where(x => x.createtime >= DateTime.Parse(dayone + " " + item_Class.starttime) && x.createtime <= DateTime.Parse(dayone + " " + item_Class.endtime))).ToList();
  501. //}
  502. }
  503. #endregion
  504. }
  505. else
  506. {
  507. //没有打卡或者排班,不让看到新建的随机工单和计划工单
  508. query = query.Where(it => it.touser.Contains(usercode) || it.touser_elevator == usercode); //配送岗 和 电梯岗 修改-------------------
  509. query_planorder = query_planorder.Where(it => it.joinuserlist.Contains(usercode));
  510. }
  511. #endregion
  512. }
  513. #endregion
  514. if (isfinish >= -1)
  515. {
  516. //isfinish 1未完成(任务中心),2已完成(我的工单)
  517. if (isfinish == 1)
  518. {
  519. if (rolecode_ByUserMap.Equals("SSY_DTG"))
  520. {
  521. //我的未完成工单 - App任务中心
  522. query = query.Where(it => it.wostate <= 2 && it.wostate_elevator <= 1); //修改--------------------- 配送状态必须为未完成 it.wostate <= 2 ||
  523. }
  524. else
  525. {
  526. //我的未完成工单 - App任务中心
  527. query = query.Where(it => it.wostate <= 2);
  528. }
  529. query_planorder = query_planorder.Where(it => it.planwostate <= 1);
  530. }
  531. else {
  532. if (rolecode_ByUserMap.Equals("SSY_DTG"))
  533. {
  534. //我的已完成工单 - App工单管理
  535. query = query.Where(it => it.wostate == 3 || it.wostate == 4 || it.wostate == 9 || it.wostate_elevator == 2); //修改---------------------
  536. }
  537. else
  538. {
  539. //我的已完成工单 - App工单管理
  540. query = query.Where(it => it.wostate == 4 || it.wostate == 9);
  541. }
  542. query_planorder = query_planorder.Where(it => it.planwostate == 2);
  543. }
  544. }
  545. if (wostate >= 0)
  546. {
  547. if (rolecode_ByUserMap.Equals("SSY_PSG"))
  548. {
  549. if (wostate == 0)
  550. {
  551. query1 = query1.Where(x => x.wostate == 0).ToList();
  552. query = query.Where(it => it.wostate == wostate);
  553. }
  554. else
  555. {
  556. query1 = query1.Where(x => x.wostate == wostate).ToList();
  557. query = query.Where(it => it.wostate == wostate);
  558. }
  559. }
  560. else if (rolecode_ByUserMap.Equals("SSY_DTG"))
  561. {
  562. //配送接单人为此用户时,视为配送任务-------------
  563. //电梯接单人为此用户时,视为电梯任务-------------
  564. //query = query.Where(it => ((it.touser.Contains(usercode) && it.wostate == wostate) || (it.touser_elevator == usercode && it.wostate_elevator == wostate)));
  565. //query = query.Where(it => (it.wostate == wostate || it.wostate_elevator == wostate));
  566. if (wostate == 0)
  567. query1 = query1.Where(x => x.wostate == 0).ToList();
  568. else
  569. query = query.Where(it => ((it.wostate_elevator == (int)EnumDistributionState_elevator.delivery) && it.wostate == wostate) || (it.wostate_elevator <= (int)EnumDistributionState_elevator.accept && it.wostate_elevator == wostate));
  570. }
  571. else
  572. query = query.Where(it => it.wostate == wostate);
  573. //新创建和开始的计划工单,都要展示再 0新任务 中
  574. if (wostate == 0)
  575. {
  576. query_planorder1 = query_planorder1.Where(x => x.planwostate == (int)EnumDistriWorkOrderPlanWOstate.create || x.planwostate == (int)EnumDistriWorkOrderPlanWOstate.start).ToList();
  577. query_planorder = query_planorder.Where(it => it.planwostate == (int)EnumDistriWorkOrderPlanWOstate.create || it.planwostate == (int)EnumDistriWorkOrderPlanWOstate.start);
  578. }
  579. else
  580. {
  581. query_planorder1 = query_planorder1.Where(x => x.planwostate == (int)EnumDistriWorkOrderPlanWOstate.finish).ToList();
  582. query_planorder = query_planorder.Where(it => it.planwostate == (int)EnumDistriWorkOrderPlanWOstate.finish);
  583. }
  584. }
  585. if (!string.IsNullOrEmpty(stime))
  586. {
  587. query = query.Where(it => it.createtime >= Convert.ToDateTime(stime + " 00:00:00"));
  588. query_planorder = query_planorder.Where(it => it.createtime >= Convert.ToDateTime(stime + " 00:00:00"));
  589. }
  590. if (!string.IsNullOrEmpty(etime))
  591. {
  592. query = query.Where(it => it.createtime <= Convert.ToDateTime(etime + " 23:59:59"));
  593. query_planorder = query_planorder.Where(it => it.createtime <= Convert.ToDateTime(etime + " 23:59:59"));
  594. }
  595. bool isUnion = true;
  596. //query = query.Where(x => x.wostate > (int)EnumDistributionState.create);
  597. //电梯岗,配送岗看到自己的工单
  598. if (rolecode_ByUserMap.Equals("SSY_PSG"))
  599. {
  600. query = query.Where(it => (it.touser.Contains(usercode))); //配送岗 和 电梯岗 ,新创建工单 || it.wostate == (int)EnumDistributionState.create
  601. query_planorder = query_planorder.Where(it => it.joinuserlist.Contains(usercode));
  602. }
  603. else if (rolecode_ByUserMap.Equals("SSY_DTG"))
  604. {
  605. query = query.Where(it => it.touser.Contains(usercode) || it.touser_elevator == usercode); //配送岗 和 电梯岗 修改-------------------
  606. query_planorder = query_planorder.Where(it => it.joinuserlist.Contains(usercode));
  607. }
  608. else
  609. {
  610. //未完成,主管等其他用户不让看(看自己的一般没有信息)
  611. if (isfinish == 1)
  612. {
  613. isUnion = false;
  614. query = query.Where(it => it.wosorts == (int)EnumDistributionWoSorts.random && it.wostate == (int)EnumDistributionState.create); //主管和其他高级角色 看到随机,新建工单 - 转派
  615. query_planorder = query_planorder.Where(it => it.joinuserlist.Contains(usercode)); //加条件就是不让其他角色看到
  616. }
  617. }
  618. if (isUnion)
  619. {
  620. query_result = (query.Where(x => x.wostate > (int)EnumDistributionState.create).ToList()
  621. .Union(query1)).ToList(); //配送岗 和 电梯岗 ,新创建工单
  622. query_planorder_result = (query_planorder.Where(x => (x.planwostate > (int)EnumDistributionState.create) || (x.planwostate == (int)EnumDistributionState.create && x.joinuserlist != null && x.joinuserlist.Count > 0)).ToList()
  623. .Union(query_planorder1)).ToList(); //新计划工单 和 已接单和已开始
  624. //query_planorder_result = (query_planorder.Where(x => x.planwostate > (int)EnumDistributionState.create).ToList()
  625. // .Union(query_planorder1)).ToList(); //配送岗 和 电梯岗 ,新创建工单
  626. }
  627. else
  628. {
  629. query_result = query.ToList();
  630. query_planorder_result = query_planorder.ToList();
  631. }
  632. #endregion
  633. foreach (var item in query_result)
  634. {
  635. //剩余时间
  636. double timeout_receive_Seconds = 0;
  637. double timeout_Seconds = 0;
  638. //抢单倒计时剩余时间(秒)
  639. if (item.wostate == (int)EnumDistributionState.create)
  640. {
  641. //抢单
  642. var receivetime = item.createtime.AddMinutes(receive_Time);
  643. TimeSpan ts_re = receivetime.Subtract(dtnow);
  644. timeout_receive_Seconds = ts_re.TotalSeconds > 0 ? ts_re.TotalSeconds : 0;
  645. }
  646. //违规倒计时剩余时间(分钟)
  647. if (item.wostate > (int)EnumDistributionState.create && item.wostate < (int)EnumDistributionState.finish)
  648. {
  649. //配送
  650. var stucktime = item.assigtime.AddMinutes(stuck_Time);
  651. TimeSpan ts = stucktime.Subtract(dtnow);
  652. timeout_Seconds = ts.TotalSeconds > 0 ? ts.TotalSeconds : 0;
  653. }
  654. var model = new Distri_PlanAndOrderDto();
  655. model.id = item.id;
  656. model.planid = item.planid;
  657. model.plantaskid = item.plantaskid;
  658. model.wocode = item.wocode;
  659. model.emergencyid = item.emergencyid;
  660. model.projectid = item.projectid;
  661. model.planname = "";
  662. model.planandorder_state = item.wostate;
  663. model.wostate_elevator = item.wostate_elevator;
  664. model.wosorts = item.wosorts; //(int)EnumDistributionWoSorts.random; 包含随机工单,分送工单
  665. model.touser = item.touser;
  666. model.assigtime = item.assigtime;
  667. model.dealtime = item.dealtime;
  668. model.receiverlist = item.receiverlist;
  669. model.deliverylist = item.deliverylist;
  670. #region 生成物品信息 - 主要是设置剩余数值
  671. List<DistributionGoodsListByTask> list_task = new List<DistributionGoodsListByTask>();
  672. foreach (var item_wo in item.goodslist)
  673. {
  674. var model_task = new DistributionGoodsListByTask();
  675. model_task.goodsid = item_wo.goodsid;
  676. model_task.goodsname = item_wo.goodsname;
  677. model_task.typeid = item_wo.typeid;
  678. model_task.isremind = item_wo.isremind;
  679. model_task.remark = item_wo.remark;
  680. model_task.num = item_wo.num;
  681. model_task.usednum = 0; //使用数量 - 主要是设置剩余数值,为了统一计划工单
  682. list_task.Add(model_task);
  683. }
  684. #endregion
  685. model.goodslist = list_task; //item.goodslist
  686. model.sended = item.sended;
  687. model.isoffence = item.isoffence;
  688. model.isexceptions = item.isexceptions;
  689. model.exceptions = item.exceptions;
  690. model.timeout = (int)timeout_Seconds;
  691. model.timeout_receive = (int)timeout_receive_Seconds;
  692. model.createtby = item.createtby;
  693. model.createtime = item.createtime;
  694. list.Add(model);
  695. }
  696. //计划工单
  697. foreach (var item_plan in query_planorder_result)
  698. {
  699. var model = new Distri_PlanAndOrderDto();
  700. model.id = item_plan.id;
  701. model.planid = item_plan.planid;
  702. model.plantaskid = item_plan.id;
  703. model.wocode = item_plan.wocode;
  704. //model.emergencyid = item.emergencyid; //默认为0
  705. model.projectid = item_plan.projectid;
  706. model.planname = item_plan.name;
  707. model.planandorder_state = item_plan.planwostate; // item_plan.planwostate == 1 ? 0 : (int)EnumDistriWorkOrderPlanWOstate.create;
  708. model.wostate_elevator = 9;
  709. model.wosorts = (int)EnumDistributionWoSorts.plantask;
  710. model.touser = item_plan.joinuserlist;
  711. model.assigtime = item_plan.statetime;
  712. model.dealtime = item_plan.dealtime;
  713. model.receiverlist = item_plan.receiverlist;
  714. model.deliverylist = item_plan.deliverylist;
  715. model.goodslist = item_plan.goodslist;
  716. model.sended = 0;
  717. model.isoffence = 0;
  718. model.isexceptions = 0;
  719. model.exceptions = "";
  720. model.timeout = 0;
  721. model.timeout_receive = 0;
  722. model.createtby = item_plan.createtby;
  723. model.createtime = item_plan.createtime;
  724. list.Add(model);
  725. }
  726. //查询条件
  727. if (wosorts > 0)
  728. list = list.Where(it => it.wosorts == wosorts).ToList(); //已完成工单中之展示随机工单,分送工单在计划工单详情中展示
  729. recordCount = list.Count();
  730. var lists = list.OrderByDescending(x=>x.createtime).Skip((pageIndex - 1) * pageSize).Take(pageSize);
  731. return lists;
  732. }
  733. /// <summary>
  734. /// 违规工单列表分页 - 随机工单 - Linq 关联查询 分页
  735. /// </summary>
  736. /// <param name="keyword"></param>
  737. /// <param name="stime"></param>
  738. /// <param name="etime"></param>
  739. /// <param name="pageIndex"></param>
  740. /// <param name="pageSize"></param>
  741. /// <param name="recordCount"></param>
  742. /// <returns></returns>
  743. public IEnumerable<object> GetOffenceWOListByPageAsync(string keyword, string projectid, string stime, string etime, string rolecode, string usercode, UserAccountInfoModel userinfo,int isappeal, int pageIndex, int pageSize, out int recordCount)
  744. {
  745. //关联查询
  746. var query =
  747. from woder in _collection.AsQueryable()
  748. join proje in _collection_pro_project_info.AsQueryable() on woder.projectid equals proje.id into proje_Defa
  749. join offencerecord in _collection_distri_workorder_offencerecord.AsQueryable() on woder.id equals offencerecord.woid into offencerecord_Defa
  750. where woder.isdelete == 0 && (woder.isoffence == 1 || woder.isexceptions == 1)
  751. orderby woder.createtime descending
  752. select new
  753. {
  754. id = woder.id,
  755. wocode = woder.wocode,
  756. planid = woder.planid,
  757. plantaskid = woder.plantaskid,
  758. emergencyid = woder.emergencyid,
  759. projectid = woder.projectid,
  760. projectname = proje_Defa != null && proje_Defa.Count() > 0 ? proje_Defa.First().project_name : null,
  761. wostate = woder.wostate,
  762. wosorts = woder.wosorts,
  763. touser = woder.touser,
  764. touser_elevator = woder.touser_elevator,
  765. wostate_elevator = woder.wostate_elevator,
  766. assigtime = woder.assigtime,
  767. assigtime_elevator = woder.assigtime_elevator,
  768. dealtime = woder.dealtime,
  769. goodslist = woder.goodslist,
  770. receiverlist = woder.receiverlist,
  771. deliverylist = woder.deliverylist,
  772. isoffence = woder.isoffence,
  773. isappeal = offencerecord_Defa != null && offencerecord_Defa.Count() > 0 ? 1 : 0, //是否申诉(0没有申诉 1已申诉)
  774. isaudit_offence = offencerecord_Defa != null && offencerecord_Defa.Count() > 0 ? offencerecord_Defa.First().isaudit : 0, //是否审核 0无操作 1不通过 2通过
  775. content_offence = offencerecord_Defa != null && offencerecord_Defa.Count() > 0 ? offencerecord_Defa.First().content : "",
  776. content_rejectreason = offencerecord_Defa != null && offencerecord_Defa.Count() > 0 ? offencerecord_Defa.First().content_rejectreason : "",
  777. isexceptions = woder.isexceptions,
  778. createtime = woder.createtime,
  779. createtby = woder.createtby,
  780. isdelete = woder.isdelete
  781. };
  782. #region 查询条件
  783. if (!string.IsNullOrEmpty(keyword))
  784. query = query.Where(it => it.wocode.Contains(keyword)); //工单编号
  785. if (!string.IsNullOrEmpty(projectid))
  786. query = query.Where(it => it.projectid == projectid);
  787. if (!string.IsNullOrEmpty(stime))
  788. query = query.Where(it => it.createtime >= Convert.ToDateTime(stime + " 00:00:00"));
  789. if (!string.IsNullOrEmpty(etime))
  790. query = query.Where(it => it.createtime <= Convert.ToDateTime(etime + " 23:59:59"));
  791. if (userinfo.isallproject == 0)
  792. {
  793. query = query.Where(it => userinfo.projectlist.Contains(it.projectid));
  794. }
  795. //已申诉,异常
  796. query = query.Where(it => it.isappeal == 1 || it.isexceptions == 1);
  797. #endregion
  798. var lists = query.ToList();
  799. recordCount = lists.Count();
  800. var list = lists.Skip((pageIndex - 1) * pageSize).Take(pageSize);
  801. return list;
  802. #region 注释
  803. ////关联查询
  804. //var query =
  805. // from offencerecord in _collection_distri_workorder_offencerecord.AsQueryable()
  806. // join goods in _collection.AsQueryable() on offencerecord.woid equals goods.id into goods_Defa
  807. // where offencerecord.isdelete == 0
  808. // orderby offencerecord.createtime descending
  809. // select new
  810. // {
  811. // offencerecord.id, //违规表id
  812. // woid = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().id : null,
  813. // wocode = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().wocode : null,
  814. // channel = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().channel : 0,
  815. // emergencyid = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().emergencyid : 0,
  816. // projectid = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().projectid : null,
  817. // wostate = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().wostate : 0,
  818. // wostate_elevator = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().wostate_elevator : 0,
  819. // goodslist = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().goodslist : null,
  820. // receiverlist = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().receiverlist : null,
  821. // deliverylist = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().deliverylist : null,
  822. // touser_elevator = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().touser_elevator : null,
  823. // touser = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().touser : null,
  824. // dealby = goods_Defa != null && goods_Defa.Count() > 0 ? goods_Defa.First().dealby : null,
  825. // offencerecord.isaudit,
  826. // offencerecord.content,
  827. // offencerecord.content_rejectreason,
  828. // offencerecord.createby,
  829. // offencerecord.createtime,
  830. // offencerecord.isdelete,
  831. // };
  832. //#region 查询条件
  833. //if (!string.IsNullOrEmpty(keyword))
  834. // query = query.Where(it => it.wocode.Contains(keyword)); //工单编号
  835. //if (!string.IsNullOrEmpty(projectid))
  836. // query = query.Where(it => it.projectid == projectid);
  837. //if (!string.IsNullOrEmpty(stime))
  838. // query = query.Where(it => it.createtime >= Convert.ToDateTime(stime + " 00:00:00"));
  839. //if (!string.IsNullOrEmpty(etime))
  840. // query = query.Where(it => it.createtime <= Convert.ToDateTime(etime + " 23:59:59"));
  841. //if (userinfo.isallproject == 0)
  842. //{
  843. // query = query.Where(it => userinfo.projectlist.Contains(it.projectid));
  844. //}
  845. //#endregion
  846. //var lists = query.ToList();
  847. //recordCount = lists.Count();
  848. //var list = lists.Skip((pageIndex - 1) * pageSize).Take(pageSize);
  849. //return list;
  850. #endregion
  851. }
  852. #endregion
  853. }
  854. }