Bladeren bron

新增飞机逻辑,修改航班以适应飞机,以及订单

kindring 2 jaren geleden
bovenliggende
commit
64d982f257
8 gewijzigde bestanden met toevoegingen van 383 en 51 verwijderingen
  1. 28 0
      controller/TimeUpdate.js
  2. 5 0
      controller/account.js
  3. 60 6
      controller/c_flight.js
  4. 107 18
      database/d_air.js
  5. 66 6
      database/d_user.js
  6. 27 17
      db.md
  7. 14 0
      maps/field.js
  8. 76 4
      routes/flight_api.js

+ 28 - 0
controller/TimeUpdate.js

@@ -0,0 +1,28 @@
+// 自动更新数据库的支付状态
+const {getUnixTimeStamp} = require('../until/time')
+const db_user = require('../database/d_user')
+const handle = require("../until/handle");
+let orders = [];
+
+// 订单超过15分钟的自动过期
+let expire = 60 * 15;
+let timerHandle = null;
+
+// 每隔5秒遍历一次数据
+async function loadOrders(now,){
+    let [err,result] = await handle(db_user.waitPayOrder());
+}
+
+async function tick (){
+
+
+}
+
+
+function check(order){
+
+}
+
+
+console.log('检测订单')
+tick();

+ 5 - 0
controller/account.js

@@ -264,6 +264,11 @@ async function addCar(flightId,account){
     return result;
 }
 
