Bladeren bron

订单创建相关逻辑,以及选坐相关逻辑

kindring 2 jaren geleden
bovenliggende
commit
1df5be5f56
6 gewijzigde bestanden met toevoegingen van 278 en 31 verwijderingen
  1. 27 22
      controller/TimeUpdate.js
  2. 143 2
      controller/account.js
  3. 28 1
      controller/c_flight.js
  4. 9 0
      database/d_air.js
  5. 65 2
      database/d_user.js
  6. 6 4
      maps/field.js

+ 27 - 22
controller/TimeUpdate.js

@@ -17,12 +17,26 @@ function tick (t,fn){
     },t)
 }
 
+async function loadOrder(){
+    let [err,result] = await handle(db_user.waitPayOrder());
+    if(err){
+        console.log('获取用户数据失败')
+        console.error(err);
+    }
+    orders = result.map(order=>{
+        return {
+            id: order.id,
+            endTime: parseInt(order.createTime) + expire
+        }
+    });
+}
 
 async function check(){
     if(payLock){
         return;
     }
     let nowUnix = getUnixTimeStamp();
+    orders = orders.filter(val=>val);
     for (let i = 0; i < orders.length; i++) {
         let order = orders[i];
         if(!order){
@@ -30,31 +44,21 @@ async function check(){
         }
         if(nowUnix>order.endTime){
             let [err,result] = await handle(db_user.changeOrder(order.id,{payState:payState_cancel}));
-            if(err){console.log(err)}
-            console.log(`订单${order.id},超时过期`);
+            if(err){console.log(err)}else{
+                console.log(`订单${order.id},超时过期`);
+                orders[i] = null;
+            }
+
         }
     }
 }
 
 async function main(){
-    let [err,result] = await handle(db_user.waitPayOrder());
-    if(err){
-        console.log('获取用户数据失败')
-        console.error(err);
-    }
-    orders = result.map(order=>{
-        return {
-            id: order.id,
-            endTime: parseInt(order.createTime) + expire
-        }
-    });
+    console.log('检测订单');
     tick(1000,check);
 }
-
 main();
 
-console.log('检测订单');
-
 // 用户支付订单
 async function payOrder(orderId){
     payLock=true;
@@ -64,17 +68,18 @@ async function payOrder(orderId){
     if(ind!=-1){orders[ind] = null}
     orders = orders.filter(val=>val);
     payLock=false;
+    return result;
 }
 
-async function addOrder(orderId,createTime){
-    orders.push({
-        id: orderId,
-        endTime: parseInt(createTime) + expire
-    })
+
+async function reloadOrder(){
+    payLock=true;
+    await loadOrder();
+    payLock=false;
 }
 
 module.exports = {
+    reloadOrder,
     payOrder,
-    addOrder,
 }
 

+ 143 - 2
controller/account.js

@@ -1,9 +1,13 @@
 const db_user = require('../database/d_user')
 const d_air = require('../database/d_air')
+const c_flight = require('./c_flight');
 const handle = require('../until/handle')
 const field = require('../maps/field')
 const codeMap = require('../maps/rcodeMap')
 const {userType} = require("../maps/field");
+const {getUnixTimeStamp} = require("../until/time");
+// 更新订单
+const {reloadOrder,payOrder} = require("./TimeUpdate");
 // 处理账号的注册登录,
 
 async function checkAccount(account,userType= field.userType){
@@ -279,8 +283,144 @@ async function addCar(flightId,account){
 }
 
 
-async function addOrder(account){
+// 创建一个基础订单,未支付
+async function addOrder(account,flightId,travelIds){
+    let flight;
+    if(travelIds.length < 1){throw {rcode:codeMap.notParam,msg:'缺少乘车人'}}
+    // 检查是否有不知名的乘机人
+    for(let i = 0;i<travelIds.length;i++){
+        [err,result] = await handle(db_user.travelInfo(travelIds[0]));
+        if(err)throw err;
+        if(result.length<1){throw {rcode:codeMap.customError,msg:'不在数据表的乘机人'}}
+    }
+    let userId,unixTime = getUnixTimeStamp();
+    // 根据账号查找id
+    let [err,result] = await handle(db_user.findAccountUser(userType,account));
+    if(err)throw err;
+    if(result.length < 1){
+        throw {rcode:codeMap.notFound,msg:'无法找到账户'}
+    }
+    userId = result[0].id;
+    // 查看航班是否已经结束
+    [err,flight] = await handle(c_flight.flightInfo(flightId));
+    if(err)throw err;
+    if((parseInt(flight.pay) + travelIds.length) > parseInt(flight.totalVotes)){
+        throw {rcode:codeMap.customError,msg:'航班机票不足'}
+    }
+    // 添加订单
+    [err,result] = await handle(db_user.addOrder(userId,flightId,travelIds,unixTime));
+    if(err)throw err;
+    await reloadOrder();
+    return result;
+
+}
+
+/**
+ * 支付订单
+ * @param account 账户
+ * @param orderId 订单id
+ * @returns {Promise<boolean>}
+ */
+async function payOrder(account,orderId){
+    let userId,order,flight,travels;
+    order.travelIds = undefined;
+    // 根据账号查找id
+    let [err,result] = await handle(db_user.findAccountUser(userType,account));
+    if(err)throw err;
+    if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到账户'}}
+    userId = result[0].id;
+    [err,result] = await handle(db_user.userOrderInfo(userId,orderId));
+    if(err)throw err;
+    if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到相关订单'} }
+    order = result[0];
+    if(order.payState!=field.payState_create){throw {rcode:codeMap.notFound,msg:'无法支付非未支付订单'}}
+    [err,flight] = await handle(c_flight.flightInfo(order.flightId));
+    if(err)throw err;
+    if(flight.flightState!=field.flightState_sail){throw {rcode:codeMap.notFound,msg:'航班已经开始检票或者起飞,无法支付'}}
+    // 创建对应的机票
+    travels=order.travelIds.split(',');
+    for(let i = 0;i<travels.length;i++){
+        // 添加乘机人
+        [err,result] = await handle(db_user.addTick(order.id,travels[i]));
+        if(err){
+            // 删除对应订单的乘机人
+            [err,result] = await handle(db_user.clearTick(order.id));
+        }
+    }
+    await payOrder(orderId);
+    return true;
+}
+
+/**
+ * 选坐
+ * @param tickId 机票id
+ * @param row 排
+ * @param col 行
+ * @returns {Promise<void>}
+ */
+async function chooseSit(tickId,row,col){
+    let tick;
+    // 获取对应的航班信息
+    let [err,result] = await handle(db_user.tickInfo(tickId))
+    if(err)throw err;
+    if(result.length < 1){throw {rcode:codeMap.notFound,msg:'无法找到机票'}}
+
+}
 
+/**
+ * 订单详情
+ * @param account
+ * @param orderId
+ * @returns {Promise<void>}
+ */
+async function orderInfo(account,orderId){
+    let userId,order,travels;
+    // 根据账号查找id
+    let [err,result] = await handle(db_user.findAccountUser(userType,account));
+    if(err)throw err;
+    if(result.length < 1){
+        throw {rcode:codeMap.notFound,msg:'无法找到账户'}
+    }
+    userId = result[0].id;
+    [err,result] = await handle(db_user.userOrderInfo(userId,orderId));
+    if(err)throw err;
+    if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到相关订单'} }
+    order = result[0];
+    // 获取乘车人信息
+    travels=order.travelIds.split(',');
+    order.travels = travels.map(async travelId=>{
+        [err,result] = await handle(db_user.travelInfo(travelId));
+        if(err) console.log('获取乘车人信息失败'); throw  err;
+        if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到乘车人'} }
+        // 查找对应车票信息
+        [err,result] = await handle(db_user.orderTick(order.id,travelId));
+        return {
+            id:result[0].id,
+            name:result[0].name,
+        }
+    });
+    return order;
+}
+
+
+async function changeOrderTravel(account,orderId,travelIds){
+    let userId,order,travels;
+    // 根据账号查找id
+    let [err,result] = await handle(db_user.findAccountUser(userType,account));
+    if(err)throw err;
+    if(result.length < 1){
+        throw {rcode:codeMap.notFound,msg:'无法找到账户'}
+    }
+    [err,result] = await handle(db_user.userOrderInfo(userId,orderId));
+    if(err)throw err;
+    if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到相关订单'} }
+    order = result[0];
+    // 只允许未选坐前进行修改乘客信息
+    if(order.payState == field.payState_create || order.payState == field.payState_pay){
+
+    }else{
+        throw {rcode:codeMap.notFound,msg:'当前订单不允许修改乘车人'}
+    }
 }
 
 module.exports = {
@@ -297,6 +437,7 @@ module.exports = {
     addTravel,
     travels,
     travelInfo,
-    updateTravel
+    updateTravel,
+    addOrder
 }
 

+ 28 - 1
controller/c_flight.js

@@ -57,11 +57,28 @@ async function flightInfo(flightId){
             refundTick =  val.refundTick.split(',').length;
         }
         return acc+(ticketNum - refundTick)
-    },0)
+    },0);
     flight.pay = sold;
     return flight;
 }
 
+/**
+ * 获取航班的座位信息
+ * @param flightId
+ * @returns {Promise<void>}
+ */
+async function seatInfo(flightId){
+    let err,flight,air,seat = {};
+    [err,flight] = await handle(flightInfo(flightId));
+    if(err){throw err}
+    // 获取飞机信息
+    [err,air] = await handle(airInfo(flight.airId));
+    // 显示座位情况
+    seat.row = air.row;
+    seat.col = air.col;
+    // 显示已经选坐的
+
+}
 async function searchFlights(state,options,page,limie){
     console.log(options);
     let searchItems = {
@@ -81,6 +98,8 @@ async function searchFlights(state,options,page,limie){
     return result;
 }
 
+
+
 /**
  * 新增航班
  * @param flightName 航班代号
@@ -234,6 +253,14 @@ async function airs(state){
     return result;
 }
 
+
+async function airInfo(airId){
+    let [err,result] = await handle(db_air.airInfo(airId));
+    if(err){throw err}
+    if(result.length<1){throw {rcode:codeMap.notFound,msg:'无法找到对应飞机'}}
+    return result[0];
+}
+
 async function updateAir(airId,updateParam){
     let param = {
         airCode:updateParam.airCode,

+ 9 - 0
database/d_air.js

@@ -25,6 +25,14 @@ function airs(state){
     return mysql.pq(sql,values);
 }
 
+
+function airInfo(airId){
+    let sql=``,values=[];
+    sql = `select * from air where id = ?`;
+    values.push(airId)
+    sql+=';';
+    return mysql.pq(sql,values);
+}
 /**
  * 新增飞机
  * @param airCode
@@ -361,5 +369,6 @@ module.exports = {
     flightOrder,
     airs,
     addAir,
+    airInfo,
     updateAir
 }

+ 65 - 2
database/d_user.js

@@ -237,9 +237,54 @@ function userOrder(userId,payState){
     return mysql.pq(sql,values);
 }
 
+// 获取
+function orderTick(orderId){
+    let sql=``,values=[];
+    sql+=`select * from airTicket where orderId = ?`;
+    values.push(orderId);
+    return mysql.pq(sql,values);
+}
+
+/**
+ * 获取机票信息
+ * @param tickId 机票id
+ * @returns {Promise | Promise<unknown>}
+ */
+function tickInfo(tickId){
+    let sql=``,values=[];
+    sql+=`select * from airTicket where id = ?`;
+    values.push(tickId);
+    return mysql.pq(sql,values);
+}
+
+/**
+ * 添加选票
+ * @param orderId
+ * @param travelId
+ * @returns {Promise | Promise<unknown>}
+ */
+function addTick(orderId,travelId){
+    let sql=``,values=[];
+    sql+=`insert into order(orderId,travelId) values(?,?)`;
+    values.push(orderId,travelId);
+    return mysql.pq(sql,values);
+}
+
+/**
+ * 清除指定订单的所有票
+ * @param orderId
+ * @returns {Promise | Promise<unknown>}
+ */
+function clearTick(orderId){
+    let sql=``,values=[];
+    sql+=`delete from order where orderId = ?`;
+    values.push(orderId);
+    return mysql.pq(sql,values);
+}
+
 function addOrder(userId,flightId,travelIds,createTime){
     let sql=``,values=[];
-    sql+=`insert into order(userId,flightId,ticketNum,travelIds,createTime)`;
+    sql+=`insert into order(userId,flightId,ticketNum,travelIds,createTime) values(?,?,?,?,?)`;
     values.push(userId,flightId);
     values.push(travelIds.length);
     values.push(travelIds.join(','));
@@ -296,6 +341,19 @@ function changeOrder(orderId,params){
     return mysql.pq(sql,values);
 }
 
+/**
+ * 获取指定用户的对应订单详细信息
+ * @param userId
+ * @param orderId
+ * @returns {Promise | Promise<unknown>}
+ */
+function userOrderInfo(userId,orderId){
+    let sql=``,values=[];
+    sql+=`select * from orders where userId = ? and orderId = ?`
+    values.push(userId,orderId);
+    return mysql.pq(sql,values);
+}
+
 module.exports =  {
     register,
     login,
@@ -317,5 +375,10 @@ module.exports =  {
     changeTravel,
     waitPayOrder,
     changeOrder,
-    payOrder
+    payOrder,
+    addOrder,
+    userOrderInfo,
+    addTick,
+    clearTick,
+    tickInfo
 }

+ 6 - 4
maps/field.js

@@ -30,12 +30,14 @@ module.exports = {
     payState_create: 1,
     // 已经支付
     payState_pay: 2,
+    // 已经选坐
+    payState_choose: 3,
     // 订单结束
-    payState_end: 3,
+    payState_end: 4,
     // 订单取消
-    payState_cancel: 4,
+    payState_cancel: 5,
     // 全部退款
-    payState_refund: 5,
+    payState_refund: 6,
     // 部分机票退款
-    payState_rebates: 6,
+    payState_rebates: 7,
 }