diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 1a2c2991e..3754ebb98 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -271,7 +271,8 @@ func (c *OrderManager) SaveOrder(order *model.GoodsOrder, isAdjust bool, db *dao } } - order.ConsigneeName = utils.LimitUTF8StringLen(order.ConsigneeName, 32) + order.ConsigneeName = utils.LimitUTF8StringLen2(order.ConsigneeName, 32) + order.ConsigneeAddress = utils.LimitUTF8StringLen2(order.ConsigneeAddress, 255) created, _, err2 := db.Db.ReadOrCreate(order, "VendorOrderID", "VendorID") if err = err2; err == nil { originalOrder := &model.GoodsOrderOriginal{ @@ -424,6 +425,7 @@ func (c *OrderManager) updateOrderOtherInfo(order *model.GoodsOrder, db *dao.Dao } if err = c.updateOrderSkuOtherInfo(order, db, payPercentage, changePriceType); err == nil { jxutils.RefreshOrderSkuRelated(order) + jxutils.RefreshOrderEarningPrice2(order, payPercentage) // caculateOrderEarningPrice(order, payPercentage) } return err @@ -872,5 +874,3 @@ func RefreshOrdersPriceInfo(ctx *jxcontext.Context, fromTime, toTime time.Time, } return hint, err } - - diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 65cffb128..b4b7ab06f 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -49,8 +49,14 @@ type StoresOrderSaleInfo struct { type OrderSkusAccept struct { model.SkuAndName - SumWeight int `json:"sumWeight"` - SumCount int `json:"sumCount"` + SumWeight int `json:"sumWeight"` + SumCount int `json:"sumCount"` + Img string `json:"img"` +} + +type OrderCount struct { + Count int `json:"count"` //销量 + Flag bool `json:"flag"` //true表示可以买 } func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours int, isIncludeFake bool) (countInfo []*model.GoodsOrderCountInfo, err error) { @@ -621,19 +627,19 @@ func (c *OrderManager) GetStoresOrderSaleInfo(ctx *jxcontext.Context, storeIDLis func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeIDList []int, fromTime time.Time, toTime time.Time, statusList []int) (saleInfoList []*dao.StoresOrderSaleInfo, err error) { db := dao.GetDB() - var isFinish = true - if toTime.Sub(fromTime).Hours() > 24 { - isFinish = false - } - orderSkuList, err := dao.GetStoreOrderSkuList(db, storeIDList, fromTime, toTime, statusList, isFinish) + // var isFinish = true + // if toTime.Sub(fromTime).Hours() > 24 { + // isFinish = false + // } + orderSkuList, err := dao.GetStoreOrderSkuList(db, storeIDList, fromTime, toTime, statusList, true) if err != nil { return nil, err } - afsSkuList, err := dao.GetStoreAfsOrderSkuList(db, storeIDList, fromTime, toTime, []int{model.AfsOrderStatusFinished}, isFinish) + afsSkuList, err := dao.GetStoreAfsOrderSkuList(db, storeIDList, fromTime, toTime, []int{model.AfsOrderStatusFinished}, true) if err != nil { return nil, err } - orderSkuList4Afs, err := dao.GetStoreOrderSkuList4Afs(db, storeIDList, fromTime, toTime, isFinish) + orderSkuList4Afs, err := dao.GetStoreOrderSkuList4Afs(db, storeIDList, fromTime, toTime, true) if err != nil { return nil, err } @@ -641,7 +647,11 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID orderMap = make(map[string]*model.GoodsOrder) orderSkuMap = make(map[string]*dao.OrderSkuWithActualPayPrice) saleInfoMap = make(map[int64]*dao.StoresOrderSaleInfo) - for _, v := range skuList { + var flagVendorOrderID string + if len(skuList) > 0 { + flagVendorOrderID = skuList[0].VendorOrderID + } + for k, v := range skuList { if v.EarningPrice == 0 { v.EarningPrice = jxutils.CaculateSkuEarningPrice(v.ShopPrice, v.SalePrice, v.PayPercentage) } @@ -663,7 +673,15 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID saleInfo.ShopPrice += v.ShopPrice * int64(v.Count) saleInfo.VendorPrice += v.VendorPrice * int64(v.Count) saleInfo.SalePrice += v.SalePrice * int64(v.Count) - saleInfo.EarningPrice += v.EarningPrice * int64(v.Count) + // saleInfo.EarningPrice += v.EarningPrice * int64(v.Count) + if v.VendorOrderID == flagVendorOrderID { + if k == 0 { + saleInfo.EarningPrice = v.NewEarningPrice + } + } else { + flagVendorOrderID = v.VendorOrderID + saleInfo.EarningPrice += v.NewEarningPrice + } universalOrderID := jxutils.ComposeUniversalOrderID(v.VendorOrderID, v.VendorID) if orderMap[universalOrderID] == nil { @@ -1148,7 +1166,7 @@ func (c *OrderManager) RefreshOrderFinancial(ctx *jxcontext.Context, fromTime, t func GetOrdersAccept(ctx *jxcontext.Context, storeID int) (result []*OrderSkusAccept, err error) { db := dao.GetDB() sql := ` - SELECT SUM(a.count) sum_count, SUM(a.weight*a.count) sum_weight, c.*, d.name, d.unit, d.prefix + SELECT SUM(a.count) sum_count, SUM(a.weight*a.count) sum_weight, c.*, d.name, d.unit, d.prefix, d.img FROM order_sku a JOIN goods_order b ON b.vendor_order_id = a.vendor_order_id AND b.vendor_id = a.vendor_id JOIN sku c ON c.id = a.sku_id @@ -1157,6 +1175,7 @@ func GetOrdersAccept(ctx *jxcontext.Context, storeID int) (result []*OrderSkusAc AND b.status = ? AND b.order_created_at <= NOW() AND b.order_created_at >= ? GROUP BY 3 + ORDER BY sum_weight DESC ` sqlParams := []interface{}{ storeID, @@ -1166,3 +1185,57 @@ func GetOrdersAccept(ctx *jxcontext.Context, storeID int) (result []*OrderSkusAc err = dao.GetRows(db, &result, sql, sqlParams) return result, err } + +func GetMatterStoreOrderCount(ctx *jxcontext.Context, storeID int) (result *OrderCount, err error) { + var ( + db = dao.GetDB() + orderPays []*model.OrderPay + orderCount = &OrderCount{} + orderTime time.Time + flag = false + ) + sql := ` + SELECT b.* + FROM goods_order a + JOIN order_pay b ON a.vendor_order_id = b.vendor_order_id + WHERE IF(a.store_id = 0, a.jx_store_id, a.store_id) = 666666 + AND a.from_store_id = ? + AND a.status >= ? AND a.status <> ? + AND b.status = ? + ORDER BY b.pay_finished_at DESC + LIMIT 1 + ` + sqlParams := []interface{}{storeID, model.OrderStatusDelivering, model.OrderStatusCanceled, model.PayStatusYes} + err = dao.GetRows(db, &orderPays, sql, sqlParams) + if len(orderPays) != 0 { + orderPay := orderPays[0] + if time.Now().Sub(*orderPay.PayFinishedAt).Hours() < 24*7 { + flag = false + } else { + flag = true + } + orderTime = *orderPay.PayFinishedAt + } else { + orderTime = time.Now().AddDate(0, -1, 0) + flag = true + } + sql2 := ` + SELECT COUNT(*) count + FROM goods_order + WHERE IF(store_id = 0,jx_store_id,store_id) = ? + AND order_created_at <= NOW() AND order_created_at >= ? + AND status = ? + ` + sqlParams2 := []interface{}{ + storeID, + orderTime, + model.OrderStatusFinished, + } + err = dao.GetRow(db, &orderCount, sql2, sqlParams2) + if err != nil { + return nil, err + } + orderCount.Flag = flag + // orderCount.Count = 1000 + return orderCount, err +} diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index ed6afc1d4..4cc88ca45 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -37,6 +37,13 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order * courierVendorID := storeCourier.VendorID bill, err2 := c.CreateWaybill(courierVendorID, order, maxDeliveryFee) if err = err2; err == nil { + stores, _ := dao.GetStoreList(dao.GetDB(), []int{order.StoreID}, nil, nil, nil, "") + if len(stores) > 0 { + if stores[0].PayPercentage <= 50 { + order.NewEarningPrice = (order.TotalShopMoney - bill.DesiredFee) * int64((100 - stores[0].PayPercentage/2)) / 10000 + dao.UpdateEntity(dao.GetDB(), order, "NewEarningPrice") + } + } globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d bill:%v", order.VendorOrderID, userName, courierVendorID, bill) bills = append(bills, bill) if createOnlyOne { diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index bacf1f200..01a515b14 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -655,7 +655,7 @@ func (s *DefScheduler) isWaybillCourierSame(savedOrderInfo *WatchOrderInfo, bill func (s *DefScheduler) addWaybill2Map(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) { if _, ok := savedOrderInfo.waybills[bill.WaybillVendorID]; ok { - if !model.IsWaybillPlatformOwn(bill) { // 购买平台重复发相同号的新运单是正常的,京东就是 + if !model.IsWaybillPlatformOwn(bill) && savedOrderInfo.order.StoreID != 666666 { // 购买平台重复发相同号的新运单是正常的,京东就是 globals.SugarLogger.Warnf("addWaybill2Map bill:%v already exists", bill) } } @@ -1333,7 +1333,7 @@ func setFakeActualPayPrice(order *model.GoodsOrder) (newOrder *model.GoodsOrder) storeDetail, err := dao.GetStoreDetail(dao.GetDB(), order.JxStoreID, order.VendorID) if err == nil { if storeDetail.PayPercentage < 50 { - orderCopy.ActualPayPrice = order.TotalShopMoney * (100 - int64(storeDetail.PayPercentage/2)) * 100 + orderCopy.ActualPayPrice = order.TotalShopMoney * (100 - int64(storeDetail.PayPercentage/2)) / 100 } else { orderCopy.ActualPayPrice = order.EarningPrice } diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index 03952ebe1..e6df5aa6c 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -297,6 +297,7 @@ func checkConfig(opFlag int, configType, key, value string) (err error) { err = checkSysConfig(key, value) } case model.ConfigTypeJxStore: + case model.ConfigTypeCookie: default: err = fmt.Errorf("当前只支持配置:%s, 传入的配置类型:%s", utils.Format4Output(model.ConfigTypeName, true), configType) } diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index fb3aeb68e..505d61c5a 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -265,6 +265,13 @@ func ReorderCategories(ctx *jxcontext.Context, parentID int, categoryIDs []int, db := dao.GetDB() if err = dao.GetEntitiesByKV(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil { catsLen := len(cats) + if !isExd { + for _, v := range cats { + if v.IsExdSpec == 1 { + catsLen-- + } + } + } if catsLen != len(categoryIDs) { return ErrInputCatsDoesntMatch } @@ -385,9 +392,11 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku bool, params ma FROM sku_name t1 LEFT JOIN sku t2 ON t1.id = t2.name_id AND t2.deleted_at = ? LEFT JOIN sku_name_place_bind t3 ON t1.id = t3.name_id + LEFT JOIN price_refer_snapshot t4 ON t4.city_code = ? AND t4.snapshot_at = ? AND t4.sku_id = t2.id WHERE t1.deleted_at = ?` sqlParams := []interface{}{ utils.DefaultTimeValue, + 0, utils.Time2Date(time.Now().AddDate(0, 0, -1)), utils.DefaultTimeValue, } if keyword != "" { @@ -554,7 +563,8 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku bool, params ma t1.upc, t1.ex_prefix, t1.ex_prefix_begin, - t1.ex_prefix_end` + t1.ex_prefix_end, + t4.mid_unit_price` if isBySku { sql += `, t2.id` @@ -588,10 +598,12 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku bool, params ma t1.ex_prefix, t1.ex_prefix_begin, t1.ex_prefix_end, + t4.mid_unit_price, CONCAT("[", GROUP_CONCAT(DISTINCT CONCAT('{"id":', t2.id, ',"comment":"', t2.comment, '","status":', t2.status, ',"createdAt":"', CONCAT(REPLACE(t2.created_at," ","T"),"+08:00"), '","updatedAt":"', CONCAT(REPLACE(t2.updated_at," ","T"),"+08:00"), '","lastOperator":"', t2.last_operator, '","specQuality":', t2.spec_quality, ',"specUnit":"', t2.spec_unit, '","exdSkuID":"', t2.exd_sku_id, + '","eclpID":"', t2.eclp_id, '","weight":', t2.weight, ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id, ', "seq":', t2.seq, "}")), "]") skus_str, @@ -765,9 +777,11 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s dao.Rollback(db) return nil, err } - if err = OnCreateThing(ctx, db, nil, int64(sku.ID), model.ThingTypeSku); err != nil { - dao.Rollback(db) - return nil, err + if sku.EclpID == "" { + if err = OnCreateThing(ctx, db, nil, int64(sku.ID), model.ThingTypeSku); err != nil { + dao.Rollback(db) + return nil, err + } } } for _, placeCode := range skuNameExt.Places { @@ -846,7 +860,10 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf } } } - + var eclpID string + if payload["eclpID"] != nil { + eclpID = payload["eclpID"].(string) + } dao.Begin(db) defer func() { if r := recover(); r != nil { @@ -859,7 +876,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf dao.Rollback(db) return 0, err } - if !isExd { + if !isExd && eclpID == "" { if err = OnUpdateThing(ctx, db, nil, int64(nameID), model.ThingTypeSkuName); err != nil { dao.Rollback(db) return 0, err @@ -885,7 +902,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf } } } - skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil) + skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil, nil) if err = err2; err == nil { for _, v := range skuList { sku := &v.Sku @@ -896,7 +913,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf dao.Rollback(db) return 0, err } - if sku.ExdSkuID == "" { + if sku.ExdSkuID == "" && sku.EclpID == "" { if err = OnUpdateThing(ctx, db, nil, int64(v.ID), model.ThingTypeSku); err != nil { dao.Rollback(db) return 0, err @@ -956,7 +973,7 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int return 0, err } - skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil) + skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil, nil) if err = err2; err == nil { for _, v := range skuList { sku := &v.Sku @@ -1084,7 +1101,7 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{} } return 0, err } - if sku.ExdSkuID == "" { + if sku.ExdSkuID == "" && sku.EclpID == "" { if err = OnUpdateThing(ctx, db, nil, int64(skuID), model.ThingTypeSku); err != nil { dao.Rollback(db) return 0, err @@ -1108,34 +1125,39 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{} } func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err error) { - dao.Begin(db) - defer func() { - if r := recover(); r != nil || err != nil { - dao.Rollback(db) - if r != nil { - panic(r) - } - } - }() list, err := dao.GetStoreSkusAndSkuName(db, nil, []int{skuID}, nil) - for _, v := range list { - storeID := v.StoreID - storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDJX) - if err != nil { - return err - } - storeSku := &model.StoreSkuBind{} - storeSku.ID = v.BindID - storeSku.JdSyncStatus = v.JdSyncStatus | model.SyncFlagPriceMask - storeSku.MtwmSyncStatus = v.MtwmSyncStatus | model.SyncFlagPriceMask - storeSku.EbaiSyncStatus = v.EbaiSyncStatus | model.SyncFlagPriceMask - storeSku.Price = jxutils.CaculateSkuPrice(int(v.UnitPrice), v.SpecQuality, v.SpecUnit, v.Unit) - storeSku.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), int(storeSku.Price)) - storeSku.LastOperator = ctx.GetUserName() - storeSku.UpdatedAt = time.Now() - dao.UpdateEntity(db, storeSku, "Price", "JdSyncStatus", "MtwmSyncStatus", "EbaiSyncStatus", "JxPrice") - } - dao.Commit(db) + task := tasksch.NewParallelTask("refreshStoreSkuPrice", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + v := batchItemList[0].(*dao.StoreSkuAndName) + storeID := v.StoreID + storeDetail, _ := dao.GetStoreDetail(db, storeID, model.VendorIDJX) + if storeDetail == nil { + return retVal, err + } + storeSku := &model.StoreSkuBind{} + storeSku.ID = v.BindID + storeSku.JdSyncStatus = v.JdSyncStatus | model.SyncFlagPriceMask + storeSku.MtwmSyncStatus = v.MtwmSyncStatus | model.SyncFlagPriceMask + storeSku.EbaiSyncStatus = v.EbaiSyncStatus | model.SyncFlagPriceMask + storeSku.Price = jxutils.CaculateSkuPrice(int(v.UnitPrice), v.SpecQuality, v.SpecUnit, v.Unit) + storeSku.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), int(storeSku.Price)) + storeSku.LastOperator = ctx.GetUserName() + storeSku.UpdatedAt = time.Now() + dao.Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + dao.UpdateEntity(db, storeSku, "Price", "JdSyncStatus", "MtwmSyncStatus", "EbaiSyncStatus", "JxPrice") + dao.Commit(db) + return retVal, err + }, list) + tasksch.HandleTask(task, nil, true).Run() + _, err = task.GetResult(0) return err } @@ -1404,7 +1426,7 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro payload["exPrefixEnd"] = nil _, err = UpdateSkuName(ctx, nameID, payload, false) } else { - skuList, err := dao.GetSkus(db, nil, []int{nameID}, nil, nil) + skuList, err := dao.GetSkus(db, nil, []int{nameID}, nil, nil, nil) if err == nil && len(skuList) > 0 { if skuList[0].ExPrefixBegin != nil { _, err = UpdateSkuName(ctx, nameID, payload, false) @@ -1437,7 +1459,7 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro case 1: if (now.Sub(toTimeP) <= 0 && now.Sub(fromTimeP) >= 0) || (now.Sub(fromTimeP) > 0 && now.Sub(toTimeP) > 0) { var skuIDs []int - skuList, err2 := dao.GetSkus(db, nil, nameIDs, nil, nil) + skuList, err2 := dao.GetSkus(db, nil, nameIDs, nil, nil, nil) if err = err2; err == nil { if len(skuList) > 0 { for _, v := range skuList { @@ -1484,18 +1506,25 @@ func SumExianDaDepot(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { v := batchItemList[0].(*ebaiapi.ExianDaSkus) skus, err := api.EbaiAPI.GetExianDaSku(utils.Str2Int64(v.ElemeGoodsID)) - if err != nil { + if err != nil || skus == nil { + globals.SugarLogger.Debugf("GetExianDaSku,[%v]", v.ElemeGoodsID) return result, err } + // sku := &model.Sku{} + // sku.ExdSkuID = v.ElemeGoodsID + // sku.DeletedAt = utils.DefaultTimeValue + // dao.GetEntity(db, sku, "ExdSkuID","DeletedAt") skuNameExt := &model.SkuName{} sql2 := ` SELECT a.* FROM sku_name a JOIN sku b ON b.name_id = a.id WHERE a.upc = ? + AND a.deleted_at = ? AND b.deleted_at = ? ` sqlParams2 := []interface{}{ - skus.UpcIds, + skus.UpcIds[0], + utils.DefaultTimeValue, utils.DefaultTimeValue, } dao.GetRow(db, skuNameExt, sql2, sqlParams2) prefix, _, _, specUnit, unit, specQuality := jxutils.SplitSkuName(v.GoodsName) @@ -1521,16 +1550,6 @@ func SumExianDaDepot(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) } } } else { - skuCat := &model.SkuCategory{} - sql := ` - SELECT * - FROM sku_category - WHERE ebai_category_id = ? - ` - sqlParams := []interface{}{ - skus.CategoryIDThird, - } - dao.GetRow(db, skuCat, sql, sqlParams) skuName := &model.SkuName{ Prefix: prefix, Name: v.GoodsName, @@ -1543,11 +1562,7 @@ func SumExianDaDepot(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) Upc: &v.UpcID, Status: model.SkuStatusNormal, } - if skuCat.ID != 0 { - skuName.CategoryID = skuCat.ID - } else { - skuName.CategoryID = 35 //默认给了个分类 - } + skuName.CategoryID = 35 //默认给了个分类 dao.WrapAddIDCULDEntity(skuName, ctx.GetUserName()) err = dao.CreateEntity(db, skuName) if err != nil { @@ -1600,7 +1615,6 @@ func UpdateExianDaSkuCategory(ctx *jxcontext.Context, isAsync, isContinueWhenErr WHERE b.exd_sku_id <> '' AND a.deleted_at = ? AND b.deleted_at = ? - AND a.category_id = 35 ` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index a3b3f1fa4..343f5bb8f 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -2369,18 +2369,21 @@ func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, needWalkDi JOIN place city ON city.code = t1.city_code JOIN store_map sm ON sm.store_id = t1.id AND sm.vendor_id = ? AND sm.deleted_at = ? AND sm.status <> ? WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.lng > ? AND t1.lng < ? AND t1.lat > ? AND t1.lat < ? + AND sm.is_order <> ? ORDER BY t1.id ` sqlParams := []interface{}{ model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled, utils.DefaultTimeValue, model.StoreStatusDisabled, jxutils.StandardCoordinate2Int(lng1), jxutils.StandardCoordinate2Int(lng2), jxutils.StandardCoordinate2Int(lat1), jxutils.StandardCoordinate2Int(lat2), + model.YES, } var storeList1 []*Store4User if err = dao.GetRows(dao.GetDB(), &storeList1, sql, sqlParams...); err == nil { var storeList2 []*Store4User for _, v := range storeList1 { - if distance := jxutils.Point2StoreDistance(lng, lat, v.Lng, v.Lat, v.DeliveryRangeType, v.DeliveryRange); distance > 0 { + distance := jxutils.Point2StoreDistance(lng, lat, v.Lng, v.Lat, v.DeliveryRangeType, v.DeliveryRange) + if distance > 0 || (lng == jxutils.IntCoordinate2Standard(v.Lng) && lat == jxutils.IntCoordinate2Standard(v.Lat)) { v.Distance = distance storeList2 = append(storeList2, v) } @@ -2388,19 +2391,28 @@ func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, needWalkDi // 为了审核用 if len(storeList2) == 0 { + sql2 := ` + SELECT t1.*, + city.name city_name + FROM store t1 + JOIN place city ON city.code = t1.city_code + WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.id = ? + ` sqlParams2 := []interface{}{ - model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled, + // model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled, utils.DefaultTimeValue, model.StoreStatusDisabled, - jxutils.StandardCoordinate2Int(0), - jxutils.StandardCoordinate2Int(10000), - jxutils.StandardCoordinate2Int(0), - jxutils.StandardCoordinate2Int(10000), - } - dao.GetRows(dao.GetDB(), &storeList2, sql, sqlParams2...) - if len(storeList2) > 1 { - storeList2 = storeList2[:1] + // jxutils.StandardCoordinate2Int(0), + // jxutils.StandardCoordinate2Int(10000), + // jxutils.StandardCoordinate2Int(0), + // jxutils.StandardCoordinate2Int(10000), + // model.YES, + 102919, //商城模板店 } + dao.GetRows(dao.GetDB(), &storeList2, sql2, sqlParams2...) + // if len(storeList2) > 1 { + // storeList2 = storeList2[:1] + // } } // 如果要求以步行距离来算 @@ -2846,3 +2858,23 @@ func UpdateJdStoreNameAll(ctx *jxcontext.Context) (err error) { } return err } + +func DeletePrinterSeq(ctx *jxcontext.Context, storeIDs []int) (err error) { + db := dao.GetDB() + for _, v := range storeIDs { + stores, err := dao.GetStoreList(db, []int{v}, nil, nil, nil, "") + if err != nil || len(stores) == 0 { + return err + } + vendorID := stores[0].PrinterVendorID + if vendorID == model.NO { + return fmt.Errorf("该门店没有绑定打印机,ID:[%v],名字:[%v]", stores[0].ID, stores[0].Name) + } + if vendorID == model.VendorIDXiaoWM { + return fmt.Errorf("暂不支持该打印机品牌清空打印队列,[%v]", model.VendorChineseNames[model.VendorIDXiaoWM]) + } + handler := partner.GetPrinterPlatformFromVendorID(vendorID) + err = handler.EmptyPrintList(ctx, stores[0].PrinterSN, stores[0].PrinterKey) + } + return err +} diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 87d664b3c..abcd89f1d 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -191,6 +191,13 @@ type tUpdateSkuSpecTag struct { IsSpec int `json:"isSpec"` } +type MatterStock struct { + SkuID int `json:"skuID"` + SkuNameID int `json:"skuNameID"` + Name string `json:"name"` + Stock int `json:"stock"` +} + const ( maxStoreNameBind = 10000 // 最大门店SkuName bind个数 maxStoreNameBind2 = 10000 // 最大门店乘SkuName个数 @@ -228,10 +235,10 @@ var ( ) func GetStoreSkus(ctx *jxcontext.Context, storeID int, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) { - return GetStoresSkus(ctx, []int{storeID}, skuIDs, isFocus, keyword, isBySku, isAct, params, offset, pageSize) + return GetStoresSkus(ctx, []int{storeID}, skuIDs, isFocus, false, keyword, isBySku, isAct, params, offset, pageSize) } -func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, actVendorID int, params map[string]interface{}) (sql string, sqlParams []interface{}, err error) { +func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct, isHighPrice bool, actVendorID int, params map[string]interface{}) (sql string, sqlParams []interface{}, err error) { sql = ` FROM sku_name t1 JOIN sku t2 FORCE INDEX(PRIMARY) ON t1.id = t2.name_id AND t2.deleted_at = ?/* AND t2.status = ?*/ @@ -302,6 +309,9 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool utils.Bool2Int(isFocus), // model.SkuStatusNormal, }) + if isHighPrice { + sql += " AND t4.unit_price > t6.mid_unit_price / IF(t3.pay_percentage < 50 , 70, t3.pay_percentage) * 1.2 * 100" + } if isFocus { sql += " AND ((t2.status = ? AND t1.status = ?) OR t4.status = ?)" sqlParams = append(sqlParams, model.SkuStatusNormal, model.SkuStatusNormal, model.SkuStatusNormal) @@ -428,11 +438,11 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool return sql, sqlParams, err } -func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) { - return GetStoresSkusNew(ctx, storeIDs, skuIDs, isFocus, keyword, isBySku, isAct, params, offset, pageSize) +func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus, isHighPrice bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) { + return GetStoresSkusNew(ctx, storeIDs, skuIDs, isFocus, isHighPrice, keyword, isBySku, isAct, params, offset, pageSize) } -func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) { +func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus, isHighPrice bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) { if !isFocus && !isBySku && (len(storeIDs) > 1 || len(storeIDs) == 0) { return nil, fmt.Errorf("未关注按SkuName只能查询单店") } @@ -444,7 +454,7 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bo actVendorID = int(utils.Interface2Int64WithDefault(params["actVendorID"], -1)) } db := dao.GetDB() - sql, sqlParams, err := getGetStoresSkusBaseSQL(db, storeIDs, skuIDs, isFocus, keyword, isBySku, isAct, actVendorID, params) + sql, sqlParams, err := getGetStoresSkusBaseSQL(db, storeIDs, skuIDs, isFocus, keyword, isBySku, isAct, isHighPrice, actVendorID, params) if err != nil { return nil, err } @@ -513,7 +523,7 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bo t3.id store_id, t3.name store_name, t3.pay_percentage, t1.*, t2.name_id, t2.id sku_id, t2.spec_quality sku_spec_quality, t2.spec_unit sku_spec_unit, t2.weight, t2m.vendor_thing_id sku_jd_id, - t2.comment, t2.category_id sku_category_id, t2.status sku_status, + t2.comment, t2.category_id sku_category_id, t2.status sku_status, t2.eclp_id, t4.created_at bind_created_at, t4.updated_at bind_updated_at, t4.last_operator bind_last_operator, t4.deleted_at bind_deleted_at, t4.sub_store_id, t4.price bind_price, IF(t4.unit_price IS NOT NULL, t4.unit_price, t1.price) unit_price, t4.status store_sku_status, t4.auto_sale_at, t4.ebai_id, t4.mtwm_id, @@ -523,6 +533,9 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bo t4.status_sale_begin, t4.status_sale_end, t6.mid_unit_price real_mid_unit_price ` + sql + if isHighPrice { + sql += " , t4.unit_price DESC LIMIT 99" + } var tmpList []*tGetStoresSkusInfo beginTime := time.Now() if err = dao.GetRows(db, &tmpList, sql, sqlParams...); err != nil { @@ -2308,16 +2321,39 @@ func ReCalculateJxPriceLight(db *dao.DaoDB, ctx *jxcontext.Context, storeID int) return err } -func GetTopSkusByStoreIDs(ctx *jxcontext.Context, storeIDs []int) (storeSkuNameExt []*dao.StoreSkuNameExt, err error) { +func GetTopSkusByStoreIDs(ctx *jxcontext.Context, storeIDs []int) (storeSkuNameExt2 []*dao.StoreSkuNameExt, err error) { + var ( + db = dao.GetDB() + skuMap = make(map[int]*dao.StoreSkuNameExt) + ) if len(storeIDs) == 0 { - return storeSkuNameExt, err + return storeSkuNameExt2, err } - db := dao.GetDB() - storeSkuNameExt, err = dao.GetTopSkusByStoreIDs(db, storeIDs) + storeSkuNameExt, err := dao.GetTopSkusByStoreIDs(db, storeIDs) if err != nil { return nil, err } - return storeSkuNameExt, err + for _, v := range storeSkuNameExt { + if skuMap[v.SkuID] == nil { + skuMap[v.SkuID] = v + } + if skuMap[v.SkuID] != nil && v.Count != 0 { + skuMap[v.SkuID] = v + } + } + for _, v := range skuMap { + storeSkuNameExt2 = append(storeSkuNameExt2, v) + } + for i := 0; i < len(storeSkuNameExt2)-1; i++ { + for j := 0; j < len(storeSkuNameExt2)-i-1; j++ { + if storeSkuNameExt2[j].Count < storeSkuNameExt2[j+1].Count { + tmp := storeSkuNameExt2[j] + storeSkuNameExt2[j] = storeSkuNameExt2[j+1] + storeSkuNameExt2[j+1] = tmp + } + } + } + return storeSkuNameExt2, err } func GetTopSkusByCityCode(ctx *jxcontext.Context, cityCode, storeID int) (skuNameAndPlaceList []*dao.SkuNameAndPlace, err error) { @@ -2371,7 +2407,7 @@ func GetTopSkusByCityCode(ctx *jxcontext.Context, cityCode, storeID int) (skuNam var skuList []*model.SkuAndName storeSkuSyncInfo, _ := dao.GetStoreSkusAndSkuName(db, []int{storeID}, nil, []int{v.ID}) for _, storeSkuSync := range storeSkuSyncInfo { - sku, _ := dao.GetSkus(db, []int{storeSkuSync.ID}, nil, nil, nil) + sku, _ := dao.GetSkus(db, []int{storeSkuSync.ID}, nil, nil, nil, nil) sku[0].Price = int(storeSkuSync.Price) skuList = append(skuList, sku...) } @@ -2984,7 +3020,7 @@ func FocusStoreSkusByExcelBin(ctx *jxcontext.Context, reader io.Reader, isAsync, for k, _ := range skuMap { skuIDs = append(skuIDs, k) } - skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil) + skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil, nil) storeList, err := dao.GetStoreList(db, nil, nil, nil, nil, "") if err != nil && len(skuList) == 0 { return result, err @@ -3097,7 +3133,7 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuBindInfos []*StoreSkuBindInf if err != nil { return retVal, err } - skuList, err := dao.GetSkus(db, []int{skuID}, nil, nil, nil) + skuList, err := dao.GetSkus(db, []int{skuID}, nil, nil, nil, nil) if err != nil { return retVal, err } @@ -3173,6 +3209,9 @@ func AutoFocusStoreSkusForTopSkus(ctx *jxcontext.Context, isAsync, isContinueWhe skuName []*model.SkuName skuNameMap = make(map[int]int) ) + if v.ID == model.MatterStoreID { + return retVal, err + } sql := ` SELECT DISTINCT a.name_id id FROM sku a @@ -3283,7 +3322,7 @@ func AutoFocusStoreSkusWithoutFocus(ctx *jxcontext.Context, skuIDs []int, isSync } var skuBindSkuList []*StoreSkuBindSkuInfo skuMap := make(map[int]int) - skuList, _ := dao.GetSkus(db, nil, []int{v.NameID}, nil, nil) + skuList, _ := dao.GetSkus(db, nil, []int{v.NameID}, nil, nil, nil) if len(v.Skus) != len(skuList) { for _, skus := range v.Skus { skuMap[skus.SkuID] = 1 @@ -3369,10 +3408,13 @@ func UpdateStoreSkusSpecTagBin(ctx *jxcontext.Context, reader io.Reader, vendorI } for _, v := range results { store, err := dao.GetStoreDetail(db, v.StoreID, model.VendorIDMTWM) - food, err := api.MtwmAPI.RetailGet(store.VendorStoreID, utils.Int2Str(v.SkuID)) if err != nil || store == nil { continue } + food, err := api.MtwmAPI.RetailGet(store.VendorStoreID, utils.Int2Str(v.SkuID)) + if err != nil || food == nil { + continue + } var foodData = make(map[string]interface{}) if v.IsSpec != 0 && v.IsSpec == -1 { v.IsSpec = 0 @@ -3556,7 +3598,7 @@ func SendSeckillSkusCountMsg(ctx *jxcontext.Context, vendorIDs []int, isAsync, i return hint, err } -func RefreshJxPriceByVendor(ctx *jxcontext.Context, jdStoreSkus []*JdStoreSkus, vendorID int, isAsync, isContinueWhenError bool) (hint string, err error) { +func RefreshJxPriceByVendor(ctx *jxcontext.Context, jdStoreSkus []*JdStoreSkus, vendorID int, ignoreLow, isAsync, isContinueWhenError bool) (hint string, err error) { var ( db = dao.GetDB() jdMap = make(map[int][]*JdStoreSkus) @@ -3572,6 +3614,8 @@ func RefreshJxPriceByVendor(ctx *jxcontext.Context, jdStoreSkus []*JdStoreSkus, pricePercentagePack []*model.PricePercentageItem cats []*model.ThingMap skus []*model.SkuAndName + vendorPrice int + specQuality float64 ) sql := ` SELECT t1.* @@ -3586,7 +3630,7 @@ func RefreshJxPriceByVendor(ctx *jxcontext.Context, jdStoreSkus []*JdStoreSkus, } err = dao.GetRows(db, &cats, sql, sqlParams...) if len(cats) > 0 { - skus, err = dao.GetSkus(db, []int{int(cats[0].ThingID)}, nil, nil, nil) + skus, err = dao.GetSkus(db, []int{int(cats[0].ThingID)}, nil, nil, nil, nil) if err != nil || len(skus) == 0 { return result, fmt.Errorf("没有找到该京西skuID!,京西skuID :[%v]", cats[0].ThingID) } @@ -3598,7 +3642,20 @@ func RefreshJxPriceByVendor(ctx *jxcontext.Context, jdStoreSkus []*JdStoreSkus, return result, fmt.Errorf("没有找到该京东门店对应的京西门店!,京东门店ID :[%v]", v.JdStoreID) } err = jxutils.Strings2Objs(store.PricePercentagePackStr, &pricePercentagePack) - jxPrice := jxutils.CaculateJxPriceByPricePack(pricePercentagePack, 0, v.Price) + if skus[0].Unit == model.SpecialUnit { + if skus[0].SpecUnit == model.SpecUnitNames[1] || skus[0].SpecUnit == model.SpecUnitNames[2] { + specQuality = float64(skus[0].SpecQuality) * 1000 + } else { + specQuality = float64(skus[0].SpecQuality) + } + vendorPrice = int(utils.Float64TwoInt64(specQuality / utils.Int2Float64(model.SpecialSpecQuality) * utils.Int2Float64(v.Price))) + } else { + vendorPrice = v.Price + } + jxPrice := jxutils.CaculateJxPriceByPricePack(pricePercentagePack, 0, vendorPrice) + if skus[0].Unit == model.SpecialUnit { + jxPrice = int(utils.Float64TwoInt64(utils.Int2Float64(jxPrice) * utils.Int2Float64(model.SpecialSpecQuality) / specQuality)) + } jdMap[store.ID] = append(jdMap[store.ID], &JdStoreSkus{ JdSkuID: skus[0].NameID, Price: jxPrice, @@ -3621,7 +3678,16 @@ func RefreshJxPriceByVendor(ctx *jxcontext.Context, jdStoreSkus []*JdStoreSkus, for kk, vv := range v { result, err := dao.GetStoreSkuBindByNameID(db, k, kk, model.SkuStatusNormal) if len(result) > 0 && err == nil { - if result[0].UnitPrice > vv { + if ignoreLow { + if result[0].UnitPrice > vv { + storeSkuBindInfo := &StoreSkuBindInfo{ + StoreID: k, + NameID: kk, + UnitPrice: vv, + } + param = append(param, storeSkuBindInfo) + } + } else { storeSkuBindInfo := &StoreSkuBindInfo{ StoreID: k, NameID: kk, @@ -3636,14 +3702,29 @@ func RefreshJxPriceByVendor(ctx *jxcontext.Context, jdStoreSkus []*JdStoreSkus, for _, v := range jdStoreSkus { var ( pricePercentagePack []*model.PricePercentageItem + vendorPrice int + specQuality float64 ) - skus, _ := dao.GetSkus(db, []int{v.JdSkuID}, nil, nil, nil) + skus, _ := dao.GetSkus(db, []int{v.JdSkuID}, nil, nil, nil, nil) if len(skus) == 0 { continue } store, _ := dao.GetStoreDetail(db, v.JdStoreID, vendorID) err = jxutils.Strings2Objs(store.PricePercentagePackStr, &pricePercentagePack) - jxPrice := jxutils.CaculateJxPriceByPricePack(pricePercentagePack, 0, v.Price) + if skus[0].Unit == model.SpecialUnit { + if skus[0].SpecUnit == model.SpecUnitNames[1] || skus[0].SpecUnit == model.SpecUnitNames[2] { + specQuality = float64(skus[0].SpecQuality) * 1000 + } else { + specQuality = float64(skus[0].SpecQuality) + } + vendorPrice = int(utils.Float64TwoInt64(specQuality / utils.Int2Float64(model.SpecialSpecQuality) * utils.Int2Float64(v.Price))) + } else { + vendorPrice = v.Price + } + jxPrice := jxutils.CaculateJxPriceByPricePack(pricePercentagePack, 0, vendorPrice) + if skus[0].Unit == model.SpecialUnit { + jxPrice = int(utils.Float64TwoInt64(utils.Int2Float64(jxPrice) * utils.Int2Float64(model.SpecialSpecQuality) / specQuality)) + } jdMap[v.JdStoreID] = append(jdMap[v.JdStoreID], &JdStoreSkus{ JdSkuID: skus[0].NameID, Price: jxPrice, @@ -3666,7 +3747,16 @@ func RefreshJxPriceByVendor(ctx *jxcontext.Context, jdStoreSkus []*JdStoreSkus, for kk, vv := range v { result, err := dao.GetStoreSkuBindByNameID(db, k, kk, model.SkuStatusNormal) if len(result) > 0 && err == nil { - if result[0].UnitPrice > vv { + if ignoreLow { + if result[0].UnitPrice > vv { + storeSkuBindInfo := &StoreSkuBindInfo{ + StoreID: k, + NameID: kk, + UnitPrice: vv, + } + param = append(param, storeSkuBindInfo) + } + } else { storeSkuBindInfo := &StoreSkuBindInfo{ StoreID: k, NameID: kk, @@ -3693,3 +3783,268 @@ func RefreshJxPriceByVendor(ctx *jxcontext.Context, jdStoreSkus []*JdStoreSkus, } return hint, err } + +func RefreshJxPriceByVendor2(ctx *jxcontext.Context, storeIDs []int, vendorID int, isAsync, isContinueWhenError bool) (hint string, err error) { + var ( + db = dao.GetDB() + param []*StoreSkuBindInfo + ) + taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: + for _, storeID := range storeIDs { + var ( + pricePercentagePack []*model.PricePercentageItem + skuNameMap = make(map[int]int64) + ) + storeDetail, _ := dao.GetStoreDetail(db, storeID, vendorID) + err = jxutils.Strings2Objs(storeDetail.PricePercentagePackStr, &pricePercentagePack) + if partner.IsMultiStore(vendorID) { + mulitStoreSkuHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler) + skuList, err := dao.GetSkusWithVendor(db, []int{vendorID}, nil, nil, nil, false) + if err != nil { + return "", err + } + bareStoreSkuMap := make(map[string][]*partner.StoreSkuInfo) + for _, sku := range skuList { + bareStoreSkuMap[sku.VendorOrgCode] = append(bareStoreSkuMap[sku.VendorOrgCode], &partner.StoreSkuInfo{ + SkuID: sku.ID, + VendorSkuID: sku.VendorSkuID, + }) + } + for _, orgCode := range apimanager.CurAPIManager.GetAppOrgCodeList(vendorID) { + outStoreSkuList, _ := mulitStoreSkuHandler.GetStoreSkusBareInfo(ctx, orgCode, task, storeID, storeDetail.VendorStoreID, bareStoreSkuMap[orgCode]) + for _, sku := range outStoreSkuList { + price, nameID := getSkuNamePrice(db, sku.SkuID, sku.VendorPrice) + if skuNameMap[nameID] < price { + skuNameMap[nameID] = price + } + } + for k, v := range skuNameMap { + unitPrice := jxutils.CaculateJxPriceByPricePack(pricePercentagePack, 0, int(v)) + storeSkuBindInfo := &StoreSkuBindInfo{ + StoreID: storeID, + NameID: k, + UnitPrice: unitPrice, + } + param = append(param, storeSkuBindInfo) + } + } + } else { + singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) + outSkuNameList, _ := singleStoreHandler.GetStoreSkusFullInfo(ctx, task, storeID, storeDetail.VendorStoreID, nil) + for _, skuName := range outSkuNameList { + sku := skuName.SkuList[0] + price, nameID := getSkuNamePrice(db, sku.SkuID, sku.VendorPrice) + if skuNameMap[nameID] < price { + skuNameMap[nameID] = price + } + } + for k, v := range skuNameMap { + unitPrice := jxutils.CaculateJxPriceByPricePack(pricePercentagePack, 0, int(v)) + storeSkuBindInfo := &StoreSkuBindInfo{ + StoreID: storeID, + NameID: k, + UnitPrice: unitPrice, + } + param = append(param, storeSkuBindInfo) + } + } + } + case 1: + _, err = UpdateStoresSkusByBind(ctx, nil, param, isAsync, isContinueWhenError) + } + return result, err + } + taskSeq := tasksch.NewSeqTask2("根据平台价刷新京西平台价", ctx, isContinueWhenError, taskSeqFunc, 2) + tasksch.HandleTask(taskSeq, nil, true).Run() + if !isAsync { + _, err = taskSeq.GetResult(0) + hint = "1" + } else { + hint = taskSeq.GetID() + } + return hint, err +} + +func getSkuNamePrice(db *dao.DaoDB, skuID int, orgPrice int64) (price int64, nameID int) { + var ( + specQuality float64 + ) + skuList, _ := dao.GetSkus(db, []int{skuID}, nil, nil, nil, nil) + for _, v := range skuList { + if v.Unit == model.SpecialUnit { + if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] { + specQuality = float64(v.SpecQuality) * 1000 + } else { + specQuality = float64(v.SpecQuality) + } + price = utils.Float64TwoInt64(utils.Int2Float64(model.SpecialSpecQuality) / specQuality * utils.Int2Float64(int(orgPrice))) + } else { + price = orgPrice + } + nameID = v.NameID + } + return price, nameID +} + +func BackUpStoreSkuBind(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { + var ( + db = dao.GetDB() + snapshotAt = utils.Time2Date(time.Now()) + ) + storeSkuBindHis := &model.StoreSkuBindHistory{ + SnapshotAt: snapshotAt.AddDate(0, 0, -2), + } + storeSkuBindHis2 := &model.StoreSkuBindHistory{ + SnapshotAt: snapshotAt, + } + dao.DeleteEntity(db, storeSkuBindHis, "SnapshotAt") + dao.DeleteEntity(db, storeSkuBindHis2, "SnapshotAt") + storeList, err := dao.GetStoreList(db, nil, nil, nil, nil, "") + task := tasksch.NewParallelTask("BackUpStoreSkuBind", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + store := batchItemList[0].(*model.Store) + storeSku, err := dao.GetStoresSkusInfo(db, []int{store.ID}, nil) + var storeSkuBindHiss []*model.StoreSkuBindHistory + for _, v := range storeSku { + storeSkuBindHis := &model.StoreSkuBindHistory{} + storeSkuBindHis.StoreSkuBind = *v + storeSkuBindHis.StoreSkuBindID = v.ID + storeSkuBindHis.StoreSkuBind.ID = 0 + storeSkuBindHis.SnapshotAt = utils.Time2Date(snapshotAt) + storeSkuBindHiss = append(storeSkuBindHiss, storeSkuBindHis) + } + if len(storeSkuBindHiss) > 0 { + dao.CreateMultiEntities(db, storeSkuBindHiss) + } + return retVal, err + }, storeList) + tasksch.HandleTask(task, nil, true).Run() + if isAsync { + hint = task.GetID() + } else { + _, err = task.GetResult(0) + hint = "1" + } + return hint, err +} + +func ReturnStoreSkuBind(ctx *jxcontext.Context, snapshotAt string, storeIDs, skuIDs []int) (err error) { + var ( + spAt = utils.Time2Date(utils.Str2Time(snapshotAt)) + db = dao.GetDB() + ) + if len(storeIDs) == 0 { + return fmt.Errorf("必须选择一个门店!") + } + if len(storeIDs) > 1 { + return fmt.Errorf("暂时只支持一次操作一个门店!") + } + //删除原门店商品 + sql := `DELETE FROM store_sku_bind WHERE store_id IN(` + dao.GenQuestionMarks(len(storeIDs)) + `)` + sqlParams := []interface{}{storeIDs} + if len(skuIDs) > 0 { + sql += " AND sku_id IN(" + dao.GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + _, err = dao.ExecuteSQL(db, sql, sqlParams) + //查询备份的门店商品 + var storeHiss []*model.StoreSkuBindHistory + sql2 := `SELECT * FROM store_sku_bind_history WHERE snapshot_at = ? AND store_id IN(` + dao.GenQuestionMarks(len(storeIDs)) + `)` + sqlParams2 := []interface{}{spAt, storeIDs} + if len(skuIDs) > 0 { + sql2 += " AND sku_id IN(" + dao.GenQuestionMarks(len(skuIDs)) + ")" + sqlParams2 = append(sqlParams2, skuIDs) + } + err = dao.GetRows(db, &storeHiss, sql2, sqlParams2) + //插入到现在 + var storeSkus []*model.StoreSkuBind + for _, v := range storeHiss { + storeSku := &model.StoreSkuBind{} + storeSku = &v.StoreSkuBind + storeSku.ID = v.StoreSkuBindID + storeSkus = append(storeSkus, storeSku) + } + if len(storeSkus) > 0 { + dao.CreateMultiEntities(db, storeSkus) + } + return err +} + +func RefreshMatterStock(ctx *jxcontext.Context, skuID int) (err error) { + var ( + db = dao.GetDB() + skuBindInfos []*StoreSkuBindInfo + ) + if skuID != 0 { + skus, err := dao.GetSkus(db, []int{skuID}, nil, nil, nil, nil) + if err != nil || len(skus) == 0 { + return err + } + result, err := api.JdEclpAPI.QueryStock(skus[0].EclpID) + if err != nil || result == nil { + return err + } + var isSale = 0 + if len(result) == 0 { + isSale = -1 + } else { + if result[0].UsableNum > 0 { + isSale = 1 + } else { + isSale = -1 + } + } + storeSkuList, _ := dao.GetStoresSkusInfo(db, nil, []int{skuID}) + for _, vv := range storeSkuList { + var storeSkuBindSkus []*StoreSkuBindSkuInfo + storeSkuBindSku := &StoreSkuBindSkuInfo{ + SkuID: vv.SkuID, + IsSale: isSale, + } + storeSkuBindSkus = append(storeSkuBindSkus, storeSkuBindSku) + storeSkuBind := &StoreSkuBindInfo{ + StoreID: vv.StoreID, + // NameID: v.SkuNameID, + Skus: storeSkuBindSkus, + } + skuBindInfos = append(skuBindInfos, storeSkuBind) + } + } else { + result, err := api.JdEclpAPI.QueryStock("") + if err != nil { + return err + } + for _, v := range result { + skus, err := dao.GetSkus(db, nil, nil, nil, nil, []string{v.GoodsNo}) + if err != nil || len(skus) == 0 { + continue + } + var isSale = 0 + if v.UsableNum > 0 { + isSale = 1 + } else { + isSale = -1 + } + storeSkuList, _ := dao.GetStoresSkusInfo(db, nil, []int{skus[0].ID}) + for _, vv := range storeSkuList { + var storeSkuBindSkus []*StoreSkuBindSkuInfo + storeSkuBindSku := &StoreSkuBindSkuInfo{ + SkuID: vv.SkuID, + IsSale: isSale, + } + storeSkuBindSkus = append(storeSkuBindSkus, storeSkuBindSku) + storeSkuBind := &StoreSkuBindInfo{ + StoreID: vv.StoreID, + NameID: skus[0].NameID, + Skus: storeSkuBindSkus, + } + skuBindInfos = append(skuBindInfos, storeSkuBind) + } + } + } + //物料店666666 + updateStoresSkusWithoutSync(ctx, db, []int{666666}, skuBindInfos, false) + return err +} diff --git a/business/jxstore/cms/store_sku_check.go b/business/jxstore/cms/store_sku_check.go index 6268288ef..af4fe0995 100644 --- a/business/jxstore/cms/store_sku_check.go +++ b/business/jxstore/cms/store_sku_check.go @@ -433,7 +433,7 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin func FilterJxDepotUnSaleSkuID() { db := dao.GetDB() filterJxDepotUnSaleSkuIds = filterJxDepotUnSaleSkuIds[0:0] - skuList, _ := dao.GetSkus(db, filterVendorDepotUnSaleSkuIds, []int{}, []int{}, []int{}) + skuList, _ := dao.GetSkus(db, filterVendorDepotUnSaleSkuIds, []int{}, []int{}, []int{}, nil) filterJxSkuInfoMap2 := GetFilterJxSkuInfoMap2(skuList) for skuid, jxSkuInfo := range filterJxSkuInfoMap2 { //过滤掉平台库下架,且京西库下架的商品,为下面比较门店商品用 @@ -456,7 +456,7 @@ func CompareJxAndMultiVenderDepot(ctx *jxcontext.Context, vendorMap map[int]bool FilterJxDepotUnSaleSkuID() filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(skuNameInfoList) skuNameInfoList = skuNameInfoList[0:0] - skuList, _ := dao.GetSkus(db, []int{}, []int{}, []int{}, []int{}) + skuList, _ := dao.GetSkus(db, []int{}, []int{}, []int{}, []int{}, nil) filterJxSkuInfoMap2 := GetFilterJxSkuInfoMap2(skuList) for skuid, jxSkuInfo := range filterJxSkuInfoMap2 { var jxSkuDetailName string @@ -571,7 +571,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, } } else { if singleFlag == false { - jxSkuInfoDataSingle, _ = GetStoreSkus(ctx, storeID, []int{}, true, "", true, false, map[string]interface{}{}, 0, -1) + jxSkuInfoDataSingle, _ = GetStoreSkus(ctx, storeID, nil, true, "", true, false, map[string]interface{}{}, 0, -1) filterJxSkuInfoMapSingle = GetFilterJxSkuInfoMap(jxSkuInfoDataSingle.SkuNames) //map[京西商品ID:StoreSkuNameExt] singleFlag = true } diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 4d4b3087f..de53fadab 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -660,8 +660,10 @@ func buildSetFinishHook(task tasksch.ITask, ctx *jxcontext.Context) { } if authInfo, err := ctx.GetV2AuthInfo(); err == nil { ddmsg.SendUserMessage(dingdingapi.MsgTyeText, authInfo.UserID, "同步错误返回", noticeMsg) + } else { + globals.SugarLogger.Debugf("同步错误发送钉钉消息失败, authinfo [%v] , [%v]", *authInfo, err) } - } else { + }else { if time.Now().Hour() >= 20 || time.Now().Hour() < 7 { downloadURL, _, _ := WirteToExcelBySyncFailed(task) user, err := dao.GetUserByID(dao.GetDB(), "mobile", "18160030913") diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 7c94c70ac..19f029bac 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -378,7 +378,7 @@ func CreateUser(user *model.User, creatorName string) (err error) { dao.WrapAddIDCULDEntity(user, creatorName) user.UserID = utils.GetUUID() user.Status = model.UserStatusNormal - user.DividePercentage = 5 + user.DividePercentage = 1 return dao.CreateEntity(nil, user) } @@ -1054,3 +1054,31 @@ func DeleteUserInfo(ctx *jxcontext.Context, userID string) (err error) { } return err } + +func GetMyJxStoreList(ctx *jxcontext.Context, mobile string) (storesInfo interface{}, err error) { + db := dao.GetDB() + user, err := dao.GetUserByID(db, "mobile", mobile) + if err != nil { + return nil, err + } + userID := user.UserID + var storeList []*dao.StoreWithCityName + if storeList, err = GetStoreList4User(ctx, mobile, userID); err == nil && len(storeList) > 0 { + // todo,应该用通用方法 + mapDataList := make([]map[string]interface{}, len(storeList)) + for k, v := range storeList { + mapDataList[k] = map[string]interface{}{ + "id": v.ID, + "address": v.Address, + "cityName": v.CityName, + "name": v.Name, + "tel1": v.Tel1, + "tel2": v.Tel2, + "payeeName": v.PayeeName, + "status": v.Status, + } + } + storesInfo = mapDataList + } + return storesInfo, err +} diff --git a/business/jxstore/event/event.go b/business/jxstore/event/event.go index f8695719f..a4d135f37 100644 --- a/business/jxstore/event/event.go +++ b/business/jxstore/event/event.go @@ -6,6 +6,8 @@ import ( "strings" "time" + "git.rosy.net.cn/baseapi/platformapi/ebaiapi" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -57,7 +59,7 @@ func AddOperateEvent(ctx *jxcontext.Context, accessUUID, jsonData string, errCod } jsonData = strings.ReplaceAll(jsonData, regexpToken.FindString(jsonData), "") jsonData = utils.LimitUTF8StringLen(jsonData, 3200) - errMsg = utils.LimitUTF8StringLen(errMsg, 3200) + errMsg = utils.LimitUTF8StringLen(errMsg, 9999) event := &model.OperateEvent{ CreatedAt: time.Now(), LastOperator: ctx.GetUserName(), @@ -140,6 +142,7 @@ func GetCheckVendorCookie(ctx *jxcontext.Context, vendorIDs []int, isAuto bool) var ( ebaiOrderID = "1577329467196263592" ebaiErr = "return not json" + ebaiErr2 = "系统错误" mtStoreID = "7388603" mtErr = "返回结果格式不正常" jdUpcCode = "6952395700895" @@ -157,11 +160,31 @@ func GetCheckVendorCookie(ctx *jxcontext.Context, vendorIDs []int, isAuto bool) case model.VendorIDEBAI: resultMap, err := api.EbaiAPI.GetStoreOrderInfo(ebaiOrderID) if len(resultMap) < 1 && err != nil { - if strings.Contains(err.Error(), ebaiErr) { + if strings.Contains(err.Error(), ebaiErr) || strings.Contains(err.Error(), ebaiErr2) { errMsg += fmt.Sprintf(" 饿百账号:[%v]的Cookie无效了!", vv) flag = true } } + result, err := api.Ebai2API.GetEbaiDepotSku(ebaiapi.EbaiWholeCountryStore, "190700570") + if err != nil || len(result) < 1 { + cc := &CheckCookie{} + cc.VendorID = v + cc.VendorOrgCode = "饿百后台饿鲜达全国账号" + cc.Status = "无效" + ccList = append(ccList, cc) + errMsg += fmt.Sprintf(" 饿百账号:[饿百后台饿鲜达全国账号]的Cookie无效了!", vv) + flag = true + } + // result2, err2 := api.EbaiAPI.GetExianDaSkuDepot("190600741") + // if err2 != nil || result2 == nil { + // cc := &CheckCookie{} + // cc.VendorID = v + // cc.VendorOrgCode = "饿鲜达供应链系统" + // cc.Status = "无效" + // ccList = append(ccList, cc) + // errMsg += fmt.Sprintf(" 饿百账号:[饿鲜达供应链系统]的Cookie无效了!", vv) + // flag = true + // } case model.VendorIDMTWM: _, err := api.MtwmAPI.PackagePriceGet(mtStoreID) if err != nil { @@ -178,6 +201,16 @@ func GetCheckVendorCookie(ctx *jxcontext.Context, vendorIDs []int, isAuto bool) flag = true } } + result2, err2 := api.JdPageAPI.GetCorporationInfo("11926674", "92510108MA68KK3M8P") + if err2 != nil || result2 == nil { + cc := &CheckCookie{} + cc.VendorID = v + cc.VendorOrgCode = "京东page账号" + cc.Status = "无效" + ccList = append(ccList, cc) + errMsg += fmt.Sprintf(" 京东page账号:的Cookie无效了!", vv) + flag = true + } } cc.VendorID = v cc.VendorOrgCode = vv @@ -189,24 +222,6 @@ func GetCheckVendorCookie(ctx *jxcontext.Context, vendorIDs []int, isAuto bool) ccList = append(ccList, cc) } } - // else { - // cc := &CheckCookie{} - // var flag = false - // if v == model.VendorIDMTPS { - // err := api.MtpsAPI.GetAccountDetail() - // if err != nil && strings.Contains(err.Error(), mtpsErr) { - // errMsg += " 美团配送账号的Cookie无效了!" - // flag = true - // } - // } - // cc.VendorID = v - // if flag { - // cc.Status = "无效" - // } else { - // cc.Status = "有效" - // } - // ccList = append(ccList, cc) - // } } if isAuto && errMsg != "" { globals.SugarLogger.Warnf("GetCheckVendorCookie:[%v]", errMsg) diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 3e770eca6..430f6884f 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -6,7 +6,10 @@ import ( "sync" "time" + "git.rosy.net.cn/baseapi/platformapi/jdapi" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx" + "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/business/jxstore/event" @@ -103,7 +106,23 @@ var ( cms.AutoSaleAtStr, } + backUpStoreSkuBindList = []string{ + "23:30:00", + } + importantTaskMap = &sync.Map{} + + cancelPayTimeOutOrderList = localjx.GetHalfHoursList() + + ebaiStorePageCookieExdTOKEN string + ebaiStorePageCookieWMUSS2 string + ebaiStorePageCookieWMSTOKEN2 string + ebaiStorePageCookieWMUSS string + ebaiStorePageCookieWMSTOKEN string + mtwmCookieStr string + mtpsStoreToken string + jd2StorePageCookie string + JdStorePageCookie string ) func GetImportantTaskID(taskName string) string { @@ -180,25 +199,76 @@ func Init() { ScheduleTimerFunc("AutoPayForPopluarMan", func() { localjx.AutoPayForPopluarMan(jxcontext.AdminCtx) }, autoPayForPopluarManList) + ScheduleTimerFunc("CancelPayTimeOutOrder", func() { + localjx.CancelPayTimeOutOrder(jxcontext.AdminCtx) + }, cancelPayTimeOutOrderList) + ScheduleTimerFunc("BackUpStoreSkuBind", func() { + cms.BackUpStoreSkuBind(jxcontext.AdminCtx, true, true) + }, backUpStoreSkuBindList) } ScheduleTimerFunc("AutoSaleStoreSku", func() { cms.AutoSaleStoreSku(jxcontext.AdminCtx, nil, false) }, autoSaleStoreSkuTimeList) if beego.BConfig.RunMode == "beta" { + ScheduleTimerFunc("CancelPayTimeOutOrder", func() { + localjx.CancelPayTimeOutOrder(jxcontext.AdminCtx) + }, cancelPayTimeOutOrderList) ScheduleTimerFunc("GetAndStoreCitiesShops", func() { netspider.GetAndStoreCitiesShops(jxcontext.AdminCtx, nil, nil, 0, 0, false, false) }, []string{ "04:05:06", }) } + if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieExdTOKEN", model.ConfigTypeCookie, ""); err == nil { + ebaiStorePageCookieExdTOKEN = configs[0].Value + } + if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieWMUSS2", model.ConfigTypeCookie, ""); err == nil { + ebaiStorePageCookieWMUSS2 = configs[0].Value + } + if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieWMSTOKEN2", model.ConfigTypeCookie, ""); err == nil { + ebaiStorePageCookieWMSTOKEN2 = configs[0].Value + } + if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieWMUSS", model.ConfigTypeCookie, ""); err == nil { + ebaiStorePageCookieWMUSS = configs[0].Value + } + if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieWMSTOKEN", model.ConfigTypeCookie, ""); err == nil { + ebaiStorePageCookieWMSTOKEN = configs[0].Value + } + if configs, err := dao.QueryConfigs(dao.GetDB(), "mtwmCookieStr", model.ConfigTypeCookie, ""); err == nil { + mtwmCookieStr = configs[0].Value + } + if configs, err := dao.QueryConfigs(dao.GetDB(), "mtpsStoreToken", model.ConfigTypeCookie, ""); err == nil { + mtpsStoreToken = configs[0].Value + } + if configs, err := dao.QueryConfigs(dao.GetDB(), "jdStorePageCookie", model.ConfigTypeCookie, ""); err == nil { + JdStorePageCookie = configs[0].Value + } + if configs, err := dao.QueryConfigs(dao.GetDB(), "jd2StorePageCookie", model.ConfigTypeCookie, ""); err == nil { + jd2StorePageCookie = configs[0].Value + } + if globals.Jd2OrgCode != "" { + api.Jd2API.SetJdCookie(jd2StorePageCookie) + } + api.EbaiAPI.SetCookie("PASSPORT_DELIMONT_TOKEN", ebaiStorePageCookieExdTOKEN) + api.EbaiAPI.SetCookie("WMUSS", ebaiStorePageCookieWMUSS) + api.EbaiAPI.SetCookie("WMSTOKEN", ebaiStorePageCookieWMSTOKEN) + api.Ebai2API.SetCookie("PASSPORT_DELIMONT_TOKEN", ebaiStorePageCookieExdTOKEN) + api.Ebai2API.SetCookie("WMUSS", ebaiStorePageCookieWMUSS2) + api.Ebai2API.SetCookie("WMSTOKEN", ebaiStorePageCookieWMSTOKEN2) + api.MtwmAPI.SetCookieWithStr(mtwmCookieStr) + api.MtpsAPI.SetCookie("token", mtpsStoreToken) + api.JdAPI.SetJdCookie(JdStorePageCookie) + api.JdPageAPI.SetCookie(jdapi.AccessStorePageCookieName, JdStorePageCookie) + api.JdPageAPI.SetCookie(jdapi.AccessStorePageCookieName2, JdStorePageCookie) } func syncStoreSku() { - syncFlag := model.SyncFlagPriceMask - if (time.Now().Unix()/24*3600)%10 == 0 { - syncFlag |= model.SyncFlagSaleMask - } + syncFlag := 0 + // syncFlag := model.SyncFlagPriceMask + // if (time.Now().Unix()/24*3600)%10 == 0 { + // syncFlag |= model.SyncFlagSaleMask + // } task := tasksch.NewParallelTask("同步京西与平台数据", nil, jxcontext.AdminCtx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { step := batchItemList[0].(int) @@ -221,13 +291,18 @@ func syncStoreSku() { // _, err = cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, db, partner.GetMultiStoreVendorIDs(), nil, false, []int{27379}, true, true) errList.AddErr(err) case 1: + // errList.AddErr(cms.SetSingleStoreSkuSyncModifyStatus(db, []int{3})) + errList.AddErr(cms.SetSingleStoreSkuSyncModifyStatus(db, partner.GetSingleStoreVendorIDs())) + // _, err = cms.CurVendorSync.AmendAndPruneStoreStuff(jxcontext.AdminCtx, []int{3}, nil, false, true, cms.AmendPruneAll, false) _, err = cms.CurVendorSync.AmendAndPruneStoreStuff(jxcontext.AdminCtx, partner.GetSingleStoreVendorIDs(), nil, false, true, cms.AmendPruneAll, false) errList.AddErr(err) SaveImportantTaskID(TaskNameSyncStoreSku, SpecialTaskID) + // taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{3}, nil, false, nil, nil, syncFlag, true, true) taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, partner.GetSingleStoreVendorIDs(), nil, false, nil, nil, syncFlag, true, true) + errList.AddErr(err2) SaveImportantTaskID(TaskNameSyncStoreSku, taskID) } @@ -246,7 +321,7 @@ func doDailyWork() { cms.CurVendorSync.SyncStore2(jxcontext.AdminCtx, dao.GetDB(), nil, nil, true, true) syncStoreSku() - + localjx.RefreshAllMatterOrderStatus(jxcontext.AdminCtx) InitEx() // 每天补全前一天与当天的订单 diff --git a/business/jxstore/misc/store_sku_sales.go b/business/jxstore/misc/store_sku_sales.go index 2f7e677fe..0e42e5eb1 100644 --- a/business/jxstore/misc/store_sku_sales.go +++ b/business/jxstore/misc/store_sku_sales.go @@ -133,7 +133,7 @@ func GetStoreSkuSalesInfo(ctx *jxcontext.Context, storeID int) (outStoreSkuSales //输出商品销量统计结果 skuAndNameMapData := make(map[int]*model.SkuAndName) if len(storeSkuMapData) < len(citySkuIDs) { - skuAndNameList, err := dao.GetSkus(db, citySkuIDs, nil, nil, nil) + skuAndNameList, err := dao.GetSkus(db, citySkuIDs, nil, nil, nil, nil) if err == nil { for _, value := range skuAndNameList { skuAndNameMapData[value.ID] = value @@ -149,7 +149,7 @@ func GetStoreSkuSalesInfo(ctx *jxcontext.Context, storeID int) (outStoreSkuSales if storeSkuInfo != nil { skuName := storeSkuInfo.SkuName skuInfo := storeSkuInfo.Skus[0] - storeSkuSales.SkuName = jxutils.ComposeSkuName(skuName.Prefix, skuName.Name, skuInfo.Comment, skuName.Unit, skuInfo.SkuSpecQuality, skuInfo.SkuSpecUnit, 0,skuName.ExPrefix,skuName.ExPrefixBegin,skuName.ExPrefixEnd) + storeSkuSales.SkuName = jxutils.ComposeSkuName(skuName.Prefix, skuName.Name, skuInfo.Comment, skuName.Unit, skuInfo.SkuSpecQuality, skuInfo.SkuSpecUnit, 0, skuName.ExPrefix, skuName.ExPrefixBegin, skuName.ExPrefixEnd) storeSkuSales.SkuImage = storeSkuInfo.Img storeSkuSales.SkuPrice = jxutils.IntPrice2StandardCurrencyString(int64(storeSkuInfo.Skus[0].BindPrice)) } else if skuAndNameInfo != nil { @@ -159,7 +159,7 @@ func GetStoreSkuSalesInfo(ctx *jxcontext.Context, storeID int) (outStoreSkuSales storeSkuSales.SkuImage = skuNameList[0].Img prefix = skuNameList[0].Prefix } - storeSkuSales.SkuName = jxutils.ComposeSkuName(prefix, skuAndNameInfo.Name, skuAndNameInfo.Comment, skuAndNameInfo.Unit, skuAndNameInfo.SpecQuality, skuAndNameInfo.SpecUnit, 0,skuAndNameInfo.ExPrefix,skuAndNameInfo.ExPrefixBegin,skuAndNameInfo.ExPrefixEnd) + storeSkuSales.SkuName = jxutils.ComposeSkuName(prefix, skuAndNameInfo.Name, skuAndNameInfo.Comment, skuAndNameInfo.Unit, skuAndNameInfo.SpecQuality, skuAndNameInfo.SpecUnit, 0, skuAndNameInfo.ExPrefix, skuAndNameInfo.ExPrefixBegin, skuAndNameInfo.ExPrefixEnd) storeSkuSales.SkuPrice = "N/A" } else { storeSkuSales.SkuName = "N/A" diff --git a/business/jxstore/yonghui/yonghui.go b/business/jxstore/yonghui/yonghui.go index ee8b945c6..a56207879 100644 --- a/business/jxstore/yonghui/yonghui.go +++ b/business/jxstore/yonghui/yonghui.go @@ -312,7 +312,7 @@ func LoadExcelBinByYongHui(ctx *jxcontext.Context, reader io.Reader, isAsync, is //如果微盟商品里找得到excel中的商品 if skuMap[spuCode] != nil { //获取京西库商品 - skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil) + skuList, _ := dao.GetSkus(db, nil, []int{int(utils.Str2Int64(goodsDetail.SkuMap.SingleSku.OuterSkuCode))}, nil, nil, nil) if len(skuList) == 0 { outPutData := DataFailed{ GoodsID: spuCode, diff --git a/business/jxutils/eventhub/syseventhub/syseventhub.go b/business/jxutils/eventhub/syseventhub/syseventhub.go index 528c76973..a99d35e02 100644 --- a/business/jxutils/eventhub/syseventhub/syseventhub.go +++ b/business/jxutils/eventhub/syseventhub/syseventhub.go @@ -13,7 +13,9 @@ import ( const ( EventCategory = "sys" - EventTypeWXToken = "wxToken" + EventTypeWXToken = "wxToken" + EventTypeWX2Token = "wx2Token" + EventTypeYLYToken = "ylyToken" EventTypeWeimobToken = "weimobToken" ) @@ -57,6 +59,13 @@ func (h *Hub) OnNewWXToken(token string) { }) } +func (h *Hub) OnNewWX2Token(token string) { + h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{ + Type: EventTypeWX2Token, + Data: token, + }) +} + func (h *Hub) OnNewYLYToken(token string) { h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{ Type: EventTypeYLYToken, @@ -82,7 +91,10 @@ func (h *Hub) GetToken(tokenType, oldToken string, waitTime time.Duration) (toke if weimobToken := api.WeimobAPI.GetToken(); weimobToken != nil { token = string(utils.MustMarshal(weimobToken)) } + case EventTypeWX2Token: + token = api.WeixinMiniAPI2.CBGetToken() } + if token != oldToken { tokenInfo = &TokenInfo{ IsNew: false, @@ -105,6 +117,10 @@ func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *To return h.GetToken(EventTypeWXToken, oldToken, waitTime) } +func (h *Hub) GetWX2Token(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { + return h.GetToken(EventTypeWX2Token, oldToken, waitTime) +} + func (h *Hub) GetYLYToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { return h.GetToken(EventTypeYLYToken, oldToken, waitTime) } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 160073540..97a011585 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -540,6 +540,15 @@ func RefreshOrderSkuRelated(order *model.GoodsOrder) *model.GoodsOrder { return order } +func RefreshOrderEarningPrice2(order *model.GoodsOrder, payPercentage int) *model.GoodsOrder { + if payPercentage <= 50 { + order.NewEarningPrice = order.TotalShopMoney * int64((100 - payPercentage/2)) / 100 + } else { + order.NewEarningPrice = order.EarningPrice + } + return order +} + func RefreshAfsOrderSkuRelated(afsOrder *model.AfsOrder) *model.AfsOrder { afsOrder.SkuUserMoney = 0 afsOrder.PmSkuSubsidyMoney = 0 diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index ebf749df0..1f4b50e60 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -271,7 +271,7 @@ func CaculateSkuActVendorPrice(price, percentage, priceAdd int) (vendorPrice int func CaculateSkuVendorPrice(price, percentage, priceAdd int) (vendorPrice int) { percentage = ConstrainPricePercentage(percentage) vendorPrice = int(math.Round(float64(price*percentage)/100)) + priceAdd - vendorPrice = int(math.Ceil(float64(vendorPrice)/10) * 10) + vendorPrice = int(math.Round(float64(vendorPrice)/10) * 10) if vendorPrice < 1 { vendorPrice = 1 } diff --git a/business/jxutils/netprinter/netprinter.go b/business/jxutils/netprinter/netprinter.go index b4c72f2f1..c1af8db20 100644 --- a/business/jxutils/netprinter/netprinter.go +++ b/business/jxutils/netprinter/netprinter.go @@ -144,6 +144,7 @@ func BindPrinter(ctx *jxcontext.Context, storeID int, data string) (printResult store.PrinterKey = bindResult.PrinterKey store.PrinterBindInfo = string(utils.MustMarshal(bindResult)) if _, err = dao.UpdateEntity(db, store); err == nil { + err = handler.EmptyPrintList(ctx, bindResult.PrinterSN, bindResult.PrinterKey) printResult, err = handler.GetPrinterStatus(ctx, bindResult.PrinterSN, bindResult.PrinterKey) } } diff --git a/business/jxutils/smsmsg/smsmsg.go b/business/jxutils/smsmsg/smsmsg.go index 3dd900baa..819fbe44a 100644 --- a/business/jxutils/smsmsg/smsmsg.go +++ b/business/jxutils/smsmsg/smsmsg.go @@ -23,7 +23,7 @@ var ( } ) -func SendSMSMsg(mobileList []string, signName, templateCode string, templateParam map[string]interface{}) (err error) { +func SendSMSMsg(mobileList []string, signName, templateCode string, templateParam map[string]interface{}, order *model.GoodsOrder) (err error) { if len(mobileList) > 0 { errList := errlist.New() mobileList = jxutils.StringMap2List(jxutils.StringList2Map(mobileList)) @@ -42,6 +42,8 @@ func SendSMSMsg(mobileList []string, signName, templateCode string, templatePara } else { globals.SugarLogger.Infof(errMsg) } + } else { + err = updateStoreSMSNotifyMark(order) } } } @@ -56,11 +58,13 @@ func getOrderNotifyPhone(order *model.GoodsOrder) (phoneList []string) { } func NotifyNewOrder(order *model.GoodsOrder) (err error) { - err = SendSMSMsg(getOrderNotifyPhone(order), globals.SMSSignName, globals.SMSNewOrderTemplate, map[string]interface{}{ - "daySeq": order.OrderSeq, - "consigneeName": order.ConsigneeName, - "payMoney": jxutils.IntPrice2StandardString(order.ActualPayPrice), - }) + if isPushSMS(order) { + err = SendSMSMsg(getOrderNotifyPhone(order), globals.SMSSignName, globals.SMSNewOrderTemplate, map[string]interface{}{ + "daySeq": order.OrderSeq, + "consigneeName": order.ConsigneeName, + "payMoney": jxutils.IntPrice2StandardString(order.ActualPayPrice), + }, order) + } return err } @@ -69,6 +73,29 @@ func NotifyOrderCanceled(order *model.GoodsOrder) (err error) { "vendorName": model.VendorChineseNames[order.VendorID], "seq": order.OrderSeq, "orderID": order.VendorOrderID, - }) + }, order) + return err +} + +func isPushSMS(order *model.GoodsOrder) bool { + stores, _ := dao.GetStoreList(dao.GetDB(), []int{order.StoreID}, nil, nil, nil, "") + if len(stores) > 0 { + if stores[0].SMSNotifyMark == model.NO { + return true + } else { + return false + } + } else { + return false + } +} + +func updateStoreSMSNotifyMark(order *model.GoodsOrder) (err error) { + var db = dao.GetDB() + stores, _ := dao.GetStoreList(db, []int{order.StoreID}, nil, nil, nil, "") + if len(stores) > 0 { + stores[0].SMSNotifyMark = model.YES + _, err = dao.UpdateEntity(db, stores[0], "SMSNotifyMark") + } return err } diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 3f66b89b2..abbff08c0 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -70,7 +70,7 @@ func RefreshConfig(configKey string, expiresTime time.Duration, configGetter fun if handleType != 0 { if curConfig.Token, curConfig.Date = configGetter(); curConfig.Token == "" { if globals.IsProductEnv() { - globals.SugarLogger.Errorf("RefreshConfig %s get empty token", configKey) + globals.SugarLogger.Infof("RefreshConfig %s get empty token", configKey) sleepDuration = errRefreshGap } else { globals.SugarLogger.Infof("RefreshConfig %s get empty token", configKey) @@ -138,6 +138,33 @@ func RefreshWeixinToken() (err error) { return err } +func RefreshWeixin2Token() (err error) { + if api.WeixinMiniAPI2 != nil { + err = RefreshConfig("wechat2", weixinTokenExpires, func() (token string, expireTimeStr string) { + globals.SugarLogger.Debugf("RefreshWeixin2Token RunMode:%s", beego.BConfig.RunMode) + if globals.IsMainProductEnv() { + if tokenInfo, err := api.WeixinMiniAPI2.CBRetrieveToken(); err == nil { + globals.SugarLogger.Debugf("RefreshWeixin2Token tokenInfo:%s", utils.Format4Output(tokenInfo, true)) + token = tokenInfo.AccessToken + } else { + globals.SugarLogger.Errorf("RefreshWeixin2Token RefreshToken failed with error:%v", err) + } + } else { + if tokenInfo := getWX2TokenFromRemote(api.WeixinMiniAPI2.CBGetToken()); tokenInfo != nil { + expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires)) + token = tokenInfo.Token + } + } + return token, expireTimeStr + }, func(value string) { + globals.SugarLogger.Debugf("RefreshWeixinToken setter value:%s", value) + syseventhub.SysEventHub.OnNewWX2Token(value) + api.WeixinMiniAPI2.CBSetToken(value) + }) + } + return err +} + func RefreshWeimobToken() (err error) { if api.WeimobAPI != nil { err = RefreshConfig("weimob", weimobTokenExpires, func() (token string, expireTimeStr string) { @@ -145,6 +172,8 @@ func RefreshWeimobToken() (err error) { if globals.IsMainProductEnv() { if tokenInfo, err := api.WeimobAPI.RefreshTokenByRefreshToken(); err == nil { return string(utils.MustMarshal(tokenInfo)), utils.Time2Str(time.Now().Add((time.Duration(tokenInfo.ExpiresIn) - weimobTokenExpires/time.Second) * time.Second)) + } else { + globals.SugarLogger.Debugf("RefreshWeimobToken err:%s", err) } } else { curToken := "" @@ -277,6 +306,15 @@ func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { return tokenInfo } +func getWX2TokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { + if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" { + tokenInfo = PollingRemotEvent(globals.GetWeixinTokenURL, 0, map[string]interface{}{ + "oldToken": oldToken, + }) + } + return tokenInfo +} + func getYLYTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetYLYTokenURL != "" { tokenInfo = PollingRemotEvent(globals.GetYLYTokenURL, 0, map[string]interface{}{ diff --git a/business/model/api_config.go b/business/model/api_config.go index 1eb9f795c..7eaca8751 100644 --- a/business/model/api_config.go +++ b/business/model/api_config.go @@ -14,6 +14,7 @@ const ( VendorIDMTWM = 1 VendorIDELM = 2 VendorIDEBAI = 3 + VendorIDYB = 4 //银豹 VendorIDWSC = 11 // 微盟微商城 VendorIDPurchaseEnd = 11 VendorIDJX = 9 // 这是一个假的京西VendorID @@ -45,6 +46,8 @@ const ( VendorIDAutonavi = 321 // 高德导航 VendorIDQiNiuCloud = 323 // 七牛云 VendorIDShowAPI = 325 // 万维易源 + + VendorIDJDWL = 401 //京东物流 ) type VendorInfo struct { @@ -65,6 +68,7 @@ var ( VendorIDELM: "Elm", VendorIDEBAI: "Ebai", VendorIDWSC: "Wsc", + VendorIDYB: "YinBao", VendorIDJX: "Jx", VendorIDDada: "Dada", @@ -90,11 +94,13 @@ var ( VendorIDMTWM: "美团外卖", VendorIDELM: "饿了么", VendorIDEBAI: "饿百新零售", + VendorIDYB: "银豹", VendorIDWSC: "微盟微商城", VendorIDJX: "京西商城", VendorIDDada: "达达众包", VendorIDMTPS: "美团配送", + VendorIDJDWL: "京东物流", VendorIDFeiE: "飞鹅", VendorIDXiaoWM: "外卖管家", diff --git a/business/model/const.go b/business/model/const.go index e9b550b36..03ac5307f 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -138,6 +138,7 @@ var ( "Login": "登录", "RegisterUser": "注册", "AutoPayForPopluarMan": "每日订单打款", + "SyncStoresQualify": "上传门店营业资质", } MultiStoresVendorMap = map[int]int{ diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 7691bcbf8..c91a89b55 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -26,7 +26,9 @@ type StoresOrderSaleInfo struct { SalePrice int64 `json:"salePrice"` ActualPayPrice int64 `json:"actualPayPrice"` - EarningPrice int64 `json:"earningPrice"` // 预估结算给门店老板的钱 + EarningPrice int64 `json:"earningPrice"` // 预估结算给门店老板的钱 + NewEarningPrice int64 `json:"newEarningPrice"` // 预估结算给门店老板的钱(新规则) + DistanceFreightMoney int64 `json:"distanceFreightMoney"` // 商户承担的远距离配送费(当前只有京东到家有值) WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费 } @@ -41,7 +43,8 @@ type OrderSkuWithActualPayPrice struct { StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid Status int `json:"status"` // 参见OrderStatus*相关的常量定义 - PayPercentage int `json:"payPercentage"` + PayPercentage int `json:"payPercentage"` + NewEarningPrice int64 `json:"newEarningPrice"` } type tGoodsAndOrder struct { @@ -356,7 +359,7 @@ func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAt // order_finished_at sql := ` SELECT t1.*, - IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, t2.status, t2.actual_pay_price, t2.distance_freight_money, t2.waybill_tip_money, + IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, t2.status, t2.actual_pay_price, t2.distance_freight_money, t2.waybill_tip_money, t2.new_earning_price, t3.pay_percentage FROM order_sku t1 JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id @@ -386,7 +389,7 @@ func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAt func GetStoreOrderSkuList4Afs(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, isFinish bool) (skuList []*OrderSkuWithActualPayPrice, err error) { sql := ` SELECT t1.*, - t2.actual_pay_price, t2.status, IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, + t2.actual_pay_price, t2.status, IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, t2.new_earning_price, t3.pay_percentage FROM order_sku t1 JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id @@ -1231,3 +1234,28 @@ func GetOrdersForJxPay(db *DaoDB, finishTimeBegin, finishTimeEnd time.Time) (goo err = GetRows(db, &goods, sql, sqlParams...) return goods, err } + +func GetWaybills(db *DaoDB, vendorOrderID string) (waybills []*model.Waybill, err error) { + sql := `SELECT * + FROM waybill + WHERE vendor_order_id = ? + ` + sqlParams := []interface{}{vendorOrderID} + err = GetRows(db, &waybills, sql, sqlParams) + return waybills, err +} + +func GetMatterChildOrders(db *DaoDB, vendorOrderID string) (goods []*model.GoodsOrder, err error) { + sql := `SELECT * + FROM goods_order + WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? + AND vendor_id = ? + ORDER BY vendor_order_id DESC + ` + sqlParams := []interface{}{ + vendorOrderID + "0%", vendorOrderID + "1%", + model.VendorIDJX, + } + err = GetRows(db, &goods, sql, sqlParams) + return goods, err +} diff --git a/business/model/dao/report.go b/business/model/dao/report.go index 5ef8d3c20..ca0e7542e 100644 --- a/business/model/dao/report.go +++ b/business/model/dao/report.go @@ -307,7 +307,7 @@ func GetPriceReferSnapshot(db *DaoDB, cityCodes, skuIDs []int, skuNameID int, sn totalCount = GetLastTotalRowCount(db) } for _, v := range priceReferSnapshot { - skuList, err2 := GetSkus(db, []int{v.SkuID}, nil, nil, nil) + skuList, err2 := GetSkus(db, []int{v.SkuID}, nil, nil, nil, nil) err = err2 if len(skuList) > 0 { skuAndName := skuList[0] diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index c9a970c72..96505e549 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -76,7 +76,7 @@ func GetCategories(db *DaoDB, parentID, level int, catIDs []int, isExd bool) (ca return cats, GetRows(db, &cats, sql, params) } -func GetSkus(db *DaoDB, skuIDs, nameIDs, statuss, catIDs []int) (skuList []*model.SkuAndName, err error) { +func GetSkus(db *DaoDB, skuIDs, nameIDs, statuss, catIDs []int, eclpIDs []string) (skuList []*model.SkuAndName, err error) { sql := ` SELECT t1.*, t2.name, t2.unit, t2.prefix, t2.is_spu, t2.ex_prefix, t2.ex_prefix_begin, t2.ex_prefix_end FROM sku t1 @@ -110,6 +110,10 @@ func GetSkus(db *DaoDB, skuIDs, nameIDs, statuss, catIDs []int) (skuList []*mode sqlWhere += " OR t3p.id IN (" + GenQuestionMarks(len(catIDs)) + ") )" sqlParams = append(sqlParams, catIDs, catIDs) } + if len(eclpIDs) > 0 { + sqlWhere += " AND t1.eclp_id IN (" + GenQuestionMarks(len(eclpIDs)) + ")" + sqlParams = append(sqlParams, eclpIDs) + } sql += sqlWhere if err = GetRows(db, &skuList, sql, sqlParams...); err == nil { return skuList, nil @@ -137,7 +141,7 @@ func GetSkuNames(db *DaoDB, nameIDs []int) (skuNameList []*model.SkuName, err er } func GetSkuIDByNames(db *DaoDB, nameIDs []int) (skuIDs []int, err error) { - skuList, err := GetSkus(db, nil, nameIDs, nil, nil) + skuList, err := GetSkus(db, nil, nameIDs, nil, nil, nil) if err == nil { for _, sku := range skuList { skuIDs = append(skuIDs, sku.ID) @@ -147,7 +151,7 @@ func GetSkuIDByNames(db *DaoDB, nameIDs []int) (skuIDs []int, err error) { } func GetSkuByCats(db *DaoDB, catIDs []int) (skuList []*model.Sku, err error) { - skuExList, err := GetSkus(db, nil, nil, nil, catIDs) + skuExList, err := GetSkus(db, nil, nil, nil, catIDs, nil) if err == nil { for _, v := range skuExList { skuList = append(skuList, &v.Sku) diff --git a/business/model/dao/store.go b/business/model/dao/store.go index 6135869c3..61338a1ac 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -45,6 +45,7 @@ type StoreDetail struct { OperatorName3 string `json:"operatorName3"` JdStoreLevel string `json:"jdStoreLevel"` //京东门店等级 + IsOrder int `json:"isOrder"` //是否是下预订单门店 } // 带快递门店信息的 @@ -88,7 +89,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto sql := ` SELECT t1.*, t2.vendor_store_id, t2.status vendor_status, t2.delivery_fee_deduction_sill, t2.delivery_fee_deduction_fee, t2.sync_status, t2.vendor_org_code, - t2.price_percentage, t2.auto_pickup, t2.delivery_type, t2.delivery_competition, t2.is_sync, t2.vendor_store_name, + t2.price_percentage, t2.auto_pickup, t2.delivery_type, t2.delivery_competition, t2.is_sync, t2.vendor_store_name, t2.is_order, t3.value price_percentage_pack_str, t4.value freight_deduction_pack_str, district.name district_name, diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 91b8f953c..2f1bf76e9 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -148,6 +148,7 @@ type StoreSkuNameExt struct { PendingOpType int8 `json:"pendingOpType"` // 取值同 StoreOpRequest.Type PendingUnitPrice int `json:"pendingUnitPrice"` // 这个是待审核的价格申请 RealMidUnitPrice int `json:"realMidUnitPrice"` + Count int `json:"count"` } // GetStoreSkus用 @@ -232,6 +233,8 @@ type StoreSkuExt struct { EarningPrice int `json:"earningPrice"` EarningActID int `orm:"column(earning_act_id)" json:"earningActID"` + + EclpID string `orm:"column(eclp_id)" json:"eclpID"` } type SkuNameAndPlace struct { @@ -967,7 +970,7 @@ func GetStoreSkusByNameIDs(db *DaoDB, storeIDs []int, nameID int) (skuList []*St func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (storeSkuNameExt []*StoreSkuNameExt, err error) { sql := ` - SELECT 1 s, t1.count, t2.id sku_id, t3.*, t1.store_id, t1.store_name + SELECT t1.count, t2.id sku_id, t3.*, t1.store_id, t1.store_name FROM( SELECT SUM(b.count) count,c.id,a.store_id,d.name store_name FROM goods_order a @@ -995,8 +998,8 @@ func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (storeSkuNameExt []*StoreSk GROUP BY 2,3,4)t1 JOIN sku t2 ON t2.id = t1.id JOIN sku_name t3 ON t3.id = t2.name_id - UNION ALL - SELECT 2 s, 0 count, a.sku_id, g.*, a.store_id, e.name store_name + UNION + SELECT 0 count, a.sku_id, g.*, a.store_id, e.name store_name FROM store_sku_bind a LEFT JOIN act_store_sku b ON a.store_id = b.store_id AND b.sku_id = a.sku_id LEFT JOIN act_map c ON c.act_id = b.act_id @@ -1017,7 +1020,7 @@ func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (storeSkuNameExt []*StoreSk AND a.status = ? AND a.deleted_at = ? AND (d.type = ? OR d.type = ?) - ORDER BY 1,2 DESC + ORDER BY 1 DESC LIMIT ? ` sqlParams = append(sqlParams, model.StoreSkuBindStatusNormal, utils.DefaultTimeValue, model.ActSkuDirectDown, model.ActSkuSecKill, 30) diff --git a/business/model/event.go b/business/model/event.go index c2c17cd8d..6269f7624 100644 --- a/business/model/event.go +++ b/business/model/event.go @@ -11,7 +11,7 @@ type OperateEvent struct { APIFunction string `orm:"column(api_function)" json:"apiFunction"` JsonData string `orm:"size(3200)" json:"jsonData"` ErrCode string `orm:"size(32)" json:"errCode"` - ErrMsg string `orm:"size(3200)" json:"errMsg"` + ErrMsg string `orm:"size(9999)" json:"errMsg"` UseTime int `json:"useTime"` } diff --git a/business/model/new_config.go b/business/model/new_config.go index 4dd3f2a43..a2f1bc131 100644 --- a/business/model/new_config.go +++ b/business/model/new_config.go @@ -7,6 +7,7 @@ const ( ConfigTypeBank = "Bank" ConfigTypeRole = "Role" ConfigTypeJxStore = "JxStore" + ConfigTypeCookie = "Cookie" ) const ( @@ -24,6 +25,7 @@ var ( ConfigTypeBank: "银行", ConfigTypeRole: "角色", ConfigTypeJxStore: "京西商城", + ConfigTypeCookie: "Cookie", } ) diff --git a/business/model/order.go b/business/model/order.go index 71c300506..175171a9f 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -10,6 +10,7 @@ const ( const ( PayTypeWX = 1 // 微信支付 + PayTypeTL = 2 // 通联宝支付 PayStatusNo = 0 PayStatusYes = 1 @@ -63,6 +64,7 @@ type GoodsOrder struct { DistanceFreightMoney int64 `json:"distanceFreightMoney"` // 商户承担的远距离配送费(当前只有京东到家有值) WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费 EarningPrice int64 `json:"earningPrice"` // 结算给门店老板的钱(未扣除可能的三方配送费) + NewEarningPrice int64 `json:"newEarningPrice"` // 结算给门店老板的钱(未扣除可能的三方配送费)(新规则) Weight int `json:"weight"` // 单位为克 VendorUserID string `orm:"column(vendor_user_id);size(48)" json:"vendorUserID"` UserID string `orm:"column(user_id);size(48);index" json:"userID"` @@ -102,6 +104,9 @@ type GoodsOrder struct { InvoiceTaxerID string `orm:"size(32);column(invoice_taxer_id)" json:"invoiceTaxerID"` // 发票纳税人识别码 InvoiceEmail string `orm:"size(64)" json:"invoiceEmail"` // 发票邮箱 VendorOrgCode string `orm:"size(64)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 + FromStoreID int `orm:"column(from_store_id)" json:"fromStoreID"` //物料配送门店 + EclpOutID string `orm:"column(eclp_out_id)" json:"eclpOutID"` //物料配送的出库单号 + AddressID int64 `orm:"column(address_id)" json:"addressID"` //配送地址ID // 以下只是用于传递数据 OriginalData string `orm:"-" json:"-"` @@ -317,7 +322,7 @@ type OrderPay struct { PrepayID string `orm:"column(prepay_id);index;size(48)" json:"prepayID"` // 下单后,支付前,支付方生成的事务ID TransactionID string `orm:"column(transaction_id);index;size(48)" json:"transactionID"` // 支付成功后,支付方生成的事务ID - CodeURL string `orm:"column(code_url);size(256)" json:"codeURL"` + CodeURL string `orm:"column(code_url);size(3200)" json:"codeURL"` OriginalData string `orm:"type(text)" json:"-"` } diff --git a/business/model/sku.go b/business/model/sku.go index d323a9a38..c2e224049 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -228,8 +228,9 @@ type Sku struct { Status int `json:"status"` Seq int `json:"seq"` - ExdSkuID string `orm:"column(exd_sku_id)" json:"exdSkuID"` + ExdSkuID string `orm:"column(exd_sku_id)" json:"exdSkuID"` //饿鲜达商品ID ExdCategoryThirdID int `orm:"column(exd_category_third_id)" json:"exdCategoryThirdID"` + EclpID string `orm:"column(eclp_id)" json:"eclpID"` //eclp物料商品ID // JdID int64 `orm:"column(jd_id);null;index" json:"jdID"` // JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` @@ -281,9 +282,10 @@ type SkuWithVendor struct { type SkuNameExt struct { SkuName - Skus []*SkuWithVendor `orm:"-" json:"skus"` - SkusStr string `json:"-"` - FullName string `json:"fullName"` - Places []int `orm:"-" json:"places"` - PlacesStr string `json:"-"` + Skus []*SkuWithVendor `orm:"-" json:"skus"` + SkusStr string `json:"-"` + FullName string `json:"fullName"` + Places []int `orm:"-" json:"places"` + PlacesStr string `json:"-"` + MidUnitPrice int `json:"midUnitPrice"` } diff --git a/business/model/store.go b/business/model/store.go index 799714676..a97385159 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -56,7 +56,8 @@ const ( ) const ( - ExdStoreName = "饿鲜达" + ExdStoreName = "饿鲜达" + MatterStoreID = 666666 ) var ( @@ -278,7 +279,8 @@ type Store struct { Status int `json:"status"` AutoEnableAt *time.Time `orm:"type(datetime);null" json:"autoEnableAt"` // 自动营业时间(临时休息用) ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核 - SMSNotify int8 `orm:"column(sms_notify);" json:"smsNotify"` // 是否通过短信接收订单消息 + SMSNotify int8 `orm:"column(sms_notify);" json:"smsNotify"` // 是否通过短信接收订单消息(每天只推一条) + SMSNotifyMark int8 `orm:"column(sms_notify_mark);" json:"smsNotifyMark"` //今天是否已经推送过订单消息 AutoReplyType int8 `json:"autoReplyType"` // 订单评价自动回复类型 LinkStoreID int `orm:"column(link_store_id);default(0);index" json:"linkStoreID"` // 关联门店ID @@ -418,6 +420,8 @@ type StoreMap struct { FakeOpenStart int16 `orm:"default(0)" json:"fakeOpenStart"` // 假开店开始 FakeOpenStop int16 `orm:"default(0)" json:"fakeOpenStop"` // 假开店结束 JdStoreLevel string `orm:"size(32)" json:"jdStoreLevel"` //京东门店等级 + + IsOrder int `orm:"default(0)" json:"isOrder"` //是否是下预订单门店 } func (*StoreMap) TableUnique() [][]string { diff --git a/business/model/store_sku.go b/business/model/store_sku.go index 25895a27a..8911292cd 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -134,6 +134,24 @@ func (*StoreSkuBind) TableIndex() [][]string { } } +type StoreSkuBindHistory struct { + StoreSkuBind + StoreSkuBindID int `orm:"column(store_sku_bind_id)"` + SnapshotAt time.Time `orm:"type(datetime);null;index" json:"snapshotAt"` +} + +func (*StoreSkuBindHistory) TableUnique() [][]string { + return [][]string{ + []string{"StoreID", "SkuID", "DeletedAt", "SnapshotAt"}, + } +} + +func (*StoreSkuBindHistory) TableIndex() [][]string { + return [][]string{ + []string{"SkuID", "StoreID", "DeletedAt"}, + } +} + type StoreOpRequest struct { ModelIDCULD // DeletedAt用于表示请求操作结束,而并不一定是删除 diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index af7459001..a4fffb315 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -480,6 +480,7 @@ func (c *PurchaseHandler) SyncQualify(ctx *jxcontext.Context, storeDetail *dao.S } globals.SugarLogger.Debug(utils.Format4Output(qualifyList, false)) if globals.EnableJdStoreWrite { + globals.SugarLogger.Debugf("SaveQualifyTest4,[%v]", utils.Format4Output(qualifyList, false)) err = api.JdPageAPI.SaveQualify(storeDetail.VendorStoreID, jdapi.SaveQualifyActionTypeCommit, qualifyList) // err = api.JdPageAPI.SaveQualify(storeDetail.VendorStoreID, jdapi.SaveQualifyActionTypeSave, qualifyList) } diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index f35c8d385..9c1eb3da3 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -4,12 +4,17 @@ import ( "crypto/md5" "fmt" "math" + "regexp" "sort" + "strings" "time" + "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" + "git.rosy.net.cn/jx-callback/business/jxstore/event" "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/baseapi/platformapi/jdeclpapi" "git.rosy.net.cn/baseapi/platformapi/wxpayapi" "git.rosy.net.cn/jx-callback/globals/api" @@ -35,9 +40,13 @@ const ( PayWaitingTime = 10 * time.Minute // 等待支付的最长时间 DingShiDaMinTime = 1 * time.Hour - specialStoreID = 100274 + specialStoreID = 100274 + specialFreightPrice = 1500 wxAppID = "wx4b5930c13f8b1170" + + autoCancelOrderReason = "支付超时,系统自动取消!" + cancelMatterOrderReason = "失败重发!" ) type JxSkuInfo struct { @@ -47,8 +56,21 @@ type JxSkuInfo struct { Price int64 `json:"price,omitempty"` // 原价 SalePrice int64 `json:"salePrice,omitempty"` // 售卖价 - Name string `json:"name"` - Weight int `json:"weight"` + Name string `json:"name"` + Weight int `json:"weight"` + GroupSign bool `json:"groupSign"` +} + +type JxSkuInfo2 struct { + SkuID int `json:"skuID"` + Count int `json:"count"` + + Price int64 `json:"price,omitempty"` // 原价 + SalePrice int64 `json:"salePrice,omitempty"` // 售卖价 + + Name string `json:"name"` + Weight int `json:"weight"` + GroupSign bool `json:"groupSign"` } type JxSkuInfoList []*JxSkuInfo @@ -80,9 +102,10 @@ type JxOrderInfo struct { OrderPrice int64 `json:"orderPrice"` // 单位为分 订单商品价格 ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付 - OrderID int64 `json:"orderID"` - StoreName string `json:"storeName"` - Weight int `json:"weight"` + OrderID int64 `json:"orderID"` + StoreName string `json:"storeName"` + Weight int `json:"weight"` + FromStoreID int `json:"fromStoreID"` } type DeliveryTimeItem struct { @@ -96,6 +119,13 @@ type DeliveryDayTimeInfo struct { TimeList []*DeliveryTimeItem `json:"timeList"` } +type MatterOrderStatus struct { + Time time.Time `json:"time"` + Status string `json:"status"` + Name string `json:"name"` + Sign int `sign` +} + var ( orderNoBeginTimestamp int64 @@ -109,6 +139,16 @@ var ( 7: "七", } dayList = []string{"今天", "明天", "后天"} + + bagMap = map[int]int{ + 6039382: 100, + 6039383: 200, + 6039384: 200, + 6039387: 200, + 6039390: 200, + } + + regexpCnameAndCmobile = regexp.MustCompile(`配送员,(.*),手机号,(.*)`) ) func init() { @@ -154,18 +194,22 @@ func GetMyOrderCountInfo(ctx *jxcontext.Context, fromDate, toDate time.Time, sta return countInfo, err } -func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64, createType int) (outJxOrder *JxOrderInfo, err error) { - outJxOrder, deliveryAddress, err := generateOrder(ctx, jxOrder, addressID) +func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64, createType int, fromStoreID int) (outJxOrder *JxOrderInfo, err error) { + outJxOrder, deliveryAddress, err := generateOrder(ctx, jxOrder, addressID, fromStoreID, "") if err != nil { return nil, err } + if fromStoreID != 0 { + checkMatterDeliveryAddress(deliveryAddress) + } if createType != OrderCreateTypePre { if outJxOrder.TotalPrice != jxOrder.TotalPrice { return nil, fmt.Errorf("商品或配送信息发生改变,请重新下单") } outJxOrder.OrderID = GenOrderNo(ctx) - order, err2 := jxOrder2GoodsOrder(ctx, outJxOrder, deliveryAddress) + order, err2 := jxOrder2GoodsOrder(ctx, outJxOrder, deliveryAddress, "") if err = err2; err == nil { + order.AddressID = addressID order.Status = model.OrderStatusWait4Pay callNewOrder(order) } @@ -200,6 +244,11 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName()) err = dao.CreateEntity(dao.GetDB(), orderPay) } + case model.PayTypeTL: + if orderPay, err = pay4OrderByTL(ctx, order, vendorPayType); err == nil && orderPay != nil { + dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName()) + err = dao.CreateEntity(dao.GetDB(), orderPay) + } default: err = fmt.Errorf("支付方式:%d当前不支持", payType) } @@ -220,15 +269,25 @@ func GetAvailableDeliverTime(ctx *jxcontext.Context, storeID int) (deliverTimerL if storeDetail.Status != model.StoreStatusOpened { return nil, fmt.Errorf("门店:%s不是营业状态,状态是:%s", storeDetail.Name, model.StoreStatusName[storeDetail.Status]) } - + // now := utils.Str2Time(timeStr) now := time.Now() + // beginDate := utils.Time2Date(utils.Str2Time(timeStr)) beginDate := utils.Time2Date(now) minDingShiDaTime := now.Add(DingShiDaMinTime) viewShippingFee := "约6.6元配送费" if storeID == specialStoreID { viewShippingFee = "免费配送" } + var isOrder = false + if storeDetail.IsOrder == model.YES { + isOrder = true + beginDate = beginDate.AddDate(0, 0, 1) + } for i, dayStr := range dayList { + if isOrder { + isOrder = false + continue + } openTime1 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime1, beginDate) closeTime1 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime1, beginDate) openTime2 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime2, beginDate) @@ -237,13 +296,14 @@ func GetAvailableDeliverTime(ctx *jxcontext.Context, storeID int) (deliverTimerL Date: fmt.Sprintf("%s(周%s)", dayStr, weekdayMap[int(beginDate.Weekday())]), } if i == 0 { - timeInfo.TimeList = append(timeInfo.TimeList, &DeliveryTimeItem{ - ViewTime: "立即送出", - UnixTime: 0, - ViewShippingFee: viewShippingFee, - }) + if isTimeInOpTime(storeDetail.OpenTime1, storeDetail.CloseTime1, storeDetail.OpenTime2, storeDetail.CloseTime2, now) { + timeInfo.TimeList = append(timeInfo.TimeList, &DeliveryTimeItem{ + ViewTime: "立即送出", + UnixTime: 0, + ViewShippingFee: viewShippingFee, + }) + } } - 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 { @@ -257,6 +317,9 @@ func GetAvailableDeliverTime(ctx *jxcontext.Context, storeID int) (deliverTimerL } } } + if len(timeInfo.TimeList) > 0 { + deliverTimerList = append(deliverTimerList, timeInfo) + } beginDate = beginDate.Add(24 * time.Hour) } return deliverTimerList, err @@ -275,6 +338,10 @@ func OnPayFinished(orderPay *model.OrderPay) (err error) { order.VendorStatus = utils.Int2Str(model.OrderStatusNew) order.StatusTime = *orderPay.PayFinishedAt err = callNewOrder(order) + //如果是物料的订单,直接到拣货完成,配送中的状态 + if order.FromStoreID != 0 { + PickupGoods(order, false, "jxadmin") + } } return err } @@ -340,7 +407,7 @@ func isTimeInOpTime(openTime1, closeTime1, openTime2, closeTime2 int16, time2Che return false } -func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64) (outJxOrder *JxOrderInfo, deliveryAddress *dao.UserDeliveryAddressEx, err error) { +func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64, fromStoreID int, userID string) (outJxOrder *JxOrderInfo, deliveryAddress *dao.UserDeliveryAddressEx, err error) { db := dao.GetDB() if jxOrder.StoreID == 0 { return nil, nil, fmt.Errorf("没有指定门店信息") @@ -350,7 +417,12 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 if err != nil { return nil, nil, err } - addressList, _, err := dao.QueryUserDeliveryAddress(db, addressID, []string{ctx.GetUserID()}, 0, 0) + var addressList []*dao.UserDeliveryAddressEx + if userID == "" { + addressList, _, err = dao.QueryUserDeliveryAddress(db, addressID, []string{ctx.GetUserID()}, 0, 0) + } else { + addressList, _, err = dao.QueryUserDeliveryAddress(db, addressID, []string{userID}, 0, 0) + } if err != nil { return nil, nil, err } @@ -380,9 +452,9 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 return nil, nil, fmt.Errorf("预订单只能预定当天或第二天") } } - if !isTimeInOpTime(storeDetail.OpenTime1, storeDetail.CloseTime1, storeDetail.OpenTime2, storeDetail.CloseTime2, checkTime) { - return nil, nil, fmt.Errorf("门店:%s不在营业时间范围", storeDetail.Name) - } + // if !isTimeInOpTime(storeDetail.OpenTime1, storeDetail.CloseTime1, storeDetail.OpenTime2, storeDetail.CloseTime2, checkTime) { + // return nil, nil, fmt.Errorf("门店:%s不在营业时间范围", storeDetail.Name) + // } outJxOrder2 := *jxOrder outJxOrder2.Skus = nil @@ -407,21 +479,45 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 storeSkuMap := make(map[int]*dao.StoreSkuExt) for _, v1 := range storeSkuInfo.SkuNames { for _, v2 := range v1.Skus { + if v2.StoreSkuStatus != model.SkuStatusNormal { + return nil, nil, fmt.Errorf("此商品已下架,请联系管理员!skuID:[%v]", v2.SkuID) + } storeSkuMap[v2.SkuID] = v2 } } - skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil) + skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil, nil) if err != nil { return nil, nil, err } skuMap := make(map[int]*model.SkuAndName) for _, v := range skuList { + if fromStoreID != 0 { + if v.EclpID == "" { + return nil, nil, fmt.Errorf("此商品物料编码为空,请联系管理员!skuID:[%v]", v.ID) + } + } skuMap[v.ID] = v } - + var ( + result *orderman.OrderCount + sum int //申请物料的店的最近销量,以下会根据销量计算具体袋子的价格 + flag = false //新店袋子拆分当个参数 + ) + if fromStoreID != 0 { + result, _ = orderman.GetMatterStoreOrderCount(nil, fromStoreID) + sum = result.Count + } for _, v := range skus { if storeSkuBind := storeSkuMap[v.SkuID]; storeSkuBind != nil { + if fromStoreID != 0 { + result2, _ := api.JdEclpAPI.QueryStock(storeSkuBind.EclpID) + if len(result2) > 0 { + if result2[0].UsableNum < v.Count { + return nil, nil, fmt.Errorf("此商品库存不足无法购买,请联系管理员!skuID:[%v]", v.SkuID) + } + } + } if sku := skuMap[v.SkuID]; sku != nil { jxSku := &JxSkuInfo{ SkuID: v.SkuID, @@ -431,6 +527,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 Weight: sku.Weight, Name: jxutils.ComposeSkuName(sku.Prefix, sku.Name, sku.Comment, sku.Unit, sku.SpecQuality, sku.SpecUnit, 0, sku.ExPrefix, sku.ExPrefixBegin, sku.ExPrefixEnd), } + //活动商品要拆分,一分钱的单独列一个(count为1),正常价格的列在一起(count叠加) if storeSkuBind.ActPrice != 0 && storeSkuBind.ActPrice < storeSkuBind.JxPrice { jxSku.SalePrice = int64(storeSkuBind.ActPrice) jxSku.Count = 1 @@ -449,27 +546,137 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 } } if jxSku != nil { - outJxOrder.Skus = append(outJxOrder.Skus, jxSku) - outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice + if fromStoreID == 0 { + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice + } else { //以下else为物料订单袋子金额和数量处理 + if result.Count == 0 && result.Flag { //这个条件被认为是新店,袋子限量 + if bagMap[jxSku.SkuID] != 0 { //如果他买了袋子,第一个袋子算1分钱,其余按原价(包括所有袋子) + if !flag { + salePirce := jxSku.SalePrice + count := jxSku.Count + jxSku.SalePrice = 1 + jxSku.Count = 1 + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice + if count > 1 { + jxSku2 := *jxSku + jxSku2.SalePrice = salePirce + jxSku2.Count = count - 1 + outJxOrder.Skus = append(outJxOrder.Skus, &jxSku2) + outJxOrder.OrderPrice += int64(jxSku2.Count) * jxSku2.SalePrice + outJxOrder.Weight += jxSku2.Count * jxSku2.Weight + } + flag = true + } else { + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice + } + } else { + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice + } + } else { + //袋子总数小于等于销量就是1分钱,只要大于销量其他就按原价 + //这个袋子规格是一份100个 + if jxSku.SkuID == 6039382 { + if bagMap[jxSku.SkuID] != 0 { + if sum > 0 { + if bagMap[jxSku.SkuID]*jxSku.Count <= sum+100 { + jxSku.SalePrice = 1 + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(1 * jxSku.Count) + } else { + jxSku2 := *jxSku + jxSku2.SalePrice = jxSku.SalePrice + jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum)/100))) + outJxOrder.Weight += jxSku2.Count * jxSku2.Weight + jxSku.SalePrice = 1 + jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum) / 100))) + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.Skus = append(outJxOrder.Skus, &jxSku2) + outJxOrder.OrderPrice += jxSku.SalePrice * int64(jxSku.Count) + outJxOrder.OrderPrice += jxSku2.SalePrice * int64(jxSku2.Count) + } + } else { + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice + } + sum = sum - bagMap[jxSku.SkuID]*jxSku.Count + } + } else if jxSku.SkuID == 6039383 || jxSku.SkuID == 6039384 || jxSku.SkuID == 6039387 || jxSku.SkuID == 6039390 { //这些袋子是一份200个 + if bagMap[jxSku.SkuID] != 0 { + if sum > 0 { + if bagMap[jxSku.SkuID]*jxSku.Count <= sum+200 { + jxSku.SalePrice = 1 + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(1 * jxSku.Count) + } else { + jxSku2 := *jxSku + jxSku2.SalePrice = jxSku.SalePrice + jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum)/200))) + outJxOrder.Weight += jxSku2.Count * jxSku2.Weight + jxSku.SalePrice = 1 + jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum) / 200))) + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.Skus = append(outJxOrder.Skus, &jxSku2) + outJxOrder.OrderPrice += jxSku.SalePrice * int64(jxSku.Count) + outJxOrder.OrderPrice += jxSku2.SalePrice * int64(jxSku2.Count) + } + } else { + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice + } + sum = sum - bagMap[jxSku.SkuID]*jxSku.Count + } + } else { + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice + } + } + } outJxOrder.Weight += jxSku.Count * jxSku.Weight } } } } - sort.Sort(JxSkuInfoList(outJxOrder.Skus)) - outJxOrder.FreightPrice, _, err = delivery.CalculateDeliveryFee(dao.GetDB(), jxOrder.StoreID, "", - jxutils.StandardCoordinate2Int(deliveryAddress.Lng), jxutils.StandardCoordinate2Int(deliveryAddress.Lat), - model.CoordinateTypeMars, outJxOrder.Weight, checkTime) - if jxOrder.StoreID == specialStoreID { - outJxOrder.FreightPrice = 0 + //物料订单的配送费另算,所以排除了免得多算一次 + if fromStoreID == 0 { + sort.Sort(JxSkuInfoList(outJxOrder.Skus)) + outJxOrder.FreightPrice, _, err = delivery.CalculateDeliveryFee(dao.GetDB(), jxOrder.StoreID, "", + jxutils.StandardCoordinate2Int(deliveryAddress.Lng), jxutils.StandardCoordinate2Int(deliveryAddress.Lat), + model.CoordinateTypeMars, outJxOrder.Weight, checkTime) } + // if jxOrder.StoreID == specialStoreID { + // outJxOrder.FreightPrice = 0 + // } } else { outJxOrder.FreightPrice = 0 } - if outJxOrder.OrderPrice >= int64(storeDetail.DeliveryFeeDeductionSill) { - outJxOrder.FreightPrice -= int64(storeDetail.DeliveryFeeDeductionFee) - if outJxOrder.FreightPrice < 0 { - outJxOrder.FreightPrice = 0 + //表示此订单为物料配送订单 + if fromStoreID != 0 { + storeDetail2, err2 := dao.GetStoreDetail(db, fromStoreID, model.VendorIDJX) + if err = err2; err != nil { + return nil, nil, fmt.Errorf("fromStoreID有误,[%v]", fromStoreID) + } + //要求配送人姓名填门店名 + deliveryAddress.ConsigneeName = storeDetail2.Name + outJxOrder.FromStoreID = fromStoreID + ///规则为: 配送费用规则。起价5元(含2kg),之后每kg+2元,不足1kg按1kg计算。 + if outJxOrder.Weight <= 2000 { + outJxOrder.FreightPrice = 500 + } else { + outJxOrder.FreightPrice = utils.Float64TwoInt64(500 + math.Ceil((utils.Int2Float64(outJxOrder.Weight)-2000)/1000)*200) + } + } else { + if outJxOrder.FreightPrice > specialFreightPrice { + outJxOrder.FreightPrice = specialFreightPrice + } + if outJxOrder.OrderPrice >= int64(storeDetail.DeliveryFeeDeductionSill) { + outJxOrder.FreightPrice -= int64(storeDetail.DeliveryFeeDeductionFee) + if outJxOrder.FreightPrice < 0 { + outJxOrder.FreightPrice = 0 + } } } if err == nil { @@ -482,14 +689,48 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 return outJxOrder, deliveryAddress, err } -func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAddress *dao.UserDeliveryAddressEx) (order *model.GoodsOrder, err error) { +//根据销量限制门店申请袋子数,现暂不使用该判断,万一以后要用就先没删 +func matterSkusLimited(skus []*JxSkuInfo, storeID int) (err error) { + result, err := orderman.GetMatterStoreOrderCount(nil, storeID) + sum := 0 + if result.Count != 0 { + for _, sku := range skus { + if sku.SkuID == 6039382 { + sum1 := 0 + if bagMap[sku.SkuID] != 0 { + sum1 += bagMap[sku.SkuID] * sku.Count + sum += sum1 + } + if utils.Int2Float64(sum1/100) >= math.Ceil(utils.Int2Float64(result.Count)/100) { + return fmt.Errorf("订单100个一份背心袋订购数量过多,请按照实际销量购买!,大概销量:[%v],购买数量:[%v]", result.Count, sum1) + } + } + if sku.SkuID == 6039383 || sku.SkuID == 6039384 || sku.SkuID == 6039387 || sku.SkuID == 6039390 { + sum2 := 0 + if bagMap[sku.SkuID] != 0 { + sum2 += bagMap[sku.SkuID] * sku.Count + sum += sum2 + } + if utils.Int2Float64(sum2/200) >= math.Ceil(utils.Int2Float64(result.Count)/200) { + return fmt.Errorf("订单200个一份背心袋订购数量过多,请按照实际销量购买!,大概销量:[%v],购买数量:[%v]", result.Count, sum2) + } + } + } + if sum-result.Count > 100 { + return fmt.Errorf("订单背心袋订购数量过多,请按照实际销量购买!,大概销量:[%v],购买数量:[%v]", result.Count, sum) + } + } + return err +} + +func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAddress *dao.UserDeliveryAddressEx, userID string) (order *model.GoodsOrder, err error) { order = &model.GoodsOrder{ VendorOrderID: utils.Int64ToStr(jxOrder.OrderID), VendorID: model.VendorIDJX, VendorStoreID: utils.Int2Str(jxOrder.StoreID), StoreID: jxOrder.StoreID, StoreName: jxOrder.StoreName, - UserID: ctx.GetUserID(), + // UserID: ctx.GetUserID(), ConsigneeName: deliveryAddress.ConsigneeName, ConsigneeMobile: deliveryAddress.ConsigneeMobile, @@ -507,13 +748,18 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd DeliveryType: model.OrderDeliveryTypeStoreSelf, StatusTime: time.Now(), } + if userID == "" { + order.UserID = ctx.GetUserID() + } else { + order.UserID = userID + } order.OrderCreatedAt = order.StatusTime order.VendorUserID = order.UserID if jxOrder.ExpectedDeliveredTimestamp != 0 { order.ExpectedDeliveredTime = utils.Timestamp2Time(jxOrder.ExpectedDeliveredTimestamp) order.BusinessType = model.BusinessTypeDingshida } else { - order.ExpectedDeliveredTime = utils.DefaultTimeValue + order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour) order.BusinessType = model.BusinessTypeImmediate } for _, sku := range jxOrder.Skus { @@ -529,7 +775,13 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd } order.TotalShopMoney += jxOrder.FreightPrice order.ActualPayPrice = order.TotalShopMoney - + if jxOrder.FromStoreID != 0 { + order.FromStoreID = jxOrder.FromStoreID + order.WaybillVendorID = model.VendorIDJDWL + order.DeliveryFlag = model.OrderDeliveryFlagMaskScheduleDisabled + order.ConsigneeAddress = deliveryAddress.Address + order.Flag = 1 + } return order, err } @@ -548,7 +800,99 @@ func AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList } func PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) { - return changeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "") + err = changeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "") + //如果是物料订单则直接进行京东物流的发单,并且状态直接变为配送中 + err = orderSolutionForWuLiao(order) + return err +} + +func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) { + if order.FromStoreID != 0 { + var ( + db = dao.GetDB() + ) + err = changeOrderStatus(order.VendorOrderID, model.OrderStatusDelivering, "") + goods, err := dao.QueryOrders(db, order.VendorOrderID, -1, []int{model.VendorIDJX}, -1, utils.ZeroTimeValue, utils.ZeroTimeValue) + if err != nil || len(goods) == 0 { + return err + } + order.WaybillVendorID = model.VendorIDJDWL + dao.UpdateEntity(db, order, "WaybillVendorID") + orderSkus := goods[0].Skus + if order.Weight <= 5000 { //如果总重量小于5kg就直接发单 + var ( + goodsNos []string + prices []string + quantities []string + ) + for _, v := range orderSkus { + skus, err := dao.GetSkus(db, []int{v.SkuID}, nil, nil, nil, nil) + if err != nil || len(skus) == 0 { + continue + } + goodsNos = append(goodsNos, skus[0].EclpID) + prices = append(prices, "0") + quantities = append(quantities, utils.Int2Str(v.Count)) + } + result, err := api.JdEclpAPI.AddOrder(&jdeclpapi.AddOrderParam{ + IsvUUID: order.VendorOrderID, + IsvSource: jdeclpapi.IsvSource, + ShopNo: jdeclpapi.ShopNo, + DepartmentNo: jdeclpapi.DepartmentNo, + WarehouseNo: jdeclpapi.WarehouseNo, + SalesPlatformOrderNo: order.VendorOrderID, + SalePlatformSource: jdeclpapi.SalePlatformSource, + ConsigneeName: order.ConsigneeName, + ConsigneeMobile: order.ConsigneeMobile, + ConsigneeAddress: order.ConsigneeAddress, + OrderMark: jdeclpapi.OrderMark, + GoodsNo: strings.Join(goodsNos, ","), + Price: strings.Join(prices, ","), + Quantity: strings.Join(quantities, ","), + }) + if err != nil { + return err + } + order.EclpOutID = result + dao.UpdateEntity(db, order, "EclpOutID") + waybill := &model.Waybill{ + VendorOrderID: order.VendorOrderID, + OrderVendorID: model.VendorIDJX, + VendorWaybillID: order.EclpOutID, + WaybillVendorID: model.VendorIDJDWL, + Status: model.WaybillStatusDelivering, + WaybillCreatedAt: time.Now(), + StatusTime: time.Now(), + WaybillFinishedAt: utils.DefaultTimeValue, + DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled, + } + dao.CreateEntity(db, waybill) + } else { //如果重量超过5kg则需要进行拆单分包,商品分包规则。最后一个包不超过5kg,其他包不超过3kg + outOrders, _, _ := tryToSplitMatterOrder(buildJxOrderInfo(order, orderSkus)) + //以下为仿照CreateOrder,改了一些参数 + for k, v := range outOrders { + outJxOrder, deliveryAddress, err := generateOrder(jxcontext.AdminCtx, v, order.AddressID, order.FromStoreID, order.UserID) + if err != nil { + return err + } + //分包后的子订单ID默认是后面加两位(目前的规则),要改的话要注意取消订单那的判断 + outJxOrder.OrderID = utils.Str2Int64(order.VendorOrderID)*100 + int64(k+1) + checkMatterDeliveryAddress(deliveryAddress) + order2, err2 := jxOrder2GoodsOrder(jxcontext.AdminCtx, outJxOrder, deliveryAddress, order.UserID) + if err = err2; err == nil { + order2.AddressID = order.AddressID + order2.Status = model.OrderStatusDelivering + err = partner.CurOrderManager.OnOrderNew(order2, model.Order2Status(order2)) + orderSolutionForWuLiao(order2) + } + } + //刷新一下库存 + for _, v := range goods[0].Skus { + cms.RefreshMatterStock(jxcontext.AdminCtx, v.SkuID) + } + } + } + return err } func SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) { @@ -569,26 +913,24 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) if orderPay.Status == model.PayStatusYes { // refundID := utils.Int64ToStr(GenRefundID(order)) refundID := order.VendorOrderID - orderPayRefund, err2 := refundOrderByWX(ctx, orderPay, refundID, orderPay.TotalFee, reason) - if err2 == nil { - dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName()) - errList.AddErr(dao.CreateEntity(dao.GetDB(), orderPayRefund)) - //退款后,若此订单下单用户有推广人,则需要将分给推广人的金额记录到该推广人的欠款中 - orders, _ := dao.QueryOrders(db, order.VendorOrderID, 0, []int{model.VendorIDJX}, 0, utils.DefaultTimeValue, utils.DefaultTimeValue) - if len(orders) > 0 { - user, _ := dao.GetUserByID(db, "user_id", orders[0].UserID) - if user.ParentMobile != "" { - user2, _ := dao.GetUserByID(db, "mobile", user.ParentMobile) - user2.Arrears = user2.Arrears + (orderPay.TotalFee * user2.DividePercentage / 100) - dao.UpdateEntity(db, user2, "Arrears") - if user2.ParentMobile != "" { - user3, _ := dao.GetUserByID(db, "mobile", user2.ParentMobile) - user3.Arrears = user3.Arrears + ((orderPay.TotalFee - user2.Arrears) * user3.DividePercentage / 100) - dao.UpdateEntity(db, user3, "Arrears") - } - } + var orderPayRefund *model.OrderPayRefund + if orderPay.PayType == model.PayTypeWX { + orderPayRefund, err = refundOrderByWX(ctx, orderPay, refundID, orderPay.TotalFee, reason) + if err == nil { + dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName()) + errList.AddErr(dao.CreateEntity(dao.GetDB(), orderPayRefund)) + } else { + errList.AddErr(err) } - } else { + } else if orderPay.PayType == model.PayTypeTL { + orderPayRefund, err = refundOrderByTL(ctx, orderPay, refundID, orderPay.TotalFee, reason) + if err != nil { + errList.AddErr(err) + } + } + if err == nil { + MarkArrears(db, order, orderPay) + err2 := CancelMatterOrder(db, order, reason) errList.AddErr(err2) } } else { @@ -606,12 +948,54 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) errList.AddErr(changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, reason)) } err = errList.GetErrListAsOne() + if len(payList) == 0 { + err = CancelMatterOrder(db, order, "") + } } else { err = fmt.Errorf("当前订单状态:%s不允许取消", model.OrderStatusName[order.Status]) } return err } +func CancelMatterOrder(db *dao.DaoDB, order *model.GoodsOrder, reason string) (err error) { + if order.FromStoreID != 0 { + if order.EclpOutID != "" { + //表示是京西的物料订单的子订单(拆分后的订单) + if len(order.VendorOrderID) == 16 && order.VendorID == model.VendorIDJX { + return fmt.Errorf("不允许取消该子订单,请取消主订单进行退货退款!主订单ID :[%v]", order.VendorOrderID[:len(order.VendorOrderID)-2]) + } + _, err = api.JdEclpAPI.CancelOrder(order.EclpOutID) + } else { + goodsList, err := dao.GetMatterChildOrders(db, order.VendorOrderID) + if err == nil && len(goodsList) > 0 { + for _, v := range goodsList { + _, err = api.JdEclpAPI.CancelOrder(v.EclpOutID) + changeOrderStatus(v.VendorOrderID, model.OrderStatusCanceled, reason) + } + } + } + } + return err +} + +func MarkArrears(db *dao.DaoDB, order *model.GoodsOrder, orderPay *model.OrderPay) { + //退款后,若此订单下单用户有推广人,则需要将分给推广人的金额记录到该推广人的欠款中 + orders, _ := dao.QueryOrders(db, order.VendorOrderID, 0, []int{model.VendorIDJX}, 0, utils.DefaultTimeValue, utils.DefaultTimeValue) + if len(orders) > 0 { + user, _ := dao.GetUserByID(db, "user_id", orders[0].UserID) + if user.ParentMobile != "" { + user2, _ := dao.GetUserByID(db, "mobile", user.ParentMobile) + user2.Arrears = user2.Arrears + (orderPay.TotalFee * user2.DividePercentage / 100) + dao.UpdateEntity(db, user2, "Arrears") + if user2.ParentMobile != "" { + user3, _ := dao.GetUserByID(db, "mobile", user2.ParentMobile) + user3.Arrears = user3.Arrears + ((orderPay.TotalFee - user2.Arrears) * user3.DividePercentage / 100) + dao.UpdateEntity(db, user3, "Arrears") + } + } + } +} + func AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model.GoodsOrder, isAgree bool, reason string) (err error) { if isAgree { err = CancelOrder(ctx, order, reason) @@ -793,3 +1177,448 @@ func updateUserAndTransfers(db *dao.DaoDB, param *wxpayapi.TransfersParam, user _, err = dao.UpdateEntity(db, user, "ProfitSum", "Profit", "Arrears") return err } + +func CancelPayTimeOutOrder(ctx *jxcontext.Context) (err error) { + db := dao.GetDB() + var orders []*model.GoodsOrder + sql := ` + SELECT * + FROM goods_order + WHERE order_created_at >= ? AND order_created_at <= NOW() + AND status = ? + AND vendor_id = ? + ` + sqlParams := []interface{}{ + time.Now().Add(-time.Minute * 30), + model.OrderStatusWait4Pay, + model.VendorIDJX, + } + err = dao.GetRows(db, &orders, sql, sqlParams) + for _, v := range orders { + if v.OrderCreatedAt.Add(PayWaitingTime).Before(time.Now()) { + err2 := changeOrderStatus(v.VendorOrderID, model.OrderStatusCanceled, autoCancelOrderReason) + err = err2 + } + } + return err +} + +func GetHalfHoursList() (strs []string) { + for k := 0; k < 3; k++ { + for i := 0; i < 10; i++ { + for j := 0; j < 4; j += 3 { + if k == 2 && i > 3 { + break + } + strs = append(strs, utils.Int2Str(k)+utils.Int2Str(i)+":"+utils.Int2Str(j)+"0"+":00") + } + } + } + return strs +} + +func RefreshAllMatterOrderStatus(ctx *jxcontext.Context) (err error) { + var ( + db = dao.GetDB() + goodsList []*model.GoodsOrder + realTime time.Time + ) + realTime = time.Now().AddDate(0, 0, -7) + //有分包的主订单 + sql := ` + SELECT * FROM goods_order WHERE store_id = 666666 AND order_created_at >= ? AND status <> ? AND vendor_id = ? AND LENGTH(vendor_order_id) = 14 + ` + sqlParams := []interface{}{realTime, model.OrderStatusFinished, model.VendorIDJX} + err = dao.GetRows(db, &goodsList, sql, sqlParams) + for _, v := range goodsList { + if v.EclpOutID == "" { + var ( + goodsList2 []*model.GoodsOrder + cancelCount int + deliveringCount int + ) + sql2 := "SELECT * FROM goods_order WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? AND vendor_id = ? AND eclp_out_id <> '' AND LENGTH(vendor_order_id) = 16" + sqlParams2 := []interface{}{v.VendorOrderID + "0%", v.VendorOrderID + "1%", model.VendorIDJX} + err = dao.GetRows(db, &goodsList2, sql2, sqlParams2) + for _, vv := range goodsList2 { + if vv.Status < model.OrderStatusFinished { + queryOrderStatus, _ := api.JdEclpAPI.QueryOrderStatus(vv.EclpOutID) + if len(queryOrderStatus.OrderStatusList) > 0 { + if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10034 { + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + vv.Status = model.OrderStatusFinished + dao.UpdateEntity(db, vv, "Status") + waybills, err := dao.GetWaybills(db, vv.VendorOrderID) + if err == nil && len(waybills) > 0 { + waybills[0].Status = model.WaybillStatusDelivered + dao.UpdateEntity(db, waybills[0], "Status") + } + dao.Commit(db) + changeOrderStatus(vv.VendorOrderID, model.OrderStatusFinished, "") + } else { + deliveringCount++ + } + } + } else if vv.Status == model.OrderStatusCanceled { + cancelCount++ + } + } + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + if deliveringCount == 0 { + v.Status = model.OrderStatusFinished + } else { + if cancelCount == len(goodsList2) { + v.Status = model.OrderStatusCanceled + } + } + dao.UpdateEntity(db, v, "Status") + dao.Commit(db) + changeOrderStatus(v.VendorOrderID, v.Status, "") + } else { + queryOrderStatus, _ := api.JdEclpAPI.QueryOrderStatus(v.EclpOutID) + if len(queryOrderStatus.OrderStatusList) > 0 { + if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10034 { + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + v.Status = model.OrderStatusFinished + dao.UpdateEntity(db, v, "Status") + waybills, err := dao.GetWaybills(db, v.VendorOrderID) + if err == nil && len(waybills) > 0 { + waybills[0].Status = model.WaybillStatusDelivered + dao.UpdateEntity(db, waybills[0], "Status") + } + dao.Commit(db) + changeOrderStatus(v.VendorOrderID, model.OrderStatusFinished, "") + } + } + } + } + return err +} + +func GetMatterOrderStatus(ctx *jxcontext.Context, vendorOrderID string) (result []*MatterOrderStatus, err error) { + var ( + db = dao.GetDB() + ) + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX) + if err != nil { + return nil, err + } + if order.EclpOutID == "" { + return nil, err + } + queryOrderStatus, err := api.JdEclpAPI.QueryOrderStatus(order.EclpOutID) + getTrackMessagePlusByOrderResult, err := api.JdEclpAPI.GetTrackMessagePlusByOrder(vendorOrderID) + if err != nil { + return nil, err + } + for _, v := range queryOrderStatus.OrderStatusList { + matter := &MatterOrderStatus{} + matter.Time = utils.Str2Time(v.OperateTime) + matter.Status = v.SoStatusName + matter.Name = v.SoStatusName + matter.Sign = 1 + result = append(result, matter) + } + if len(getTrackMessagePlusByOrderResult.ResultData) > 0 { + for _, vv := range getTrackMessagePlusByOrderResult.ResultData { + matter := &MatterOrderStatus{} + matter.Time = utils.Str2Time(strings.ReplaceAll(vv.OpeTime, "/", "-")) + matter.Status = vv.OpeTitle + matter.Name = vv.OpeRemark + matter.Sign = 2 + result = append(result, matter) + } + } + for i := 0; i < len(result)-1; i++ { + for j := 0; j < len(result)-i-1; j++ { + if result[j].Time.Unix() > result[j+1].Time.Unix() || (result[j].Time.Unix() == result[j+1].Time.Unix() && result[j].Sign > result[j+1].Sign) { + tmp := result[j] + result[j] = result[j+1] + result[j+1] = tmp + } + } + } + if len(queryOrderStatus.OrderStatusList) > 0 { + if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10034 { + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + order.Status = model.OrderStatusFinished + dao.UpdateEntity(db, order, "Status") + waybills, err := dao.GetWaybills(db, vendorOrderID) + if err == nil && len(waybills) > 0 { + waybills[0].Status = model.WaybillStatusDelivered + dao.UpdateEntity(db, waybills[0], "Status") + } + dao.Commit(db) + changeOrderStatus(vendorOrderID, model.OrderStatusFinished, "") + } + } + if len(getTrackMessagePlusByOrderResult.ResultData) > 0 { + var ( + waybillCode = getTrackMessagePlusByOrderResult.ResultData[0].WaybillCode + cName string + cMobile string + waybills []*model.Waybill + ) + for _, vv := range getTrackMessagePlusByOrderResult.ResultData { + if vv.OpeTitle == "配送员收货" { + result := regexpCnameAndCmobile.FindAllStringSubmatch(vv.OpeRemark, -1) + cName = result[0][1] + cMobile = result[0][2] + break + } + } + waybills, err = dao.GetWaybills(db, vendorOrderID) + if len(waybills) > 0 { + waybills[0].VendorWaybillID = waybillCode + waybills[0].CourierName = cName + waybills[0].CourierMobile = cMobile + order.VendorWaybillID = waybillCode + order.WaybillVendorID = model.VendorIDJDWL + dao.UpdateEntity(db, order, "VendorWaybillID", "WaybillVendorID") + dao.UpdateEntity(db, waybills[0], "VendorWaybillID", "CourierName", "CourierMobile") + } + } + return result, err +} + +func tryToSplitMatterOrder(jxOrder *JxOrderInfo) (outOrders []*JxOrderInfo, freightPrice int, err error) { + var ( + skus = jxOrder.Skus + weightList []*JxSkuInfo2 + ) + //我的思路为把所有商品依次按重量销量从大到小排列,然后第一个包尽量分出3kg,后面分出5kg + //但是我把JxSkuInfo放进list的时候,想根据一个参数GroupSign判断是否这个商品已经分出去了 + //但是在list中同一个商品通过以下方式放进去的地址是一样的,我改了一个商品的GroupSign,所有的都变了,所以只有分出一个JxSkuInfo2去弄。。 + //要做优化的话更好 + for _, v := range skus { + for i := 0; i < v.Count; i++ { + var sku2 = &JxSkuInfo2{} + sku2.Count = v.Count + sku2.Name = v.Name + sku2.Price = v.Price + sku2.SalePrice = v.SalePrice + sku2.Weight = v.Weight + sku2.SkuID = v.SkuID + weightList = append(weightList, sku2) + } + } + for i := 0; i < len(weightList)-1; i++ { + for j := 0; j < len(weightList)-i-1; j++ { + if weightList[j].Weight < weightList[j+1].Weight { + tmp := weightList[j] + weightList[j] = weightList[j+1] + weightList[j+1] = tmp + } + } + } + weight := jxOrder.Weight + for { + //每拿出一组就删掉list里的值 + outOrders = append(outOrders, loop2(weightList, jxOrder.StoreID, &weight)) + for i := 0; i < len(weightList); { + if weightList[i].GroupSign { + var weightList3 []*JxSkuInfo2 + weightList3 = append(weightList[:i], weightList[i+1:]...) + weightList = weightList3 + } else { + i++ + } + } + if len(weightList) == 0 { + break + } + } + return outOrders, freightPrice, err +} + +func jxOrderChange(sku2 *JxSkuInfo2) *JxSkuInfo { + sku := &JxSkuInfo{} + sku.Count = 1 + sku.Name = sku2.Name + sku.Price = sku2.Price + sku.SalePrice = sku2.SalePrice + sku.SkuID = sku2.SkuID + sku.Weight = sku2.Weight + return sku +} + +//商品分包规则2。最后一个包不超过5kg,其他包不超过3kg +// 举例1:5.1kg,分为 2.5kg,2.6kg,确保每个包不超过3kg,最后一个包不超过5kg +// 举例2:4kg,分为4kg +// 举例3:10kg,分为 3kg,3kg,4kg +// 举例4:8.1kg,分为 3kg,3kg,2.1kg ; 不能分为3kg,5.1kg +//sum3表示3kg的计算 +func loop2(weightList []*JxSkuInfo2, storeID int, weight *int) (outOrder *JxOrderInfo) { + outOrder = &JxOrderInfo{} + outOrder.StoreID = storeID + sum3 := 0 + if *weight <= 5000 { + for i := 0; i < len(weightList); i++ { + buildOutOrderSkus(weightList[i], outOrder) + } + } else { + for i := 0; i < len(weightList); i++ { + if weightList[i].Weight+sum3 <= 3000 { + sum3 += weightList[i].Weight + *weight -= weightList[i].Weight + buildOutOrderSkus(weightList[i], outOrder) + } else { + if sum3 >= 3000 { + break + } + continue + } + } + } + return outOrder +} + +func buildOutOrderSkus(weightp *JxSkuInfo2, outOrder *JxOrderInfo) { + weightp.GroupSign = true + outOrder.Weight += weightp.Weight + if len(outOrder.Skus) > 0 { + var flag = false + for _, v := range outOrder.Skus { + if v.SkuID == weightp.SkuID { + v.Count++ + flag = true + } + } + if !flag { + outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightp)) + } + } else { + outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightp)) + } +} + +func checkMatterDeliveryAddress(deliveryAddress *dao.UserDeliveryAddressEx) { + var ( + db = dao.GetDB() + ) + if !strings.Contains(deliveryAddress.Address, "区") { + deliveryAddress.Address = deliveryAddress.DistrictName + deliveryAddress.Address + } + if !strings.Contains(deliveryAddress.Address, "市") { + deliveryAddress.Address = deliveryAddress.CityName + deliveryAddress.Address + } + if !strings.Contains(deliveryAddress.Address, "省") { + if place1, err := dao.GetPlaceByCode(db, deliveryAddress.CityCode); err == nil { + if place2, err2 := dao.GetPlaceByCode(db, place1.ParentCode); err2 == nil { + deliveryAddress.Address = place2.Name + deliveryAddress.Address + } + } + } +} + +func SendFailedMatterOrder(ctx *jxcontext.Context, vendorOrderID string) (err error) { + var ( + db = dao.GetDB() + ) + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX) + if err != nil { + return err + } + if order == nil || order.StoreID != model.MatterStoreID || order.FromStoreID == 0 { + return fmt.Errorf("只允许物料店重发物料订单调用此接口!") + } + queryOrderStatus, err := api.JdEclpAPI.QueryOrderStatus(order.EclpOutID) + if len(queryOrderStatus.OrderStatusList) > 0 { + if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10022 { //表示该订单在京东物流为暂停 + if len(order.VendorOrderID) == 14 && order.EclpOutID != "" { //这是不分包的订单 + _, err = createMatterOrder(buildJxOrderInfo(order, order.Skus), order, int64(00)) + err = CancelMatterOrder(db, order, cancelMatterOrderReason) + changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, cancelMatterOrderReason) + for _, v := range order.Skus { + cms.RefreshMatterStock(jxcontext.AdminCtx, v.SkuID) + } + } else if len(order.VendorOrderID) == 14 && order.EclpOutID == "" { //这是分包的主订单 + goodsList, err := dao.GetMatterChildOrders(db, order.VendorOrderID) + if err != nil { + return err + } + if len(goodsList) > 0 { + for _, v := range goodsList { + cOrder, err := partner.CurOrderManager.LoadOrder(v.VendorOrderID, model.VendorIDJX) + if err != nil { + return err + } + suffix := utils.Str2Int64(cOrder.VendorOrderID[len(cOrder.VendorOrderID)-2:]) + int64(len(goodsList)) + _, err = createMatterOrder(buildJxOrderInfo(cOrder, cOrder.Skus), cOrder, suffix) + for _, v := range cOrder.Skus { + cms.RefreshMatterStock(jxcontext.AdminCtx, v.SkuID) + } + } + } + err = CancelMatterOrder(db, order, cancelMatterOrderReason) + changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, cancelMatterOrderReason) + } else if len(order.VendorOrderID) == 16 && order.EclpOutID != "" { // 这是分包的子订单 + return fmt.Errorf("请重发主订单!主订单号:[%v]", order.VendorOrderID[len(order.VendorOrderID)-2:]) + } + } else { + return fmt.Errorf("只允许物流订单为暂停才能调用此接口!") + } + } + return err +} + +func createMatterOrder(jxOrder *JxOrderInfo, order *model.GoodsOrder, newOrderIDSuffix int64) (order2 *model.GoodsOrder, err error) { + outJxOrder, deliveryAddress, err := generateOrder(jxcontext.AdminCtx, jxOrder, order.AddressID, order.FromStoreID, order.UserID) + if err != nil { + return nil, err + } + outJxOrder.OrderID = utils.Str2Int64(order.VendorOrderID)*100 + newOrderIDSuffix + checkMatterDeliveryAddress(deliveryAddress) + order2, err2 := jxOrder2GoodsOrder(jxcontext.AdminCtx, outJxOrder, deliveryAddress, order.UserID) + if err = err2; err == nil { + order2.AddressID = order.AddressID + order2.Status = model.OrderStatusDelivering + err = partner.CurOrderManager.OnOrderNew(order2, model.Order2Status(order2)) + err = orderSolutionForWuLiao(order2) + } + return order2, err +} + +func buildJxOrderInfo(order *model.GoodsOrder, orderSkus []*model.OrderSku) (jxOrder *JxOrderInfo) { + jxOrder = &JxOrderInfo{} + jxOrder.StoreID = order.StoreID + weight := 0 + var skus []*JxSkuInfo + for _, v := range orderSkus { + weight += v.Weight * v.Count + sku := &JxSkuInfo{} + sku.SkuID = v.SkuID + sku.SalePrice = v.SalePrice + sku.Name = v.SkuName + sku.Weight = v.Weight + sku.Count = v.Count + skus = append(skus, sku) + } + jxOrder.Skus = skus + jxOrder.Weight = weight + return jxOrder +} diff --git a/business/partner/purchase/jx/localjx/tonglianpay.go b/business/partner/purchase/jx/localjx/tonglianpay.go new file mode 100644 index 000000000..9faeb1aeb --- /dev/null +++ b/business/partner/purchase/jx/localjx/tonglianpay.go @@ -0,0 +1,185 @@ +package localjx + +import ( + "encoding/json" + "fmt" + "strings" + "time" + + "git.rosy.net.cn/jx-callback/globals" + + "git.rosy.net.cn/baseapi/platformapi/tonglianpayapi" + "git.rosy.net.cn/baseapi/utils" + + "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" + "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" + "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" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals/api" +) + +func pay4OrderByTL(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayType string) (orderPay *model.OrderPay, err error) { + if order.FromStoreID != 0 { + result, _ := orderman.GetMatterStoreOrderCount(nil, order.FromStoreID) + if !result.Flag { + return nil, fmt.Errorf("该门店[%v]已在一周内申请过物料,请勿重复申请!", order.FromStoreID) + } + } + payCreatedAt := time.Now() + param := &tonglianpayapi.CreateUnitorderOrderParam{ + Trxamt: int(order.ActualPayPrice), + NotifyUrl: globals.TLPayNotifyURL, + Reqsn: order.VendorOrderID, + PayType: vendorPayType, + } + //暂时做兼容处理 + if vendorPayType == "JSAPI" { + param.PayType = tonglianpayapi.PayTypeWxXcx + } + if vendorPayType == tonglianpayapi.PayTypeWxXcx { + if authInfo, err := ctx.GetV2AuthInfo(); err == nil && authInfo.GetAuthType() == weixin.AuthTypeMini { + param.Acct = authInfo.GetAuthID() + } + } + if vendorPayType == tonglianpayapi.PayTypeH5 { + param2 := &tonglianpayapi.CreateH5UnitorderOrderParam{ + Trxamt: int(order.ActualPayPrice), + NotifyUrl: globals.TLPayNotifyURL, + Body: "京西菜市", + Charset: "UTF-8", + } + err = api.TLpayAPI.CreateH5UnitorderOrder(param2) + } else { + result, err := api.TLpayAPI.CreateUnitorderOrder(param) + if err == nil { + var result2 tonglianpayapi.PayInfo + json.Unmarshal([]byte(result.PayInfo), &result2) + prePayID := result2.Package[strings.LastIndex(result2.Package, "=")+1 : len(result2.Package)] + orderPay = &model.OrderPay{ + PayOrderID: param.Reqsn, + PayType: model.PayTypeTL, + VendorPayType: vendorPayType, + TransactionID: result.TrxID, + VendorOrderID: order.VendorOrderID, + VendorID: order.VendorID, + Status: 0, + PayCreatedAt: payCreatedAt, + PrepayID: prePayID, + CodeURL: utils.LimitUTF8StringLen(result.PayInfo, 3200), + TotalFee: int(order.ActualPayPrice), + } + } + } + return orderPay, err +} + +func OnTLPayCallback(call *tonglianpayapi.CallBackResult) (err error) { + globals.SugarLogger.Debugf("OnTLPayCallback msg:%s", utils.Format4Output(call, true)) + switch call.TrxCode { + case tonglianpayapi.MsgTypePay: + err = onTLpayFinished(call) + case tonglianpayapi.MsgTypeRefund: + err = onTLpayRefund(call) + } + return err +} + +func onTLpayFinished(call *tonglianpayapi.CallBackResult) (err error) { + orderPay := &model.OrderPay{ + PayOrderID: call.CusorderID, + PayType: model.PayTypeTL, + } + orderPay.DeletedAt = utils.DefaultTimeValue + db := dao.GetDB() + if err = dao.GetEntity(db, orderPay, "PayOrderID", "PayType", "DeletedAt"); err == nil { + if orderPay.Status != 0 { + globals.SugarLogger.Debugf("already pay msg:%s, err:%v", utils.Format4Output(call, true), err) + return err + } + loc, _ := time.LoadLocation("Local") + t1, _ := time.ParseInLocation("20060102150405", call.PayTime, loc) + orderPay.PayFinishedAt = utils.Time2Pointer(t1) + // orderPay.TransactionID = call.ChnlTrxID + orderPay.OriginalData = utils.Format4Output(call, true) + if call.TrxStatus == tonglianpayapi.TrxStatusSuccess { + orderPay.Status = model.PayStatusYes + } else { + orderPay.Status = model.PayStatusFailed + } + dao.UpdateEntity(db, orderPay) + if call.TrxStatus == tonglianpayapi.TrxStatusSuccess { + err = OnPayFinished(orderPay) + } + } else { + globals.SugarLogger.Debugf("onTLpayFinished msg:%s, err:%v", utils.Format4Output(call, true), err) + } + return err +} + +func onTLpayRefund(call *tonglianpayapi.CallBackResult) (err error) { + orderPayRefund := &model.OrderPayRefund{ + RefundID: call.CusorderID, + } + db := dao.GetDB() + if err = dao.GetEntity(db, orderPayRefund, "RefundID"); err == nil { + if call.TrxStatus == tonglianpayapi.TrxStatusSuccess { + orderPayRefund.Status = model.RefundStatusYes + } else { + orderPayRefund.Status = model.RefundStatusFailed + } + orderPayRefund.OriginalData = utils.Format4Output(call, true) + dao.UpdateEntity(db, orderPayRefund) + } else if dao.IsNoRowsError(err) { + globals.SugarLogger.Warnf("收到异常的退款事件, call:%s", utils.Format4Output(call, true)) + } + + orderPay := &model.OrderPay{ + VendorOrderID: orderPayRefund.VendorOrderID, + VendorID: jxutils.GetPossibleVendorIDFromVendorOrderID(orderPayRefund.VendorOrderID), + PayType: model.PayTypeWX, + Status: model.PayStatusYes, + } + orderPay.DeletedAt = utils.DefaultTimeValue + if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "PayType", "Status", "DeletedAt"); err == nil { + orderPay.Status = model.PayStatusRefund + dao.UpdateEntity(db, orderPay) + } + return err +} + +func refundOrderByTL(ctx *jxcontext.Context, orderPay *model.OrderPay, refundID string, refundFee int, refundDesc string) (orderPayRefund *model.OrderPayRefund, err error) { + result, err := api.TLpayAPI.PayRefund(&tonglianpayapi.PayRefundParam{ + Trxamt: orderPay.TotalFee, + Reqsn: utils.GetUUID(), + // OldReqsn: orderPay.VendorOrderID, + Remark: refundDesc, + OldTrxID: orderPay.TransactionID, + }) + if err == nil { + orderPayRefund = &model.OrderPayRefund{ + RefundID: refundID, + VendorRefundID: result.TrxID, + VendorOrderID: orderPay.VendorOrderID, + VendorID: orderPay.VendorID, + Status: model.RefundStatusNo, + TransactionID: orderPay.TransactionID, + RefundFee: orderPay.TotalFee, + RefundCreatedAt: time.Now(), + } + dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName()) + db := dao.GetDB() + if result.TrxStatus == tonglianpayapi.TrxStatusSuccess { + orderPayRefund.Status = model.RefundStatusYes + } else { + orderPayRefund.Status = model.RefundStatusFailed + } + orderPayRefund.OriginalData = utils.Format4Output(result, true) + dao.CreateEntity(db, orderPayRefund) + + orderPay.Status = model.PayStatusRefund + dao.UpdateEntity(db, orderPay) + } + return orderPayRefund, err +} diff --git a/business/partner/purchase/mtwm/store.go b/business/partner/purchase/mtwm/store.go index 760f83d75..3e5a7409b 100644 --- a/business/partner/purchase/mtwm/store.go +++ b/business/partner/purchase/mtwm/store.go @@ -117,6 +117,9 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin if storeDetail.VendorStoreName != "" { name = storeDetail.VendorStoreName } + // else { + // name = jxutils.ComposeStoreName(storeDetail.Store.Name, model.VendorIDMTWM) + // } } // openLevel, isOnline := bizStatusJX2Mtwm(mergedStoreStatus) params := map[string]interface{}{ diff --git a/business/userstore/food_recipe.go b/business/userstore/food_recipe.go index e64ae900b..5359a94eb 100644 --- a/business/userstore/food_recipe.go +++ b/business/userstore/food_recipe.go @@ -40,7 +40,7 @@ func updateFoodRecipeItemAndStep(ctx *jxcontext.Context, db *dao.DaoDB, recipeID if len(v.SkuIDs) == 0 { return fmt.Errorf("SkuIDs必须要有值") } - skuIDs, err2 := dao.GetSkus(db, v.SkuIDs, nil, nil, nil) + skuIDs, err2 := dao.GetSkus(db, v.SkuIDs, nil, nil, nil, nil) if err = err2; err != nil { return err } diff --git a/conf/app.conf b/conf/app.conf index 21cafe9ef..81beb4852 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -15,7 +15,7 @@ dadaAppSecret = "7f97d8f258b70b450f04e7ab274ed8f8" mtwmAppID = "589" mtwmSecret = "a81eb3df418d83d6a1a4b7c572156d2f" mtwmCallbackURL = "http://callback.jxc4.com" -mtwmCookieStr = "_lxsdk_cuid=16ddced5e9a95-0a65869c427a14-48714616-15f900-16ddced5e9b2b; _hc.v=cfebbfd1-79a7-9823-d8df-77e59646cb34.1571369610; _lxsdk=16ddced5e9a95-0a65869c427a14-48714616-15f900-16ddced5e9b2b; uuid_update=true; uuid=7b28e71504f5414e382b.1579155871.1.0.0; device_uuid=!64dedf83-b510-4910-8a31-b2b13d0bdd73; pushToken=00kRvxlerO15kB0dJFWDwYuctAoe04xGMNd0r3BqvLUA*; acctId=57396785; brandId=-1; wmPoiId=-1; isOfflineSelfOpen=0; city_id=0; isChain=1; existBrandPoi=true; ignore_set_router_proxy=true; region_id=; region_version=0; newCategory=false; bsid=OyqgRLyV54i9JKP0zRCI9jPyXc4UBU-6KReDAkPIwSlljhb97JPyFUIXfYQvhlJb6G1erzHQKbvtZ2pSWOYDxQ; cityId=510100; provinceId=510000; city_location_id=0; location_id=0; igateApp=shangouepc; wpush_server_url=wss://wpush.meituan.com; token=0MScAPaSa57iwRpgpCmGLf21tiA4yU4Uy-nDZlv8wNWs*; shopCategory=food; set_info=%7B%22wmPoiId%22%3A-1%2C%22ignoreSetRouterProxy%22%3Atrue%7D; JSESSIONID=105dgww27nsy6yfp68q7wmcni; LX_SC_CONSTANT=c_shangou_online_e_znrurnrc; _lxsdk_s=17041b590ac-3d-689-a8c%7C%7C15" +# mtwmCookieStr = "_lxsdk_cuid=16ddced5e9a95-0a65869c427a14-48714616-15f900-16ddced5e9b2b; _hc.v=cfebbfd1-79a7-9823-d8df-77e59646cb34.1571369610; _lxsdk=16ddced5e9a95-0a65869c427a14-48714616-15f900-16ddced5e9b2b; uuid_update=true; uuid=7b28e71504f5414e382b.1579155871.1.0.0; device_uuid=!64dedf83-b510-4910-8a31-b2b13d0bdd73; pushToken=00kRvxlerO15kB0dJFWDwYuctAoe04xGMNd0r3BqvLUA*; acctId=57396785; brandId=-1; wmPoiId=-1; isOfflineSelfOpen=0; city_id=0; isChain=1; existBrandPoi=true; ignore_set_router_proxy=true; region_id=; region_version=0; newCategory=false; bsid=OyqgRLyV54i9JKP0zRCI9jPyXc4UBU-6KReDAkPIwSlljhb97JPyFUIXfYQvhlJb6G1erzHQKbvtZ2pSWOYDxQ; cityId=510100; provinceId=510000; city_location_id=0; location_id=0; igateApp=shangouepc; wpush_server_url=wss://wpush.meituan.com; token=0MScAPaSa57iwRpgpCmGLf21tiA4yU4Uy-nDZlv8wNWs*; shopCategory=food; set_info=%7B%22wmPoiId%22%3A-1%2C%22ignoreSetRouterProxy%22%3Atrue%7D; JSESSIONID=105dgww27nsy6yfp68q7wmcni; LX_SC_CONSTANT=c_shangou_online_e_znrurnrc; _lxsdk_s=17041b590ac-3d-689-a8c%7C%7C15" autonaviKey = "ef64f638f31e05cb7bde28790f7309fe" @@ -56,20 +56,25 @@ wxpayAppKey = "XKJPOIHJ233adf01KJIXlIeQDSDKFJAD" wxpayAppMchID = "1390686702" wxpayNotifyURL = "http://callback.test.jxc4.com/wxpay/msg/" +tonglianPayAppID = "00183083" +tonglianPayKey = "18048531223" +tonglianPayCusID = "56065105499TVAH" +tonglianPayNotifyURL = "http://callback.test.jxc4.com/tonglian/msg/" + backstageHost = "http://www.jxc4.com" wxBackstageHost = "http://wx.jxc4.com" -jdStorePageCookie = "YYJV3NHVBPHLD36FWP6F3EM5PTXJ2XZQS7U4HWRIDPP4IWGUKUIB4XG5N26CZRDLDF7PKOXBPD6BNTUAJLETLZOIWMCVFI3K6MYZIY4QBIXIMXYDJNUKFGJVQTN5356SAD6WPCIHWNQAG7DDMF7L7S3SHD6O37OTAHUCKU6ALXATYTGMHNFLM4XRLVSFUQAJR77M4URSZRKVO55243TDVXLO25PP4UYSPTTPMNRUFXDNP4WPE566Q6V4AH32F7HT" -jd2StorePageCookie = "CK5GE5MR2UIOBOZC7BBZLLSI7MVDWPEQ4BRJTJQ2OP3ZFKYDDYTFFV4XOXKLERC2UXFT44TMCUMRFP3C25HD6W3PYONTQCOML6YIZA5Z37P62UXFE655IRGYJ4ZLQIEBYQM32FABIN5RVJYZWPQWSRTZURNRLYV57XJEDWZT5UVZRYUBTN3AT6JJJJ22YHE6ZHCN6LCH27JHSRO55YA6TJH6G54IF72X3UAXCKW5P2G2MT3U6I3527NQFMAFLHXBZKQFFMYUKUHUU4GZWD4O7GO45Y" +# jdStorePageCookie = "YYJV3NHVBPHLD36FWP6F3EM5PTXJ2XZQS7U4HWRIDPP4IWGUKUIB4XG5N26CZRDLDF7PKOXBPD6BNTUAJLETLZOIWMCVFI3K6MYZIY4QBIXIMXYDJNUKFGJVQTN5356SAD6WPCIHWNQAG7DDMF7L7S3SHD6O37OTAHUCKU6ALXATYTGMHNFLM4XRLVSFUQAJR77M4URSZRKVO55243TDVXLO25PP4UYSPTTPMNRUFXDNP4WPE566Q6V4AH32F7HT" +# jd2StorePageCookie = "CK5GE5MR2UIOBOZC7BBZLLSI7MVDWPEQ4BRJTJQ2OP3ZFKYDDYTFFV4XOXKLERC2UXFT44TMCUMRFP3C25HD6W3PYONTQCOML6YIZA5Z37P62UXFE655IRGYJ4ZLQIEBYQM32FABIN5RVJYZWPQWSRTZURNRLYV57XJEDWZT5UVZRYUBTN3AT6JJJJ22YHE6ZHCN6LCH27JHSRO55YA6TJH6G54IF72X3UAXCKW5P2G2MT3U6I3527NQFMAFLHXBZKQFFMYUKUHUU4GZWD4O7GO45Y" fakeJdToken = "ndslkv9asl@djf_n7askdjfk$" fakeJdBaseURL = "http://test.jxc4.com/qqqq" -ebaiStorePageCookieWMUSS = "B0AAFQCAAAGbhkuMCsvcyYBDkkyAxBGIBlgXAQYVwc7VwYZFkx2HDoPSmo5eV1femopWgJRawhgAALG04cg1RUmhUakBbJRdgPS0tNEhnQhNRewwuWwYYBDEFPCQSDXV5YWA6PAVRHUJ9SnVGMThYAjNjLw9pRxIbS04-XFo05AQgBl%7ERLA33vWcR73gEAKZ" -ebaiStorePageCookieWMSTOKEN = "gAALgNAAAGfBI5YEBHSQdZY1InIS8CVQU9aBU1f3VLWVQqKHAAAc5LnRLZ1QLLx0S5IuzCSX8ZQ7oUwAAUr-GEm9JpRc9AQAAsLkLHHXzuhh2lZkbyrcAAAWBESKg3ZA" -ebaiStorePageCookieWMUSS2 = "A8AAIcCAAADJhpNHQoGGjZaLFRBdnE7Uwp9TBQXH1o9RTBgP30NQiQmEEAwFVplbwc6wAAMXwsa082aRxJfzskPX9THj9RKgJ0TxE1fyYPZRYVH0YSSjFgARt8Shs3bVc3QHV2Eh94B24KO20vSlJEXnELcDxTl9sJ35T2Dvg21A3wCT0NMXaNAcPzKhPamv" -ebaiStorePageCookieWMSTOKEN2 = "A4AANwHAAARMA9ZWhh6BzcGYTQZJjVOHGIxPUdPVElXQz8iahGqiIS5gAAsLaD8yOwpYLCVMU2qqCEN8nAyiUQAAUr-GEu-F2xVbAQAAYcnZGrUx2Rf9qJkbRKQAAONp" -ebaiStorePageCookieExdTOKEN = "PBE_2.0_5cd1c6141c127d419e817e88920aa5ae01c164ed47b678e0b16c628ef65ffc0b93ddf4a7cd1f7172e644f4f5321c5f197dd406a5a0d219aae2fa169e59c5419db8f4d4ca44c01e112c6bb4f8d87cbae90e6eaefceba88f486f26bafa41f3ec181773c4b329a6c7c154333a8496509943c63a96c71c72edc82f6beb6ecd9acd5ad69b2f2bbcbe011d05536112cbe52be0b2176860870ce608a0d7f465a1e782f6584e4253aaaee30d9042f82f12b312b5a29151e2e0400f4a128ee365966025f9719278850f60e10ddda0e32554c6867091321cd552b41aa5e5e676f64af218a0e98e4030f499c31de664a0c0a23c5306075ffb061c7654d4646317c8e6a55c66361c96b9e8f11f55c2f666a0240a3f8fb8e221d58b907731a8720572a03febd20d146cad4b6a3821cfd3c5b3286bb3383c4eff8c8ff2d63b8773bbd88f2d6c4b1deb7634221b0e086b7b7d6201435dacdb09525dc59588beeffcd0232ef64aa73fd2325509fa7fc6" -mtpsStoreToken = "M0p9VatZSeSHfrosD5IViAVl73IcA8mlcuHIV5sG6Zpv83a7JE0wY3t26aEhrrs_MR5gtLSFF1UIkt8HAjaXow" +# ebaiStorePageCookieWMUSS = "B0AAFQCAAAGbhkuMCsvcyYBDkkyAxBGIBlgXAQYVwc7VwYZFkx2HDoPSmo5eV1femopWgJRawhgAALG04cg1RUmhUakBbJRdgPS0tNEhnQhNRewwuWwYYBDEFPCQSDXV5YWA6PAVRHUJ9SnVGMThYAjNjLw9pRxIbS04-XFo05AQgBl%7ERLA33vWcR73gEAKZ" +# ebaiStorePageCookieWMSTOKEN = "gAALgNAAAGfBI5YEBHSQdZY1InIS8CVQU9aBU1f3VLWVQqKHAAAc5LnRLZ1QLLx0S5IuzCSX8ZQ7oUwAAUr-GEm9JpRc9AQAAsLkLHHXzuhh2lZkbyrcAAAWBESKg3ZA" +# ebaiStorePageCookieWMUSS2 = "A8AAIcCAAADJhpNHQoGGjZaLFRBdnE7Uwp9TBQXH1o9RTBgP30NQiQmEEAwFVplbwc6wAAMXwsa082aRxJfzskPX9THj9RKgJ0TxE1fyYPZRYVH0YSSjFgARt8Shs3bVc3QHV2Eh94B24KO20vSlJEXnELcDxTl9sJ35T2Dvg21A3wCT0NMXaNAcPzKhPamv" +# ebaiStorePageCookieWMSTOKEN2 = "A4AANwHAAARMA9ZWhh6BzcGYTQZJjVOHGIxPUdPVElXQz8iahGqiIS5gAAsLaD8yOwpYLCVMU2qqCEN8nAyiUQAAUr-GEu-F2xVbAQAAYcnZGrUx2Rf9qJkbRKQAAONp" +# ebaiStorePageCookieExdTOKEN = "PBE_2.0_5cd1c6141c127d41d12be02a04e58e0a2529c8ac5aad36be932f6e341f8be9a0e56b833c924cc95dd2ced76b31ea6fcbc7341cc9c03e3e2f470441192d51fc8bd81b6c5d24a867630a65400e688ff8f4453895ca9a18d7e91726941b28631cf2ab81797279967fcb03ae57e5bc33bf91e4495727569681c724597fb2c639a85c145723c12de262224e2536ad2c6f94bcae0c10c8f30728a6ea3ab6000940fffaa66271f17ecbae139f0b4fdfff791b7986a88b8f252827e799a2e1862ec522fd4c51c70ae9d17c69da93f1c12715bf9e0b35eccf39ae605d424c83319acaa7acbe191a8ee410afd1d02d1e02834ce6cbd2503b89f30efc1f7635a1e71e10e3370fc79b33e6352290e87f82b1cb8ac91195a09ff28e4418923e89993eb10d01e39fb621d517a14081611b25e83da9ec860fbacd2cb13562271585b53a0a7178e8f614bd62ffa442c78a10f008b3721675cad803024fad0c13aeecd64d1360bab4127883d2e7198201" +# mtpsStoreToken = "M0p9VatZSeSHfrosD5IViAVl73IcA8mlcuHIV5sG6Zpv83a7JE0wY3t26aEhrrs_MR5gtLSFF1UIkt8HAjaXow" weimobAppID = "319F5E7FB6784DFCA3684C9333EB7744" weimobAppSecret = "7267AA7F58261F6965599218F5A1D592" @@ -165,6 +170,10 @@ jd2Token = "29e0e567-c475-433a-aff0-37176ee8d8a7" jd2AppKey = "7fb947624ff847ae94ff2f068cc99652" jd2Secret = "1097abd7ef09427099b4922784af123a" +jdEclpAccessToken = "bcb6201b5b3c45a0976dcda5e2dea8aejiwm" +jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" +jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" + elmIsProd = true elmToken = "" elmAppKey = "KLRDcOZGrk" @@ -187,6 +196,11 @@ weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" wxpayNotifyURL = "http://callback.jxc4.com/wxpay/msg/" +tonglianPayAppID = "00183083" +tonglianPayKey = "18048531223" +tonglianPayCusID = "56065105499TVAH" +tonglianPayNotifyURL = "http://callback.jxc4.com/tonglian/msg/" + dbConnectStr = "root:WebServer@1@tcp(db1.int.jxc4.com:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" enableStoreWrite = true @@ -204,6 +218,9 @@ dingdingSecret = "LWrZAFeqUfuVv7n_tc8vPpCAx6PT4CwManx2XCVhJOqGsx2L5XCDuX1sAN_Jtv dingdingCallbackURL = "http://callback.jxc4.com/dingding/msg" +yinbaoAppID = "18C0E0867E467DBC26EFF5E957B02EC4" +yinbaoAppKey = "682628966212343269" + [jxgy] httpport = 8088 EnableDocs = false @@ -244,8 +261,16 @@ weixinSecret = "6bbbed1443cc062c20a015a64c07a531" weixinMiniAppID = "wx2d6949f724b2541d" weixinMiniSecret = "11f3c380551c4683c149990b004d6df9" +weixinMiniAppID2 = "wx4b5930c13f8b1170" +weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" + wxpayNotifyURL = "http://callback-jxgy.jxc4.com/wxpay/msg/" +tonglianPayAppID = "00183083" +tonglianPayKey = "18048531223" +tonglianPayCusID = "56065105499TVAH" +tonglianPayNotifyURL = "http://callback-jxgy.jxc4.com/tonglian/msg/" + backstageHost = "http://www-jxgy.jxc4.com" wxBackstageHost = "http://wx-jxgy.jxc4.com" @@ -261,6 +286,13 @@ dingdingCallbackURL = "http://callback-jxgy.jxc4.com/dingding/msg" getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken" +jdEclpAccessToken = "bcb6201b5b3c45a0976dcda5e2dea8aejiwm" +jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" +jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" + +yinbaoAppID = "18C0E0867E467DBC26EFF5E957B02EC4" +yinbaoAppKey = "682628966212343269" + storeName = "京西果园" [test] @@ -316,6 +348,9 @@ dadaSourceID = "73753" weixinAppID = "wx2bb99eb5d2c9b82c" weixinSecret = "6bbbed1443cc062c20a015a64c07a531" getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" +getWeixin2TokenURL = "http://www.jxc4.com/v2/sys/GetWX2Token" +weixinMiniAppID2 = "wx4b5930c13f8b1170" +weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" mtwmCallbackURL = "http://callback.alpha.jxc4.com" @@ -345,6 +380,10 @@ jd2Token = "29e0e567-c475-433a-aff0-37176ee8d8a7" jd2AppKey = "7fb947624ff847ae94ff2f068cc99652" jd2Secret = "1097abd7ef09427099b4922784af123a" +jdEclpAccessToken = "bcb6201b5b3c45a0976dcda5e2dea8aejiwm" +jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" +jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" + elmIsProd = true elmToken = "" elmAppKey = "KLRDcOZGrk" @@ -367,6 +406,10 @@ weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" disableWeimob = false getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" +getWeixin2TokenURL = "http://www.jxc4.com/v2/sys/GetWX2Token" getWeimobTokenURL = "http://www.jxc4.com/v2/sys/GetWeimobToken" dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" + +yinbaoAppID = "18C0E0867E467DBC26EFF5E957B02EC4" +yinbaoAppKey = "682628966212343269" \ No newline at end of file diff --git a/controllers/cms_store.go b/controllers/cms_store.go index 2dfab7cc0..aef66e7a9 100644 --- a/controllers/cms_store.go +++ b/controllers/cms_store.go @@ -647,3 +647,20 @@ func (c *StoreController) SyncJdStore() { return retVal, "", err }) } + +// @Title 清空打印机打印队列 +// @Description 清空打印机打印队列 +// @Param token header string true "认证token" +// @Param storeIDs formData string true "门店列表" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /DeletePrinterSeq [post] +func (c *StoreController) DeletePrinterSeq() { + var storeIDList []int + c.callDeletePrinterSeq(func(params *tStoreDeletePrinterSeqParams) (retVal interface{}, errCode string, err error) { + if jxutils.Strings2Objs(params.StoreIDs, &storeIDList); err == nil { + err = cms.DeletePrinterSeq(params.Ctx, storeIDList) + } + return retVal, "", err + }) +} diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 72632ae0c..73025aa3d 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -85,6 +85,7 @@ func (c *StoreSkuController) GetStoreSkus() { // @Param ebaiSyncStatus query int false "饿百同步标识" // @Param mtwmSyncStatus query int false "美团外卖同步标识" // @Param lockTime query string false "价格锁定时间" +// @Param isHighPrice query bool false "是否查过高价格商品" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /GetStoresSkus [get,post] @@ -92,7 +93,7 @@ func (c *StoreSkuController) GetStoresSkus() { c.callGetStoresSkus(func(params *tStoreSkuGetStoresSkusParams) (retVal interface{}, errCode string, err error) { var storeIDs, skuIDs []int if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.SkuIDs, &skuIDs); err == nil { - retVal, err = cms.GetStoresSkus(params.Ctx, storeIDs, skuIDs, params.IsFocus, params.Keyword, params.IsBySku, params.IsAct, params.MapData, params.Offset, params.PageSize) + retVal, err = cms.GetStoresSkus(params.Ctx, storeIDs, skuIDs, params.IsFocus, params.IsHighPrice, params.Keyword, params.IsBySku, params.IsAct, params.MapData, params.Offset, params.PageSize) } return retVal, "", err }) @@ -674,6 +675,7 @@ func (c *StoreSkuController) SendSeckillSkusCountMsg() { // @Param token header string true "认证token" // @Param payload formData string true "json数据,JdStoreSkus对象" // @Param vendorID formData int true "厂商ID" +// @Param ignoreLow formData bool true "是否忽略低价商品" // @Param isAsync formData bool true "是否异步,缺省是同步" // @Param isContinueWhenError formData bool true "单个同步失败是否继续,缺省false" // @Success 200 {object} controllers.CallResult @@ -685,7 +687,76 @@ func (c *StoreSkuController) RefreshJxPriceByVendor() { if err = jxutils.Strings2Objs(params.Payload, &skuBindInfos); err != nil { return retVal, "", err } - retVal, err = cms.RefreshJxPriceByVendor(params.Ctx, skuBindInfos, params.VendorID, params.IsAsync, params.IsContinueWhenError) + retVal, err = cms.RefreshJxPriceByVendor(params.Ctx, skuBindInfos, params.VendorID, params.IgnoreLow, params.IsAsync, params.IsContinueWhenError) + return retVal, "", err + }) +} + +// @Title 根据平台价反算京西价2 +// @Description 根据平台价反算京西价2 +// @Param token header string true "认证token" +// @Param storeIDs formData string true "门店列表" +// @Param vendorID formData int true "厂商ID" +// @Param isAsync formData bool false "是否异步,缺省是同步" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /RefreshJxPriceByVendor2 [put] +func (c *StoreSkuController) RefreshJxPriceByVendor2() { + var storeIDs []int + c.callRefreshJxPriceByVendor2(func(params *tStoreSkuRefreshJxPriceByVendor2Params) (retVal interface{}, errCode string, err error) { + if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs); err != nil { + return retVal, "", err + } + retVal, err = cms.RefreshJxPriceByVendor2(params.Ctx, storeIDs, params.VendorID, params.IsAsync, params.IsContinueWhenError) + return retVal, "", err + }) +} + +// @Title 生成门店商品备份表 +// @Description 生成门店商品备份表 +// @Param token header string true "认证token" +// @Param isAsync formData bool false "是否异步,缺省是同步" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /BackUpStoreSkuBind [post] +func (c *StoreSkuController) BackUpStoreSkuBind() { + c.callBackUpStoreSkuBind(func(params *tStoreSkuBackUpStoreSkuBindParams) (retVal interface{}, errCode string, err error) { + retVal, err = cms.BackUpStoreSkuBind(params.Ctx, params.IsAsync, params.IsContinueWhenError) + return retVal, "", err + }) +} + +// @Title 恢复门店商品表 +// @Description 恢复门店商品表 +// @Param token header string true "认证token" +// @Param snapshotAt formData string true "日期,格式2020-03-06 00:00:00" +// @Param storeIDs formData string true "门店列表" +// @Param skuIDs formData string false "商品列表" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /ReturnStoreSkuBind [post] +func (c *StoreSkuController) ReturnStoreSkuBind() { + c.callReturnStoreSkuBind(func(params *tStoreSkuReturnStoreSkuBindParams) (retVal interface{}, errCode string, err error) { + var storeIDs, skuIDs []int + if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.SkuIDs, &skuIDs); err != nil { + return retVal, "", err + } + err = cms.ReturnStoreSkuBind(params.Ctx, params.SnapshotAt, storeIDs, skuIDs) + return retVal, "", err + }) +} + +// @Title 物料库存刷新(物料店商品上下架) +// @Description 物料库存刷新(物料店商品上下架) +// @Param token header string false "认证token" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /RefreshMatterStock [post] +func (c *StoreSkuController) RefreshMatterStock() { + c.callRefreshMatterStock(func(params *tStoreSkuRefreshMatterStockParams) (retVal interface{}, errCode string, err error) { + err = cms.RefreshMatterStock(params.Ctx, 0) return retVal, "", err }) } diff --git a/controllers/cms_user2.go b/controllers/cms_user2.go index ca2608ef5..a7a55f81c 100644 --- a/controllers/cms_user2.go +++ b/controllers/cms_user2.go @@ -485,3 +485,17 @@ func (c *User2Controller) DeleteUserInfo() { return retVal, "", err }) } + +// @Title 得到用户自己的门店列表(商城用) +// @Description 得到用户自己的门店列表(商城用) +// @Param token header string false "认证token" +// @Param mobile query string true "电话" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetMyJxStoreList [get] +func (c *User2Controller) GetMyJxStoreList() { + c.callGetMyJxStoreList(func(params *tUser2GetMyJxStoreListParams) (retVal interface{}, errCode string, err error) { + retVal, err = cms.GetMyJxStoreList(params.Ctx, params.Mobile) + return retVal, "", err + }) +} diff --git a/controllers/eclp_callback.go b/controllers/eclp_callback.go new file mode 100644 index 000000000..40b0b8635 --- /dev/null +++ b/controllers/eclp_callback.go @@ -0,0 +1,22 @@ +package controllers + +import ( + "fmt" + "net/http" + + "github.com/astaxie/beego" +) + +type EclpController struct { + beego.Controller +} + +func (c *EclpController) Msg() { + if c.Ctx.Input.Method() == http.MethodPost { + fmt.Println("testElcp", c.Ctx.Request.Body) + c.Data["json"] = c.Ctx.Request.Body + c.ServeJSON() + } else { + c.Abort("404") + } +} diff --git a/controllers/event.go b/controllers/event.go index e60db4764..4b7df673c 100644 --- a/controllers/event.go +++ b/controllers/event.go @@ -1,8 +1,13 @@ package controllers import ( + "time" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxstore/event" "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego" ) @@ -55,3 +60,25 @@ func (c *EventController) GetCheckVendorCookie() { return retVal, "", err }) } + +// @Title 得到微信小程序码 +// @Description 得到微信小程序码 +// @Param token header string true "认证token" +// @Param scene formData string true "最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)" +// @Param page formData string false "必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetWeixinUnlimited [post] +func (c *EventController) GetWeixinUnlimited() { + c.callGetWeixinUnlimited(func(params *tEventGetWeixinUnlimitedParams) (retVal interface{}, errCode string, err error) { + // api.WeixinMiniAPI2.CBRetrieveToken() + result, err := api.WeixinMiniAPI2.GetUnlimited(params.Scene, params.Page) + if err != nil || result == nil { + return retVal, "", err + } + fileName := "wxcode" + utils.Int64ToStr(time.Now().Unix()) + ".jpg" + retVal, err = jxutils.UploadExportContent([]byte(result["fakeData"].(string)), fileName) + // tasks.RefreshWeixinToken() + return retVal, "", err + }) +} diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 34d6ee3d1..ddb0eed3a 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -1002,3 +1002,17 @@ func (c *OrderController) GetOrdersAccept() { return retVal, "", err }) } + +// @Title 获取某个门店上次申请物料到现在的销量 +// @Description 获取某个门店上次申请物料到现在的销量 +// @Param token header string false "认证token" +// @Param storeID query int true "门店ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetMatterStoreOrderCount [get] +func (c *OrderController) GetMatterStoreOrderCount() { + c.callGetMatterStoreOrderCount(func(params *tOrderGetMatterStoreOrderCountParams) (retVal interface{}, errCode string, err error) { + retVal, err = orderman.GetMatterStoreOrderCount(params.Ctx, params.StoreID) + return retVal, "", err + }) +} diff --git a/controllers/jx_order2.go b/controllers/jx_order2.go index 6eab161ca..62b9fe70b 100644 --- a/controllers/jx_order2.go +++ b/controllers/jx_order2.go @@ -16,6 +16,7 @@ type JxOrderController struct { // @Param token header string true "认证token" // @Param jxOrder formData string true "订单信息" // @Param addressID formData int64 true "配送地址ID" +// @Param fromStoreID formData int fasle "物料配送门店" // @Param createType formData int false "创建类型, 0:预创建, 1:创建" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult @@ -24,7 +25,7 @@ func (c *JxOrderController) CreateOrder() { c.callCreateOrder(func(params *tJxorderCreateOrderParams) (retVal interface{}, errCode string, err error) { var jxOrder *localjx.JxOrderInfo if err = utils.UnmarshalUseNumber([]byte(params.JxOrder), &jxOrder); err == nil { - retVal, err = localjx.CreateOrder(params.Ctx, jxOrder, int64(params.AddressID), params.CreateType) + retVal, err = localjx.CreateOrder(params.Ctx, jxOrder, int64(params.AddressID), params.CreateType, params.FromStoreID) } return retVal, "", err }) @@ -61,8 +62,8 @@ func (c *JxOrderController) BuyerCancelOrder() { }) } -// @Title 查询网络打印机状态 -// @Description 查询网络打印机状态 +// @Title 得到门店营业时间配送列表 +// @Description 得到门店营业时间配送列表 // @Param token header string true "认证token" // @Param storeID query int true "门店ID" // @Success 200 {object} controllers.CallResult @@ -159,3 +160,44 @@ func (c *JxOrderController) PayForPopluarMan() { return retVal, "", err }) } + +// @Title 查询物料订单状态 +// @Description 查询物料订单状态 +// @Param token header string true "认证token" +// @Param vendorOrderID query string true "订单ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetMatterOrderStatus [get] +func (c *JxOrderController) GetMatterOrderStatus() { + c.callGetMatterOrderStatus(func(params *tJxorderGetMatterOrderStatusParams) (retVal interface{}, errCode string, err error) { + retVal, err = localjx.GetMatterOrderStatus(params.Ctx, params.VendorOrderID) + return retVal, "", err + }) +} + +// @Title 刷新所有物料订单状态 +// @Description 刷新所有物料订单状态 +// @Param token header string true "认证token" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /RefreshAllMatterOrderStatus [put] +func (c *JxOrderController) RefreshAllMatterOrderStatus() { + c.callRefreshAllMatterOrderStatus(func(params *tJxorderRefreshAllMatterOrderStatusParams) (retVal interface{}, errCode string, err error) { + err = localjx.RefreshAllMatterOrderStatus(params.Ctx) + return retVal, "", err + }) +} + +// @Title 重发物料订单 +// @Description 重发物料订单 +// @Param token header string true "认证token" +// @Param vendorOrderID formData string true "订单ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /SendFailedMatterOrder [post] +func (c *JxOrderController) SendFailedMatterOrder() { + c.callSendFailedMatterOrder(func(params *tJxorderSendFailedMatterOrderParams) (retVal interface{}, errCode string, err error) { + err = localjx.SendFailedMatterOrder(params.Ctx, params.VendorOrderID) + return retVal, "", err + }) +} diff --git a/controllers/sys.go b/controllers/sys.go index 4e4b66a0e..6c7160961 100644 --- a/controllers/sys.go +++ b/controllers/sys.go @@ -37,6 +37,23 @@ func (c *SysController) GetWXToken() { }) } +// @Title 得到微信小程序2token +// @Description 得到微信小程序2token +// @Param accessKey query string true "假token" +// @Param oldToken query string false "之前的token" +// @Param waitSecond query int false "等待秒数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetWX2Token [get] +func (c *SysController) GetWX2Token() { + c.callGetWX2Token(func(params *tSysGetWX2TokenParams) (retVal interface{}, errCode string, err error) { + if params.AccessKey == globals.GetWeixinTokenKey { + retVal = syseventhub.SysEventHub.GetWX2Token(params.OldToken, time.Duration(params.WaitSecond)*time.Second) + } + return retVal, "", err + }) +} + // @Title 得到易联云token // @Description 得到易联云token // @Param accessKey query string true "假token" diff --git a/controllers/tonglian_callback.go b/controllers/tonglian_callback.go new file mode 100644 index 000000000..6d33cb8c2 --- /dev/null +++ b/controllers/tonglian_callback.go @@ -0,0 +1,39 @@ +package controllers + +import ( + "bytes" + "io/ioutil" + "net/http" + + "git.rosy.net.cn/jx-callback/globals/api" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx" + "git.rosy.net.cn/jx-callback/globals" + + "github.com/astaxie/beego" + "github.com/astaxie/beego/context" +) + +type TongLianController struct { + beego.Controller +} + +func (c *TongLianController) Msg() { + if c.Ctx.Input.Method() == http.MethodPost { + call, err := api.TLpayAPI.GetCallbackMsg(getUsefulRequest2(c.Ctx)) + globals.SugarLogger.Debugf("tonglianapi callback callbackResponse:%s", utils.Format4Output(call, true)) + if err == nil { + err = localjx.OnTLPayCallback(call) + } + c.Data["json"] = call + c.ServeJSON() + } else { + c.Abort("404") + } +} + +func getUsefulRequest2(ctx *context.Context) *http.Request { + ctx.Request.Body = ioutil.NopCloser(bytes.NewReader(ctx.Input.RequestBody)) + return ctx.Request +} diff --git a/globals/api/api.go b/globals/api/api.go index 83cd083c2..e47c0c46d 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -3,6 +3,11 @@ package api import ( "time" + "git.rosy.net.cn/baseapi/platformapi/jdeclpapi" + "git.rosy.net.cn/baseapi/platformapi/yinbaoapi" + + "git.rosy.net.cn/baseapi/platformapi/tonglianpayapi" + aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate" "git.rosy.net.cn/baseapi/platformapi" @@ -38,6 +43,7 @@ var ( Jd2API *jdapi.API FakeJdAPI *jdapi.API + JdEclpAPI *jdeclpapi.API ElmAPI *elmapi.API EbaiAPI *ebaiapi.API @@ -50,7 +56,10 @@ var ( WeixinMiniAPI *weixinapi.API // 小程序 WeixinMiniAPI2 *weixinapi.API // 小程序2 WeixinMiniAppID2 string - WxpayAPI *wxpayapi.API // 微信支付API + WxpayAPI *wxpayapi.API // 微信支付API + TLpayAPI *tonglianpayapi.API //通联收银宝api + + YinBaoAPI *yinbaoapi.API //银豹平台api WeixinPageAPI *weixinapi.API // 用户微信扫码登录 @@ -82,16 +91,16 @@ func init() { func Init() { if !beego.AppConfig.DefaultBool("disableJd", false) { JdAPI = jdapi.New(beego.AppConfig.String("jdToken"), beego.AppConfig.String("jdAppKey"), beego.AppConfig.String("jdSecret")) - cookieValue := beego.AppConfig.DefaultString("jdStorePageCookie", "") - JdAPI.SetJdCookie(cookieValue) + // cookieValue := beego.AppConfig.DefaultString("jdStorePageCookie", "") + // JdAPI.SetJdCookie(cookieValue) conf := platformapi.NewDefAPIConfig() conf.MaxSleepSecondWhenExceedLimit = 60 * 30 // 最大重试间隙30分钟 - JdPageAPI = jdapi.NewPageOnly(cookieValue, conf) + JdPageAPI = jdapi.NewPageOnly("", conf) if globals.Jd2OrgCode != "" { Jd2API = jdapi.New(beego.AppConfig.String("jd2Token"), beego.AppConfig.String("jd2AppKey"), beego.AppConfig.String("jd2Secret")) - Jd2API.SetJdCookie(beego.AppConfig.DefaultString("jd2StorePageCookie", "")) + // Jd2API.SetJdCookie(beego.AppConfig.DefaultString("jd2StorePageCookie", "")) } fakeJdToken := beego.AppConfig.DefaultString("fakeJdToken", "") @@ -101,6 +110,11 @@ func Init() { } else { JdAPI = nil } + if !beego.AppConfig.DefaultBool("disableJdEclp", false) { + JdEclpAPI = jdeclpapi.New(beego.AppConfig.String("jdEclpAccessToken"), beego.AppConfig.String("jdEclpAppKey"), beego.AppConfig.String("jdEclpAppSecret")) + } else { + JdEclpAPI = nil + } if !beego.AppConfig.DefaultBool("disableElm", false) { ElmAPI = elmapi.New(beego.AppConfig.DefaultString("elmToken", ""), beego.AppConfig.String("elmAppKey"), beego.AppConfig.String("elmSecret"), beego.AppConfig.DefaultBool("elmIsProd", false)) } else { @@ -108,9 +122,9 @@ func Init() { } if !beego.AppConfig.DefaultBool("disableMtwm", false) { MtwmAPI = mtwmapi.New(beego.AppConfig.String("mtwmAppID"), beego.AppConfig.String("mtwmSecret"), beego.AppConfig.String("mtwmCallbackURL")) - if mtwmCookieStr := beego.AppConfig.DefaultString("mtwmCookieStr", ""); mtwmCookieStr != "" { - MtwmAPI.SetCookieWithStr(mtwmCookieStr) - } + // if mtwmCookieStr := beego.AppConfig.DefaultString("mtwmCookieStr", ""); mtwmCookieStr != "" { + // MtwmAPI.SetCookieWithStr(mtwmCookieStr) + // } } else { MtwmAPI = nil } @@ -124,32 +138,38 @@ func Init() { } if !beego.AppConfig.DefaultBool("disableEbai", false) { EbaiAPI = ebaiapi.New(beego.AppConfig.String("ebaiSource"), beego.AppConfig.String("ebaiSecret")) - ebaiStorePageCookieWMUSS := beego.AppConfig.DefaultString("ebaiStorePageCookieWMUSS", "") - ebaiStorePageCookieWMSTOKEN := beego.AppConfig.DefaultString("ebaiStorePageCookieWMSTOKEN", "") - ebaiStorePageCookieExdTOKEN := beego.AppConfig.DefaultString("ebaiStorePageCookieExdTOKEN", "") - if ebaiStorePageCookieWMUSS != "" && ebaiStorePageCookieWMSTOKEN != "" && ebaiStorePageCookieExdTOKEN != "" { - EbaiAPI.SetCookie("WMUSS", ebaiStorePageCookieWMUSS) - EbaiAPI.SetCookie("WMSTOKEN", ebaiStorePageCookieWMSTOKEN) - EbaiAPI.SetCookie("PASSPORT_DELIMONT_TOKEN", ebaiStorePageCookieExdTOKEN) - } + // ebaiStorePageCookieWMUSS := beego.AppConfig.DefaultString("ebaiStorePageCookieWMUSS", "") + // ebaiStorePageCookieWMSTOKEN := beego.AppConfig.DefaultString("ebaiStorePageCookieWMSTOKEN", "") + // ebaiStorePageCookieExdTOKEN := beego.AppConfig.DefaultString("ebaiStorePageCookieExdTOKEN", "") + // if ebaiStorePageCookieWMUSS != "" && ebaiStorePageCookieWMSTOKEN != "" && ebaiStorePageCookieExdTOKEN != "" { + // EbaiAPI.SetCookie("WMUSS", ebaiStorePageCookieWMUSS) + // EbaiAPI.SetCookie("WMSTOKEN", ebaiStorePageCookieWMSTOKEN) + // EbaiAPI.SetCookie("PASSPORT_DELIMONT_TOKEN", ebaiStorePageCookieExdTOKEN) + // } Ebai2API = ebaiapi.New(beego.AppConfig.String("ebaiSource"), beego.AppConfig.String("ebaiSecret")) - ebaiStorePageCookieWMUSS2 := beego.AppConfig.DefaultString("ebaiStorePageCookieWMUSS2", "") - ebaiStorePageCookieWMSTOKEN2 := beego.AppConfig.DefaultString("ebaiStorePageCookieWMSTOKEN2", "") - if ebaiStorePageCookieWMUSS2 != "" && ebaiStorePageCookieWMSTOKEN2 != "" && ebaiStorePageCookieExdTOKEN != "" { - Ebai2API.SetCookie("WMUSS", ebaiStorePageCookieWMUSS2) - Ebai2API.SetCookie("WMSTOKEN", ebaiStorePageCookieWMSTOKEN2) - Ebai2API.SetCookie("PASSPORT_DELIMONT_TOKEN", ebaiStorePageCookieExdTOKEN) - } + // ebaiStorePageCookieWMUSS2 := beego.AppConfig.DefaultString("ebaiStorePageCookieWMUSS2", "") + // ebaiStorePageCookieWMSTOKEN2 := beego.AppConfig.DefaultString("ebaiStorePageCookieWMSTOKEN2", "") + // if ebaiStorePageCookieWMUSS2 != "" && ebaiStorePageCookieWMSTOKEN2 != "" && ebaiStorePageCookieExdTOKEN != "" { + // Ebai2API.SetCookie("WMUSS", ebaiStorePageCookieWMUSS2) + // Ebai2API.SetCookie("WMSTOKEN", ebaiStorePageCookieWMSTOKEN2) + // Ebai2API.SetCookie("PASSPORT_DELIMONT_TOKEN", ebaiStorePageCookieExdTOKEN) + // } } else { EbaiAPI = nil Ebai2API = nil } + // if !beego.AppConfig.DefaultBool("disableYb", false) { + // YinBaoAPI = yinbaoapi.New(beego.AppConfig.String("yinbaoAppKey"), beego.AppConfig.String("yinbaoAppID")) + // } else { + // YinBaoAPI = nil + // } + if !beego.AppConfig.DefaultBool("disableMtps", false) { MtpsAPI = mtpsapi.New(beego.AppConfig.String("mtpsAppKey"), beego.AppConfig.String("mtpsSecret")) - if mtpsStoreToken := beego.AppConfig.DefaultString("mtpsStoreToken", ""); mtpsStoreToken != "" { - MtpsAPI.SetCookie("token", mtpsStoreToken) - } + // if mtpsStoreToken := beego.AppConfig.DefaultString("mtpsStoreToken", ""); mtpsStoreToken != "" { + // MtpsAPI.SetCookie("token", mtpsStoreToken) + // } } else { MtpsAPI = nil } @@ -181,6 +201,10 @@ func Init() { WxpayAPI = wxpayapi.NewWithCertificate(beego.AppConfig.String("wxpayAppID"), beego.AppConfig.String("wxpayAppKey"), beego.AppConfig.String("wxpayAppMchID"), "conf/apiclient_cert.pem", "conf/apiclient_key.pem") } + + if globals.TLPayNotifyURL != "" { + TLpayAPI = tonglianpayapi.New(beego.AppConfig.String("tonglianPayAppID"), beego.AppConfig.String("tonglianPayKey"), beego.AppConfig.String("tonglianPayCusID"), beego.AppConfig.String("wxpayAppID")) + } AutonaviAPI = autonavi.New(beego.AppConfig.String("autonaviKey")) BaiDuNaviAPI = baidunavi.New(beego.AppConfig.String("baidunaviAK"), beego.AppConfig.String("baidunaviSK")) QiniuAPI = qbox.NewMac(beego.AppConfig.String("qiniuAK"), beego.AppConfig.String("qiniuSK")) diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index df1146097..2ddd46103 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -31,6 +31,7 @@ func Init() { orm.RegisterModel(&model.Place{}) orm.RegisterModel(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}, &model.StoreCourierMap{}) orm.RegisterModel(&model.SkuVendorCategory{}, &model.StoreSkuCategoryMap{}, &model.SkuName{}, &model.Sku{}, &model.SkuNamePlaceBind{}, &model.StoreSkuBind{}) + orm.RegisterModel(&model.StoreSkuBindHistory{}) orm.RegisterModel(&model.SkuCategory{}) orm.RegisterModel(&model.ThingMap{}) diff --git a/globals/globals.go b/globals/globals.go index 85cc2ea0a..e12384f76 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -32,10 +32,11 @@ var ( BackstageHost string WxBackstageHost string - GetWeixinTokenURL string - GetWeixinTokenKey string - GetYLYTokenURL string - GetWeimobTokenURL string + GetWeixinTokenURL string + GetWeixin2TokenURL string + GetWeixinTokenKey string + GetYLYTokenURL string + GetWeimobTokenURL string StoreName string StoreNameMtwm string @@ -50,6 +51,7 @@ var ( DisableWXAuth1 bool WxpayNotifyURL string + TLPayNotifyURL string JdOrgCode string Jd2OrgCode string @@ -99,6 +101,7 @@ func Init() { WxBackstageHost = beego.AppConfig.DefaultString("wxBackstageHost", "") GetWeixinTokenURL = beego.AppConfig.DefaultString("getWeixinTokenURL", "") + GetWeixin2TokenURL = beego.AppConfig.DefaultString("getWeixin2TokenURL", "") GetYLYTokenURL = beego.AppConfig.DefaultString("getYLYTokenURL", "") GetWeimobTokenURL = beego.AppConfig.DefaultString("getWeimobTokenURL", "") GetWeixinTokenKey = beego.AppConfig.DefaultString("getWeixinTokenKey", "") @@ -116,6 +119,7 @@ func Init() { DisableWXAuth1 = true WxpayNotifyURL = beego.AppConfig.DefaultString("wxpayNotifyURL", "") + TLPayNotifyURL = beego.AppConfig.DefaultString("tonglianPayNotifyURL", "") JdOrgCode = beego.AppConfig.DefaultString("jdOrgCode", "") Jd2OrgCode = beego.AppConfig.DefaultString("jd2OrgCode", "") diff --git a/main.go b/main.go index 00908e8c2..15feef3f3 100644 --- a/main.go +++ b/main.go @@ -126,10 +126,14 @@ func main() { globals.SugarLogger.Errorf("RefreshWeixinToken failed with error:%s", err) return } - if err := tasks.RefreshWeimobToken(); err != nil { - globals.SugarLogger.Errorf("RefreshWeimobToken failed with error:%s", err) + if err := tasks.RefreshWeixin2Token(); err != nil { + globals.SugarLogger.Errorf("RefreshWeixin2Token failed with error:%s", err) return } + // if err := tasks.RefreshWeimobToken(); err != nil { + // globals.SugarLogger.Errorf("RefreshWeimobToken failed with error:%s", err) + // return + // } if err := tasks.RefreshYilianyunToken(); err != nil { globals.SugarLogger.Errorf("RefreshYilianyunToken failed with error:%s", err) return diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 67eddb1ce..061cf5d33 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -421,6 +421,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:EventController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:EventController"], + beego.ControllerComments{ + Method: "GetWeixinUnlimited", + Router: `/GetWeixinUnlimited`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:FinancialController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:FinancialController"], beego.ControllerComments{ Method: "GetOrdersFinancial", @@ -646,6 +655,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: "GetMatterOrderStatus", + Router: `/GetMatterOrderStatus`, + 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: "GetMyOrderCountInfo", @@ -691,6 +709,24 @@ 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: "RefreshAllMatterOrderStatus", + Router: `/RefreshAllMatterOrderStatus`, + AllowHTTPMethods: []string{"put"}, + 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: "SendFailedMatterOrder", + Router: `/SendFailedMatterOrder`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxShopController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JxShopController"], beego.ControllerComments{ Method: "JxMsg", @@ -954,6 +990,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: "GetMatterStoreOrderCount", + Router: `/GetMatterStoreOrderCount`, + AllowHTTPMethods: []string{"get"}, + 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: "GetOrderInfo", @@ -1485,6 +1530,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: "DeletePrinterSeq", + Router: `/DeletePrinterSeq`, + AllowHTTPMethods: []string{"post"}, + 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: "DeleteStore", @@ -1755,6 +1809,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], + beego.ControllerComments{ + Method: "BackUpStoreSkuBind", + Router: `/BackUpStoreSkuBind`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], beego.ControllerComments{ Method: "CopyStoreSkus", @@ -1908,6 +1971,24 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], + beego.ControllerComments{ + Method: "RefreshJxPriceByVendor2", + Router: `/RefreshJxPriceByVendor2`, + AllowHTTPMethods: []string{"put"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], + beego.ControllerComments{ + Method: "RefreshMatterStock", + Router: `/RefreshMatterStock`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], beego.ControllerComments{ Method: "RefreshStoresSkuByVendor", @@ -1917,6 +1998,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], + beego.ControllerComments{ + Method: "ReturnStoreSkuBind", + Router: `/ReturnStoreSkuBind`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], beego.ControllerComments{ Method: "SendSeckillSkusCountMsg", @@ -2124,6 +2214,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"], + beego.ControllerComments{ + Method: "GetWX2Token", + Router: `/GetWX2Token`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SysController"], beego.ControllerComments{ Method: "GetWXToken", @@ -2358,6 +2457,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:User2Controller"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:User2Controller"], + beego.ControllerComments{ + Method: "GetMyJxStoreList", + Router: `/GetMyJxStoreList`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:User2Controller"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:User2Controller"], beego.ControllerComments{ Method: "GetMyStoreList", diff --git a/routers/router.go b/routers/router.go index e12b6a539..5a12568a9 100644 --- a/routers/router.go +++ b/routers/router.go @@ -155,6 +155,8 @@ func init() { beego.AutoRouter(&controllers.DingDingController{}) beego.AutoRouter(&controllers.WXPayController{}) beego.AutoRouter(&controllers.Djsw2Controller{}) + beego.AutoRouter(&controllers.TongLianController{}) + beego.AutoRouter(&controllers.EclpController{}) // 如下都是用于检测存活的空接口 beego.Any("/", func(ctx *beecontext.Context) {