c_flight.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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. /**
  62. * 获取航班的座位信息
  63. * @param flightId
  64. * @returns {Promise<void>}
  65. */
  66. async function seatInfo(flightId){
  67. let err,flight,air,seat = {};
  68. [err,flight] = await handle(flightInfo(flightId));
  69. if(err){throw err}
  70. // 获取飞机信息
  71. [err,air] = await handle(airInfo(flight.airId));
  72. // 显示座位情况
  73. seat.row = air.row;
  74. seat.col = air.col;
  75. // 获取已经选坐的列表
  76. }
  77. async function searchFlights(state,options,page,limie){
  78. console.log(options);
  79. let searchItems = {
  80. departureCity:options.departureCity,
  81. targetCity:options.targetCity,
  82. startTime:options.startTime?(options.startTime-0)/1000:((new Date().getTime()-0)/1000),
  83. endTime:options.endTime?(options.endTime-0)/1000:((new Date().getTime()-0)/1000)+offsetTime,
  84. flightState: state,
  85. routeType: options.routeType,
  86. isLate: options.isLate,
  87. startPrice: options.startPrice,
  88. endPrice: options.endPrice,
  89. }
  90. let [err,result] = await handle(db_air.searchFlights(searchItems));
  91. if(err){throw err}
  92. console.log(result)
  93. return result;
  94. }
  95. /**
  96. * 新增航班
  97. * @param flightName 航班代号
  98. * @param airCode 飞机代号
  99. * @param originalPrice 原始价格
  100. * @param currentPrice 当前价格
  101. * @param sailingTime 出发时间
  102. * @param langdinTime 落地时间
  103. * @param totalVotes 票数量
  104. * @param departureCity 出发城市id
  105. * @param targetCity 目标城市id
  106. * @returns {Promise<*>}
  107. */
  108. async function addFlight(
  109. flightName,airId,
  110. originalPrice,currentPrice,
  111. sailingTime,langdinTime,
  112. totalVotes,departureCity,targetCity){
  113. let err,result,departCityType,targetCityType,routerType;
  114. // 检查参数
  115. if(!flightName||!airId||!originalPrice||!currentPrice||!sailingTime||!langdinTime||!totalVotes||!departureCity||!targetCity){
  116. throw {rcode:codeMap.notParam,msg:``}
  117. }
  118. // 判断时间是否合法
  119. if(sailingTime >= langdinTime){
  120. throw {rcode:codeMap.customError,msg:`出发时间晚于到站时间`}
  121. }
  122. // 获取城市类型
  123. [err,departCityType] = await handle(db_area.cityType(departureCity));
  124. [err,targetCityType] = await handle(db_area.cityType(targetCity));
  125. if(!departCityType.length||!targetCityType.length){
  126. console.log('------error------')
  127. console.log(departCityType);
  128. console.log(targetCityType);
  129. throw {rcode:codeMap.customError,msg:`未知的起始城市`}
  130. }
  131. departCityType = departCityType[0].cityType;
  132. targetCityType = targetCityType[0].cityType;
  133. if(departCityType==field.cityType_domestic&&targetCityType==field.cityType_domestic){
  134. routerType=field.routeType_domestic;
  135. }else{
  136. routerType=field.routeType_international;
  137. }
  138. if(err){throw err}
  139. [err,result] = await handle(db_air.addFlight(
  140. flightName,
  141. airId,
  142. originalPrice,
  143. currentPrice,
  144. sailingTime,
  145. langdinTime,
  146. totalVotes,
  147. routerType,
  148. departureCity,
  149. targetCity
  150. ));
  151. if(err){throw err}
  152. return result;
  153. }
  154. /**
  155. * 修改航班信息
  156. * @param flightId
  157. * @param updateOption
  158. * @returns {Promise<void>}
  159. */
  160. async function updateFlight(flightId,updateOption){
  161. let err,result,departCityType,targetCityType,routerType;
  162. let updateOptions = {}
  163. console.log(flightId);
  164. console.log(updateOption);
  165. // 如果修改了城市,那么直接修改对应的航班类型
  166. if(updateOption.departureCity){
  167. [err,departCityType] = await handle(db_area.cityType(updateOption.departureCity));
  168. if(err) throw err;
  169. departCityType = departCityType[0].cityType;
  170. if(departCityType){
  171. // 判断是否为国内城市
  172. if(departCityType==field.cityType_international){
  173. routerType = field.routeType_international;
  174. }
  175. }
  176. }
  177. if(updateOption.targetCity){
  178. [err,targetCityType] = await handle(db_area.cityType(updateOption.departureCity));
  179. if(err) throw err;
  180. targetCityType = targetCityType[0].cityType;
  181. if(targetCityType) {
  182. // 判断是否为国内城市
  183. if (targetCityType == field.cityType_international) {
  184. routerType = field.routeType_international;
  185. }
  186. }
  187. }
  188. if(routerType){
  189. updateOptions.routeType = routerType;
  190. }
  191. updateOptions.flightName = updateOption.flightName;
  192. updateOptions.airId = updateOption.airId;
  193. updateOptions.originalPrice = updateOption.originalPrice;
  194. updateOptions.currentPrice = updateOption.currentPrice;
  195. updateOptions.sailingTime = updateOption.sailingTime;
  196. updateOptions.langdinTime = updateOption.langdinTime;
  197. updateOptions.totalVotes = updateOption.totalVotes;
  198. updateOptions.departureCity = updateOption.departureCity;
  199. updateOptions.targetCity = updateOption.targetCity;
  200. updateOptions.flightState = updateOption.flightState;
  201. [err,result] = await handle(db_air.updateFlight(flightId,updateOptions));
  202. if(err) throw err;
  203. return result
  204. }
  205. /**
  206. * 航班相关新闻
  207. * @param nums 每种类型的数量
  208. * @returns {Promise<void>}
  209. */
  210. async function news(nums){
  211. let result = {},sellFlights,wicketFlights;
  212. [err,wicketFlights] = await handle(db_air.wicketFlights(nums));
  213. if(err){throw err}
  214. [err,sellFlights] = await handle(db_air.sellFlights(nums));
  215. if(err){throw err}
  216. result.sellFlights = sellFlights;
  217. result.wicketFlights = wicketFlights;
  218. return result;
  219. }
  220. /**
  221. * 新增飞机
  222. * @param airCode
  223. * @param row
  224. * @param col
  225. * @returns {Promise<*>}
  226. */
  227. async function addAir(airCode,row,col){
  228. let [err,result] = await handle(db_air.addAir(airCode,row,col));
  229. if(err){throw err}
  230. return result;
  231. }
  232. /**
  233. * 飞机列表
  234. * @param state
  235. * @returns {Promise<*>}
  236. */
  237. async function airs(state){
  238. let [err,result] = await handle(db_air.airs(state));
  239. if(err){throw err}
  240. return result;
  241. }
  242. async function airInfo(airId){
  243. let [err,result] = await handle(db_air.airInfo(airId));
  244. if(err){throw err}
  245. if(result.length<1){throw {rcode:codeMap.notFound,msg:'无法找到对应飞机'}}
  246. return result[0];
  247. }
  248. async function updateAir(airId,updateParam){
  249. let param = {
  250. airCode:updateParam.airCode,
  251. col:updateParam.col,
  252. row:updateParam.row,
  253. }
  254. let [err,result] = await handle(db_air.updateAir(airId,param));
  255. if(err){throw err}
  256. return result;
  257. }
  258. module.exports = {
  259. searchFlight,
  260. flightList,
  261. addFlight,
  262. updateFlight,
  263. flightInfo,
  264. news,
  265. searchFlights,
  266. addAir,
  267. airs,
  268. updateAir
  269. }