diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index b47c689e6..668b3c652 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -410,7 +410,7 @@ func checkPriceDefendOrderByStock(db *dao.DaoDB, storeID, skuID, stock, jxPrice var ( sumStock = 0 ) - priceDefends, _ := dao.GetPriceDefendOrder(db, "", []int{storeID}, []int{skuID}, []int{jxutils.GetDefendPriceIssue()}, 0, 1, 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) + priceDefends, _ := dao.GetPriceDefendOrder(db, "", []int{storeID}, []int{skuID}, []int{jxutils.GetDefendPriceIssue()}, 0, 1, 0, 1, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) if len(priceDefends) == 0 { return -1 } diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 58ea9c985..d0c9be128 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -1658,7 +1658,7 @@ func ChangeJxPriceByDiscountAct(ctx *jxcontext.Context) { } func checkPriceDefendOrderByPrice(db *dao.DaoDB, storeID, skuID, stock, jxPrice int) (realStock int) { - priceDefends, _ := dao.GetPriceDefendOrder(db, "", []int{storeID}, []int{skuID}, []int{jxutils.GetDefendPriceIssue()}, 0, 0, 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) + priceDefends, _ := dao.GetPriceDefendOrder(db, "", []int{storeID}, []int{skuID}, []int{jxutils.GetDefendPriceIssue()}, 0, 0, 0, 1, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) if len(priceDefends) == 0 { return -1 } diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 6ba8cf33e..501284bdc 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -1412,7 +1412,7 @@ func GetSupplySupportStoreSkus(db *DaoDB, fromDate, toDate time.Time, fromStoreI return getSupplySupportStoreSkusResult, err } -func GetPriceDefendOrder(db *DaoDB, vendorOrderID string, storeIDs, skuIDs, issues []int, defendPrice, isBuyNowPrice, isSuccess int, userID string, beginAt, EndAt time.Time, isDesc bool) (priceDefendOrders []*model.PriceDefendOrder, err error) { +func GetPriceDefendOrder(db *DaoDB, vendorOrderID string, storeIDs, skuIDs, issues []int, defendPrice, isBuyNowPrice, isSuccess, isPay int, userID string, beginAt, EndAt time.Time, isDesc bool) (priceDefendOrders []*model.PriceDefendOrder, err error) { sql := ` SELECT a.* FROM price_defend_order a @@ -1452,6 +1452,10 @@ func GetPriceDefendOrder(db *DaoDB, vendorOrderID string, storeIDs, skuIDs, issu sql += " AND a.is_success = ?" sqlParams = append(sqlParams, isSuccess) } + if isPay != -1 { + sql += " AND a.is_pay = ?" + sqlParams = append(sqlParams, isPay) + } if userID != "" { sql += " AND b.user_id = ?" sqlParams = append(sqlParams, userID) diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 145204f7f..4c7fbab95 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -115,6 +115,7 @@ type JxOrderInfo struct { OrderType int `json:"orderType"` IsBuyNowPrice int `json:"isBuyNowPrice"` IsPriceDefend int `json:"isPriceDefend"` + OrderID2 string `json:"-"` } type DeliveryTimeItem struct { @@ -324,9 +325,9 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType err = fmt.Errorf("支付方式:%d当前不支持", payType) } } else { - priceDefendOrders, _ := dao.GetPriceDefendOrder(db, utils.Int64ToStr(orderID), nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, -1, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) + priceDefendOrders, _ := dao.GetPriceDefendOrder(db, utils.Int64ToStr(orderID), nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, -1, 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) if len(priceDefendOrders) == 0 { - err = fmt.Errorf("未查询到订单!order_id: %v", orderID) + err = fmt.Errorf("未查询到待支付订单!order_id: %v", orderID) } order2 := &model.GoodsOrder{ VendorOrderID: priceDefendOrders[0].VendorOrderID, @@ -455,7 +456,7 @@ func OnPayFinished(orderPay *model.OrderPay) (err error) { // } } } else { - priceDefendOrders, _ := dao.GetPriceDefendOrder(dao.GetDB(), orderPay.VendorOrderID, nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, -1, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) + priceDefendOrders, _ := dao.GetPriceDefendOrder(dao.GetDB(), orderPay.VendorOrderID, nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, -1, 0, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) if len(priceDefendOrders) > 0 { priceDefendOrders[0].IsPay = model.YES dao.UpdateEntity(dao.GetDB(), priceDefendOrders[0], "IsPay") @@ -811,14 +812,17 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 outJxOrder.FreightPrice = 500 // } //如果是守价的订单,需要查询本期中该用户是否已经守价过,如果守价过就只算一次运费 - priceDefendOrders, _ := dao.GetPriceDefendOrder(db, "", nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, -1, deliveryAddress.UserID, utils.ZeroTimeValue, utils.ZeroTimeValue, false) - flag2 := false - for _, v := range priceDefendOrders { - if v.IsPay == model.YES { - flag2 = true + priceDefendOrders, _ := dao.GetPriceDefendOrder(db, "", nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, -1, 1, deliveryAddress.UserID, utils.ZeroTimeValue, utils.ZeroTimeValue, false) + if len(priceDefendOrders) > 0 { + flag2 := false + for _, v := range priceDefendOrders { + if v.StoreID != jxOrder.StoreID { + flag2 = true + } + } + if flag2 { + return nil, nil, fmt.Errorf("同一期不允许相同用户在不同门店进行守价!") } - } - if len(priceDefendOrders) > 0 && flag2 { outJxOrder.FreightPrice = 0 } } else { @@ -1938,36 +1942,71 @@ func GetSupplySupportStoreSkus(ctx *jxcontext.Context, fromDate, toDate string, return orderSkus, err } -func CreateOrderByPriceDefend(ctx *jxcontext.Context) { +func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) { var ( - db = dao.GetDB() + db = dao.GetDB() + userOrderMap = make(map[int64][]*model.PriceDefendOrder) ) - priceDefends, _ := dao.GetPriceDefendOrder(db, "", nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, 1, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) - if len(priceDefends) == 0 { - return - } - for _, v := range priceDefends { - jxOrder := &JxOrderInfo{ - BuyerComment: "守价订单", - StoreID: v.StoreID, - Skus: []*JxSkuInfo{ - &JxSkuInfo{ - SkuID: v.SkuID, - Count: v.Count, - }, - }, - IsPriceDefend: model.YES, - OrderID: utils.Str2Int64(v.VendorOrderID), + priceDefends, _ := dao.GetPriceDefendOrder(db, "", nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, 1, 1, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) + if len(priceDefends) > 0 { + for _, v := range priceDefends { + userOrderMap[v.AddressID] = append(userOrderMap[v.AddressID], v) } - if _, err := CreateOrder(ctx, jxOrder, v.AddressID, OrderCreateTypeNormal, 0, false); err == nil { - err = SettleDiscountActByPriceDefend(ctx, v) + for kk, vv := range userOrderMap { + if len(vv) == 1 { + jxOrder := &JxOrderInfo{ + BuyerComment: "守价订单", + StoreID: vv[0].StoreID, + Skus: []*JxSkuInfo{ + &JxSkuInfo{ + SkuID: vv[0].SkuID, + Count: vv[0].Count, + }, + }, + IsPriceDefend: model.YES, + OrderID: utils.Str2Int64(vv[0].VendorOrderID), + } + if _, err := CreateOrder(ctx, jxOrder, kk, OrderCreateTypeNormal, 0, false); err == nil { + err = SettleDiscountActByPriceDefend(ctx, vv[0], false) + } + } else { + var ( + skus []*JxSkuInfo + orderIDs []string + ) + jxOrder := &JxOrderInfo{ + BuyerComment: "守价订单", + StoreID: vv[0].StoreID, + IsPriceDefend: model.YES, + OrderID: GenOrderNo(ctx), + } + for _, priceDefend := range vv { + sku := &JxSkuInfo{ + SkuID: priceDefend.SkuID, + Count: priceDefend.Count, + } + skus = append(skus, sku) + orderIDs = append(orderIDs, priceDefend.VendorOrderID) + err = SettleDiscountActByPriceDefend(ctx, priceDefend, false) + } + jxOrder.Skus = skus + jxOrder.OrderID2 = strings.Join(orderIDs, ",") + if _, err := CreateOrder(ctx, jxOrder, kk, OrderCreateTypeNormal, 0, false); err == nil { + } + } } } - + priceDefends2, _ := dao.GetPriceDefendOrder(db, "", nil, nil, []int{jxutils.GetDefendPriceIssue()}, 0, -1, 0, 1, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false) + if len(priceDefends2) > 0 { + for _, v := range priceDefends2 { + err = SettleDiscountActByPriceDefend(ctx, v, true) + } + } + return err } //结算因京西折扣活动而参与守价的订单 -func SettleDiscountActByPriceDefend(ctx *jxcontext.Context, order *model.PriceDefendOrder) (err error) { +func SettleDiscountActByPriceDefend(ctx *jxcontext.Context, order *model.PriceDefendOrder, isFull bool) (err error) { var ( db = dao.GetDB() ) @@ -1977,7 +2016,11 @@ func SettleDiscountActByPriceDefend(ctx *jxcontext.Context, order *model.PriceDe if orderPay.Status == model.PayStatusYes { refundID := order.VendorOrderID if orderPay.PayType == model.PayTypeTL { - _, err = RefundOrderByTL(ctx, orderPay, refundID, int(order.ActualPayPrice-order.RealPrice), settleDiscountActRefundReason) + if !isFull { + _, err = RefundOrderByTL(ctx, orderPay, refundID, int(order.ActualPayPrice-order.RealPrice), settleDiscountActRefundReason) + } else { + _, err = RefundOrderByTL(ctx, orderPay, refundID, int(order.ActualPayPrice), settleDiscountActRefundReason) + } } } else { orderPay.Status = model.PayStatusCanceled @@ -1993,6 +2036,6 @@ func GetMyPriceDefendOrders(ctx *jxcontext.Context, fromTime, toTime string) (pr db = dao.GetDB() userID = ctx.GetUserID() ) - priceDefendOrders, err = dao.GetPriceDefendOrder(db, "", nil, nil, nil, 0, -1, -1, userID, utils.Str2Time(fromTime), utils.Str2Time(toTime), true) + priceDefendOrders, err = dao.GetPriceDefendOrder(db, "", nil, nil, nil, 0, -1, -1, -1, userID, utils.Str2Time(fromTime), utils.Str2Time(toTime), true) return priceDefendOrders, err }