Merge remote-tracking branch 'origin/mark' into su

This commit is contained in:
苏尹岚
2019-11-21 11:49:01 +08:00
16 changed files with 300 additions and 51 deletions

View File

@@ -242,6 +242,7 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa
}
}
}
db := dao.GetDB()
err = func() (err error) {
if model.IsSyncStatusDelete(act.SyncStatus) {
for vendorActID := range vendorActInfoMap {
@@ -257,6 +258,10 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa
updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagModifiedMask))
} else if model.IsSyncStatusNew(act.SyncStatus) {
if act.VendorActID, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil {
if act.VendorActID != "" {
actMap := partner.Act2ActMap(act)
dao.UpdateEntity(db, actMap, "VendorActID")
}
return err
}
updateItems = append(updateItems, partner.ActStoreSku2Update(actStoreSkuList4Create, model.SyncFlagNewMask)...)
@@ -289,7 +294,6 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa
}
return err
}()
db := dao.GetDB()
// globals.SugarLogger.Debug(utils.Format4Output(updateItems, false))
_, err2 := dao.BatchUpdateEntityByKV(db, updateItems)
if err == nil {

View File

@@ -12,6 +12,7 @@ import (
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
)
const (
@@ -79,6 +80,8 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType
switch payType {
case model.PayTypeWX:
orderPay, err = pay4OrderByWX(ctx, order, vendorPayType)
dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName())
err = dao.CreateEntity(dao.GetDB(), orderPay)
default:
err = fmt.Errorf("支付方式:%d当前不支持", payType)
}
@@ -93,13 +96,13 @@ func OnPayFinished(orderPay *model.OrderPay) (err error) {
dao.UpdateEntity(db, orderPay)
order.Status = model.OrderStatusNew
order.StatusTime = *orderPay.PayFinishedAt
// OnOrderNew逻辑需要修改
// err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order))
err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order))
}
return err
}
func GenOrderNo(ctx *jxcontext.Context) (orderNo int64) {
const prefix = 88
const randPartNum = 1000
orderNo = time.Now().Unix() - orderNoBeginTimestamp
// fmt.Println(orderNo)
@@ -110,10 +113,17 @@ func GenOrderNo(ctx *jxcontext.Context) (orderNo int64) {
randPart += int(v) << ((k % 3) * 8)
}
orderNo += int64(randPart % randPartNum)
orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * 88
orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix
return orderNo
}
func GenRefundID(order *model.GoodsOrder) (refundID int64) {
const suffix = 100000
orderID := utils.Str2Int64(order.VendorOrderID) * suffix
orderID += int64(time.Now().Sub(order.OrderFinishedAt) / time.Minute)
return refundID
}
func formalizeSkus(skus []*JxSkuInfo) (outSkus []*JxSkuInfo) {
skuMap := make(map[int]int)
for _, v := range skus {
@@ -290,3 +300,72 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd
return order, err
}
func AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
var status int
if isAcceptIt {
status = model.OrderStatusAccepted
} else {
status = model.OrderStatusCanceled
}
return changeOrderStatus(order.VendorOrderID, status, "")
}
func PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
return changeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "")
}
func SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) {
return changeOrderStatus(order.VendorOrderID, model.OrderStatusDelivering, "")
}
func SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) {
return changeOrderStatus(order.VendorOrderID, model.OrderStatusFinished, "")
}
func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
if order.Status < model.OrderStatusDelivering {
orderPay := &model.OrderPay{
VendorOrderID: order.VendorOrderID,
VendorID: jxutils.GetPossibleVendorIDFromVendorOrderID(order.VendorOrderID),
Status: model.PayStatusYes,
}
orderPay.DeletedAt = utils.DefaultTimeValue
db := dao.GetDB()
if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "Status", "DeletedAt"); err == nil || dao.IsNoRowsError(err) {
if err == nil {
refundID := utils.Int64ToStr(GenRefundID(order))
orderPayRefund, err2 := refundOrderByWX(ctx, orderPay, refundID)
if err = err2; err == nil {
dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName())
err = dao.CreateEntity(dao.GetDB(), orderPay)
}
} else {
if order.Status >= model.OrderStatusNew {
globals.SugarLogger.Warnf("订单:%s找不到有效的支付方式", order.VendorOrderID)
}
}
if err == nil {
err = changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, reason)
}
}
} else {
err = fmt.Errorf("当前订单状态:%s不允许取消", model.OrderStatusName[order.Status])
}
return err
}
func changeOrderStatus(vendorOrderID string, status int, remark string) (err error) {
orderStatus := &model.OrderStatus{
VendorOrderID: vendorOrderID,
VendorID: model.VendorIDJX,
OrderType: model.OrderTypeOrder,
RefVendorOrderID: vendorOrderID,
RefVendorID: model.VendorIDJX,
VendorStatus: utils.Int2Str(status),
Status: status,
StatusTime: time.Now(),
Remark: remark,
}
return partner.CurOrderManager.OnOrderStatusChanged(orderStatus)
}

View File

