diff --git a/controllers/callback_controller.go b/controllers/callback_controller.go index 2783e3e..81161af 100644 --- a/controllers/callback_controller.go +++ b/controllers/callback_controller.go @@ -1,8 +1,11 @@ package controllers import ( + "bytes" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-print/globals" "git.rosy.net.cn/jx-print/services" + "git.rosy.net.cn/jx-print/services/api" "github.com/gin-gonic/gin" "io/ioutil" ) @@ -21,4 +24,10 @@ func (t *CallbackController) Msg(c *gin.Context) { func (t *CallbackController) TlPayCallback(c *gin.Context) { data, _ := ioutil.ReadAll(c.Request.Body) globals.SugarLogger.Debugf("TlPayCallback msg: %v", string(data)) + c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) + if call, err := api.TLpayAPI.GetCallbackMsg(c.Request); err == nil { + globals.SugarLogger.Debugf("tonglianapi callback callbackResponse:%s", utils.Format4Output(call, true)) + services.PayTLCallback(call) + } + c.JSON(200, &CallBack{}) } diff --git a/dao/print_dao.go b/dao/print_dao.go index ee50045..49d6f19 100644 --- a/dao/print_dao.go +++ b/dao/print_dao.go @@ -7,7 +7,7 @@ import ( "time" ) -func GetPrinters(db *sqlx.DB, appID int, printNo string, status int, statusNeq int, flowFlag int) (printers []*model.Printer, err error) { +func GetPrinters(db *sqlx.DB, appID int, printNo string, status, statusNeq, flowFlag int) (printers []*model.Printer, err error) { sql := ` SELECT * FROM printer @@ -150,3 +150,27 @@ func GetPrintMessagesPage(db *sqlx.DB, printNo, msgID, beginAt, endAt string, of } return page, err } + +func GetPrinter(db *sqlx.DB, printNo, iccID string) (printer *model.Printer, err error) { + var ( + printers []*model.Printer + ) + sql := ` + SELECT * + FROM printer + WHERE 1 = 1 AND deleted_at = ? + ` + sqlParams := []interface{}{utils.DefaultTimeValue} + if printNo != "" { + sql += " AND print_no = ?" + sqlParams = append(sqlParams, printNo) + } + if iccID != "" { + sql += " AND icc_id = ?" + sqlParams = append(sqlParams, iccID) + } + if err = db.Select(&printers, sql, sqlParams...); err == nil && len(printers) > 0 { + return printers[0], err + } + return printer, err +} diff --git a/services/order.go b/services/order.go index 5df2cb7..8d064d8 100644 --- a/services/order.go +++ b/services/order.go @@ -54,6 +54,44 @@ var ( return err }, } + + payFinishedFunc = map[string]func(db *sqlx.DB, order *model.PayOrder) (err error){ + //冲流量,支付完了之后要充进去 + model.OrderTypeFlow: func(db *sqlx.DB, order *model.PayOrder) (err error) { + var ( + flowCfg []*model.FlowConfig + iccID = order.ThingID + flow float64 + unit string + now = time.Now() + monthBegin = utils.Str2Time(now.Format("2006-01") + "-01 00:00:00") + monthEnd = utils.Str2Time(monthBegin.AddDate(0, 1, 0).AddDate(0, 0, -1).Format("2006-01-02") + " 23:59:59") + ) + if config, err2 := dao.GetConfig(db, model.ConfigTypeSys, model.OrderTypeFlow); err2 == nil && config != nil { + if err = json.Unmarshal([]byte(config.Value), &flowCfg); err == nil && len(flowCfg) > 0 { + for _, v := range flowCfg { + if v.ID == utils.Str2Int(order.TypeID) { + flow, unit = v.Flow, v.Unit + break + } + } + } + } + err = FlowIncome(db, iccID, flow, unit) + //冲进去之后重新计算流量超标 + sumIncome, _ := dao.GetSimFlowIncomeSum(db, iccID, monthBegin, monthEnd) + sumExpend, _ := dao.GetSimFlowExpendSum(db, iccID, monthBegin, monthEnd) + if sumIncome != nil && sumExpend != nil { + if sumIncome.Flow-sumExpend.Flow <= 0 { + if printer, err := dao.GetPrinter(db, "", iccID); err == nil && printer != nil { + printer.FlowFlag = 1 + err = dao.Update(db, printer, "flow_flag") + } + } + } + return err + }, + } ) func CreateOrder(tokenInfo *model.TokenInfo, orderType, origin, thingID, typeID string) (orderID string, err error) { @@ -91,3 +129,39 @@ func Pay(tokenInfo *model.TokenInfo, orderID, payType, vendorPayType string) (or err = payFunc[payType](db, order, vendorPayType) return order, err } + +func PayTLCallback(call *tonglianpayapi.CallBackResult) (err error) { + var ( + db = globals.GetDB() + orderID = call.CusorderID + ) + if order, err := dao.GetOrder(db, orderID); err == nil { + if order.Status != model.OrderStatusWaitPay { + globals.SugarLogger.Debugf("already pay msg:%s, err:%v", utils.Format4Output(call, true), err) + return err + } + loc, _ := time.LoadLocation("Local") + t1, _ := time.ParseInLocation("20060102150405", call.PayTime, loc) + order.PayFinishedAt = &t1 + data, _ := json.Marshal(call) + dataStr := string(data) + order.OriginalData = &dataStr + if call.TrxStatus == tonglianpayapi.TrxStatusSuccess { + order.Status = model.OrderStatusPaid + } else { + order.Status = model.OrderStatusPayFail + } + dao.Update(db, order, "status", "pay_finished_at", "original_data") + if call.TrxStatus == tonglianpayapi.TrxStatusSuccess { + err = OnPayFinished(order) + } + } else { + globals.SugarLogger.Debugf("onTLpayFinished msg:%s, err:%v", utils.Format4Output(call, true), err) + } + return err +} + +func OnPayFinished(order *model.PayOrder) (err error) { + + return err +} diff --git a/services/sim.go b/services/sim.go index 400330b..93898be 100644 --- a/services/sim.go +++ b/services/sim.go @@ -8,6 +8,7 @@ import ( "git.rosy.net.cn/jx-print/model" putils "git.rosy.net.cn/jx-print/putils" "git.rosy.net.cn/jx-print/services/api" + "github.com/jmoiron/sqlx" "time" ) @@ -81,8 +82,7 @@ func SimFlowDaySettle() (err error) { //每月流量卡流量划转 func SimFlowMonthSettle() { var ( - db = globals.GetDB() - now = time.Now() + db = globals.GetDB() ) //..每月1号划转 if time.Now().Day() != 1 { @@ -92,16 +92,24 @@ func SimFlowMonthSettle() { printers, _ := dao.GetPrinters(db, 0, "", 0, 0, 0) for _, v := range printers { if v.IccID != "" { - flowIncome := &model.SimFlowIncome{ - IccID: v.IccID, - CreatedAt: &now, - UpdatedAt: &now, - LastOperator: "jxadmin", - IncomeType: model.FlowIncomeTypeJX, - Flow: 30, - FlowUnit: "MB", - } - dao.Insert(db, flowIncome) + FlowIncome(db, v.IccID, 30, "MB") } } } + +func FlowIncome(db *sqlx.DB, iccID string, flow float64, unit string) (err error) { + var ( + now = time.Now() + ) + flowIncome := &model.SimFlowIncome{ + IccID: iccID, + CreatedAt: &now, + UpdatedAt: &now, + LastOperator: "jxadmin", + IncomeType: model.FlowIncomeTypeJX, + Flow: 30, + FlowUnit: "MB", + } + dao.Insert(db, flowIncome) + return err +}