diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 89bc4004b..cb876dc82 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -131,6 +131,11 @@ func (c *OrderManager) OnOrderAdjust(order *model.GoodsOrder, orderStatus *model // return err // }, "OnAdjustOrder delete order_sku, orderID:%s", order.VendorOrderID) order.AdjustCount = adjustCount + 1 + //扣点的订单需要修改订单的totalshopmoney + if err == nil && order.EarningType == model.EarningTypePoints { + order2, _ := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrgCode, order.VendorOrderID) + order.TotalShopMoney = order2.TotalShopMoney + } isDuplicated, err = c.SaveOrder(order, true, db) } if err == nil { @@ -1321,6 +1326,154 @@ func setJdsOrderSeq(order *model.GoodsOrder) (err error) { return err } +func MergeJdsOrders(ctx *jxcontext.Context, vendorOrderIDs []string) (vendorOrderIDJds string, err error) { + globals.SugarLogger.Debugf("jds MergeJdsOrders vendorOrderIDs: %v", vendorOrderIDs) + var ( + db = dao.GetDB() + orders []*model.GoodsOrder + orderSkus []*model.OrderSku + orderIDs []string + storeDuplicate = make(map[int]int) + storeID int + ) + for _, vendorOrderID := range vendorOrderIDs { + order, _ := dao.GetSimpleOrder(db, vendorOrderID) + if err != nil || order == nil { + return "", fmt.Errorf("未查询到该订单!订单号:[%v]", vendorOrderID) + } + if order.Status >= model.OrderStatusDelivering && order.Status != model.OrderStatusCanceled { + return "", fmt.Errorf("暂不支持此状态的订单进行转移!订单号:[%v]", vendorOrderID) + } + if order.VendorID != model.VendorIDJDShop { + return "", fmt.Errorf("暂不支持非京狗的订单进行转移!订单号:[%v]", vendorOrderID) + } + storeDuplicate[jxutils.GetSaleStoreIDFromOrder(order)] = jxutils.GetSaleStoreIDFromOrder(order) + orders = append(orders, order) + + //订单商品 + skus, _ := dao.GetSimpleOrderSkus(db, order.VendorOrderID, nil) + orderSkus = append(orderSkus, skus...) + + orderIDs = append(orderIDs, vendorOrderID) + } + if len(storeDuplicate) > 1 { + return "", fmt.Errorf("只能选择相同门店的订单进行合并!") + } else { + storeID = jxutils.GetSaleStoreIDFromOrder(orders[0]) + } + for _, order := range orders { + var waybill *model.Waybill + //将订单和运单取消 + waybills, err := dao.GetWaybills(db, order.VendorOrderID) + if err != nil { + return "", err + } + if len(waybills) > 0 { + for _, v := range waybills { + if v.Status != model.WaybillStatusCanceled { + waybill = v + } + } + if waybill != nil { + if waybill.WaybillVendorID != model.VendorIDJDWL { + if handler := partner.GetDeliveryPlatformFromVendorID(waybill.WaybillVendorID); handler != nil { + err = handler.Handler.CancelWaybill(waybill, 0, "订单合并被取消") + } + } + } + } + if err = jdshop.ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, "订单合并被取消"); err != nil { + return "", err + } + } + //重新构建order的数据 + storeMaps, err := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "") + if err != nil || len(storeMaps) == 0 { + return "", fmt.Errorf("该门店未绑定京狗平台,请先绑定后再转移!门店:[%v]", storeID) + } + stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "") + var ( + newEarningPrice int64 + actualPrice int64 + shopPrice int64 + salePrice int64 + totalShop int64 + ) + for _, v := range orders { + newEarningPrice += v.NewEarningPrice + actualPrice += v.ActualPayPrice + shopPrice += v.ShopPrice + salePrice += v.SalePrice + totalShop += v.TotalShopMoney + } + store := stores[0] + order := orders[0] + order.ID = 0 + order.NewEarningPrice = newEarningPrice + order.ActualPayPrice = actualPrice + order.SalePrice = salePrice + order.ShopPrice = shopPrice + order.TotalShopMoney = totalShop + order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(orders[0].VendorOrderID2)*10000) + utils.Int2Str(99) + order.VendorOrderID2 = strings.Join(orderIDs, ",") + order.Status = model.OrderStatusNew + setJdsOrderSeq(order) + if order.BusinessType == model.BusinessTypeImmediate { + var ( + opentime1 = jxutils.JxOperationTime2TimeByDate(store.OpenTime1, order.CreatedAt) + opentime2 = jxutils.JxOperationTime2TimeByDate(store.OpenTime2, order.CreatedAt) + closetime1 = jxutils.JxOperationTime2TimeByDate(store.CloseTime1, order.CreatedAt) + closetime2 = jxutils.JxOperationTime2TimeByDate(store.CloseTime2, order.CreatedAt) + orderCreatedAt = order.CreatedAt + ) + if store.OpenTime1 == 0 || store.CloseTime1 == 0 { + return "", fmt.Errorf("该门店没有营业时间,不能接单!门店:[%v]", storeID) + } + if !(orderCreatedAt.Sub(opentime1) >= 0 && orderCreatedAt.Sub(closetime1) <= 0) { + if store.OpenTime2 != 0 && store.CloseTime2 != 0 { + if !(orderCreatedAt.Sub(opentime2) >= 0 && orderCreatedAt.Sub(closetime2) <= 0) { + if orderCreatedAt.Sub(opentime1) < 0 { + order.ExpectedDeliveredTime = opentime1 + order.BusinessType = model.BusinessTypeDingshida + } else { + if orderCreatedAt.Sub(opentime2) < 0 { + order.ExpectedDeliveredTime = opentime2 + } else { + order.ExpectedDeliveredTime = opentime1.AddDate(0, 0, 1) + } + order.BusinessType = model.BusinessTypeDingshida + } + } + } else { + if orderCreatedAt.Sub(opentime1) < 0 { + order.ExpectedDeliveredTime = opentime1 + } else { + order.ExpectedDeliveredTime = opentime1.AddDate(0, 0, 1) + } + order.BusinessType = model.BusinessTypeDingshida + } + } + } + //结算类型 + if store.PayPercentage < 50 { + order.EarningType = model.EarningTypePoints + } else { + order.EarningType = model.EarningTypeQuote + } + if storeID != model.JdShopMainStoreID { + order.DeliveryFlag = model.NO + } + //skus + for _, sku := range orderSkus { + sku.VendorOrderID = order.VendorOrderID + sku.ID = 0 + } + order.Skus = orderSkus + err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) + vendorOrderIDJds = order.VendorOrderID + return vendorOrderIDJds, err +} + func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) (vendorOrderIDJds string, err error) { globals.SugarLogger.Debugf("jds TransferJdsOrder vendorOrderID: %v, storeID : %v", vendorOrderID, storeID) var ( @@ -1354,10 +1507,8 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) } if waybill != nil { if waybill.WaybillVendorID != model.VendorIDJDWL { - handler := partner.DeliveryPlatformHandlers[waybill.WaybillVendorID] - err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消") - if err != nil { - return "", err + if handler := partner.GetDeliveryPlatformFromVendorID(waybill.WaybillVendorID); handler != nil { + err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消") } } } @@ -1440,6 +1591,9 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) } suffix := utils.Str2Int(goodsOrders[0].VendorOrderID[12:len(goodsOrders[0].VendorOrderID)]) suffix++ + if len(order.VendorOrderID2) > 18 { + order.VendorOrderID2 = order.VendorOrderID2[0:12] + } order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(order.VendorOrderID2)*100000) + utils.Int2Str(suffix) } for _, sku := range skus { @@ -1553,7 +1707,10 @@ func AdjustJdsOrderSimple(ctx *jxcontext.Context, vendorOrderID string, skuID in ) orderSkus, err := dao.GetSimpleOrderSkus(db, vendorOrderID, []int{skuID}) order, err := dao.GetSimpleOrder(db, vendorOrderID) - + //如果不是商城模板店 + if jxutils.GetSaleStoreIDFromOrder(order) != model.JdShopMainStoreID { + return fmt.Errorf("目前只支持商城模板店的简单售前删除!") + } orderSkus2, err := dao.GetSimpleOrderSkus(db, vendorOrderID, nil) if len(orderSkus2) == 1 { return fmt.Errorf("这一单只剩这最后一个商品了,不允许删除!") @@ -1571,6 +1728,7 @@ func AdjustJdsOrderSimple(ctx *jxcontext.Context, vendorOrderID string, skuID in } else { _, err = dao.DeleteEntity(db, orderSku) } + return err } diff --git a/business/jxcallback/orderman/order_afs.go b/business/jxcallback/orderman/order_afs.go index 6cc91da54..1c5ca6fbf 100644 --- a/business/jxcallback/orderman/order_afs.go +++ b/business/jxcallback/orderman/order_afs.go @@ -100,6 +100,7 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode return err } } + dao.Commit(db) scheduler.CurrentScheduler.OnAfsOrderNew(afsOrder, false) return err @@ -261,7 +262,13 @@ func (c *OrderManager) updateAfsOrderSkuOtherInfo(db *dao.DaoDB, order *model.Af } } if len(vendorSkuIDs) > 0 { - l, err := dao.GetStoreSkuPriceAndWeight(db, order.VendorStoreID, order.VendorID, vendorSkuIDs) + var vendorStoreID string + if order.VendorID == model.VendorIDJDShop { + vendorStoreID = model.JdShopMainVendorStoreID + } else { + vendorStoreID = order.VendorStoreID + } + l, err := dao.GetStoreSkuPriceAndWeight(db, vendorStoreID, order.VendorID, vendorSkuIDs) if err != nil { globals.SugarLogger.Warnf("updateAfsOrderSkuOtherInfo orderID:%s failed with err:%v", order.VendorOrderID, err) return err diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index fc5ab3c29..3bf1bd679 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -64,11 +64,11 @@ type OrderCount struct { Flag bool `json:"flag"` //true表示可以买 } -func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours int, isIncludeFake bool) (countInfo []*model.GoodsOrderCountInfo, err error) { +func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours, lastMinutes int, isIncludeFake bool) (countInfo []*model.GoodsOrderCountInfo, err error) { globals.SugarLogger.Debugf("GetStoreOrderCountInfo storeID:%d", storeID) if lastHours > maxLastHours { lastHours = maxLastHours - } else if lastHours == 0 { + } else if lastHours == 0 && lastMinutes == 0 { lastHours = defLastHours } @@ -80,7 +80,12 @@ func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, l AND t1.order_created_at >= ?` sqlParams := []interface{}{ storeID, - time.Now().Add(-time.Duration(lastHours) * time.Hour), + // time.Now().Add(-time.Duration(lastHours) * time.Hour), + } + if lastMinutes != 0 { + sqlParams = append(sqlParams, time.Now().Add(-time.Duration(lastMinutes)*time.Minute)) + } else { + sqlParams = append(sqlParams, time.Now().Add(-time.Duration(lastHours)*time.Hour)) } if !isIncludeFake { sql += " AND (t1.flag & ?) = 0" diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index c6668a142..95e9f3328 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -5,6 +5,8 @@ import ( "strings" "time" + "git.rosy.net.cn/baseapi/platformapi/jdshopapi" + "git.rosy.net.cn/baseapi/platformapi/dingdingapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils/errlist" @@ -213,6 +215,37 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s flag = model.AfsOrderFlagRefuseUserRefund afsOrder.RefuseReason = reason partner.CurOrderManager.UpdateAfsOrderFields(afsOrder, []string{"RefuseReason"}) + } else { + if order, _ := partner.CurOrderManager.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID); order != nil { + if order.EarningType == model.EarningTypePoints { + var ( + skuMap = make(map[int]*model.OrderSku) + diff int64 + db = dao.GetDB() + ) + for _, sku := range order.Skus { + skuMap[sku.SkuID] = sku + } + storeDetail, _ := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID) + waybills, _ := dao.GetWaybills(db, order.VendorOrderID) + //京东商城和京西要重新算totalshopmoney等 + if order.VendorID == model.VendorIDJDShop || order.VendorID == model.VendorIDJX { + skus, _ := dao.GetAfsOrderSkuInfo(db, order.VendorOrderID, afsOrderID, order.VendorID, false) + for _, v := range skus { + if skuMap[v.SkuID] != nil { + diff += skuMap[v.SkuID].SalePrice * int64(v.Count) + } + } + order.TotalShopMoney = utils.Float64TwoInt64(float64(float64(order.TotalShopMoney)/jdshopapi.JdsPayPercentage-float64(diff)) * jdshopapi.JdsPayPercentage) + if len(waybills) > 0 { + jxutils.RefreshOrderEarningPrice3(order, storeDetail.PayPercentage, waybills[0]) + } else { + jxutils.RefreshOrderEarningPrice2(order, storeDetail.PayPercentage) + } + dao.UpdateEntity(db, order, "TotalShopMoney", "NewEarningPrice") + } + } + } } dao.SetAfsOrderFlag(dao.GetDB(), ctx.GetUserName(), afsOrderID, vendorID, flag) } diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 080bda43c..629ba16ff 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -422,7 +422,7 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod } } } - s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, curWaybill, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrOrderAlreadyFinished) + s.cancelOtherWaybills(savedOrderInfo, curWaybill, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrOrderAlreadyFinished) if status.Status >= model.OrderStatusEndBegin { s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status)) } diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index f49997f1d..a0ce88a6d 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -3455,3 +3455,82 @@ func UpdateStorePricePack(ctx *jxcontext.Context, storeID, vendorID int, pricePa } return err } + +func GetJdDeliveryArea(ctx *jxcontext.Context, storeIDs []int) (err error) { + type tmp struct { + JdID string `json:"jdID"` + S int `json:"s"` + } + type SpecialtyStoreSkus struct { + StoreID int `json:"门店ID"` + StoreName string `json:"门店名"` + City string `json:"城市"` + Area int `json:"面积"` + } + var ( + ss []*tmp + excelTitle = []string{ + "门店ID", + "门店名", + "城市", + "面积", + } + sheetList []*excel.Obj2ExcelSheetConfig + specialtyStoreSkus []*SpecialtyStoreSkus + downloadURL, fileName string + ) + storeMaps, _ := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDJD}, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "") + for _, v := range storeMaps { + time.Sleep(time.Second / 3) + station, err := jd.GetAPI("320406").GetDeliveryRangeByStationNo2(v.VendorStoreID) + if err != nil { + continue + } + if station.DeliveryRangeType == 2 { + strs := strings.Split(station.DeliveryRange, ";") + ss = append(ss, &tmp{ + JdID: v.VendorStoreID, + S: utils.Float64TwoInt(math.Ceil((jxutils.ComputeSignedArea(strs[:len(strs)-1])))), + }) + } + } + for i := 0; i < len(ss)-1; i++ { + for j := 0; j < len(ss)-1-i; j++ { + if ss[j].S > ss[j+1].S { + temp := ss[j] + ss[j] = ss[j+1] + ss[j+1] = temp + } + } + } + for _, v := range ss { + storeDetail, _ := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), v.JdID, model.VendorIDJD) + place, _ := dao.GetPlaceByCode(dao.GetDB(), storeDetail.CityCode) + specialtyStoreSku := &SpecialtyStoreSkus{ + StoreID: storeDetail.ID, + StoreName: storeDetail.Name, + City: place.Name, + Area: v.S, + } + specialtyStoreSkus = append(specialtyStoreSkus, specialtyStoreSku) + } + excelConf := &excel.Obj2ExcelSheetConfig{ + Title: "sheet1", + Data: specialtyStoreSkus, + CaptionList: excelTitle, + } + sheetList = append(sheetList, excelConf) + if excelConf != nil { + downloadURL, fileName, err = jxutils.UploadExeclAndPushMsg(sheetList, "面积") + } else { + baseapi.SugarLogger.Debug("WriteToExcel: dataSuccess is nil!") + } + if err != nil { + baseapi.SugarLogger.Errorf("WriteToExcel:upload %s , %s failed error:%v", fileName, err) + } else { + noticeMsg := fmt.Sprintf("[详情点我]%s/billshow/?normal=true&path=%s \n", globals.BackstageHost, downloadURL) + ddmsg.SendUserMessage(dingdingapi.MsgTyeText, ctx.GetUserID(), "异步任务完成", noticeMsg) + baseapi.SugarLogger.Debug("WriteToExcel: dataSuccess downloadURL: [%v]", downloadURL) + } + return err +} diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 7273ffd02..7ba20c673 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -4721,6 +4721,7 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku } return storeSkuAudits2, "", err } + deletedDuplicateWaitAuditData(ctx, db) task := tasksch.NewParallelTask("StoreSkuPriceAudit", tasksch.NewParallelConfig().SetParallelCount(5).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { storeAudit := batchItemList[0].(*model.StoreSkuAudit) @@ -4801,6 +4802,45 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku return nil, hint, err } +func deletedDuplicateWaitAuditData(ctx *jxcontext.Context, db *dao.DaoDB) { + var ( + duplicateDatas []*model.StoreSkuAudit + duplicateStore = make(map[int][]*model.StoreSkuAudit) + ) + sql := ` + SELECT a.* + FROM store_sku_audit a , + ( + SELECT count(*), store_id ,name_id ,status, deleted_at + FROM store_sku_audit + WHERE status = 0 + AND deleted_at = ? + GROUP BY 2,3,4,5 + HAVING count(*) > 1 + ) b + WHERE a.store_id = b.store_id + AND a.name_id = b.name_id + AND a.status= b.status + AND a.deleted_at = b.deleted_at + ` + sqlParams := []interface{}{utils.DefaultTimeValue} + dao.GetRows(db, &duplicateDatas, sql, sqlParams) + for _, v := range duplicateDatas { + duplicateStore[v.StoreID] = append(duplicateStore[v.StoreID], v) + } + for _, v := range duplicateStore { + duplicateSkuName := make(map[int][]*model.StoreSkuAudit) + for _, vv := range v { + duplicateSkuName[vv.NameID] = append(duplicateSkuName[vv.NameID], vv) + } + for _, vv := range duplicateSkuName { + for i := 0; i < len(vv)-1; i++ { + dao.DeleteEntity(db, vv[i]) + } + } + } +} + func GetSpecialtyStoreSkus(ctx *jxcontext.Context, storeIDs, vendorIDs []int) (err error) { type SpecialtyStoreSkus struct { StoreID int `json:"门店ID"` diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 4a89efbd7..61aa4846a 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -1098,7 +1098,7 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i var ( db = dao.GetDB() ) - storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil) + // storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil) _, hint, err = v.LoopStoresMap2(ctx, nil, db, fmt.Sprintf("同步京东商城门店的可售信息:%v", storeIDs), isAsync, true, []int{model.VendorIDJDShop}, storeIDs, false, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { loopMapInfo := batchItemList[0].(*LoopStoreMapInfo) @@ -1107,7 +1107,7 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i if storeMap.Status > model.StoreStatusDisabled && storeMap.StoreID != model.JdShopMainStoreID && storeMap.SyncRule != 0 { err = syncJdsStoresSkus(ctx, db, t, storeMap, isAsync, isContinueWhenError) } - err = syncJdsStoreStock(ctx, db, t, storeSkus, storeMap, isAsync, isContinueWhenError) + // err = syncJdsStoreStock(ctx, db, t, storeSkus, storeMap, isAsync, isContinueWhenError) } } return nil, partner.AddVendorInfo2Err(err, loopMapInfo.VendorID) @@ -1116,15 +1116,6 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i } func syncJdsStoreStock(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeSkus []*model.StoreSkuBind, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (err error) { - // storeMaps, err := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "") - // if err != nil { - // return err - // } - // storeSkus, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil) - // if err != nil { - // return err - // } - // for _, storeMap := range storeMaps { task := tasksch.NewParallelTask("syncJdsStoreStock", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { storeSku := batchItemList[0].(*model.StoreSkuBind) @@ -1146,7 +1137,53 @@ func syncJdsStoreStock(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch }, storeSkus) tasksch.HandleTask(task, parentTask, true).Run() _, err = task.GetResult(0) - // } + return err +} + +func SyncJdsStoreStock(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (err error) { + var ( + db = dao.GetDB() + storeMaps []*model.StoreMap + ) + sql := ` + SELECT * FROM store_map WHERE vendor_id = ? AND vendor_store_id <> '' AND store_id <> ? + ` + sqlParams := []interface{}{ + model.VendorIDJDShop, model.JdShopMainStoreID, + } + err = dao.GetRows(db, &storeMaps, sql, sqlParams) + storeSkus, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil) + if err != nil { + return err + } + task1 := tasksch.NewParallelTask("syncJdsStoreStock1", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, + func(task1 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeMap := batchItemList[0].(*model.StoreMap) + task2 := tasksch.NewParallelTask("syncJdsStoreStock2", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, + func(task2 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeSku := batchItemList[0].(*model.StoreSkuBind) + stock := 0 + storeSku2, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{storeSku.SkuID}) + if storeSku.JdsID != 0 { + if len(storeSku2) > 0 { + if storeSku2[0].Status == model.StoreSkuBindStatusNormal && storeSku.Status == model.StoreSkuBindStatusNormal { + stock = 9999 + } + if storeMap.VendorStoreID != "" { + err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, stock, utils.Str2Int(storeMap.VendorStoreID)) + } + } else { + err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, 0, utils.Str2Int(storeMap.VendorStoreID)) + } + } + return retVal, err + }, storeSkus) + tasksch.HandleTask(task2, task1, true).Run() + _, err = task2.GetResult(0) + return retVal, err + }, storeMaps) + tasksch.HandleTask(task1, nil, true).Run() + _, err = task1.GetResult(0) return err } diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index fcba3d309..39f79a2af 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -414,7 +414,7 @@ func doDailyWork2() { //同步京东商城门店的商品 cms.CurVendorSync.SyncJdsStoresSkus(jxcontext.AdminCtx, nil, true, true) //刷新京东商城的门店库存 - // cms.SyncJdsStoreStock(jxcontext.AdminCtx, dao.GetDB(), nil, true, true) + cms.SyncJdsStoreStock(jxcontext.AdminCtx, true, true) } func doDailyWork() { @@ -449,7 +449,7 @@ func doDailyWork() { //同步银豹到京西 // cms.CurVendorSync.SyncStoreSkusFromYb(jxcontext.AdminCtx, nil, true, true) //刷新京东商城订单结算价 - orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -3).Format("20060102"), time.Now().Format("20060102")) + orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -2).Format("20060102"), time.Now().Format("20060102")) //同步上架京东商城待售商品 cms.RefreshJdsSkusStatus(jxcontext.AdminCtx) //同步美团配送与否状态及美团门店是否存在 diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index d3fec4dc1..f4df58aee 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -1583,14 +1583,9 @@ func UploadJdsImage(ctx *jxcontext.Context) (err error) { // fmt.Println("addList2", addList) // fmt.Println("updateList2", utils.Format4Output(updateList, false)) // fmt.Println("deleteList2", deleteList) - var skuNames []model.SkuName - sql := ` - SELECT * FROM sku_name WHERE img = 'https://image.jxc4.com/noGoodsImg.jpg' AND deleted_at = '1970-01-01 00:00:00' - ` - dao.GetRows(dao.GetDB(), &skuNames, sql, nil) - for _, v := range skuNames { - cms.DeleteSkuName(ctx, v.ID, ctx.GetUserName()) - } + // cms.DeletedDuplicateWaitAuditData(ctx, dao.GetDB()) + // orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -2).Format("20060102"), time.Now().Format("20060102")) + return err } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index beb7601aa..a76972b8a 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -974,3 +974,33 @@ func GetDefendPriceIssue() (issue int) { func GetLastDefendPriceIssue() (issue int) { return utils.Str2Int(time.Now().AddDate(0, 0, 1).Format("20060102")) } + +//根据一堆坐标求面积 +//有待考证,不过暂时拿来用 +func ComputeSignedArea(path []string) (s float64) { + var ( + radius = 6371009 + len = len(path) + total float64 + prev = path[len-1] + ) + if len < 3 { + return + } + prevTanLat := math.Tan(((math.Pi/2 - utils.Str2Float64(strings.Split(prev, ",")[1])/180*math.Pi) / 2)) + prevLng := utils.Str2Float64(strings.Split(prev, ",")[0]) / 180 * math.Pi + for i := 0; i < len; i++ { + tanLat := math.Tan(((math.Pi/2 - utils.Str2Float64(strings.Split(path[i], ",")[1])/180*math.Pi) / 2)) + lng := utils.Str2Float64(strings.Split(path[i], ",")[0]) / 180 * math.Pi + total += polarTriangleArea(tanLat, lng, prevTanLat, prevLng) + prevTanLat = tanLat + prevLng = lng + } + return math.Abs(total * (float64(radius) * float64(radius))) +} + +func polarTriangleArea(tan1, lng1, tan2, lng2 float64) (s float64) { + deltaLng := lng1 - lng2 + t := tan1 * tan2 + return 2 * math.Atan2(t*math.Sin(deltaLng), 1+t*math.Cos(deltaLng)) +} diff --git a/business/model/order.go b/business/model/order.go index 93fcfbd00..a8f841c35 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -58,7 +58,7 @@ type ModelTimeInfo struct { type GoodsOrder struct { ID int64 `orm:"column(id)" json:"id"` VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` - VendorOrderID2 string `orm:"column(vendor_order_id2);size(48);index" json:"vendorOrderID2"` + VendorOrderID2 string `orm:"column(vendor_order_id2);size(200);index" json:"vendorOrderID2"` VendorID int `orm:"column(vendor_id)" json:"vendorID"` VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"` StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid diff --git a/business/partner/purchase/ebai/waybill.go b/business/partner/purchase/ebai/waybill.go index b8c202914..ba25910dd 100644 --- a/business/partner/purchase/ebai/waybill.go +++ b/business/partner/purchase/ebai/waybill.go @@ -5,6 +5,7 @@ import ( "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" @@ -50,6 +51,13 @@ func (c *PurchaseHandler) onWaybillMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaiap order.CourierName = utils.Interface2String(result["name"]) order.CourierMobile = utils.Interface2String(result["phone"]) } + if order.Status == model.WaybillStatusNew { + order2, _ := partner.CurOrderManager.LoadOrder(order.VendorOrderID, order.WaybillVendorID) + if order2.Status == model.OrderStatusWaitAccepted { + order2.Status = model.OrderStatusNew + scheduler.CurrentScheduler.OnOrderNew(order2, false) + } + } } else if order.Status == model.WaybillStatusCanceled { utils.AfterFuncWithRecover(timeout4WaybillCancel, func() { if localOrder, err2 := partner.CurOrderManager.LoadOrder(order.VendorOrderID, model.VendorIDEBAI); err2 == nil { diff --git a/business/partner/purchase/jdshop/callback.go b/business/partner/purchase/jdshop/callback.go index 9f7b8736a..93a86a059 100644 --- a/business/partner/purchase/jdshop/callback.go +++ b/business/partner/purchase/jdshop/callback.go @@ -117,8 +117,6 @@ func result2Orders(msg *jdshopapi.CallBackResult) (order *model.GoodsOrder, err order.BusinessType = model.BusinessTypeDingshida // order.ExpectedDeliveredTime = utils.Str2Time(orderDetail.ExpectedDeliveredTime) order.PickDeadline = order.ExpectedDeliveredTime.Add(-time.Hour) - globals.SugarLogger.Warnf("来暂停的订单了!%v", msg.OrderID) - return nil, err } else if msg.OrderState == jdshopapi.OrderStatusWait { order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour) order.BusinessType = model.BusinessTypeImmediate diff --git a/business/partner/purchase/jdshop/order_afs.go b/business/partner/purchase/jdshop/order_afs.go index 7990066de..bc0c8ec51 100644 --- a/business/partner/purchase/jdshop/order_afs.go +++ b/business/partner/purchase/jdshop/order_afs.go @@ -6,6 +6,8 @@ import ( "math" "time" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" @@ -13,19 +15,20 @@ import ( "git.rosy.net.cn/jx-callback/globals" ) -func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) { +func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrder *model.AfsOrder, approveType int, reason string) (err error) { var status int if approveType == partner.AfsApproveTypeRefused { status = model.AfsOrderStatusFailed } else { status = model.AfsOrderStatusFinished + } orderStatus := &model.OrderStatus{ - VendorOrderID: order.AfsOrderID, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中 - VendorID: order.VendorID, + VendorOrderID: afsOrder.AfsOrderID, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中 + VendorID: afsOrder.VendorID, OrderType: model.OrderTypeAfsOrder, - RefVendorOrderID: order.VendorOrderID, - RefVendorID: order.VendorID, + RefVendorOrderID: afsOrder.VendorOrderID, + RefVendorID: afsOrder.VendorID, VendorStatus: utils.Int2Str(status), Status: status, StatusTime: time.Now(), @@ -53,17 +56,18 @@ func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.G var ( skuMap = make(map[int]*model.OrderSku) salePrice int64 + db = dao.GetDB() ) for _, sku := range order.Skus { skuMap[sku.SkuID] = sku } orderStatus := buildOrderStatus(ctx, order, reason) afsOrder := &model.AfsOrder{ - VendorID: order.VendorID, - AfsOrderID: orderStatus.VendorOrderID, - VendorOrderID: orderStatus.RefVendorOrderID, - VendorStoreID: order.VendorStoreID, - StoreID: order.StoreID, + VendorID: order.VendorID, + AfsOrderID: orderStatus.VendorOrderID, + VendorOrderID: orderStatus.RefVendorOrderID, + // VendorStoreID: order.VendorStoreID, + // StoreID: jxutils.GetSaleStoreIDFromOrder(order), AfsCreatedAt: time.Now(), VendorAppealType: "", AppealType: model.AfsAppealTypeRefund, @@ -81,6 +85,10 @@ func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.G VendorSkuID: utils.Int2Str(sku.SkuID), SkuID: sku.SkuID, } + storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, []int{sku.SkuID}) + if len(storeSkus) > 0 { + orderSku.VendorSkuID = utils.Int64ToStr(storeSkus[0].JdsID) + } if skuMap[sku.SkuID] != nil { orderSku.Name = skuMap[sku.SkuID].SkuName orderSku.UserMoney = skuMap[sku.SkuID].SalePrice * int64(sku.Count) diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 7deb9cb19..389ca3740 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -118,6 +118,7 @@ type JxOrderInfo struct { IsBuyNowPrice int `json:"isBuyNowPrice"` IsPriceDefend int `json:"isPriceDefend"` OrderID2 string `json:"-"` + UserID string `json:"userID"` } type DeliveryTimeItem struct { @@ -815,18 +816,20 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 outJxOrder.FreightPrice = 500 // } //如果是守价的订单,需要查询本期中该用户是否已经守价过,如果守价过就只算一次运费 - 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 jxOrder.OrderType == model.OrderTypeDefendPrice { + 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("同一期不允许相同用户在不同门店进行守价!") + } + outJxOrder.FreightPrice = 0 } - if flag2 { - return nil, nil, fmt.Errorf("同一期不允许相同用户在不同门店进行守价!") - } - outJxOrder.FreightPrice = 0 } } else { outJxOrder.FreightPrice = 0 @@ -876,6 +879,9 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 if jxOrder.OrderType == model.OrderTypeDefendPrice { outJxOrder.Skus[0].DefendPrice = jxOrder.Skus[0].DefendPrice } + if jxOrder.UserID != "" { + outJxOrder.UserID = jxOrder.UserID + } } else { outJxOrder = nil deliveryAddress = nil @@ -952,6 +958,12 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd } order.OrderCreatedAt = order.StatusTime order.VendorUserID = order.UserID + if order.UserID == "" && order.VendorUserID == "" { + if jxOrder.UserID != "" { + order.UserID = jxOrder.UserID + order.VendorUserID = jxOrder.UserID + } + } if jxOrder.ExpectedDeliveredTimestamp != 0 { order.ExpectedDeliveredTime = utils.Timestamp2Time(jxOrder.ExpectedDeliveredTimestamp) order.BusinessType = model.BusinessTypeDingshida @@ -1961,6 +1973,8 @@ func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) { userOrderMap[v.AddressID] = append(userOrderMap[v.AddressID], v) } for kk, vv := range userOrderMap { + addressList, _, _ := dao.QueryUserDeliveryAddress(db, kk, nil, 0, 0) + address := addressList[0] if len(vv) == 1 { jxOrder := &JxOrderInfo{ BuyerComment: "守价订单", @@ -1973,6 +1987,7 @@ func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) { }, IsPriceDefend: model.YES, OrderID: utils.Str2Int64(vv[0].VendorOrderID), + UserID: address.UserID, } if _, err := CreateOrder(ctx, jxOrder, kk, OrderCreateTypeNormal, 0, false); err == nil { err = SettleDiscountActByPriceDefend(ctx, vv[0], false) @@ -1987,6 +2002,7 @@ func CreateOrderByPriceDefend(ctx *jxcontext.Context) (err error) { StoreID: vv[0].StoreID, IsPriceDefend: model.YES, OrderID: GenOrderNo(ctx), + UserID: address.UserID, } for _, priceDefend := range vv { sku := &JxSkuInfo{ diff --git a/business/partner/purchase/jx/order_afs.go b/business/partner/purchase/jx/order_afs.go index 10dcbce39..757c6ec44 100644 --- a/business/partner/purchase/jx/order_afs.go +++ b/business/partner/purchase/jx/order_afs.go @@ -73,6 +73,7 @@ func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.G skuMap = make(map[int]*model.OrderSku) appID = "" salePrice int64 + db = dao.GetDB() ) if time.Now().Sub(order.OrderCreatedAt) > 24*time.Hour { return fmt.Errorf("已超过售后申请时间,如有疑问请联系门店!") @@ -122,7 +123,7 @@ func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.G } if !isJxShop(appID) { - orderPays, err := dao.GetOrderPayList(dao.GetDB(), order.VendorOrderID, order.VendorID) + orderPays, err := dao.GetOrderPayList(db, order.VendorOrderID, order.VendorID) if err == nil { _, err = localjx.RefundOrderByTL(ctx, orderPays[0], order.VendorOrderID, int(salePrice), reason) if err != nil { diff --git a/conf/app.conf b/conf/app.conf index f8891f18b..9df9a53e6 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -401,7 +401,7 @@ enableJdShopWrite = false jdOrgCode = "320406" jdLoginName = "jd_jxcs1223" -jdToken = "77e703b7-7997-441b-a12a-2e522efb117a" +jdToken = "29afd5a8-f93f-4d4c-9fce-a7297340af59" jdAppKey = "1dba76d40cac446ca500c0391a0b6c9d" jdSecret = "a88d031a1e7b462cb1579f12e97fe7f4" diff --git a/controllers/cms_store.go b/controllers/cms_store.go index eb65996a1..c15db3963 100644 --- a/controllers/cms_store.go +++ b/controllers/cms_store.go @@ -808,3 +808,20 @@ func (c *StoreController) GetNearSupplyGoodsStoreByStoreID() { return retVal, "", err }) } + +// @Title 获取京东门店手动划的配送范围面积 +// @Description 获取京东门店手动划的配送范围面积 +// @Param token header string true "认证token" +// @Param storeIDs query string true "门店IDs" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetJdDeliveryArea [get] +func (c *StoreController) GetJdDeliveryArea() { + var storeIDs []int + c.callGetJdDeliveryArea(func(params *tStoreGetJdDeliveryAreaParams) (retVal interface{}, errCode string, err error) { + if jxutils.Strings2Objs(params.StoreIDs, &storeIDs); err == nil { + err = cms.GetJdDeliveryArea(params.Ctx, storeIDs) + } + return retVal, "", err + }) +} diff --git a/controllers/event.go b/controllers/event.go index 9be62c869..ce8349a14 100644 --- a/controllers/event.go +++ b/controllers/event.go @@ -29,10 +29,10 @@ type EventController struct { } //连接的客户端,吧每个客户端都放进来 -var clients = make(map[*websocket.Conn]bool) +var clients = make(map[string][]*websocket.Conn) //广播频道(通道) -var broadcast = make(chan []*model.ImMessageRecord) +var broadcast = make(chan map[string]*model.ImMessageRecord) // 配置升级程序(升级为websocket) var upgrader = websocket.Upgrader{} @@ -129,47 +129,51 @@ func (c *EventController) TestWebsocket() { log.Fatal(err) } defer ws.Close() + var ( + vendorOrderID = c.GetString("vendorOrderID") + msgMap = make(map[string]*model.ImMessageRecord) + ) //将当前客户端放入map中 - clients[ws] = true - //聊天记录 + clients[vendorOrderID] = append(clients[vendorOrderID], ws) + db := dao.GetDB() - _, _, err = jxcontext.New(nil, c.GetString("token"), c.Ctx.ResponseWriter, c.Ctx.Request) - if err != nil { - msg := &CallResult{ - Code: model.ErrCodeGeneralFailed, - Desc: err.Error(), - } - ws.WriteJSON(&msg) - } - records, _ := dao.GetImMessageRecord(db, c.GetString("vendorOrderID"), "", 0, -1) - if len(records) > 0 { - // 把消息 写入通道 - broadcast <- records - } else { - broadcast <- []*model.ImMessageRecord{ - &model.ImMessageRecord{ - Content: "第一条", - }, + if globals.IsProductEnv() { + _, _, err = jxcontext.New(nil, c.GetString("token"), c.Ctx.ResponseWriter, c.Ctx.Request) + if err != nil { + msg := &CallResult{ + Code: model.ErrCodeGeneralFailed, + Desc: err.Error(), + } + ws.WriteJSON(&msg) } } c.EnableRender = false //Beego不启用渲染 - var s []*model.ImMessageRecord + var s *model.ImMessageRecord for { //接收客户端的消息 err := ws.ReadJSON(&s) if err != nil { globals.SugarLogger.Debugf("页面可能断开啦 ws.ReadJSON error: %v", err.Error()) - delete(clients, ws) //删除map中的客户端 - break //结束循环 + index := 0 + for k, v := range clients[vendorOrderID] { + if v == ws { + index = k + } + } + wsList := clients[vendorOrderID] + clients[vendorOrderID] = clients[vendorOrderID][0:0] + clients[vendorOrderID] = append(clients[vendorOrderID], wsList[0:index]...) + clients[vendorOrderID] = append(clients[vendorOrderID], wsList[index+1:len(wsList)]...) + // delete(clients, ws) //删除map中的客户端 + break //结束循环 } else { //接受消息 业务逻辑 - broadcast <- s - for _, v := range s { - dao.WrapAddIDCULDEntity(v, "") - dao.CreateEntity(db, v) - } + msgMap[vendorOrderID] = s + broadcast <- msgMap + dao.WrapAddIDCULDEntity(s, "") + dao.CreateEntity(db, s) // fmt.Println("接受到从页面上反馈回来的信息 ", utils.Format4Output(s, false)) } } @@ -186,14 +190,26 @@ func handleMessages() { msg := <-broadcast globals.SugarLogger.Debugf("clients len %v", len(clients)) //循环map客户端 - for client := range clients { - //把通道中的消息发送给客户端 - globals.SugarLogger.Debugf("msg %v", utils.Format4Output(msg, false)) - err := client.WriteJSON(msg) - if err != nil { - globals.SugarLogger.Debugf("client.WriteJSON error: %v", err) - client.Close() //关闭 - delete(clients, client) //删除map中的客户端 + for vendorOrderID, mmsg := range msg { + for _, client := range clients[vendorOrderID] { + //把通道中的消息发送给客户端 + globals.SugarLogger.Debugf("msg %v", utils.Format4Output(mmsg, false)) + err := client.WriteJSON(mmsg) + if err != nil { + globals.SugarLogger.Debugf("client.WriteJSON error: %v", err) + client.Close() //关闭 + index := 0 + for k, v := range clients[vendorOrderID] { + if v == client { + index = k + } + } + wsList := clients[vendorOrderID] + clients[vendorOrderID] = clients[vendorOrderID][0:0] + clients[vendorOrderID] = append(clients[vendorOrderID], wsList[0:index]...) + clients[vendorOrderID] = append(clients[vendorOrderID], wsList[index+1:len(wsList)]...) + // delete(clients, client) //删除map中的客户端 + } } } } diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 2398e74e8..3bcf028cc 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -172,13 +172,14 @@ func (c *OrderController) CancelWaybill() { // @Param token header string true "认证token" // @Param storeID query int true "京西门店ID" // @Param lastHours query int false "最近多少小时的信息(缺省为两天)" +// @Param lastMinutes query int false "最近多少分钟的信息(缺省为不传)" // @Param isIncludeFake query bool false "是否包括假订单" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /GetStoreOrderCountInfo [get] func (c *OrderController) GetStoreOrderCountInfo() { c.callGetStoreOrderCountInfo(func(params *tOrderGetStoreOrderCountInfoParams) (retVal interface{}, errCode string, err error) { - retVal, err = orderman.FixedOrderManager.GetStoreOrderCountInfo(params.Ctx, params.StoreID, params.LastHours, params.IsIncludeFake) + retVal, err = orderman.FixedOrderManager.GetStoreOrderCountInfo(params.Ctx, params.StoreID, params.LastHours, params.LastMinutes, params.IsIncludeFake) return retVal, "", err }) } @@ -1076,6 +1077,23 @@ func (c *OrderController) TransferJdsOrder() { }) } +// @Title 合并订单(京东商城用) +// @Description 合并订单(京东商城用) +// @Param token header string true "认证token" +// @Param vendorOrderIDs formData string true "订单号s" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /MergeJdsOrders [post] +func (c *OrderController) MergeJdsOrders() { + c.callMergeJdsOrders(func(params *tOrderMergeJdsOrdersParams) (retVal interface{}, errCode string, err error) { + var vendorOrderIDs []string + if err = jxutils.Strings2Objs(params.VendorOrderIDs, &vendorOrderIDs); err == nil { + retVal, err = orderman.MergeJdsOrders(params.Ctx, vendorOrderIDs) + } + return retVal, "", err + }) +} + // @Title 京东商城订单发送京东物流 // @Description 京东商城订单发送京东物流 // @Param token header string true "认证token" diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index fc918404a..20f774aea 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1224,6 +1224,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + beego.ControllerComments{ + Method: "MergeJdsOrders", + Router: `/MergeJdsOrders`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "PartRefundOrder", @@ -1827,6 +1836,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"], + beego.ControllerComments{ + Method: "GetJdDeliveryArea", + Router: `/GetJdDeliveryArea`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"], beego.ControllerComments{ Method: "GetNearSupplyGoodsStoreByStoreID",