account.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. const db_user = require('../database/d_user')
  2. const d_air = require('../database/d_air')
  3. const c_flight = require('./c_flight');
  4. const handle = require('../until/handle')
  5. const field = require('../maps/field')
  6. const codeMap = require('../maps/rcodeMap')
  7. const {userType, orderType_all} = require("../maps/field");
  8. const {getUnixTimeStamp} = require("../until/time");
  9. // 更新订单
  10. const {reloadOrder, payOrderItem} = require("./TimeUpdate");
  11. // 处理账号的注册登录,
  12. async function checkAccount(account,userType= field.userType){
  13. let [err,result] = await handle(db_user.findAccountUser(userType,account));
  14. if(err){throw err}
  15. // 查看是否有结果
  16. if (result.length >= 1 ) {throw {rcode:codeMap.notFound,msg:'该账户已经被注册'}}
  17. return true;
  18. }
  19. /**
  20. * 用户登录,返回用户名
  21. * @param userType
  22. * @param account
  23. * @param passwd
  24. * @returns {Promise<*>}
  25. */
  26. async function login(userType = field.userType,account,passwd){
  27. let [err,result] = await handle(db_user.login(userType,account,passwd));
  28. if(err){throw err}
  29. // 查看是否有结果,没有结果自动告知账户或者密码错误
  30. if (result.length < 1 ) {throw {rcode:codeMap.notFound,msg:'账号或者密码错误'}}
  31. // 账号被冻结
  32. if (result[0].state == field.userFreezeState ){throw {rcode:codeMap.permissionDenied,msg:'账号被冻结'}}
  33. return result[0];
  34. }
  35. /**
  36. * 修改账户密码
  37. * @param type
  38. * @param account
  39. * @param oldPasswd
  40. * @param newPasswd
  41. * @returns {Promise<void>}
  42. */
  43. async function changePasswd(type,account,oldPasswd,newPasswd){
  44. // 根据账号和原密码查找id
  45. let [err,result] = await handle(db_user.login(type,account,oldPasswd));
  46. if(err)throw err;
  47. if (result.length < 1 ) {throw {rcode:codeMap.notFound,msg:'密码错误'}}
  48. let id = result[0].id;
  49. [err,result] = await handle(db_user.changePasswd(id,newPasswd));
  50. if(err)throw err;
  51. return;
  52. }
  53. /**
  54. * 修改指定账户的手机号
  55. * @param type
  56. * @param account
  57. * @param passwd
  58. * @param newPhone
  59. * @returns {Promise<void>}
  60. */
  61. async function changePhone(type,account,passwd,newPhone){
  62. // 根据账号和原密码查找id
  63. let [err,result] = await handle(db_user.login(type,account,passwd));
  64. if(err)throw err;
  65. if (result.length < 1 ) {throw {rcode:codeMap.notFound,msg:'密码错误'}}
  66. // 查看是否有对应的手机号
  67. let id = result[0].id;
  68. [err,result] = await handle(db_user.findPhoneUser(type,newPhone));
  69. if(err)throw err;
  70. if(result[0].total){throw {rcode:codeMap.dataRepeat,msg:'手机号已经使用'}}
  71. // 修改手机号
  72. [err,result] = await handle(db_user.changePhone(id,newPhone));
  73. if(err)throw err;
  74. return result;
  75. }
  76. /**
  77. * 用户注册
  78. * @param type
  79. * @param account
  80. * @param passwd
  81. * @param nickName
  82. * @returns {Promise<void>}
  83. */
  84. async function register(type,account,passwd,nickName){
  85. // 根据账号和原密码查找id
  86. let [err,result] = await handle(db_user.findAccountUser(type,account));
  87. if(err)throw err;
  88. if(result.length&&result[0].total){throw {rcode:codeMap.dataRepeat,msg:'账号重复'}}
  89. // 新增用户
  90. [err,result] = await handle(db_user.register(type,nickName,account,passwd));
  91. if(err)throw err;
  92. // 注册成功
  93. return result;
  94. }
  95. /**
  96. * 加载用户信息
  97. * @param type
  98. * @param account
  99. * @returns {Promise<void>}
  100. */
  101. async function info(type,account){
  102. // 根据账号和原密码查找id
  103. let [err,result] = await handle(db_user.info(type,account));
  104. if(err)throw err;
  105. if(result.length < 1){
  106. throw {rcode:codeMap.notFound,msg:'无法找到账户'}
  107. }
  108. // 用户信息
  109. return result[0];
  110. }
  111. /**
  112. * 获取用户购物车
  113. * @param account 用户账号
  114. * @returns {Promise<*>}
  115. */
  116. async function cars(account){
  117. // 根据账号查找id
  118. let [err,result] = await handle(db_user.findAccountUser(userType,account));
  119. if(err)throw err;
  120. if(result.length < 1){
  121. throw {rcode:codeMap.notFound,msg:'无法找到账户'}
  122. }
  123. [err,result] = await handle(db_user.cars(result[0].id));
  124. if(err)throw err;
  125. // 注册成功
  126. return result;
  127. }
  128. async function removeCar(carId){
  129. let [err,result] = await handle(db_user.removeCar(carId));
  130. if(err)throw err;
  131. return result;
  132. }
  133. /**
  134. * 移除乘机人
  135. * @param travelId
  136. * @returns {Promise<*>}
  137. */
  138. async function removeTravel(travelId){
  139. let [err,result] = await handle(db_user.removeTravel(travelId));
  140. if(err)throw err;
  141. return result;
  142. }
  143. /**
  144. * 添加乘机人
  145. * @param name 乘机人名
  146. * @param card 身份证号
  147. * @param phone 手机号
  148. * @param account 登陆账号
  149. * @param isDefault 是否为默认
  150. * @returns {Promise<*>}
  151. */
  152. async function addTravel(name,card,phone,account,isDefault = field.travelState_isDefault){
  153. let userId;
  154. // 根据账号查找id
  155. let [err,result] = await handle(db_user.findAccountUser(userType,account));
  156. if(err)throw err;
  157. if(result.length < 1){
  158. throw {rcode:codeMap.notFound,msg:'无法找到账户'}
  159. }
  160. userId = result[0].id;
  161. // 开始添加乘客
  162. [err,result] = await handle(db_user.addTravel(userId,name,card,phone,isDefault));
  163. if(err)throw err;
  164. return result;
  165. }
  166. /**
  167. * 更改乘车人信息
  168. * @param account
  169. * @param travelId
  170. * @param params
  171. * @returns {Promise<*>}
  172. */
  173. async function updateTravel(account,travelId,params){
  174. // 根据账号查找id
  175. let [err,result] = await handle(db_user.findAccountUser(userType,account));
  176. if(err)throw err;
  177. if(result.length < 1){
  178. throw {rcode:codeMap.notFound,msg:'无法找到账户'}
  179. }
  180. // 根据账户与id查找乘车人
  181. [err,result] = await handle(db_user.findUserTravel(result[0].id,travelId));
  182. if(err)throw err;
  183. if(result.length < 1){
  184. throw {rcode:codeMap.notFound,msg:'无法匹配用户的乘车人'}
  185. }
  186. [err,result] = await handle(db_user.changeTravel(travelId,{
  187. name:params.name,
  188. card:params.card,
  189. phone:params.phone,
  190. default:params.default
  191. }));
  192. if(err)throw err;
  193. // 查找成功
  194. return result;
  195. }
  196. /**
  197. * 查找所有的乘机人
  198. * @param account
  199. * @returns {Promise<*>}
  200. */
  201. async function travels(account){
  202. // 根据账号查找id
  203. let [err,result] = await handle(db_user.findAccountUser(userType,account));
  204. if(err)throw err;
  205. if(result.length < 1){
  206. throw {rcode:codeMap.notFound,msg:'无法找到账户'}
  207. }
  208. [err,result] = await handle(db_user.travels(result[0].id));
  209. if(err)throw err;
  210. // 查找成功
  211. return result.map(val=>{
  212. let card = val.card.replace(val.card.substr(4,10),'**********')
  213. return {
  214. ...val,
  215. card:card
  216. }
  217. });
  218. }
  219. /**
  220. * 乘机人详细信息
  221. * @param account
  222. * @param passwd
  223. * @param travelId
  224. * @returns {Promise<*>}
  225. */
  226. async function travelInfo(account,passwd,travelId){
  227. // 根据账号查找id
  228. let [err,result] = await handle(db_user.login(userType,account,passwd));
  229. if(err)throw err;
  230. if(result.length < 1){
  231. throw {rcode:codeMap.notFound,msg:'无法找到账户'}
  232. }
  233. [err,result] = await handle(db_user.travelInfo(travelId));
  234. if(err)throw err;
  235. if(result.length < 1){
  236. throw {rcode:codeMap.notFound,msg:'无法找到乘车人'}
  237. }
  238. return result[0];
  239. }
  240. async function addCar(flightId,account){
  241. let userId;
  242. // 根据账号查找id
  243. let [err,result] = await handle(db_user.findAccountUser(userType,account));
  244. if(err)throw err;
  245. if(result.length < 1){
  246. throw {rcode:codeMap.notFound,msg:'无法找到账户'}
  247. }
  248. userId = result[0].id;
  249. // 查看航班是否已经结束
  250. [err,result] = await handle(d_air.flightInfo(flightId));
  251. if(err)throw err;
  252. if(result.length < 1){
  253. throw {rcode:codeMap.notFound,msg:'无法找到航班,航班号错误'}
  254. }
  255. console.log(result[0]);
  256. if(result[0].flightState !== field.flightState_sail+''){
  257. throw {rcode:codeMap.customError,msg:'航班非销售状态'}
  258. }
  259. [err,result] = await handle(db_user.findCar(userId,flightId));
  260. if(err)throw err;
  261. if(result.length >= 1){
  262. throw {rcode:codeMap.customError,msg:'该航班已经在购物车中'}
  263. }
  264. // 开始添加购物车
  265. [err,result] = await handle(db_user.addCar(flightId,userId));
  266. if(err)throw err;
  267. return result;
  268. }
  269. /**
  270. * 获取指定用户的订单
  271. * @param account
  272. * @param orderType
  273. * @returns {Promise<*>}
  274. */
  275. async function orders(account,orderType){
  276. // 获取订单详情
  277. let err,user,result;
  278. [err,user] = await handle(info(userType,account));
  279. if(err)throw err;
  280. console.log(orderType);
  281. // 获取账户
  282. [err,result] = await handle(db_user.userOrder(user.id,orderType));
  283. if(err)throw err;
  284. return result;
  285. }
  286. /**
  287. * 新建订单
  288. * @param account
  289. * @param flightId
  290. * @param travelIds
  291. * @returns {Promise<*>}
  292. */
  293. async function addOrder(account,flightId,travelIds){
  294. let flight,err,result;
  295. if(travelIds.length < 1){throw {rcode:codeMap.notParam,msg:'缺少乘车人'}}
  296. // 检查是否有不知名的乘机人
  297. for(let i = 0;i<travelIds.length;i++){
  298. [err,result] = await handle(db_user.travelInfo(travelIds[0]));
  299. if(err)throw err;
  300. if(result.length<1){throw {rcode:codeMap.customError,msg:'不在数据表的乘机人'}}
  301. }
  302. let userId,unixTime = getUnixTimeStamp();
  303. // 根据账号查找id
  304. [err,result] = await handle(db_user.findAccountUser(userType,account));
  305. if(err)throw err;
  306. if(result.length < 1){
  307. throw {rcode:codeMap.notFound,msg:'无法找到账户'}
  308. }
  309. userId = result[0].id;
  310. // 查看航班是否已经结束
  311. [err,flight] = await handle(c_flight.flightInfo(flightId));
  312. if(err)throw err;
  313. if((parseInt(flight.pay) + travelIds.length) > parseInt(flight.totalVotes)){
  314. throw {rcode:codeMap.customError,msg:'航班机票不足'}
  315. }
  316. if(flight.flightState != field.flightState_sail){
  317. throw {rcode:codeMap.customError,msg:'该航班已经结束售卖'}
  318. }
  319. // 添加订单
  320. [err,result] = await handle(db_user.addOrder(userId,flightId,travelIds,unixTime));
  321. if(err)throw err;
  322. await reloadOrder();
  323. // 添加订单
  324. [err,result] = await handle(db_user.findOrder(userId,flightId,travelIds,unixTime));
  325. if(err)throw err;
  326. return result[0]||{};
  327. }
  328. // 退票订单
  329. async function refundOrder(account,orderId){
  330. let userId,order,ticks,isRefund = false;
  331. // order.travelIds = undefined;
  332. // 根据账号查找id
  333. let [err,result] = await handle(info(userType,account));
  334. if(err)throw err;
  335. userId = result.id;
  336. [err,result] = await handle(db_user.userOrderInfo(userId,orderId));
  337. if(err)throw err;
  338. if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到相关订单'} }
  339. order = result[0];
  340. // 获取所有车票信息,只有在已经支付后才有
  341. [err,ticks] = await handle(db_user.orderTicks(order.id));
  342. if(err)throw err;
  343. // 判断是否有机票已经退款了
  344. for (const tick of ticks) {
  345. if(tick.tickState == field.tickState_seat){
  346. throw {rcode:codeMap.customError,msg:'该订单部分机票已经值机不允许退票'}
  347. }
  348. }
  349. // 订单设置为退票状态
  350. [err,result] = await handle(db_user.changeOrder(orderId, {payState:field.payState_refund}));
  351. if(err)throw err;
  352. // 退票所有乘客
  353. [err,result] = await handle(db_user.refundOrderTick(orderId));
  354. if(err)throw err;
  355. return result;
  356. }
  357. /**
  358. * 支付订单
  359. * @param account 账户
  360. * @param passwd
  361. * @param orderId 订单id
  362. * @returns {Promise<boolean>}
  363. */
  364. async function payOrder(account,passwd,orderId){
  365. let userId,order,flight,travels;
  366. // order.travelIds = undefined;
  367. // 根据账号查找id
  368. let [err,result] = await handle(login(userType,account,passwd));
  369. if(err)throw err;
  370. userId = result.id;
  371. [err,result] = await handle(db_user.userOrderInfo(userId,orderId));
  372. if(err)throw err;
  373. if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到相关订单'} }
  374. order = result[0];
  375. if(order.payState!=field.payState_create){throw {rcode:codeMap.notFound,msg:'无法支付非未支付订单'}}
  376. [err,flight] = await handle(c_flight.flightInfo(order.flightId));
  377. if(err)throw err;
  378. if(flight.flightState!=field.flightState_sail){throw {rcode:codeMap.notFound,msg:'航班已经开始检票或者起飞,无法支付'}}
  379. // 创建对应的机票
  380. travels=order.travelIds.split(',');
  381. for(let i = 0;i<travels.length;i++){
  382. // 添加乘机人
  383. [err,result] = await handle(db_user.addTick(order.id,travels[i]));
  384. if(err){
  385. // 删除对应订单的乘机人
  386. [err,result] = await handle(db_user.clearTick(order.id));
  387. }
  388. }
  389. let unitPrice = parseFloat(flight.currentPrice);
  390. let payPrice = parseFloat(flight.currentPrice) * travels.length;
  391. [err,result] = await handle(db_user.payOrder(orderId,unitPrice,payPrice,getUnixTimeStamp()));
  392. if(err){console.log(err);throw err}
  393. await reloadOrder();
  394. return result;
  395. }
  396. /**
  397. * 选坐
  398. * @param account
  399. * @param tickId 机票id
  400. * @param row 排
  401. * @param col 行
  402. * @returns {Promise<void>}
  403. */
  404. async function chooseSit(account,tickId,row,col){
  405. let tick,order,travels;
  406. // 获取对应的航班信息
  407. let [err,result] = await handle(db_user.tickInfo(tickId))
  408. if(err)throw err;
  409. if(result.length < 1){throw {rcode:codeMap.notFound,msg:'无法找到机票'}}
  410. tick = result[0];
  411. [err,order] = await handle(orderInfo(account,tick.orderId))
  412. if(err)throw err;
  413. // 查看指定航班指定位置的票是否被选中
  414. [err,result] = await handle(db_user.findTickRowCol(order.flightId,row,col))
  415. if(err)throw err;
  416. if(result.length > 0){throw {rcode:codeMap.dataRepeat,msg:'该位置已经被占用了呢'}}
  417. // 设置座位
  418. [err,result] = await handle(db_user.tickChooseToSel(tickId,row,col,getUnixTimeStamp()))
  419. if(err)throw err;
  420. // 遍历查看订单是否全部选坐完成.全部选坐完成则
  421. travels=order.travelIds.split(',');
  422. [err,result] = await handle(db_user.tickSearch({
  423. orderId: order.id,
  424. tickState: field.tickState_seat
  425. }));
  426. if(err) {throw err}
  427. // 已经全部值机,订单切换为全部值机的状态
  428. if(result.length === travels.length){
  429. [err,result] = await handle(db_user.changeOrder(order.id,{payState:field.payState_choose,chooseNum:result.length}));
  430. if(err) {throw err}
  431. }else{
  432. // 添加已经选坐的乘客数量
  433. [err,result] = await handle(db_user.changeOrder(order.id,{chooseNum:result.length}));
  434. if(err) {throw err}
  435. }
  436. return result;
  437. }
  438. /**
  439. * 退款机票
  440. * @param account
  441. * @param tickId
  442. * @returns {Promise<*>}
  443. */
  444. async function refundTick(account,tickId){
  445. let tick,order,travels;
  446. // 获取对应的航班信息
  447. let [err,result] = await handle(db_user.tickInfo(tickId))
  448. if(err)throw err;
  449. if(result.length < 1){throw {rcode:codeMap.notFound,msg:'无法找到机票'}}
  450. tick = result[0];
  451. if(tick.tickState != field.tickState_create){throw {rcode:codeMap.customError,msg:'该机票不允许退款'}}
  452. // 退款订单
  453. [err,result] = await handle(db_user.refundTick(tickId))
  454. if(err)throw err;
  455. // 查看对应的订单状态
  456. [err,order] = await handle(orderInfo(account,tick.orderId))
  457. if(err)throw err;
  458. // 遍历查看订单是否为部分退款
  459. travels=order.travelIds.split(',');
  460. [err,result] = await handle(db_user.tickSearch({
  461. orderId: order.id,
  462. tickState: field.tickState_refund
  463. }));
  464. if(err) {throw err}
  465. // 是否已经全部退款
  466. if(result.length === travels.length){
  467. [err,result] = await handle(db_user.changeOrder(order.id,{payState:field.payState_refund}));
  468. if(err) {throw err}
  469. }else{
  470. [err,result] = await handle(db_user.changeOrder(order.id,{payState:field.payState_rebates}));
  471. if(err) {throw err}
  472. }
  473. return result;
  474. }
  475. /**
  476. * 订单详情
  477. * @param account
  478. * @param orderId
  479. * @returns {Promise<void>}
  480. */
  481. async function orderInfo(account,orderId){
  482. let userId,order,travels,ticks,tmpTravels=[];
  483. // 根据账号查找id
  484. let [err,result] = await handle(db_user.findAccountUser(userType,account));
  485. if(err)throw err;
  486. if(result.length < 1){
  487. throw {rcode:codeMap.notFound,msg:'无法找到账户'}
  488. }
  489. userId = result[0].id;
  490. [err,result] = await handle(db_user.userOrderInfo(userId,orderId));
  491. if(err)throw err;
  492. if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到相关订单'} }
  493. order = result[0];
  494. // 获取所有车票信息,只有在已经支付后才有
  495. [err,ticks] = await handle(db_user.orderTicks(orderId));
  496. order.ticks = ticks
  497. // 获取乘车人信息
  498. travels=order.travelIds.split(',');
  499. for (let i = 0; i < travels.length ; i++) {
  500. [err,result] = await handle(db_user.travelInfo(travels[i]));
  501. if(err) {console.log('获取乘车人信息失败'); throw err}
  502. if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到乘车人'} }
  503. console.log(result);
  504. tmpTravels.push({
  505. id:result[0].id,
  506. name:result[0].name,
  507. })
  508. }
  509. order.travels = tmpTravels;
  510. return order;
  511. }
  512. /**
  513. * 修改订单乘机人
  514. * @param account
  515. * @param orderId
  516. * @param travelIds
  517. * @returns {Promise<void>}
  518. */
  519. async function changeOrderTravel(account,orderId,travelIds){
  520. let userId,order,travels;
  521. // 根据账号查找id
  522. let [err,result] = await handle(db_user.findAccountUser(userType,account));
  523. if(err)throw err;
  524. if(result.length < 1){
  525. throw {rcode:codeMap.notFound,msg:'无法找到账户'}
  526. }
  527. [err,result] = await handle(db_user.userOrderInfo(userId,orderId));
  528. if(err)throw err;
  529. if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到相关订单'} }
  530. order = result[0];
  531. // 只允许未选坐前进行修改乘客信息
  532. if(order.payState == field.payState_create || order.payState == field.payState_pay){
  533. }else{
  534. throw {rcode:codeMap.notFound,msg:'当前订单不允许修改乘车人'}
  535. }
  536. }
  537. module.exports = {
  538. register,
  539. changePhone,
  540. changePasswd,
  541. checkAccount,
  542. login,
  543. info,
  544. removeCar,
  545. addCar,
  546. cars,
  547. removeTravel,
  548. addTravel,
  549. travels,
  550. travelInfo,
  551. updateTravel,
  552. orders,
  553. addOrder,
  554. chooseSit,
  555. payOrder,
  556. orderInfo,
  557. refundTick,
  558. refundOrder,
  559. changeOrderTravel
  560. }