From 5697cdbcff4b1d966d2f5e41058920ee92694b63 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 09:47:02 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E9=98=B2=E6=AD=A2=E4=BA=AC=E4=B8=9C?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E9=87=8D=E5=A4=8D=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/jd/act.go | 56 +++++++++++++++++------------ 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index 2f69f6afd..668e21d05 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -18,6 +18,10 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) +const ( + actMapDuration = 2 * time.Hour +) + type LogicUpdateInfo struct { Item interface{} KVs map[string]interface{} @@ -31,6 +35,8 @@ var ( jdapi.PromotionStateCanceled: model.ActStatusCanceled, jdapi.PromotionStateEnded: model.ActStatusEnded, } + + actMap jxutils.SyncMapWithTimeout ) func splitPromotionSku(skus []*jdapi.PromotionSku, maxCount int) (skusList [][]*jdapi.PromotionSku) { @@ -62,22 +68,25 @@ func jdSkuActStatus2Jx(jdActState int) int { func CreatePromotionInfos(promotionType int, name string, beginDate, endDate time.Time, outInfoId, advertising, traceId string) (infoId int64, err error) { if globals.EnableJdStoreWrite { if promotionType == model.ActSkuDirectDown { - return getAPI("").CreatePromotionInfosSingle(name, beginDate, endDate, outInfoId, advertising, traceId) + infoId, err = getAPI("").CreatePromotionInfosSingle(name, beginDate, endDate, outInfoId, advertising, traceId) } else { - return getAPI("").CreatePromotionInfosLimitTime(name, beginDate, endDate, outInfoId, advertising, traceId) + infoId, err = getAPI("").CreatePromotionInfosLimitTime(name, beginDate, endDate, outInfoId, advertising, traceId) } } else { infoId = jxutils.GenFakeID() } + if err == nil { + actMap.StoreWithTimeout(infoId, 1, actMapDuration) + } return infoId, err } func CreatePromotionRules(promotionType int, infoId int64, outInfoId string, limitDevice, limitPin, limitCount, limitDaily int, traceId string) (err error) { if globals.EnableJdStoreWrite { if promotionType == model.ActSkuDirectDown { - return getAPI("").CreatePromotionRulesSingle(infoId, outInfoId, limitDevice, limitPin, limitCount, limitDaily, traceId) + err = getAPI("").CreatePromotionRulesSingle(infoId, outInfoId, limitDevice, limitPin, limitCount, limitDaily, traceId) } else { - return getAPI("").CreatePromotionRulesLimitTime(infoId, outInfoId, limitDevice, limitPin, limitCount, limitDaily, traceId) + err = getAPI("").CreatePromotionRulesLimitTime(infoId, outInfoId, limitDevice, limitPin, limitCount, limitDaily, traceId) } } return err @@ -133,9 +142,9 @@ func ConfirmPromotion(promotionType int, infoId int64, outInfoId, traceId string func CancelPromotion(promotionType int, infoId int64, outInfoId, traceId string) (err error) { if globals.EnableJdStoreWrite { if promotionType == model.ActSkuDirectDown { - return getAPI("").CancelPromotionSingle(infoId, outInfoId, traceId) + err = getAPI("").CancelPromotionSingle(infoId, outInfoId, traceId) } else { - return getAPI("").CancelPromotionLimitTime(infoId, outInfoId, traceId) + err = getAPI("").CancelPromotionLimitTime(infoId, outInfoId, traceId) } } return err @@ -144,9 +153,9 @@ func CancelPromotion(promotionType int, infoId int64, outInfoId, traceId string) func AdjustPromotionTime(promotionType int, infoId int64, outInfoId string, endDate time.Time, traceId string) (err error) { if globals.EnableJdStoreWrite { if promotionType == model.ActSkuDirectDown { - return getAPI("").AdjustPromotionTimeSingle(infoId, outInfoId, endDate, traceId) + err = getAPI("").AdjustPromotionTimeSingle(infoId, outInfoId, endDate, traceId) } else { - return getAPI("").AdjustPromotionTimeLimitTime(infoId, outInfoId, endDate, traceId) + err = getAPI("").AdjustPromotionTimeLimitTime(infoId, outInfoId, endDate, traceId) } } return err @@ -155,9 +164,9 @@ func AdjustPromotionTime(promotionType int, infoId int64, outInfoId string, endD func AdjustPromotionSku(promotionType int, infoId int64, outInfoId string, skus []*jdapi.PromotionSku, traceId string) (skusResult []*jdapi.PromotionSku, err error) { if globals.EnableJdStoreWrite { if promotionType == model.ActSkuDirectDown { - return getAPI("").AdjustPromotionSkuSingle(infoId, outInfoId, skus, traceId) + skusResult, err = getAPI("").AdjustPromotionSkuSingle(infoId, outInfoId, skus, traceId) } else { - return getAPI("").AdjustPromotionSkuLimitTime(infoId, outInfoId, skus, traceId) + skusResult, err = getAPI("").AdjustPromotionSkuLimitTime(infoId, outInfoId, skus, traceId) } } return skusResult, err @@ -312,19 +321,22 @@ func OnActMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { func (c *PurchaseHandler) onActMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { if msg.StatusID == jdapi.PromotionStatusSingleOK || msg.StatusID == jdapi.PromotionStatusLimitTimeOK { promotionID := msg.BillID - // 等几秒再执行的原因是防止通过后台自己创建时,本地还没有建好,消息就过来,导致重复记录 - // 可能的问题是在重启时丢失消息 - utils.AfterFuncWithRecover(5*time.Second, func() { - if !partner.CurActManager.IsVendorActExist(jxcontext.AdminCtx, promotionID, model.VendorIDJD) { - act, actStoreSkuList, err := getActFromJD(promotionID) - if err == nil && len(actStoreSkuList) > 0 { - _, err = partner.CurActManager.CreateActFromVendor(jxcontext.AdminCtx, act, actStoreSkuList) + intPromotionID := utils.Str2Int64(promotionID) + if _, ok := actMap.Load(intPromotionID); !ok { + utils.CallFuncAsync(func() { + if !partner.CurActManager.IsVendorActExist(jxcontext.AdminCtx, promotionID, model.VendorIDJD) { + act, actStoreSkuList, err := getActFromJD(promotionID) + if err == nil && len(actStoreSkuList) > 0 { + _, err = partner.CurActManager.CreateActFromVendor(jxcontext.AdminCtx, act, actStoreSkuList) + } + if err != nil { + retVal = jdapi.Err2CallbackResponse(err, promotionID) + } } - if err != nil { - retVal = jdapi.Err2CallbackResponse(err, promotionID) - } - } - }) + }) + } else { + actMap.Delete(intPromotionID) + } } return retVal } From b8a293c2965fe3646e3e250d821fad5df43c6554 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 11:00:49 +0800 Subject: [PATCH 02/11] up --- business/model/dao/store.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/business/model/dao/store.go b/business/model/dao/store.go index a603c7856..b5eff9d84 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -104,6 +104,9 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto storeDetail.AutoPickup = 1 storeDetail.DeliveryType = model.StoreDeliveryTypeByStore storeDetail.DeliveryCompetition = 1 + if vendorID == model.VendorIDJX { + storeDetail.IsSync = 1 + } } return storeDetail, nil } From 4e9d09657cd00028dd08dd8bc4d3abac41486e6a Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 11:05:26 +0800 Subject: [PATCH 03/11] up --- business/jxstore/act/act.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 05c8a5498..d70606856 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -81,6 +81,8 @@ func getVendorPriceFromStoreSkuBind(bind *model.StoreSkuBind, vendorID int) (ven vendorPrice = bind.MtwmPrice case model.VendorIDEBAI: vendorPrice = bind.EbaiPrice + case model.VendorIDJX: + vendorPrice = bind.JxPrice } return vendorPrice } From ed0f172865f9349eb6907be8aa18df71d4889dd8 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 11:15:14 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E4=BA=AC=E8=A5=BF=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E4=B8=8D=E8=AE=BE=E7=BD=AE=E5=90=8C=E6=AD=A5=E6=A0=87=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/act/act.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index d70606856..119d3a727 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -160,7 +160,9 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Ac wrongSkuList = append(wrongSkuList, v) continue } - actSkuMap.SyncStatus = model.SyncFlagNewMask + if !(vendorID == model.VendorIDJX || act.Type == model.ActSkuFake) { + actSkuMap.SyncStatus = model.SyncFlagNewMask + } if v.ActPrice != 0 { actSkuMap.ActualActPrice = v.ActPrice } else { @@ -430,11 +432,9 @@ func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules actMap := &model.ActMap{ ActID: act.ID, VendorID: vendorID, - - SyncStatus: model.SyncFlagNewMask, } - if act.Type == model.ActSkuFake { - actMap.SyncStatus = 0 + if !(vendorID == model.VendorIDJX || act.Type == model.ActSkuFake) { + actMap.SyncStatus = model.SyncFlagNewMask } dao.WrapAddIDCULDEntity(actMap, ctx.GetUserName()) actMapList = append(actMapList, actMap) From af7ba61bbcce5d041724c93cfcddc02a4d2b1aa6 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 11:47:33 +0800 Subject: [PATCH 05/11] bug fix --- business/jxcallback/scheduler/defsch/defsch.go | 2 +- business/model/dao/act.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 0da8d7bca..7f06ad3fe 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -31,7 +31,7 @@ const ( minute2Schedule3rdCarrier4Ebai = 30 // 饿百的最少转自配送需要的时间(分钟) minMinute2Schedule3rdCarrier = 5 // 转三方配送最少等待时间(分钟) - time2AutoPickupMin = 15 * time.Minute // 自动拣货等待时间,这个只有在没有PickDeadline信息才有用,否则会根据PickDeadline设置 + time2AutoPickupMin = 14 * time.Minute // 自动拣货等待时间,这个只有在没有PickDeadline信息才有用,否则会根据PickDeadline设置 second2AutoPickupGap = 60 //随机60秒 time2AutoPickupAhead = 20 * time.Second // 有最后拣货时间的提前值 diff --git a/business/model/dao/act.go b/business/model/dao/act.go index 5475f3a8f..47e2f013b 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -75,7 +75,7 @@ func GetActStoreSkuVendorList(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs pageSize = FormalizePageSize(pageSize) leftOrEmpty := "" - if len(vendorIDs) == 1 && vendorIDs[0] == -1 { + if len(vendorIDs) == 1 && (vendorIDs[0] == -1 || vendorIDs[0] == model.VendorIDJX) { leftOrEmpty = "LEFT" } sql := fmt.Sprintf(` From d0f59c3f4bfa08fe2c8a986c1da3141ff82d9ecb Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 12:00:07 +0800 Subject: [PATCH 06/11] fk --- business/model/dao/act.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/business/model/dao/act.go b/business/model/dao/act.go index 47e2f013b..a599d8d43 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -102,19 +102,19 @@ func GetActStoreSkuVendorList(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs actID, utils.DefaultTimeValue, } + if len(vendorIDs) > 0 { sql += " AND t2.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" sqlParams = append(sqlParams, vendorIDs) } - - sql += fmt.Sprintf(` - %s JOIN store_map t3 ON t3.store_id = t1.store_id AND t3.vendor_id = t2.vendor_id AND t3.deleted_at = ? + sql += ` + LEFT JOIN store_map t3 ON t3.store_id = t1.store_id AND t3.vendor_id = t2.vendor_id AND t3.deleted_at = ? JOIN sku t4 ON t4.id = t1.sku_id LEFT JOIN store_sku_bind t5 ON t5.sku_id = t1.sku_id AND t5.store_id = t1.store_id AND t5.deleted_at = ? LEFT JOIN store t6 ON t6.id = t1.store_id JOIN sku_name t7 ON t7.id = t4.name_id WHERE t1.act_id = ? - `, leftOrEmpty) + ` sqlParams = append(sqlParams, utils.DefaultTimeValue, utils.DefaultTimeValue, From 2d1bfa4c1e3ea553421778d34ba70007d5fe125c Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 16:16:54 +0800 Subject: [PATCH 07/11] +GetAvailableDeliverTime --- business/jxutils/jxutils_cms.go | 4 + business/partner/purchase/jx/localjx/order.go | 92 +++++++++++++++++-- .../partner/purchase/jx/localjx/order_test.go | 14 +++ controllers/jx_order2.go | 14 +++ routers/commentsRouter_controllers.go | 9 ++ 5 files changed, 127 insertions(+), 6 deletions(-) diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index 03d9d6951..8d6265932 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -119,6 +119,10 @@ func JxOperationTime2StrTime(value int16) string { return fmt.Sprintf("%02d:%02d", value/100, value%100) } +func JxOperationTime2TimeByDate(value int16, tm time.Time) (outTm time.Time) { + return utils.Str2TimeWithDefault(fmt.Sprintf("%s %02d:%02d:00", utils.Time2DateStr(tm), value/100, value%100), utils.DefaultTimeValue) +} + func GetPolygonFromCircle(lng, lat, distance float64, pointCount int) (points [][2]float64) { points = make([][2]float64, pointCount) for k := range points { diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index f37383608..2f4692242 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -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/business/partner/delivery" "git.rosy.net.cn/jx-callback/globals" ) @@ -19,7 +20,8 @@ const ( OrderCreateTypePre = 0 // 预创建 OrderCreateTypeNormal = 1 // 正常创建 - PayWaitingTime = 10 * time.Minute // 等待支付的最长时间 + PayWaitingTime = 10 * time.Minute // 等待支付的最长时间 + DingShiDaMinTime = 1 * time.Hour ) type JxSkuInfo struct { @@ -29,11 +31,12 @@ type JxSkuInfo struct { Price int64 `json:"price,omitempty"` // 原价 SalePrice int64 `json:"salePrice,omitempty"` // 售卖价 - Name string `json:"name"` + Name string `json:"name"` + Weight int `json:"weight"` } type JxOrderInfo struct { - BuyerComment string + BuyerComment string `json:"buyerComment"` StoreID int `json:"storeID"` Skus []*JxSkuInfo `json:"skus"` @@ -46,10 +49,33 @@ type JxOrderInfo struct { OrderID int64 `json:"orderID"` StoreName string `json:"storeName"` + Weight int `json:"weight"` +} + +type DeliveryTimeItem struct { + ViewTime string `json:"viewTime"` + UnixTime int64 `json:"unixTime"` + ViewShippingFee string `json:"viewShippingFee"` +} + +type DeliveryDayTimeInfo struct { + Date string `json:"date"` + TimeList []*DeliveryTimeItem `json:"timeList"` } var ( orderNoBeginTimestamp int64 + + weekdayMap = map[int]string{ + 1: "一", + 2: "二", + 3: "三", + 4: "四", + 5: "五", + 6: "六", + 7: "七", + } + dayList = []string{"今天", "明天"} ) func init() { @@ -89,6 +115,50 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType return orderPay, err } +func time2ShortTimeStr(t time.Time) string { + return t.Format("15:04") +} + +func GetAvailableDeliverTime(ctx *jxcontext.Context, storeID int) (deliverTimerList []*DeliveryDayTimeInfo, err error) { + db := dao.GetDB() + storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDJX) + if err != nil { + return nil, err + } + if storeDetail.Status != model.StoreStatusOpened { + return nil, fmt.Errorf("门店:%s不是营业状态,状态是:%s", storeDetail.Name, model.StoreStatusName[storeDetail.Status]) + } + + now := time.Now() + beginDate := utils.Time2Date(now) + minDingShiDaTime := now.Add(DingShiDaMinTime) + for i := 0; i < 2; i++ { + openTime1 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime1, beginDate) + closeTime1 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime1, beginDate) + openTime2 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime2, beginDate) + closeTime2 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime2, beginDate) + timeInfo := &DeliveryDayTimeInfo{ + Date: fmt.Sprintf("%s(周%s)", dayList[i], weekdayMap[int(beginDate.Weekday())]), + } + deliverTimerList = append(deliverTimerList, timeInfo) + for j := 0; j < 24*3; j++ { + deliveryTime := beginDate.Add(time.Duration(j) * 20 * time.Minute) + if deliveryTime.Sub(minDingShiDaTime) >= 0 { + if (deliveryTime.Sub(openTime1) >= 0 && deliveryTime.Sub(closeTime1) <= 0) || + (storeDetail.OpenTime2 > 0 && deliveryTime.Sub(openTime2) >= 0 && deliveryTime.Sub(closeTime2) <= 0) { + timeInfo.TimeList = append(timeInfo.TimeList, &DeliveryTimeItem{ + ViewTime: time2ShortTimeStr(deliveryTime), + UnixTime: deliveryTime.Unix(), + ViewShippingFee: "6.6元配送费", + }) + } + } + } + beginDate = beginDate.Add(24 * time.Hour) + } + return deliverTimerList, err +} + func OnPayFinished(orderPay *model.OrderPay) (err error) { order, err := partner.CurOrderManager.LoadOrder(orderPay.VendorOrderID, orderPay.VendorID) if err == nil { @@ -181,7 +251,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 } // 营业状态及时间检查 - if storeDetail.Status == model.StoreStatusDisabled { + if storeDetail.Status != model.StoreStatusOpened { // model.StoreStatusDisabled { return nil, nil, fmt.Errorf("门店:%s状态是:%s", storeDetail.Name, model.StoreStatusName[storeDetail.Status]) } checkTime := time.Now() @@ -191,6 +261,9 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 } } else { checkTime = *jxOrder.ExpectedDeliveredTime + if checkTime.Sub(time.Now()) < DingShiDaMinTime { + return nil, nil, fmt.Errorf("预订单只能在1小时后") + } if utils.Time2Date(time.Now()).Sub(utils.Time2Date(checkTime)) > 24*time.Hour { return nil, nil, fmt.Errorf("预订单只能预定当天或第二天") } @@ -238,15 +311,22 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 Count: v.Count, Price: int64(storeSkuBind.JxPrice), SalePrice: int64(storeSkuBind.JxPrice), // todo 考虑活动价 + Weight: sku.Weight, Name: jxutils.ComposeSkuName(sku.Prefix, sku.Name, sku.Comment, sku.Unit, sku.SpecQuality, sku.SpecUnit, 0), } outJxOrder.Skus = append(outJxOrder.Skus, jxSku) outJxOrder.OrderPrice += int64(v.Count) * jxSku.SalePrice + outJxOrder.Weight = v.Count * jxSku.Weight } } } - outJxOrder.TotalPrice = outJxOrder.OrderPrice + outJxOrder.FreightPrice - outJxOrder.ActualPayPrice = outJxOrder.TotalPrice + + if outJxOrder.FreightPrice, _, err = delivery.CalculateDeliveryFee(dao.GetDB(), jxOrder.StoreID, "", + jxutils.StandardCoordinate2Int(deliveryAddress.Lng), jxutils.StandardCoordinate2Int(deliveryAddress.Lat), + model.CoordinateTypeMars, outJxOrder.Weight, checkTime); err == nil { + outJxOrder.TotalPrice = outJxOrder.OrderPrice + outJxOrder.FreightPrice + outJxOrder.ActualPayPrice = outJxOrder.TotalPrice + } return outJxOrder, deliveryAddress, err } diff --git a/business/partner/purchase/jx/localjx/order_test.go b/business/partner/purchase/jx/localjx/order_test.go index d9ee64cb1..6965e1146 100644 --- a/business/partner/purchase/jx/localjx/order_test.go +++ b/business/partner/purchase/jx/localjx/order_test.go @@ -3,10 +3,24 @@ package localjx import ( "testing" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/globals/testinit" ) +func init() { + testinit.Init() +} + func TestGenOrderNo(t *testing.T) { orderNo := GenOrderNo(jxcontext.AdminCtx) t.Log(orderNo) } + +func TestGetAvailableDeliverTime(t *testing.T) { + timeInfo, err := GetAvailableDeliverTime(jxcontext.AdminCtx, 100118) + if err != nil { + t.Fatal(err) + } + t.Log(utils.Format4Output(timeInfo, false)) +} diff --git a/controllers/jx_order2.go b/controllers/jx_order2.go index c82145403..102837b7e 100644 --- a/controllers/jx_order2.go +++ b/controllers/jx_order2.go @@ -44,3 +44,17 @@ func (c *JxOrderController) Pay4Order() { return retVal, "", err }) } + +// @Title 查询网络打印机状态 +// @Description 查询网络打印机状态 +// @Param token header string true "认证token" +// @Param storeID query int true "门店ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetAvailableDeliverTime [get] +func (c *JxOrderController) GetAvailableDeliverTime() { + c.callGetAvailableDeliverTime(func(params *tJxorderGetAvailableDeliverTimeParams) (retVal interface{}, errCode string, err error) { + retVal, err = localjx.GetAvailableDeliverTime(params.Ctx, params.StoreID) + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index a36fc41ca..20f0c80d2 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -592,6 +592,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"], + beego.ControllerComments{ + Method: "GetAvailableDeliverTime", + Router: `/GetAvailableDeliverTime`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxOrderController"], beego.ControllerComments{ Method: "Pay4Order", From e369341bdf401033bf34e46657f8245016dc8328 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 16:50:22 +0800 Subject: [PATCH 08/11] =?UTF-8?q?GetAvailableDeliverTime=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E2=80=9C=E7=AB=8B=E5=8D=B3=E9=80=81=E5=87=BA=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/jx/localjx/order.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 2f4692242..6c630c76f 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -137,8 +137,13 @@ func GetAvailableDeliverTime(ctx *jxcontext.Context, storeID int) (deliverTimerL closeTime1 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime1, beginDate) openTime2 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime2, beginDate) closeTime2 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime2, beginDate) - timeInfo := &DeliveryDayTimeInfo{ - Date: fmt.Sprintf("%s(周%s)", dayList[i], weekdayMap[int(beginDate.Weekday())]), + timeInfo := &DeliveryDayTimeInfo{} + if i == 0 { + timeInfo.TimeList = append(timeInfo.TimeList, &DeliveryTimeItem{ + ViewTime: "立即送出", + UnixTime: 0, + ViewShippingFee: "6.6元配送费", + }) } deliverTimerList = append(deliverTimerList, timeInfo) for j := 0; j < 24*3; j++ { From 026e73cc210dcee674249380178b194dded0130e Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 17:16:43 +0800 Subject: [PATCH 09/11] =?UTF-8?q?CreateOrder=E8=BF=94=E5=9B=9E=E7=9A=84?= =?UTF-8?q?=E5=95=86=E5=93=81=E5=88=97=E8=A1=A8=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/jx/localjx/order.go | 37 +++++++++++++++---- business/partner/purchase/jx/localjx/wxpay.go | 4 ++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 6c630c76f..b8bcc7435 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -4,6 +4,7 @@ import ( "crypto/md5" "fmt" "math" + "sort" "time" "git.rosy.net.cn/baseapi/utils" @@ -35,12 +36,29 @@ type JxSkuInfo struct { Weight int `json:"weight"` } +type JxSkuInfoList []*JxSkuInfo + +func (l JxSkuInfoList) Len() int { + return len(l) +} + +func (l JxSkuInfoList) Less(i, j int) bool { + if l[i].SkuID == l[j].SkuID { + return l[i].SalePrice < l[j].SalePrice + } + return l[i].SkuID < l[j].SkuID +} + +func (l JxSkuInfoList) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + type JxOrderInfo struct { BuyerComment string `json:"buyerComment"` StoreID int `json:"storeID"` Skus []*JxSkuInfo `json:"skus"` - ExpectedDeliveredTime *time.Time `orm:"type(datetime)" json:"expectedDeliveredTime"` // 预期送达时间 + ExpectedDeliveredTimestamp int64 `json:"expectedDeliveredTimestamp"` // 预期送达时间 TotalPrice int64 `json:"totalPrice"` // 单位为分 订单总价 FreightPrice int64 `json:"freightPrice"` // 单位为分 订单配送费 @@ -137,12 +155,14 @@ func GetAvailableDeliverTime(ctx *jxcontext.Context, storeID int) (deliverTimerL closeTime1 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime1, beginDate) openTime2 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime2, beginDate) closeTime2 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime2, beginDate) - timeInfo := &DeliveryDayTimeInfo{} + timeInfo := &DeliveryDayTimeInfo{ + Date: fmt.Sprintf("%s(周%s)", dayList[i], weekdayMap[int(beginDate.Weekday())]), + } if i == 0 { timeInfo.TimeList = append(timeInfo.TimeList, &DeliveryTimeItem{ ViewTime: "立即送出", UnixTime: 0, - ViewShippingFee: "6.6元配送费", + ViewShippingFee: "约6.6元配送费", }) } deliverTimerList = append(deliverTimerList, timeInfo) @@ -154,7 +174,7 @@ func GetAvailableDeliverTime(ctx *jxcontext.Context, storeID int) (deliverTimerL timeInfo.TimeList = append(timeInfo.TimeList, &DeliveryTimeItem{ ViewTime: time2ShortTimeStr(deliveryTime), UnixTime: deliveryTime.Unix(), - ViewShippingFee: "6.6元配送费", + ViewShippingFee: "约6.6元配送费", }) } } @@ -260,12 +280,12 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 return nil, nil, fmt.Errorf("门店:%s状态是:%s", storeDetail.Name, model.StoreStatusName[storeDetail.Status]) } checkTime := time.Now() - if jxOrder.ExpectedDeliveredTime == nil { + if jxOrder.ExpectedDeliveredTimestamp == 0 { if storeDetail.Status != model.StoreStatusOpened { return nil, nil, fmt.Errorf("门店:%s不是营业状态,状态是:%s", storeDetail.Name, model.StoreStatusName[storeDetail.Status]) } } else { - checkTime = *jxOrder.ExpectedDeliveredTime + checkTime = utils.Timestamp2Time(jxOrder.ExpectedDeliveredTimestamp) if checkTime.Sub(time.Now()) < DingShiDaMinTime { return nil, nil, fmt.Errorf("预订单只能在1小时后") } @@ -325,6 +345,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 } } } + sort.Sort(JxSkuInfoList(outJxOrder.Skus)) if outJxOrder.FreightPrice, _, err = delivery.CalculateDeliveryFee(dao.GetDB(), jxOrder.StoreID, "", jxutils.StandardCoordinate2Int(deliveryAddress.Lng), jxutils.StandardCoordinate2Int(deliveryAddress.Lat), @@ -362,8 +383,8 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd } order.OrderCreatedAt = order.StatusTime order.VendorUserID = order.UserID - if jxOrder.ExpectedDeliveredTime != nil { - order.ExpectedDeliveredTime = *jxOrder.ExpectedDeliveredTime + if jxOrder.ExpectedDeliveredTimestamp == 0 { + order.ExpectedDeliveredTime = utils.Timestamp2Time(jxOrder.ExpectedDeliveredTimestamp) order.BusinessType = model.BusinessTypeDingshida } else { order.ExpectedDeliveredTime = utils.DefaultTimeValue diff --git a/business/partner/purchase/jx/localjx/wxpay.go b/business/partner/purchase/jx/localjx/wxpay.go index 01ed71e43..6519d3edb 100644 --- a/business/partner/purchase/jx/localjx/wxpay.go +++ b/business/partner/purchase/jx/localjx/wxpay.go @@ -5,6 +5,7 @@ import ( "git.rosy.net.cn/baseapi/platformapi/wxpay" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" @@ -30,6 +31,9 @@ func pay4OrderByWX(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayTyp TimeStart: wxpay.Time2PayTime(payCreatedAt), // TimeExpire: wxpay.Time2PayTime(payCreatedAt.Add(PayWaitingTime)), } + if authInfo, err := ctx.GetV2AuthInfo(); err == nil && authInfo.GetAuthType() == weixin.AuthTypeMini { + param.OpenID = authInfo.GetAuthID() + } result, err := api.WxpayAPI.CreateUnifiedOrder(param) if err == nil { orderPay = &model.OrderPay{ From 6145142f584f8ed7d5d6886b2263298c07246c57 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 17:39:13 +0800 Subject: [PATCH 10/11] +model.OrderStatusPayed --- business/model/const.go | 4 ++-- business/partner/purchase/jx/localjx/order.go | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/business/model/const.go b/business/model/const.go index 7dc9d85f8..a20cce891 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -171,8 +171,8 @@ const ( OrderStatusUndoApplyCancel = -10 OrderStatusApplyCancel = -5 - OrderStatusUnknown = 0 - + OrderStatusUnknown = 0 + OrderStatusPayed = 2 // 已支付 OrderStatusNew = 5 // 新订单,实际是已经支付 OrderStatusAccepted = 10 // 已经接单,也即待出库,待拣货 OrderStatusFinishedPickup = 15 // 拣货完成 diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index b8bcc7435..40bd4b286 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -112,6 +112,7 @@ func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64, outJxOrder.OrderID = GenOrderNo(ctx) order, err2 := jxOrder2GoodsOrder(ctx, outJxOrder, deliveryAddress) if err = err2; err == nil { + order.Status = model.OrderStatusPayed partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) } } From 881cf8b51569307f96872a706dd5b45f4f2039d3 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 26 Nov 2019 17:59:18 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=AC=E4=B8=9C?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=95=86=E5=93=81=E6=97=B6=EF=BC=8C=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E4=BC=A0=E5=85=A5infoId=E4=B8=8EoutInfoId=E5=8F=82?= =?UTF-8?q?=E6=95=B0=EF=BC=88=E4=BA=AC=E4=B8=9C=E7=9A=84bug=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/jd/act.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index 668e21d05..c5d3a496e 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -198,7 +198,7 @@ func createSkuAct(ctx *jxcontext.Context, act *model.Act2, actStoreSku []*model. if err = err2; err == nil { vendorActID = utils.Int64ToStr(infoID) if err = CreatePromotionRules(act.Type, infoID, "", act.LimitUser, act.LimitUser, act.LimitCount, 1, traceInfo); err == nil { - if _, err = CreatePromotionSku(act.Type, infoID, "", storeSku2Jd(actStoreSku, model.IsSyncStatusNeedCreate), traceInfo); err == nil { + if _, err = CreatePromotionSku(act.Type, infoID, utils.Int2Str(act.ID), storeSku2Jd(actStoreSku, model.IsSyncStatusNeedCreate), traceInfo); err == nil { if err = ConfirmPromotion(act.Type, infoID, "", traceInfo); err == nil { for _, v := range actStoreSku { v.VendorActID = vendorActID