c_flight.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // 管理航班
  2. const db_air = require('../database/d_air')
  3. const db_area = require('../database/d_area')
  4. const handle = require('../until/handle')
  5. const field = require('../maps/field')
  6. const codeMap = require('../maps/rcodeMap')
  7. const str_action = require('../until/string_action')
  8. let offsetTime = 7 * 24 * 60 * 60;
  9. /**
  10. * 用户查询指定出发时间的航班
  11. * @param departureCity 出发城市
  12. * @param targetCity 目标城市
  13. * @param flightState 航线类型
  14. * @param startUnixTime 起飞时间开始
  15. * @param endUnixTime 起飞时间结束
  16. * @returns {Promise<*>}
  17. */
  18. async function searchFlight(departureCity,targetCity,flightState,startUnixTime,endUnixTime){
  19. let [err,result] = await handle(db_air.flightSearch(...arguments));
  20. if(err){throw err}
  21. return result;
  22. }
  23. /**
  24. * 航班列表,所有航班列表
  25. * @param routeType 航班类型
  26. * @returns {Promise<*>}
  27. */
  28. async function flightList(routeType){
  29. let [err,result] = await handle(db_air.flightList(routeType));
  30. if(err){throw err}
  31. return result;
  32. }
  33. /**
  34. * 航班具体信息,用来给用户直接查看航班
  35. * @param flightId
  36. * @returns {Promise<void>}
  37. */
  38. async function flightInfo(flightId){
  39. let [err,result] = await handle(db_air.flightInfo(flightId));
  40. if(err){throw err}
  41. if(!result.length){
  42. throw {rcode:codeMap.notFound,msg:'无法找到航班'}
  43. }
  44. let flight = result[0];
  45. flight.maxTotalVotes = parseInt(flight.col) * parseInt(flight.row);
  46. // 查找已经售出数量
  47. [err,result] = await handle(db_air.flightOrder(flightId));
  48. if(err){throw err}
  49. let sold = result.reduce((acc,val)=>{
  50. // 查看是否有部分退票
  51. let ticketNum = parseInt(val.ticketNum);
  52. let refundTick = 0;
  53. if(val.refundTick){
  54. refundTick = val.refundTick.split(',').length;
  55. }
  56. return acc+(ticketNum - refundTick)
  57. },0)
  58. flight.pay = sold;
  59. return flight;
  60. }
  61. async function searchFlights(state,options,page,limie){
  62. console.log(options);
  63. let searchItems = {
  64. departureCity:options.departureCity,
  65. targetCity:options.targetCity,
  66. startTime:options.startTime?(options.startTime-0)/1000:((new Date().getTime()-0)/1000),
  67. endTime:options.endTime?(options.endTime-0)/1000:((new Date().getTime()-0)/1000)+offsetTime,
  68. flightState: state,
  69. routeType: options.routeType,
  70. isLate: options.isLate,
  71. startPrice: options.startPrice,
  72. endPrice: options.endPrice,
  73. }
  74. let [err,result] = await handle(db_air.searchFlights(searchItems));
  75. if(err){throw err}
  76. console.log(result)
  77. return result;
  78. }
  79. /**
  80. * 新增航班
  81. * @param flightName 航班代号
  82. * @param airCode 飞机代号
  83. * @param originalPrice 原始价格
  84. * @param currentPrice 当前价格
  85. * @param sailingTime 出发时间
  86. * @param langdinTime 落地时间
  87. * @param totalVotes 票数量
  88. * @param departureCity 出发城市id
  89. * @param targetCity 目标城市id
  90. * @returns {Promise<*>}
  91. */
  92. async function addFlight(
  93. flightName,airId,
  94. originalPrice,currentPrice,
  95. sailingTime,langdinTime,
  96. totalVotes,departureCity,targetCity){
  97. let err,result,departCityType,targetCityType,routerType;
  98. // 检查参数
  99. if(!flightName||!airId||!originalPrice||!currentPrice||!sailingTime||!langdinTime||!totalVotes||!departureCity||!targetCity){
  100. throw {rcode:codeMap.notParam,msg:``}
  101. }
  102. // 判断时间是否合法
  103. if(sailingTime >= langdinTime){
  104. throw {rcode:codeMap.customError,msg:`出发时间晚于到站时间`}
  105. }
  106. // 获取城市类型
  107. [err,departCityType] = await handle(db_area.cityType(departureCity));
  108. [err,targetCityType] = await handle(db_area.cityType(targetCity));
  109. if(!departCityType.length||!targetCityType.length){
  110. console.log('------error------')
  111. console.log(departCityType);
  112. console.log(targetCityType);
  113. throw {rcode:codeMap.customError,msg:`未知的起始城市`}
  114. }
  115. departCityType = departCityType[0].cityType;
  116. targetCityType = targetCityType[0].cityType;
  117. if(departCityType==field.cityType_domestic&&targetCityType==field.cityType_domestic){
  118. routerType=field.routeType_domestic;
  119. }else{
  120. routerType=field.routeType_international;
  121. }
  122. if(err){throw err}
  123. [err,result] = await handle(db_air.addFlight(
  124. flightName,
  125. airId,
  126. originalPrice,
  127. currentPrice,
  128. sailingTime,
  129. langdinTime,
  130. totalVotes,
  131. routerType,
  132. departureCity,
  133. targetCity
  134. ));
  135. if(err){throw err}
  136. return result;
  137. }
  138. /**
  139. * 修改航班信息
  140. * @param flightId
  141. * @param updateOption
  142. * @returns {Promise<void>}
  143. */
  144. async function updateFlight(flightId,updateOption){
  145. let err,result,departCityType,targetCityType,routerType;
  146. let updateOptions = {}
  147. console.log(flightId);
  148. console.log(updateOption);
  149. // 如果修改了城市,那么直接修改对应的航班类型
  150. if(updateOption.departureCity){
  151. [err,departCityType] = await handle(db_area.cityType(updateOption.departureCity));
  152. if(err) throw err;
  153. departCityType = departCityType[0].cityType;
  154. if(departCityType){
  155. // 判断是否为国内城市
  156. if(departCityType==field.cityType_international){
  157. routerType = field.routeType_international;
  158. }
  159. }
  160. }
  161. if(updateOption.targetCity){
  162. [err,targetCityType] = await handle(db_area.cityType(updateOption.departureCity));
  163. if(err) throw err;
  164. targetCityType = targetCityType[0].cityType;
  165. if(targetCityType) {
  166. // 判断是否为国内城市
  167. if (targetCityType == field.cityType_international) {
  168. routerType = field.routeType_international;
  169. }
  170. }
  171. }
  172. if(routerType){
  173. updateOptions.routeType = routerType;
  174. }
  175. updateOptions.flightName = updateOption.flightName;
  176. updateOptions.airId = updateOption.airId;
  177. updateOptions.originalPrice = updateOption.originalPrice;
  178. updateOptions.currentPrice = updateOption.currentPrice;
  179. updateOptions.sailingTime = updateOption.sailingTime;
  180. updateOptions.langdinTime = updateOption.langdinTime;
  181. updateOptions.totalVotes = updateOption.totalVotes;
  182. updateOptions.departureCity = updateOption.departureCity;
  183. updateOptions.targetCity = updateOption.targetCity;
  184. updateOptions.flightState = updateOption.flightState;
  185. [err,result] = await handle(db_air.updateFlight(flightId,updateOptions));
  186. if(err) throw err;
  187. return result
  188. }
  189. /**
  190. * 航班相关新闻
  191. * @param nums 每种类型的数量
  192. * @returns {Promise<void>}
  193. */
  194. async function news(nums){
  195. let result = {},sellFlights,wicketFlights;
  196. [err,wicketFlights] = await handle(db_air.wicketFlights(nums));
  197. if(err){throw err}
  198. [err,sellFlights] = await handle(db_air.sellFlights(nums));
  199. if(err){throw err}
  200. result.sellFlights = sellFlights;
  201. result.wicketFlights = wicketFlights;
  202. return result;
  203. }
  204. /**
  205. * 新增飞机
  206. * @param airCode
  207. * @param row
  208. * @param col
  209. * @returns {Promise<*>}
  210. */
  211. async function addAir(airCode,row,col){
  212. let [err,result] = await handle(db_air.addAir(airCode,row,col));
  213. if(err){throw err}
  214. return result;
  215. }
  216. /**
  217. * 飞机列表
  218. * @param state
  219. * @returns {Promise<*>}
  220. */
  221. async function airs(state){
  222. let [err,result] = await handle(db_air.airs(state));
  223. if(err){throw err}
  224. return result;
  225. }
  226. async function updateAir(airId,updateParam){
  227. let param = {
  228. airCode:updateParam.airCode,
  229. col:updateParam.col,
  230. row:updateParam.row,
  231. }
  232. let [err,result] = await handle(db_air.updateAir(airId,param));
  233. if(err){throw err}
  234. return result;
  235. }
  236. module.exports = {
  237. searchFlight,
  238. flightList,
  239. addFlight,
  240. updateFlight,
  241. flightInfo,
  242. news,
  243. searchFlights,
  244. addAir,
  245. airs,
  246. updateAir
  247. }