@@ -9,6 +9,7 @@ import (
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
@@ -20,7 +21,7 @@ func pay4OrderByWX(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayTyp
payCreatedAt := time.Now()
param := &wxpay.CreateOrderParam{
Body: "",
NotifyURL: "http://callback.test.jxc4.com/wxpay/msg/",
NotifyURL: globals.WxpayNotifyURL,
OutTradeNo: order.VendorOrderID,
SpbillCreateIP: ctx.GetRealRemoteIP(),
TradeType: vendorPayType2WxpayType(vendorPayType),
@@ -40,14 +41,19 @@ func pay4OrderByWX(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayTyp
PayCreatedAt: payCreatedAt,
PrepayID: result.PrepayID,
CodeURL: result.CodeURL,
TotalFee: int(order.ActualPayPrice),
}
dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName())
err = dao.CreateEntity(dao.GetDB(), orderPay)
}
return orderPay, err
}
func OnWxPayCallback(msg *wxpay.CallbackMsg) (err error) {
switch msg.MsgType {
case wxpay.MsgTypePay:
err = onWxpayFinished(msg.Data.(*wxpay.PayResultMsg))
case wxpay.MsgTypeRefund:
err = onWxpayRefund(msg.Data.(*wxpay.RefundResultMsg))
}
return err
}
@@ -62,9 +68,59 @@ func onWxpayFinished(msg *wxpay.PayResultMsg) (err error) {
if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "PayType", "DeletedAt"); err == nil {
orderPay.VendorPayType = msg.TradeType
orderPay.PayFinishedAt = utils.Time2Pointer(wxpay.PayTime2Time(msg.TimeEnd))
orderPay.Status = model.PayStatusYes
orderPay.TransactionID = msg.TransactionID
orderPay.OriginalData = utils.Format4Output(msg, true)
if msg.ResultCode == wxpay.ResponseCodeSuccess {
orderPay.Status = model.PayStatusYes
} else {
orderPay.Status = model.PayStatusFailed
}
dao.UpdateEntity(db, orderPay)
err = OnPayFinished(orderPay)
if msg.ResultCode == wxpay.ResponseCodeSuccess {
err = OnPayFinished(orderPay)
}
}
return err
}
func onWxpayRefund(msg *wxpay.RefundResultMsg) (err error) {
orderPayRefund := &model.OrderPayRefund{
RefundID: msg.ReqInfoObj.OutRefundNo,
}
db := dao.GetDB()
if err = dao.GetEntity(db, orderPayRefund, "RefundID"); err == nil {
if msg.ResultCode == wxpay.ResponseCodeSuccess {
orderPayRefund.Status = model.PayStatusYes
} else {
orderPayRefund.Status = model.PayStatusFailed
}
orderPayRefund.OriginalData = utils.Format4Output(msg, true)
dao.UpdateEntity(db, orderPayRefund)
} else if dao.IsNoRowsError(err) {
globals.SugarLogger.Warnf("收到异常的退款事件, msg:%s", utils.Format4Output(msg, true))
}
return err
}
func refundOrderByWX(ctx *jxcontext.Context, orderPay *model.OrderPay, refundID string) (orderPayRefund *model.OrderPayRefund, err error) {
result, err := api.WxpayAPI.PayRefund(&wxpay.PayRefundParam{
OutTradeNo: orderPay.VendorOrderID,
NotifyURL: globals.WxpayNotifyURL,
OutRefundNo: refundID,
TotalFee: orderPay.TotalFee,
RefundFee: orderPay.TotalFee,
})
if err == nil {
orderPayRefund = &model.OrderPayRefund{
RefundID: refundID,
VendorRefundID: result.RefundID,
VendorOrderID: orderPay.VendorOrderID,
VendorID: orderPay.VendorID,
Status: model.PayStatusNo,
TransactionID: orderPay.TransactionID,
RefundFee: orderPay.TotalFee,
RefundCreatedAt: time.Now(),
}
}
return orderPayRefund, err
}

View File

@@ -7,6 +7,7 @@ import (
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx"
"git.rosy.net.cn/jx-callback/business/partner/purchase/jx/phpjx"
)
@@ -27,6 +28,8 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI
}
if model.IsOrderJXTemp(order) {
err = phpjx.NotifyOrderStatusChanged(order, status)
} else {
err = localjx.AcceptOrRefuseOrder(order, isAcceptIt, userName)
}
return err
}
@@ -34,6 +37,8 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI
func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
if model.IsOrderJXTemp(order) {
err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusFinishedPickup)
} else {
err = localjx.PickupGoods(order, isSelfDelivery, userName)
}
return err
}
@@ -61,6 +66,8 @@ func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName
func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) {
if model.IsOrderJXTemp(order) {
err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusDelivering)
} else {
err = localjx.SelfDeliverDelivering(order, userName)
}
return err
}
@@ -68,6 +75,8 @@ func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userNam
func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) {
if model.IsOrderJXTemp(order) {
err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusFinished)
} else {
err = localjx.SelfDeliverDelivered(order, userName)
}
return err
}
@@ -83,6 +92,8 @@ func (c *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *mod
func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
if model.IsOrderJXTemp(order) {
err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusCanceled)
} else {
err = localjx.CancelOrder(ctx, order, reason)
}
return err
}