打印机

This commit is contained in:
邹宗楠
2022-07-11 16:43:16 +08:00
parent 80c079db4e
commit ecdb628231
17 changed files with 64 additions and 61 deletions

View File

@@ -0,0 +1,191 @@
package print_server
import (
"encoding/json"
"git.rosy.net.cn/baseapi/platformapi/tonglianpayapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
"git.rosy.net.cn/jx-print/putils"
"git.rosy.net.cn/jx-print/services/api"
"github.com/jmoiron/sqlx"
"time"
)
var (
findOrderPayPriceMap = map[string]func(db *sqlx.DB, typeID string) (int64, error){
model.OrderTypeFlow: func(db *sqlx.DB, typeID string) (payPrice int64, err error) {
var flowCfg []*model.FlowConfig
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(typeID) {
payPrice = v.Price
break
}
}
}
} else {
err = err2
}
return payPrice, err
},
model.OrderTypeCardValid: func(db *sqlx.DB, typeID string) (payPrice int64, err error) {
var (
avgPrice int64
count = utils.Str2Int(typeID) //充卡有效期代表几个月
)
if config, err2 := dao.GetConfig(db, model.ConfigTypeSys, model.OrderTypeCardValid); err2 == nil && config != nil {
avgPrice = utils.Str2Int64(config.Value)
} else {
err = err2
}
return avgPrice * int64(count), err
},
}
payFunc = map[string]func(db *sqlx.DB, order *model.PayOrder, vendorPayType string) (err error){
model.PayTypeTL: func(db *sqlx.DB, order *model.PayOrder, vendorPayType string) (err error) {
param := &tonglianpayapi.CreateUnitorderOrderParam{
Trxamt: int(order.PayPrice),
NotifyUrl: "http://print.jxc4.com/callback/tlPayCallback",
Reqsn: order.OrderID,
PayType: vendorPayType,
}
//if vendorPayType != tonglianpayapi.PayTypeWxCode {
// return fmt.Errorf("暂不支持的支付类型vendorPayType :%s", vendorPayType)
//}
result, err := api.TLpayAPI.CreateUnitorderOrder(param)
if err == nil {
order.PrepayID = result.PayInfo
order.TransactionID = result.TrxID
err = dao.Update(db, order, "transaction_id", "prepay_id")
}
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, model.FlowIncomeTypeUser, order.OrderID)
//冲进去之后重新计算流量超标
sumIncome, _ := dao.GetSimFlowIncomeSum(db, iccID, monthBegin, monthEnd)
sumExpend, _ := dao.GetSimFlowExpendSum(db, iccID, monthBegin, monthEnd)
if sumIncome != nil && sumExpend != nil {
if printer, err := dao.GetPrinter(db, "", iccID); err == nil && printer != nil {
flowFlag := 0
if sumIncome.Flow-sumExpend.Flow <= 0 {
flowFlag = 1
}
printer.FlowFlag = flowFlag
err = dao.Update(db, printer, "flow_flag")
}
}
return err
},
model.OrderTypeCardValid: func(db *sqlx.DB, order *model.PayOrder) (err error) {
_, err = api.TibiotAPI.Submit(order.ThingID, utils.Str2Int(order.TypeID))
return err
},
}
)
func CreateOrder(tokenInfo *model.TokenInfo, orderType, origin, thingID, typeID string) (orderID string, err error) {
var (
db = globals.GetDB()
now = time.Now()
payPrice int64
)
if payPrice, err = findOrderPayPriceMap[orderType](db, typeID); err != nil {
return "", err
}
globals.SugarLogger.Debugf("CreateOrder payPrice: %v", payPrice)
orderID = utils.Int64ToStr(putils.GenOrderNo())
payOrder := &model.PayOrder{
CreatedAt: &now,
OrderID: orderID,
PayPrice: payPrice,
UserID: tokenInfo.User.UserID,
OrderType: orderType,
Origin: origin,
ThingID: thingID,
TypeID: typeID,
}
err = dao.Insert(db, payOrder)
return orderID, err
}
func Pay(tokenInfo *model.TokenInfo, orderID, payType, vendorPayType string) (order *model.PayOrder, err error) {
var (
db = globals.GetDB()
)
if order, err = dao.GetOrder(db, orderID); err != nil {
return order, err
}
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) {
var (
db = globals.GetDB()
)
err = payFinishedFunc[order.OrderType](db, order)
if err != nil {
order.Comment = err.Error()
dao.Update(db, order, "Comment")
}
return err
}