dispatch_command.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #ifndef __DISPATCH_COMMAND_HH__
  2. #define __DISPATCH_COMMAND_HH__
  3. #include "../tool/singleton.h"
  4. #include "../tool/thread_condition.h"
  5. #include "../error_code/error_code.h"
  6. #include "../dispatch/database_controller.h"
  7. #include "../message/message.pb.h"
  8. #include "../tool/common_data.h"
  9. #include <string>
  10. #include <map>
  11. #include <glog/logging.h>
  12. //调度指令模块, 主要是与数据库的表 command_queue 同步, 然后按照一定的策略
  13. class Dispatch_command
  14. {
  15. public:
  16. #define PARK_TIME_FLAG 101 //存车时间标记, 用于记录时差
  17. #define PICK_TIME_FLAG 102 //取车时间标记, 用于记录时差
  18. //调度指令模块 的状态
  19. enum Dispatch_command_status
  20. {
  21. E_DISPATCH_COMMAND_UNKNOW = 0, //未知
  22. E_DISPATCH_COMMAND_READY = 1, //准备,待机
  23. E_DISPATCH_COMMAND_BUSY = 2, //工作正忙
  24. E_DISPATCH_COMMAND_DISCONNECT = 3, //断连
  25. E_DISPATCH_COMMAND_FAULT = 100, //故障
  26. };
  27. //调度指令, 格式和数据库的 command_queue 保持一致
  28. struct Dispatch_command_info
  29. {
  30. std::string m_car_number; //车牌号
  31. std::string m_primary_key; //唯一码
  32. int m_unit; //单元号, 1~3
  33. int m_queue_id; //排序的id, 从0开始递增
  34. int m_type; //指令类型, 0无效, 1存车, 2取车,
  35. int m_statu; //指令状态, 0排队中, 1正在工作, 2已完成, 3故障异常
  36. std::string m_space_info; //车位信息的DebugString, 默认没有, 存车要根据感测信息的车高去申请车位, 取车根据车牌号找车位
  37. parkspace_info m_parkspace_info_msg; //车位信息的proto格式
  38. std::string m_measure_info; //感测信息的DebugString, 里面自带车高, 小1.5 中1.7 大1.9,
  39. measure_info m_measure_info_msg; //感测信息的proto格式
  40. int m_export_id; //出入口id, 1~6
  41. int m_useless_distance; //空跑的路程,
  42. };
  43. //调度车位信息, 格式和数据库的 space 保持一致
  44. struct Dispatch_space_info
  45. {
  46. int m_id; //车位id
  47. int m_floor; //车位楼层
  48. int m_subID; //层内id
  49. float m_height; //车位高度, 小1.55 中1.75 大2.2,
  50. std::string m_car_number; //车牌号
  51. int m_unit; //单元号, 1~3
  52. int m_statu; //车位状态, 0可用, 1故障
  53. };
  54. //调度车辆信息, 格式和数据库的 vehicle 保持一致
  55. struct Dispatch_vehicle_info
  56. {
  57. std::string m_car_number; //车牌号
  58. std::string m_primary_key; //唯一码
  59. std::string m_actually_measure_info; //感测信息的DebugString, 里面自带车高, 小1.5 中1.7 大1.9,
  60. measure_info m_actually_measure_info_msg; //感测信息的proto格式
  61. };
  62. public:
  63. Dispatch_command();
  64. Dispatch_command(const Dispatch_command& other)= default;
  65. Dispatch_command& operator =(const Dispatch_command& other)= default;
  66. ~Dispatch_command();
  67. public://API functions
  68. //调度开始前, 向数据库发送请求的相关操作, 输入 穿梭机所在的楼层, 调度id 0~2, 空闲出口id, 如果不是0,就表示有空闲的出口
  69. Error_manager dispatch_request_to_sql(int plc_floor, int dispatch_id, int outlet_ready);
  70. //调度完成后, 向数据库发送答复的相关操作
  71. Error_manager dispatch_response_to_sql(Error_manager error);
  72. //调度 , 向数据库 重新分配车位,
  73. Error_manager dispatch_reallocate_to_sql(Common_data::Car_type reallocate_car_type, int outlet_ready);
  74. //检查出口是否空闲, 检查指令队列的取车完成的出口id是否存在, 不存在就是空闲,返回成功
  75. Error_manager check_export_id_is_ready(int export_id);
  76. public://get or set member variable
  77. protected://member functions
  78. //获取调度指令, 与数据库同步 command_queue
  79. Error_manager query_all_dispatch_command();
  80. //对调度指令进行排序, 选出最优解, 比较存车和取车
  81. Error_manager sort_dispatch_command_for_total();
  82. //对调度指令进行排序, 选出最优解, 只比较存车
  83. Error_manager sort_dispatch_command_for_park();
  84. //获取 指定车高 指定单元 的车位信息,用于车位分配, 找不到就会报错,
  85. Error_manager query_specify_height_unit_parkspace_info(int unit, float height, Dispatch_space_info & dispatch_space_info);
  86. //查询空闲车位最优解, 存车指令 根据调度指令最优解 获取 空闲车位最优解
  87. Error_manager query_dispatch_space_optimal();
  88. //查询空闲车位最优解, 存车指令 根据调度指令最优解 获取 空闲车位最优解
  89. Error_manager query_dispatch_space_optimal(Common_data::Car_type reallocate_car_type);
  90. //查询 取车的车位 取车指令 根据车牌号 查询对应的车位
  91. Error_manager query_dispatch_space_for_car_number();
  92. //查询 取车的车辆感测信息 取车指令 根据key 查询感测信息
  93. Error_manager query_dispatch_vehicle_for_primary_key();
  94. //更新 车位状态, 根据车位ID 修改车牌号即可,
  95. Error_manager update_parkspace_info_write_car_number();
  96. //更新 车位状态, 找到车牌号, 写NULL
  97. Error_manager update_parkspace_info_clear_car_number();
  98. //更新 指令队列, 根据车牌号 修改状态即可, //指令状态, 0排队中, 1正在工作, 2已完成, 3故障异常
  99. Error_manager update_command_queue_for_statu(int statu);
  100. //更新 指令队列, 根据车牌号 修改状态即可, //指令状态, 0排队中, 1正在工作, 2已完成, 3故障异常
  101. // Error_manager update_command_queue_for_statu(int statu, std::string error_description);
  102. //更新 指令队列, 根据车牌号 删除指令
  103. Error_manager delete_command_queue_for_statu();
  104. //制作存车表单
  105. Error_manager create_park_table();
  106. //制作取车表单
  107. Error_manager create_pick_table(int outlet_ready);
  108. //增加 车辆表, 存车指令 完成后添加车辆信息
  109. Error_manager insert_vehicle_for_car_number();
  110. //删除 车辆表, 取车指令 完成后删除车辆信息
  111. Error_manager delete_vehicle_for_car_number();
  112. //增加 记录表, 存车指令 完成后添加存车记录
  113. Error_manager insert_record_for_park_start();
  114. //增加 记录表, 存车指令 完成后添加存车记录
  115. Error_manager updata_record_for_park_end();
  116. //更新 记录表, 取车指令 完成后更新取车记录
  117. Error_manager updata_record_for_pick_start();
  118. //更新 记录表, 取车指令 完成后更新取车记录
  119. Error_manager updata_record_for_pick_end();
  120. //更新 记录表, 取车指令 完成后更新取车记录, 撤销指令, 没有取车时间差
  121. Error_manager updata_record_for_pick_end_ex();
  122. //计算汽车在车库的存车时间, 从存车开始到取车结束, 返回 parking_time, 单位秒.
  123. Error_manager get_parking_time(std::string primary_key, int & parking_time );
  124. protected://member variable
  125. public:
  126. Dispatch_command_status m_dispatch_command_status; //调度指令模块 的状态
  127. std::mutex m_lock; // 锁.
  128. int m_dispatch_id; //调度id, 0-2
  129. int m_unit; //单元号
  130. int m_device_floor; //穿梭机所在的楼层, 存车完在对应的车位楼层, 取车完在1楼
  131. int m_outlet_ready; //取车空闲出口id, 0表示没有出口, 1~6表示空闲出口
  132. std::map<std::string, Dispatch_command_info> m_dispatch_command_map; //调度指令map, 数据库的所有信息
  133. std::string m_car_number_optimal; //调度指令最优解
  134. Dispatch_space_info m_dispatch_space_info; //调度车位最优解
  135. Dispatch_vehicle_info m_dispatch_vehicle_info; //调度车位最优解
  136. Common_data::Dispatch_process_type m_dispatch_process_type ; //调度流程类型
  137. park_table m_park_table_msg; //停车表单
  138. pick_table m_pick_table_msg; //取车表单
  139. Common_data::Car_type m_car_type; //车的大小
  140. private:
  141. };
  142. #endif // __DISPATCH_COMMAND_HH__