PriorityAppService.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using Business.Domain;
  2. using Business.ResourceExamineManagement.Dto;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using Volo.Abp.Application.Services;
  6. namespace Business.PriorityManagement
  7. {
  8. /// <summary>
  9. /// 优先级算法
  10. /// </summary>
  11. public class PriorityAppService : ApplicationService
  12. {
  13. /// <summary>
  14. /// 计算订单优先级
  15. /// </summary>
  16. /// <param name="seorders">订单数据</param>
  17. /// <param name="sentrys">订单行数据</param>
  18. /// <returns></returns>
  19. public List<crm_seorder> CalcOrderPriority(List<crm_seorder> seorders, List<crm_seorderentry> sentrys)
  20. {
  21. //数据处理:取主表数据
  22. var dtos = seorders.Select(p=>new PriorityDto {
  23. id = p.Id,
  24. urgent = p.urgent,
  25. level = p.custom_level.GetValueOrDefault()
  26. }).AsQueryable<PriorityDto>().ToList();
  27. //子表数据处理:根据订单id分组取出客户要求交期交期最小的数据
  28. var entrys = from t in sentrys
  29. group t by t.seorder_id into temp
  30. select new
  31. {
  32. id = temp.Key,
  33. plan_date = temp.Min(x => x.plan_date.GetValueOrDefault())
  34. };
  35. foreach (var item in dtos)
  36. {
  37. var entry = entrys.FirstOrDefault(p => p.id == item.id);
  38. if (entry != null)
  39. {
  40. item.plan_date = entry.plan_date;
  41. }
  42. }
  43. //根据紧急级别倒序,客户级别升序,交期升序排序
  44. dtos = dtos.OrderByDescending(p => p.urgent).ThenBy(m => m.level).ThenBy(n => n.plan_date).ToList();
  45. List<crm_seorder> rtnOrders = new List<crm_seorder>();
  46. foreach (var item in dtos)
  47. {
  48. var order = seorders.First(p=>p.Id == item.id);
  49. rtnOrders.Add(order);
  50. }
  51. return rtnOrders;
  52. }
  53. /// <summary>
  54. /// 计算订单行优先级
  55. /// </summary>
  56. /// <param name="seorders">订单数据</param>
  57. /// <param name="sentrys">订单行数据</param>
  58. /// <returns></returns>
  59. public List<crm_seorderentry> CalcOrderEntryPriority(List<crm_seorder> seorders, List<crm_seorderentry> sentrys)
  60. {
  61. //数据处理:取主表数据
  62. var dtos = seorders.Select(p => new PriorityDto
  63. {
  64. id = p.Id,
  65. urgent = p.urgent,
  66. level = p.custom_level.GetValueOrDefault()
  67. }).AsQueryable<PriorityDto>().ToList();
  68. //子表数据处理:根据订单id分组取出客户要求交期交期最小的数据
  69. var entrys = from t in sentrys
  70. group t by t.seorder_id into temp
  71. select new
  72. {
  73. id = temp.Key,
  74. plan_date = temp.Min(x => x.plan_date.GetValueOrDefault())
  75. };
  76. foreach (var item in dtos)
  77. {
  78. var entry = entrys.FirstOrDefault(p => p.id == item.id);
  79. if (entry != null)
  80. {
  81. item.plan_date = entry.plan_date;
  82. }
  83. }
  84. //根据紧急级别倒序,客户级别升序,交期升序排序
  85. dtos = dtos.OrderByDescending(p => p.urgent).ThenBy(m => m.level).ThenBy(n => n.plan_date).ToList();
  86. List<crm_seorderentry> rtnEntrys = new List<crm_seorderentry>();
  87. foreach (var item in dtos)
  88. {
  89. var curEntrys = sentrys.Where(p => p.seorder_id == item.id).ToList();
  90. rtnEntrys.AddRange(curEntrys);
  91. }
  92. return rtnEntrys;
  93. }
  94. }
  95. }