+
+async function addOrder(){
+
+}
+
 module.exports = {
     register,
     changePhone,

+ 60 - 6
controller/c_flight.js

@@ -18,6 +18,7 @@ let offsetTime = 7 * 24 * 60 * 60;
 async function searchFlight(departureCity,targetCity,flightState,startUnixTime,endUnixTime){
     let [err,result] = await handle(db_air.flightSearch(...arguments));
     if(err){throw err}
+
     return result;
 }
 
@@ -43,7 +44,22 @@ async function flightInfo(flightId){
     if(!result.length){
         throw {rcode:codeMap.notFound,msg:'无法找到航班'}
     }
-    return result[0];
+    let flight = result[0];
+    flight.maxTotalVotes = parseInt(flight.col) * parseInt(flight.row);
+    // 查找已经售出数量
+    [err,result] = await handle(db_air.flightOrder(flightId));
+    if(err){throw err}
+    let sold = result.reduce((acc,val)=>{
+        // 查看是否有部分退票
+        let ticketNum = parseInt(val.ticketNum);
+        let refundTick = 0;
+        if(val.refundTick){
+            refundTick =  val.refundTick.split(',').length;
+        }
+        return acc+(ticketNum - refundTick)
+    },0)
+    flight.pay = sold;
+    return flight;
 }
 
 async function searchFlights(state,options,page,limie){
@@ -79,13 +95,13 @@ async function searchFlights(state,options,page,limie){
  * @returns {Promise<*>}
  */
 async function addFlight(
-    flightName,airCode,
+    flightName,airId,
     originalPrice,currentPrice,
     sailingTime,langdinTime,
     totalVotes,departureCity,targetCity){
     let err,result,departCityType,targetCityType,routerType;
     // 检查参数
-    if(!flightName||!airCode||!originalPrice||!currentPrice||!sailingTime||!langdinTime||!totalVotes||!departureCity||!targetCity){
+    if(!flightName||!airId||!originalPrice||!currentPrice||!sailingTime||!langdinTime||!totalVotes||!departureCity||!targetCity){
         throw {rcode:codeMap.notParam,msg:``}
     }
     // 判断时间是否合法
@@ -111,7 +127,7 @@ async function addFlight(
     if(err){throw err}
     [err,result] = await handle(db_air.addFlight(
         flightName,
-        airCode,
+        airId,
         originalPrice,
         currentPrice,
         sailingTime,
@@ -164,7 +180,7 @@ async function updateFlight(flightId,updateOption){
         updateOptions.routeType = routerType;
     }
     updateOptions.flightName = updateOption.flightName;
-    updateOptions.airCode = updateOption.airCode;
+    updateOptions.airId = updateOption.airId;
     updateOptions.originalPrice = updateOption.originalPrice;
     updateOptions.currentPrice = updateOption.currentPrice;
     updateOptions.sailingTime = updateOption.sailingTime;
@@ -194,6 +210,41 @@ async function news(nums){
     return result;
 }
 
+/**
+ * 新增飞机
+ * @param airCode
+ * @param row
+ * @param col
+ * @returns {Promise<*>}
+ */
+async function addAir(airCode,row,col){
+    let [err,result] = await handle(db_air.addAir(airCode,row,col));
+    if(err){throw err}
+    return result;
+}
+
+/**
+ * 飞机列表
+ * @param state
+ * @returns {Promise<*>}
+ */
+async function airs(state){
+    let [err,result] = await handle(db_air.airs(state));
+    if(err){throw err}
+    return result;
+}
+
+async function updateAir(airId,updateParam){
+    let param = {
+        airCode:updateParam.airCode,
+        col:updateParam.col,
+        row:updateParam.row,
+    }
+    let [err,result] = await handle(db_air.updateAir(airId,param));
+    if(err){throw err}
+    return result;
+}
+
 module.exports = {
     searchFlight,
     flightList,
@@ -201,5 +252,8 @@ module.exports = {
     updateFlight,
     flightInfo,
     news,
-    searchFlights
+    searchFlights,
+    addAir,
+    airs,
+    updateAir
 }

+ 107 - 18
database/d_air.js

@@ -9,27 +9,89 @@ const {loadFlights} = require("./d_recommend");
 // 查询指定城市航班
 
 
+/**
+ * 获取飞机列表
+ * @param [state] 飞机状态,默认为
+ * @returns {Promise | Promise<unknown>}
+ */
+function airs(state){
+    let sql=``,values=[];
+    sql = `select * from air`;
+    if(state == 1 || state == 2){
+        sql+= ` where state = ?`
+        values.push(state)
+    }
+    sql+=';';
+    return mysql.pq(sql,values);
+}
+
+/**
+ * 新增飞机
+ * @param airCode
+ * @param row
+ * @param col
+ * @returns {Promise | Promise<unknown>}
+ */
+function addAir(airCode,row,col){
+    let sql=``,values=[];
+    sql = `insert into air(airCode,\`row\`,col) values(?,?,?)`;
+    sql+=';';
+    values.push(...arguments);
+    return mysql.pq(sql,values);
+}
+
+/**
+ * 更新飞机
+ * @param airId 飞机id
+ * @param params 要修改的飞机信息
+ * @returns {Promise | Promise<unknown>}
+ */
+function updateAir(airId,params){
+    let sql=`update air set`,values=[];
+    let fields = Object.keys(params);
+    fields = fields.filter(field=>params[field])
+    if(fields.length<1){
+        throw {rcode:code.notParam}
+    }
+    for(let field of fields) {
+        if (!params[field]) {
+            continue;
+        }
+        if(values.length>0){sql+=','}
+        sql+=` \`${field}\` = ?`
+        values.push(params[field])
+    }
+    sql+=` where id=?`;
+    values.push(airId)
+    return mysql.pq(sql,values);
+}
+
+
 /**
  * 查询相关航班信息
  * @param departureCity 除非城市id
  * @param targetCity 目标城市id
- * @param [routeType] 航班类型,国内或者国际
+ * @param [flightState] 航班类型,国内或者国际
  * @param [startUnixTime] 出发时间开始,某个时间点之前
  * @param [endUnixTime] 出发时间截止,某个时间段内的
  * @returns {Promise | Promise<unknown>}
  */
 function flightSearch(departureCity,targetCity,flightState,startUnixTime,endUnixTime){
     let sql=``,values=[];
-    sql = `select f.id,f.originalPrice,f.currentPrice,f.sailingTime,f.langdinTime ,dep.cityname as departureCityName,tar.cityname as targetCityName
+    sql = `select 
+                f.id,f.originalPrice,f.currentPrice,f.sailingTime,f.langdinTime ,
+                air.airCode,air.row,air.col
+                dep.cityname as departureCityName,tar.cityname as targetCityName
             from
             flight as f
+            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;
             where f.departureCity = ? and f.targetCity = ?`;
     values.push(departureCity,targetCity);
-    if(routeType){
-        sql += ` and f.routerType = ?`;
-        values.push(routeType);
+    if(flightState){
+        sql += ` and f.flightState = ?`;
+        values.push(flightState);
     }
     if(endUnixTime){
         // 如果有结束时间,没有开始时间则默认添加
@@ -54,14 +116,37 @@ function flightSearch(departureCity,targetCity,flightState,startUnixTime,endUnix
  */
 function flightList(){
     let sql=``,values=[];
-    sql=`select f.* ,dep.cityname as departureCityName,tar.cityname as targetCityName
+    sql=`select f.* ,air.airCode,air.row,air.col,dep.cityname as departureCityName,tar.cityname as targetCityName
             from
             flight as f
+            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;`;
     return mysql.pq(sql,values);
 }
 
+/**
+ * 查询航班对应的订单,仅限新创建以及已经支付的,以及部分退票
+ * @param flightId 航班id
+ * @returns {Promise | Promise<unknown>}
+ */
+function flightOrder(flightId){
+    let sql=``,values=[];
+    sql+=`select * from orders where flightId = ? 
+        and (payState = ? or payState = ? or payState = ?)`
+    values.push(
+        flightId,
+        fields.payState_pay,
+        fields.payState_create,
+        fields.payState_rebates
+    );
+    return mysql.pq(sql,values);
+}
+
+
+
+
+
 /**
  * 航班具体信息
  * @param flightId
@@ -69,15 +154,15 @@ function flightList(){
  */
 function flightInfo(flightId){
     let sql=``,values=[];
-    sql+=`select ff.*,count(flightId = ? or null) as pay,
-            dep.cityname as departureCityName,tar.cityname as targetCityName
-            from 
-            (select * from flight where id = ?) as ff
-            LEFT JOIN (select id,cityName from area ) as dep on dep.id = ff.departureCity
-            LEFT JOIN (select id,cityName from area ) as tar on tar.id = ff.targetCity,
-            airTickets as t 
-            where t.payState != '1' and t.payState != '4';`
-    values.push(flightId,flightId)
+    sql+=`select f.*,
+        air.airCode,air.row,air.col,
+        dep.cityname as departureCityName,tar.cityname as targetCityName
+        from 
+        (select * from flight where id = ?) as f
+        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`
+    values.push(flightId)
     return mysql.pq(sql,values);
 }
 
@@ -112,7 +197,7 @@ function flightTicks(flightId){
  * @returns {Promise<unknown>}
  */
 function addFlight(flightName,
-                   airCode,
+                   airId,
                    originalPrice,
                    currentPrice,
                    sailingTime,
@@ -123,7 +208,7 @@ function addFlight(flightName,
                    targetCity){
     let sql = ``,values = [];
     sql = `insert into flight 
-    (flightName,airCode,originalPrice,currentPrice,
+    (flightName,airId,originalPrice,currentPrice,
     sailingTime,langdinTime,
     totalVotes,routeType,
     departureCity,targetCity
@@ -272,5 +357,9 @@ module.exports = {
     flightInfo,
     wicketFlights,
     searchFlights,
-    sellFlights
+    sellFlights,
+    flightOrder,
+    airs,
+    addAir,
+    updateAir
 }

+ 66 - 6
database/d_user.js

@@ -133,8 +133,8 @@ function addTravel(userId,name,card,phone,defaultState){
 }
 // 获取乘机人
 function travels(userId){
-    let sql = `select * from travel where userId = ?`;
-    let values = [userId];
+    let sql = `select * from travel where userId = ? and delete = ?`;
+    let values = [userId,fields.travelDelete_notDelete];
     return mysql.pq(sql,values);
 }
 
@@ -168,6 +168,7 @@ function changeTravel(travelId,params){
         if (!params[field]) {
             continue;
         }
+        if(values.length>0){sql+=','}
         sql+=` ${field} = ?`
         values.push(params[field])
     }
@@ -179,9 +180,9 @@ function changeTravel(travelId,params){
 }
 
 // 修改乘机人
-function removeTravel(travelId,name,card,phone,defaultState){
-    let sql = `delete from travel where id = ?`;
-    let values = [travelId];
+function removeTravel(travelId){
+    let sql = `update travel set travel.delete = ? where travelId =?`;
+    let values = [fields.travelDelete_notDelete,travelId];
     return mysql.pq(sql,values);
 }
 
@@ -205,6 +206,64 @@ function removeCar(carId){
     return mysql.pq(sql,values);
 }
 
+
+function userOrder(userId,payState){
+    let sql=``,values=[];
+    sql+=`
+        select 
+        o.*,air.airCode,
+        f.sailingTime,f.langdinTime,f.flightState,f.flightName,
+        dep.cityname as departureCityName,
+        tar.cityname as targetCityName
+        from 
+        orders as o 
+        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;
+        where userId = ?
+       `
+    values.push(userId);
+    if (payState){
+        sql+=` and payState = ?`;
+        values.push(payState);
+    }
+    return mysql.pq(sql,values);
+}
+
+function addOrder(userId,flightId,travelIds,createTime){
+    let sql=``,values=[];
+    sql+=`insert into order(userId,flightId,ticketNum,travelIds,createTime)`;
+    values.push(userId,flightId);
+    values.push(travelIds.length);
+    values.push(travelIds.join(','));
+    values.push(createTime);
+    return mysql.pq(sql,values);
+}
+
+/**
+ * 用户支付订单
+ * @param orderId
+ * @returns {Promise | Promise<unknown>}
+ */
+function payOrder(orderId){
+    let sql=``,values=[];
+    sql+=`update orders set payState = ? where id = orderId`
+    values.push(fields.payState_pay,orderId);
+    return mysql.pq(sql,values);
+}
+
+/**
+ * 获取平台上所有等待支付的订单
+ * @returns {Promise | Promise<unknown>}
+ */
+function waitPayOrder(){
+    let sql=``,values=[];
+    sql+=`select * from orders where payState = ?`
+    values.push(fields.payState_create);
+    return mysql.pq(sql,values);
+}
+
 module.exports =  {
     register,
     login,
@@ -222,5 +281,6 @@ module.exports =  {
     travels,
     travelInfo,
     changeAllTravelState,
-    changeTravel
+    changeTravel,
+    waitPayOrder
 }

+ 27 - 17
db.md

@@ -22,15 +22,7 @@
 | accountState | char | 1   | 账号状态,封禁 |
 | createTime | date | now | 创建时间  |
 
-## 乘机人 travel
-| 字段  | 类型  | 默认值 | 可选值| 备注    |
-|-----|-----|-----|---|-------|
-| id | int | | | |
-| userId | int | | | 用户id |
-| name | varchar | '' | '' | 乘机人名字 |
-| phone | varchar | '' |'' | 手机号 |
-| card | varchar | '' |'' | 乘机人身份证 |
-| default | char(2) | 1 | 1默认 2非默认 |是否为默认 |
+
 
 ## 地区表 area
 | 字段        | 类型      | 默认值  | 可选值 | 备注  |
@@ -48,6 +40,7 @@
 | airCode | varcahr | 255 | '' | 飞机名称 |
 | row | int | 1 | 15 | 一共有多少排 |
 | col | int | 1 | 5 | 一排几个座位 |
+| state | char(2) | 1 | 1(启用) 2(暂停使用) | 飞机状态 |
 
 ## 航班表flight(管理员通过航线创建航班),需要输入价格和指定飞机和起飞时间
 | 字段           | 类型      | 默认值 | 可选值                      | 备注     |
@@ -63,27 +56,44 @@
 | routeType    | char | 1 | 1(国内),2(国际) | 航线类型,是否为跨国航线,程序自动生成 | 
 | departureCity | int  | null | n           | 出发城市          |
 | targetCity   | int  | null | n           | 目标城市          |
-| flightName   | varchar | '' | '' | 航班名称 | 
+| flightName   | varchar | '' | '' | 航班名称 |
+
+## 乘机人 travel
+| 字段  | 类型  | 默认值 | 可选值| 备注    |
+|-----|-----|-----|---|-------|
+| id | int | | | |
+| userId | int | | | 用户id |
+| name | varchar | '' | '' | 乘机人名字 |
+| phone | varchar | '' |'' | 手机号 |
+| card | varchar | '' |'' | 乘机人身份证 |
+| default | char(2) | 1 | 1默认 2非默认 |是否为默认 |
+| delete | char(1) | 2 | 1删除 2未删除 | 是否删除 |
 
-## 订单表 orders 
+## 订单表 orders (需要半小时支付)
 | 字段       | 类型      | 默认值 | 可选值 | 备注                  |
 |----------|---------|----|-----|---------------------|
 | id       | int     | pk | n   | id |
-| payState | char | 1 | 1(创建,待支付),2(已经支付),3(等待值机,值机后不允许进行),3(订单结束,航班已经到站),4(取消),5(已经退款) | 机票状态|
+| payState | char | 1 | 1(创建,待支付),2(已经支付),3(订单结束,航班已经到站),4(取消,或者超时),5(已经退款),6(部分退款) | 订单状态 |
 | userId | int | pk | n   | 用户id |
 | flightId | int | pk | n | 航班id |
+| ticketNum | int | 1 | 1-200 | 够票数量 |
 | createTime | date | now | now | 创建时间 |
 | payTime | date | null | null | 支付时间 |
+| travelIds | varchar |  |  | 乘机人列表 |
+| refundTick | varchar | | | 退款的机票id | 
+| payPrice | floor | n | 0-9999 | 订单价格 |
 
 
-## 机票表 airTickets
+## 机票表 airTicket (需要选坐,多机票订单不允许)
 | 字段       | 类型      | 默认值 | 可选值 | 备注                  |
 |----------|---------|----|-----|---------------------|
 | id       | int     | pk | n   | id |
-| flightId | int | pk | n   | 航班id |
-| createTime | date | now | now | 创建时间 |
-| payTime | date | null | null | 支付时间 |
-
+| orderId | int | pk | n   | 订单id |
+| travel | int | pk | n | 乘机人id |
+| ticketState | char(2) | 1 | 1(已经创建) 2(已经值机) 3(等待飞行) 4(退款) | 机票状态 |
+| line | int | n | 1-24 | 座位排数 |
+| row | int | n | 1-6 | 座位列数 |
+| cussTime | int | n | n | 值机时间 |
 
 ## 购物车 car
 | 字段       | 类型      | 默认值 | 可选值 | 备注                  |

+ 14 - 0
maps/field.js

@@ -24,4 +24,18 @@ module.exports = {
     // 设置
     travelState_isDefault: 1,
     travelState_notDefault: 2,
+    // 未删除的乘机人
+    travelDelete_notDelete: 2,
+    // 订单已经创建,暂时未支付
+    payState_create: 1,
+    // 已经支付
+    payState_pay: 2,
+    // 订单结束
+    payState_end: 3,
+    // 订单取消
+    payState_cancel: 4,
+    // 全部退款
+    payState_refund: 5,
+    // 部分机票退款
+    payState_rebates: 6,
 }

+ 76 - 4
routes/flight_api.js

@@ -87,7 +87,7 @@ router.post('/add',
     paramsCheck({
         post:{
             flightName:{required:true},
-            airCode:{required:true},
+            airId:{required:true},
             originalPrice:{required:true},
             currentPrice:{required:true},
             sailingTime:{required:true},
@@ -101,7 +101,7 @@ router.post('/add',
         try{
             let results = await c_flight.addFlight(
                 req.body.flightName,
-                req.body.airCode,
+                req.body.airId,
                 req.body.originalPrice,
                 req.body.currentPrice,
                 req.body.sailingTime,
@@ -137,8 +137,6 @@ router.post('/update',
     }),
     async (req,res)=>{
         try{
-            console.log()
-
             let results = await c_flight.updateFlight(req.body.flightId, req.body.newOption);
             res.json({
                 rcode: code.ok,
@@ -249,4 +247,78 @@ router.post('/state',
         }
 })
 
+router.get('/airs',
+    async (req,res)=>{
+        try{
+            let results = await c_flight.airs(req.query.state);
+            res.json({
+                rcode: code.ok,
+                data: results
+            })
+        }catch (error) {
+            if (error.rcode !== code.customError) {
+                console.log(error);
+            }
+            res.json({
+                rcode: error.rcode || code.serverError,
+                msg: error.msg || error.message
+            });
+        }
+    })
+
+router.post('/air/add',
+    checkLogin(field.adminType),
+    paramsCheck({
+        post:{
+            airCode:{required:true},
+            col:{required:true},
+            row:{required:true},
+        }
+    }),
+    async (req,res)=>{
+        try{
+            let results = await c_flight.addAir(req.body.airCode,
+                req.body.row,req.body.col);
+            res.json({
+                rcode: code.ok,
+                data: results
+            })
+        }catch (error) {
+            if (error.rcode !== code.customError) {
+                console.log(error);
+            }
+            res.json({
+                rcode: error.rcode || code.serverError,
+                msg: error.msg || error.message
+            });
+        }
+    })
+
+router.post('/air/change',
+    checkLogin(field.adminType),
+    paramsCheck({
+        post:{
+            airId:{required:true},
+            params:{required:true},
+        }
+    }),
+    async (req,res)=>{
+        try{
+            let results = await c_flight.updateAir(req.body.airId,
+                req.body.params);
+            res.json({
+                rcode: code.ok,
+                data: results
+            })
+        }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;