Accept Merge Request #199: (mark -> master)

Merge Request: 更新master
Created By: @苏尹岚
Accepted By: @苏尹岚
URL: https://rosydev.coding.net/p/jx-callback/d/jx-callback/git/merge/199
This commit is contained in:
苏尹岚
2020-04-01 16:32:23 +08:00
55 changed files with 2515 additions and 281 deletions

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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,

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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")

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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()
// 每天补全前一天与当天的订单

View File

@@ -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"

View File

@@ -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,

View File

@@ -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)
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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
}

View File

@@ -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{}{

View File

@@ -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: "外卖管家",

View File

@@ -138,6 +138,7 @@ var (
"Login": "登录",
"RegisterUser": "注册",
"AutoPayForPopluarMan": "每日订单打款",
"SyncStoresQualify": "上传门店营业资质",
}
MultiStoresVendorMap = map[int]int{

View File

@@ -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
}

View File

@@ -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]

View File

@@ -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)

View File

@@ -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,

View File

@@ -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)

View File

@@ -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"`
}

View File

@@ -7,6 +7,7 @@ const (
ConfigTypeBank = "Bank"
ConfigTypeRole = "Role"
ConfigTypeJxStore = "JxStore"
ConfigTypeCookie = "Cookie"
)
const (
@@ -24,6 +25,7 @@ var (
ConfigTypeBank: "银行",
ConfigTypeRole: "角色",
ConfigTypeJxStore: "京西商城",
ConfigTypeCookie: "Cookie",
}
)

View File

@@ -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:"-"`
}

View File

@@ -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"`
}

View File

@@ -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 {

View File

@@ -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用于表示请求操作结束而并不一定是删除

View File

@@ -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)
}

File diff suppressed because it is too large Load Diff

View File

@@ -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
}

View File

@@ -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{}{

View File

@@ -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
}

View File

@@ -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"

View File

@@ -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
})
}

View File

@@ -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
})
}

View File

@@ -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
})
}

View File

@@ -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")
}
}

View File

@@ -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
})
}

View File

@@ -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
})
}

View File

@@ -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
})
}

View File

@@ -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"

View File

@@ -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
}

View File

@@ -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"))

View File

@@ -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{})

View File

@@ -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", "")

View File

@@ -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

View File

@@ -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",

View File

@@ -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) {