Bladeren bron

自动超时订单逻辑
订单相关接口逻辑制作

kindring 2 jaren geleden
bovenliggende
commit
437d34bab7
9 gewijzigde bestanden met toevoegingen van 331 en 65 verwijderingen
  1. 12 9
      controller/TimeUpdate.js
  2. 114 18
      controller/account.js
  3. 15 3
      controller/c_flight.js
  4. 3 22
      database/d_air.js
  5. 105 10
      database/d_user.js
  6. 1 1
      db.md
  7. 21 1
      maps/field.js
  8. 59 0
      routes/userApi.js
  9. 1 1
      until/time.js

+ 12 - 9
controller/TimeUpdate.js

@@ -2,7 +2,7 @@
 const {getUnixTimeStamp} = require('../until/time')
 const db_user = require('../database/d_user')
 const handle = require("../until/handle");
-const {payState_cancel} = require("../maps/field");
+const {payState_cancel,payState_timeout} = require("../maps/field");
 let orders = [];
 let payLock = false;
 // 订单超过15分钟的自动过期
@@ -35,6 +35,7 @@ async function check(){
     if(payLock){
         return;
     }
+    // console.log(orders)
     let nowUnix = getUnixTimeStamp();
     orders = orders.filter(val=>val);
     for (let i = 0; i < orders.length; i++) {
@@ -42,8 +43,12 @@ async function check(){
         if(!order){
             break;
         }
-        if(nowUnix>order.endTime){
-            let [err,result] = await handle(db_user.changeOrder(order.id,{payState:payState_cancel}));
+        console.log(`订单${order.id} 当前时间${nowUnix} - 结束时间${order.endTime} 剩余 ${nowUnix-order.endTime}秒`)
+        // console.log(nowUnix);
+        // console.log(order.endTime);
+        // console.log(nowUnix > order.endTime);
+        if(nowUnix > order.endTime){
+            let [err,result] = await handle(db_user.changeOrder(order.id,{payState:payState_timeout}));
             if(err){console.log(err)}else{
                 console.log(`订单${order.id},超时过期`);
                 orders[i] = null;
@@ -55,20 +60,18 @@ async function check(){
 
 async function main(){
     console.log('检测订单');
+    await loadOrder();
     tick(1000,check);
 }
 main();
 
 // 用户支付订单
-async function payOrder(orderId){
+function payOrderItem(orderId){
     payLock=true;
-    let [err,result] = await handle(db_user.payOrder(orderId));
-    if(err){payLock=false;console.log(err);throw err}
     let ind = orders.findIndex(val=>val.id==orderId);
-    if(ind!=-1){orders[ind] = null}
+    if(ind != -1){orders[ind] = null}
     orders = orders.filter(val=>val);
     payLock=false;
-    return result;
 }
 
 
@@ -80,6 +83,6 @@ async function reloadOrder(){
 
 module.exports = {
     reloadOrder,
-    payOrder,
+    payOrderItem,
 }
 

+ 114 - 18
controller/account.js

@@ -4,10 +4,10 @@ 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 {userType, orderType_all} = require("../maps/field");
 const {getUnixTimeStamp} = require("../until/time");
 // 更新订单
-const {reloadOrder,payOrder} = require("./TimeUpdate");
+const {reloadOrder, payOrderItem} = require("./TimeUpdate");
 // 处理账号的注册登录,
 
 async function checkAccount(account,userType= field.userType){
@@ -110,7 +110,7 @@ async function info(type,account){
     if(result.length < 1){
         throw {rcode:codeMap.notFound,msg:'无法找到账户'}
     }
-    // 注册成功
+    // 用户信息
     return result[0];
 }
 
@@ -282,10 +282,33 @@ async function addCar(flightId,account){
     return result;
 }
 
+/**
+ * 获取指定用户的订单
+ * @param account
+ * @param orderType
+ * @returns {Promise<*>}
+ */
+async function orders(account,orderType){
+    // 获取订单详情
+    let err,user,result;
+    [err,user] = await handle(info(userType,account));
+    if(err)throw err;
+    console.log(orderType);
+    // 获取账户
+    [err,result] = await handle(db_user.userOrder(user.id,orderType));
+    if(err)throw err;
+    return result;
+}
 
-// 创建一个基础订单,未支付
+/**
+ * 新建订单
+ * @param account
+ * @param flightId
+ * @param travelIds
+ * @returns {Promise<*>}
+ */
 async function addOrder(account,flightId,travelIds){
-    let flight;
+    let flight,err,result;
     if(travelIds.length < 1){throw {rcode:codeMap.notParam,msg:'缺少乘车人'}}
     // 检查是否有不知名的乘机人
     for(let i = 0;i<travelIds.length;i++){
@@ -295,7 +318,7 @@ async function addOrder(account,flightId,travelIds){
     }
     let userId,unixTime = getUnixTimeStamp();
     // 根据账号查找id
-    let [err,result] = await handle(db_user.findAccountUser(userType,account));
+   [err,result] = await handle(db_user.findAccountUser(userType,account));
     if(err)throw err;
     if(result.length < 1){
         throw {rcode:codeMap.notFound,msg:'无法找到账户'}
@@ -307,12 +330,17 @@ async function addOrder(account,flightId,travelIds){
     if((parseInt(flight.pay) + travelIds.length) > parseInt(flight.totalVotes)){
         throw {rcode:codeMap.customError,msg:'航班机票不足'}
     }
+    if(flight.flightState != field.flightState_sail){
+        throw {rcode:codeMap.customError,msg:'该航班已经结束售卖'}
+    }
     // 添加订单
     [err,result] = await handle(db_user.addOrder(userId,flightId,travelIds,unixTime));
     if(err)throw err;
     await reloadOrder();
-    return result;
-
+    // 添加订单
+    [err,result] = await handle(db_user.findOrder(userId,flightId,travelIds,unixTime));
+    if(err)throw err;
+    return result[0]||{};
 }
 
 /**
@@ -325,10 +353,9 @@ async function payOrder(account,orderId){
     let userId,order,flight,travels;
     order.travelIds = undefined;
     // 根据账号查找id
-    let [err,result] = await handle(db_user.findAccountUser(userType,account));
+    let [err,result] = await handle(info(userType,account));
     if(err)throw err;
-    if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到账户'}}
-    userId = result[0].id;
+    userId = result.id;
     [err,result] = await handle(db_user.userOrderInfo(userId,orderId));
     if(err)throw err;
     if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到相关订单'} }
@@ -347,24 +374,83 @@ async function payOrder(account,orderId){
             [err,result] = await handle(db_user.clearTick(order.id));
         }
     }
-    await payOrder(orderId);
-    return true;
+    [err,result] = await handle(db_user.payOrder(orderId));
+    if(err){console.log(err);throw err}
+    payOrderItem();
+    return result;
 }
 
 /**
  * 选坐
+ * @param account
  * @param tickId 机票id
  * @param row 排
  * @param col 行
  * @returns {Promise<void>}
  */
-async function chooseSit(tickId,row,col){
-    let tick;
+async function chooseSit(account,tickId,row,col){
+    let tick,order,travels;
     // 获取对应的航班信息
     let [err,result] = await handle(db_user.tickInfo(tickId))
     if(err)throw err;
     if(result.length < 1){throw {rcode:codeMap.notFound,msg:'无法找到机票'}}
+    tick = result[0];
+    [err,order] = await handle(orderInfo(account,tick.orderId))
+    if(err)throw err;
+    // 查看指定航班指定位置的票是否被选中
+    [err,result] = await handle(db_user.findTickRowCol(order.flightId,row,col))
+    if(err)throw err;
+    if(result.length > 0){throw {rcode:codeMap.dataRepeat,msg:'该位置已经被占用了呢'}}
+    // 设置座位
+    [err,result] = await handle(db_user.tickChooseToSel(tickId,row,col))
+    if(err)throw err;
+    // 遍历查看订单是否全部选坐完成.全部选坐完成则
+    travels=order.travelIds.split(',');
+    [err,result] = await handle(db_user.tickSearch({
+        orderId: order.id,
+        tickState: field.tickState_seat
+    }));
+    if(err) {throw err}
+    // 已经全部值机,订单切换为全部值机的状态
+    if(result.length === travels.length){
+        [err,result] = await handle(db_user.changeOrder(order.id,{payState:field.payState_choose}));
+        if(err) {throw  err}
+    }
+    return result;
+}
 
+/**
+ * 退款机票
+ * @param account
+ * @param tickId
+ * @returns {Promise<*>}
+ */
+async function refundTick(account,tickId){
+    let tick,order,travels;
+    // 获取对应的航班信息
+    let [err,result] = await handle(db_user.tickInfo(tickId))
+    if(err)throw err;
+    if(result.length < 1){throw {rcode:codeMap.notFound,msg:'无法找到机票'}}
+    tick = result[0];
+    if(tick.tickState != field.tickState_create){throw {rcode:codeMap.customError,msg:'该机票不允许退款'}}
+    [err,order] = await handle(orderInfo(account,tick.orderId))
+    if(err)throw err;
+    // 遍历查看订单是否为部分退款
+    travels=order.travelIds.split(',');
+    [err,result] = await handle(db_user.tickSearch({
+        orderId: order.id,
+        tickState: field.tickState_refund
+    }));
+    if(err) {throw err}
+    // 是否已经全部退款
+    if(result.length === travels.length){
+        [err,result] = await handle(db_user.changeOrder(order.id,{payState:field.payState_refund}));
+        if(err) {throw  err}
+    }else{
+        [err,result] = await handle(db_user.changeOrder(order.id,{payState:field.payState_rebates}));
+        if(err) {throw  err}
+    }
+    return result;
 }
 
 /**
@@ -390,7 +476,7 @@ async function orderInfo(account,orderId){
     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(err) {console.log('获取乘车人信息失败'); throw  err}
         if(result.length < 1){ throw {rcode:codeMap.notFound,msg:'无法找到乘车人'} }
         // 查找对应车票信息
         [err,result] = await handle(db_user.orderTick(order.id,travelId));
@@ -402,7 +488,13 @@ async function orderInfo(account,orderId){
     return order;
 }
 
-
+/**
+ * 修改订单乘机人
+ * @param account
+ * @param orderId
+ * @param travelIds
+ * @returns {Promise<void>}
+ */
 async function changeOrderTravel(account,orderId,travelIds){
     let userId,order,travels;
     // 根据账号查找id
@@ -438,6 +530,10 @@ module.exports = {
     travels,
     travelInfo,
     updateTravel,
-    addOrder
+    orders,
+    addOrder,
+    chooseSit,
+    payOrder,
+    changeOrderTravel
 }
 

+ 15 - 3
controller/c_flight.js

@@ -1,6 +1,7 @@
 // 管理航班
 const db_air = require('../database/d_air')
 const db_area = require('../database/d_area')
+const db_user = require('../database/d_user')
 const handle = require('../until/handle')
 const field = require('../maps/field')
 const codeMap = require('../maps/rcodeMap')
@@ -68,7 +69,7 @@ async function flightInfo(flightId){
  * @returns {Promise<void>}
  */
 async function seatInfo(flightId){
-    let err,flight,air,seat = {};
+    let err,result,flight,air,seat = {};
     [err,flight] = await handle(flightInfo(flightId));
     if(err){throw err}
     // 获取飞机信息
@@ -77,8 +78,18 @@ async function seatInfo(flightId){
     seat.row = air.row;
     seat.col = air.col;
     // 获取已经选坐的列表
-
+    [err,result] = await handle(db_user.flightTickSeat(flightId));
+    seat.selecteds = result.map(val=>{
+        return {
+            id:val.id,
+            row: val.row,
+            col: val.col,
+        }
+    })
 }
+
+
+
 async function searchFlights(state,options,page,limie){
     console.log(options);
     let searchItems = {
@@ -282,5 +293,6 @@ module.exports = {
     searchFlights,
     addAir,
     airs,
-    updateAir
+    updateAir,
+    seatInfo
 }

+ 3 - 22
database/d_air.js

@@ -151,10 +151,6 @@ function flightOrder(flightId){
     return mysql.pq(sql,values);
 }
 
-
-
-
-
 /**
  * 航班具体信息
  * @param flightId
@@ -174,26 +170,10 @@ function flightInfo(flightId){
     return mysql.pq(sql,values);
 }
 
-/**
- * 获取航班票数
- * @param flightId
- * @returns {Promise<unknown>}
- */
-function flightTicks(flightId){
-    let sql=``,values=[];
-    sql=`select ff.*,count(t.flightId = ? or null) as pay
-            from 
-            (select totalVotes from flight where id = ?) as ff,
-            airTickets as t 
-            where t.payState != '1' and t.payState != '4'`;
-    values.push(flightId,flightId);
-    return mysql.pq(sql,values);
-}
-
 /**
  * 添加航班
  * @param flightName 航班名
- * @param airCode 飞机代码
+ * @param airId 飞机id
  * @param originalPrice 原始价格
  * @param currentPrice 当前价格
  * @param sailingTime 起飞时间
@@ -356,10 +336,11 @@ function wicketFlights(num = 5){
     return mysql.pq(sql,values);
 }
 
+
+
 module.exports = {
     flightSearch,
     addFlight,
-    flightTicks,
     updateFlight,
     flightList,
     flightInfo,

+ 105 - 10
database/d_user.js

@@ -131,6 +131,7 @@ function addTravel(userId,name,card,phone,defaultState){
     let values = [userId,name,card,phone,defaultState];
     return mysql.pq(sql,values);
 }
+
 // 获取乘机人
 function travels(userId){
     let sql = `select * from travel where userId = ? and \`delete\` = ?`;
@@ -144,6 +145,7 @@ function findUserTravel(userId,flightId){
     let values = [userId,flightId];
     return mysql.pq(sql,values);
 }
+
 /**
  * 修改指定用户的所有状态
  * @param userId
@@ -212,8 +214,13 @@ function removeCar(carId){
     return mysql.pq(sql,values);
 }
 
-
-function userOrder(userId,payState){
+/**
+ * 用户的所有订单
+ * @param userId
+ * @param orderType
+ * @returns {Promise | Promise<unknown>}
+ */
+function userOrder(userId,orderType = fields.orderType_all){
     let sql=``,values=[];
     sql+=`
         select 
@@ -226,19 +233,36 @@ function userOrder(userId,payState){
         LEFT JOIN (select * from flight ) as f on f.id = o.flightId
         LEFT JOIN (select * from air ) as air on air.id = f.airId
         LEFT JOIN (select id,cityName from area ) as dep on dep.id = f.departureCity
-        LEFT JOIN (select id,cityName from area ) as tar on tar.id = f.targetCity;
+        LEFT JOIN (select id,cityName from area ) as tar on tar.id = f.targetCity
         where userId = ?
        `
     values.push(userId);
-    if (payState){
+
+    // 刚创建
+    if (orderType === fields.orderType_waitPay){
+        sql+=` and payState = ?`;
+        values.push(fields.payState_create);
+    }
+    // 已经支付,全部值机,部分值机
+    if (orderType === fields.orderType_pay){
+        sql+=` and (payState = ? or payState = ? or payState = ?)`;
+        values.push(fields.payState_pay,fields.payState_choose,fields.payState_rebates);
+    }
+    // 已经取消
+    if (orderType === fields.orderType_cancel){
+        sql+=` and (payState = ? or payState = ? or payState = ?)`;
+        values.push(fields.payState_cancel,fields.payState_timeout,fields.payState_refund);
+    }
+    // 已经完成
+    if (orderType === fields.orderType_end){
         sql+=` and payState = ?`;
-        values.push(payState);
+        values.push(fields.payState_end);
     }
     return mysql.pq(sql,values);
 }
 
 // 获取
-function orderTick(orderId){
+function orderTicks(orderId){
     let sql=``,values=[];
     sql+=`select * from airTicket where orderId = ?`;
     values.push(orderId);
@@ -257,6 +281,59 @@ function tickInfo(tickId){
     return mysql.pq(sql,values);
 }
 
+/**
+ * 某个机票进行值机
+ * @param tickId
+ * @param row
+ * @param col
+ * @returns {Promise | Promise<unknown>}
+ */
+function tickChooseToSel(tickId,row,col){
+    let sql=``,values=[];
+    sql+=`update airTicket set \`row\` = ? , \`col\` = ? , \`tickState\` = ? where id =?`;
+    values.push(row,col,fields.tickState_seat,tickId);
+    return mysql.pq(sql,values);
+}
+
+/**
+ * 获取航班已经选择的座位列表
+ * @param flightId
+ * @returns {Promise | Promise<unknown>}
+ */
+function flightTickSeat(flightId){
+    let sql=``,values=[];
+    sql+=`select t.* from airTicket as t ,orders as o
+            where t.orderId = o.id and o.flightId = ? and t.tickState = ?`;
+    values.push(flightId,fields.tickState_seat)
+    return mysql.pq(sql,values);
+}
+
+function findTickRowCol(flightId,row,col){
+    let sql=``,values=[];
+    sql+=`select t.* from airTicket as t ,orders as o
+            where t.orderId = o.id and o.flightId = ? and t.row = ? and t.col = ? and t.tickState = ?`;
+    values.push(flightId,row,col,fields.tickState_seat)
+    return mysql.pq(sql,values);
+}
+
+function tickSearch(params){
+    let sql=``,values=[];
+    let fields = Object.keys(params);
+    fields = fields.filter(field=>params[field])
+    sql+=`select * from airTicket`;
+    if(fields.length>=1){sql+=' where' }
+    for(let field of fields) {
+        // console.log(`${field} : ${searchItems[field]}`)
+        if (!params[field]) {
+            continue;
+        }
+        if(values.length>0){sql+='and'}
+        sql+=` \`${field}\` = ?`
+        values.push(params[field])
+    }
+    sql+=';';
+    return mysql.pq(sql,values);
+}
 /**
  * 添加选票
  * @param orderId
@@ -265,7 +342,7 @@ function tickInfo(tickId){
  */
 function addTick(orderId,travelId){
     let sql=``,values=[];
-    sql+=`insert into order(orderId,travelId) values(?,?)`;
+    sql+=`insert into airTicket(orderId,travelId) values(?,?)`;
     values.push(orderId,travelId);
     return mysql.pq(sql,values);
 }
@@ -277,14 +354,25 @@ function addTick(orderId,travelId){
  */
 function clearTick(orderId){
     let sql=``,values=[];
-    sql+=`delete from order where orderId = ?`;
+    sql+=`delete from orders 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) values(?,?,?,?,?)`;
+    sql+=`insert into orders(userId,flightId,ticketNum,travelIds,createTime) values(?,?,?,?,?)`;
+    values.push(userId,flightId);
+    values.push(travelIds.length);
+    values.push(travelIds.join(','));
+    values.push(createTime);
+    return mysql.pq(sql,values);
+}
+
+function findOrder(userId,flightId,travelIds,createTime){
+    let sql=``,values=[];
+    sql+=`select * from orders where userId = ? and flightId = ? and ticketNum = ? and travelIds = ? and createTime = ?`
+    // sql+=`insert into orders(userId,flightId,ticketNum,travelIds,createTime) values(?,?,?,?,?)`;
     values.push(userId,flightId);
     values.push(travelIds.length);
     values.push(travelIds.join(','));
@@ -373,12 +461,19 @@ module.exports =  {
     travelInfo,
     changeAllTravelState,
     changeTravel,
+    userOrder,
     waitPayOrder,
     changeOrder,
     payOrder,
     addOrder,
     userOrderInfo,
     addTick,
+    findOrder,
+    orderTicks,
+    findTickRowCol,
     clearTick,
-    tickInfo
+    tickInfo,
+    tickSearch,
+    flightTickSeat,
+    tickChooseToSel
 }

+ 1 - 1
db.md

@@ -73,7 +73,7 @@
 | 字段       | 类型      | 默认值 | 可选值 | 备注                  |
 |----------|---------|----|-----|---------------------|
 | id       | int     | pk | n   | id |
-| payState | char | 1 | 1(创建,待支付),2(已经支付),3(订单结束,航班已经到站),4(取消,或者超时),5(已经退款),6(部分退款) | 订单状态 |
+| payState | char | 1 | 1(创建,待支付),2(已经支付),3(已经全部值机),4(订单结束,航班已经到站),5(订单取消),6(已经退款),7(部分退款),8(超时自动取消) | 订单状态 |
 | userId | int | pk | n   | 用户id |
 | flightId | int | pk | n | 航班id |
 | ticketNum | int | 1 | 1-200 | 够票数量 |

+ 21 - 1
maps/field.js

@@ -30,7 +30,7 @@ module.exports = {
     payState_create: 1,
     // 已经支付
     payState_pay: 2,
-    // 已经选坐
+    // 已经全部值机
     payState_choose: 3,
     // 订单结束
     payState_end: 4,
@@ -40,4 +40,24 @@ module.exports = {
     payState_refund: 6,
     // 部分机票退款
     payState_rebates: 7,
+    // 超时取消
+    payState_timeout: 8,
+    // 机票创建
+    tickState_create: 1,
+    // 已经值机
+    tickState_seat: 2,
+    // 行程结束
+    tickState_wait: 3,
+    // 机票已经退款
+    tickState_refund: 4,
+    // 全部订单
+    orderType_all:'all',
+    // 等待支付
+    orderType_waitPay:'waitPay',
+    // 已经支付订单
+    orderType_pay:'pay',
+    // 已经结束订单
+    orderType_end:'end',
+    // 已经取消订单
+    orderType_cancel:'cancel',
 }

+ 59 - 0
routes/userApi.js

@@ -294,4 +294,63 @@ router.get('/travels',
         }
     })
 
+
+router.post(
+    '/order/add',
+    checkLogin(fields.userType),
+    checkParams({
+            post:{
+                flightId:{required:true},
+                travelIds:{required:true},
+            }
+        }),
+    async (req,res)=>{
+        try{
+            let results = await c_user.addOrder(
+                req.session[progress.userSessionField],
+                req.body.flightId,
+                req.body.travelIds,
+            );
+            res.json({
+                rcode: code.ok,
+                data: results,
+                total: results.length
+            })
+        }catch (error) {
+            if (error.rcode !== code.customError) {
+                console.log(error);
+            }
+            res.json({
+                rcode: error.rcode || code.serverError,
+                msg: error.msg || error.message
+            });
+        }
+    }
+    )
+
+router.get(
+    '/orders',
+    checkLogin(fields.userType),
+    async (req,res)=>{
+        try{
+            let results = await c_user.orders(
+                req.session[progress.userSessionField],
+                req.query.type,
+            );
+            res.json({
+                rcode: code.ok,
+                data: results,
+                total: results.length
+            })
+        }catch (error) {
+            if (error.rcode !== code.customError) {
+                console.log(error);
+            }
+            res.json({
+                rcode: error.rcode || code.serverError,
+                msg: error.msg || error.message
+            });
+        }
+    }
+)
 module.exports = router;

+ 1 - 1
until/time.js

@@ -4,7 +4,7 @@
  * @returns {number}
  */
 function getUnixTimeStamp(date = new Date()){
-    return date.getTime() / 1000;
+    return parseInt(date.getTime() / 1000);
 }