Merge remote-tracking branch 'origin/mark' into yonghui

This commit is contained in:
苏尹岚
2019-12-05 14:47:08 +08:00
13 changed files with 299 additions and 193 deletions

View File

@@ -293,6 +293,7 @@ func AddActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto
} }
if act.Type != model.ActSkuFake { if act.Type != model.ActSkuFake {
for _, act := range actMap { for _, act := range actMap {
if act.VendorID != model.VendorIDJX {
if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act), if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act),
map[string]interface{}{ map[string]interface{}{
model.FieldSyncStatus: act.SyncStatus | model.SyncFlagModifiedMask, model.FieldSyncStatus: act.SyncStatus | model.SyncFlagModifiedMask,
@@ -301,6 +302,7 @@ func AddActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto
} }
} }
} }
}
dao.Commit(db) dao.Commit(db)
return err return err
} }
@@ -710,7 +712,7 @@ func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, act
syncStatus = model.SyncFlagDeletedMask syncStatus = model.SyncFlagDeletedMask
} }
syncStatus |= act.SyncStatus syncStatus |= act.SyncStatus
if act.Type != model.ActSkuFake { if act.Type != model.ActSkuFake && vendorID != model.VendorIDJX {
if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act), if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act),
map[string]interface{}{ map[string]interface{}{
model.FieldSyncStatus: syncStatus, model.FieldSyncStatus: syncStatus,

View File

@@ -109,7 +109,7 @@ func AddCategory(ctx *jxcontext.Context, cat *model.SkuCategory, userName string
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
} }
if err = OnCreateThing(db, int64(cat.ID), model.ThingTypeCategory); err != nil { if err = OnCreateThing(ctx, db, int64(cat.ID), model.ThingTypeCategory); err != nil {
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
} }
@@ -147,7 +147,7 @@ func UpdateCategory(ctx *jxcontext.Context, categoryID int, payload map[string]i
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
if err = OnUpdateThing(db, int64(categoryID), model.ThingTypeCategory); err != nil { if err = OnUpdateThing(ctx, db, int64(categoryID), model.ThingTypeCategory); err != nil {
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
@@ -241,7 +241,7 @@ func ReorderCategories(ctx *jxcontext.Context, parentID int, categoryIDs []int,
dao.Rollback(db) dao.Rollback(db)
return err return err
} }
if err = OnUpdateThing(db, int64(catsMap[v].ID), model.ThingTypeCategory); err != nil { if err = OnUpdateThing(ctx, db, int64(catsMap[v].ID), model.ThingTypeCategory); err != nil {
dao.Rollback(db) dao.Rollback(db)
return err return err
} }
@@ -293,7 +293,7 @@ func DeleteCategory(ctx *jxcontext.Context, categoryID int, userName string) (nu
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
if err = OnDeleteThing(db, int64(categoryID), model.ThingTypeCategory); err != nil { if err = OnDeleteThing(ctx, db, int64(categoryID), model.ThingTypeCategory); err != nil {
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
@@ -663,7 +663,7 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
} }
if err = OnCreateThing(db, int64(skuNameExt.SkuName.ID), model.ThingTypeSkuName); err != nil { if err = OnCreateThing(ctx, db, int64(skuNameExt.SkuName.ID), model.ThingTypeSkuName); err != nil {
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
} }
@@ -779,7 +779,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil { if err = OnUpdateThing(ctx, db, int64(nameID), model.ThingTypeSkuName); err != nil {
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
@@ -816,7 +816,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
return 0, err return 0, err
} }
if err = OnUpdateThing(db, int64(v.ID), model.ThingTypeSku); err != nil { if err = OnUpdateThing(ctx, db, int64(v.ID), model.ThingTypeSku); err != nil {
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
@@ -887,14 +887,14 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int
return 0, err return 0, err
} }
if err = OnDeleteThing(db, int64(v.ID), model.ThingTypeSku); err != nil { if err = OnDeleteThing(ctx, db, int64(v.ID), model.ThingTypeSku); err != nil {
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
} }
} }
if err = OnDeleteThing(db, int64(nameID), model.ThingTypeSkuName); err != nil { if err = OnDeleteThing(ctx, db, int64(nameID), model.ThingTypeSkuName); err != nil {
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
@@ -943,7 +943,7 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string)
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
} }
if err = OnCreateThing(db, int64(sku.ID), model.ThingTypeSku); err != nil { if err = OnCreateThing(ctx, db, int64(sku.ID), model.ThingTypeSku); err != nil {
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
} }
@@ -991,20 +991,20 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{}
} }
return 0, err return 0, err
} }
if num, err = dao.ExecuteSQL(db, ` if _, err = dao.ExecuteSQL(db, `
UPDATE sku_name t1 UPDATE sku_name t1
JOIN sku t2 ON t1.id = t2.name_id JOIN sku t2 ON t1.id = t2.name_id
SET t1.spec_quality = t2.spec_quality, SET t1.spec_quality = t2.spec_quality,
t1.spec_unit = t2.spec_unit t1.spec_unit = t2.spec_unit
WHERE t1.deleted_at = ? AND t2.id = ? AND t1.unit <> ? WHERE t1.deleted_at = ? AND t2.id = ? AND t1.unit <> ?
`, utils.DefaultTimeValue, skuID, model.SpecialUnit); err != nil || num == 0 { `, utils.DefaultTimeValue, skuID, model.SpecialUnit); err != nil {
dao.Rollback(db) dao.Rollback(db)
if err == nil { if err == nil {
err = ErrEntityNotExist err = ErrEntityNotExist
} }
return 0, err return 0, err
} }
if err = OnUpdateThing(db, int64(skuID), model.ThingTypeSku); err != nil { if err = OnUpdateThing(ctx, db, int64(skuID), model.ThingTypeSku); err != nil {
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
@@ -1069,7 +1069,7 @@ func DeleteSku(ctx *jxcontext.Context, skuID int, userName string) (num int64, e
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
if err = OnDeleteThing(db, int64(skuID), model.ThingTypeSku); err != nil { if err = OnDeleteThing(ctx, db, int64(skuID), model.ThingTypeSku); err != nil {
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }
@@ -1149,7 +1149,7 @@ func AddSkuNamePlace(ctx *jxcontext.Context, nameID, placeCode int, userName str
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
} }
if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil { if err = OnUpdateThing(ctx, db, int64(nameID), model.ThingTypeSkuName); err != nil {
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
} }
@@ -1179,7 +1179,7 @@ func DeleteSkuNamePlace(ctx *jxcontext.Context, nameID, placeCode int, userName
} }
return 0, err return 0, err
} }
if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil { if err = OnUpdateThing(ctx, db, int64(nameID), model.ThingTypeSkuName); err != nil {
dao.Rollback(db) dao.Rollback(db)
return 0, err return 0, err
} }

View File

@@ -15,6 +15,7 @@ import (
"git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/baseapi/utils/errlist"
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
"git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
@@ -788,15 +789,15 @@ func UpdateStoreSku(ctx *jxcontext.Context, storeID int, skuBindInfo *StoreSkuBi
} }
func UpdateStoreSkus(ctx *jxcontext.Context, storeID int, skuBindInfos []*StoreSkuBindInfo, isAsync, isContinueWhenError bool) (hint string, err error) { func UpdateStoreSkus(ctx *jxcontext.Context, storeID int, skuBindInfos []*StoreSkuBindInfo, isAsync, isContinueWhenError bool) (hint string, err error) {
return UpdateStoresSkus(ctx, []int{storeID}, skuBindInfos, isAsync, isContinueWhenError) return UpdateStoresSkus(ctx, []int{storeID}, skuBindInfos, false, isAsync, isContinueWhenError)
} }
func UpdateStoresSkus(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, isAsync, isContinueWhenError bool) (hint string, err error) { func UpdateStoresSkus(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, isScale, isAsync, isContinueWhenError bool) (hint string, err error) {
globals.SugarLogger.Debugf("UpdateStoresSkus:%s, storeIDs:%v, skuBindInfos:%s", ctx.GetTrackInfo(), storeIDs, utils.Format4Output(skuBindInfos, true)) globals.SugarLogger.Debugf("UpdateStoresSkus:%s, storeIDs:%v, skuBindInfos:%s", ctx.GetTrackInfo(), storeIDs, utils.Format4Output(skuBindInfos, true))
var num int64 var num int64
db := dao.GetDB() db := dao.GetDB()
skuIDs, err := updateStoresSkusWithoutSync(ctx, db, storeIDs, skuBindInfos) skuIDs, err := updateStoresSkusWithoutSync(ctx, db, storeIDs, skuBindInfos, isScale)
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -836,7 +837,7 @@ func UpdateStoresSkusByBind(ctx *jxcontext.Context, skuBindInfos []*StoreSkuBind
} }
}() }()
for _, storeID := range storeIDs { for _, storeID := range storeIDs {
skuIDs, err2 := updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosMap[storeID]) skuIDs, err2 := updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosMap[storeID], false)
if err = err2; err != nil { if err = err2; err != nil {
dao.Rollback(db) dao.Rollback(db)
return "", err return "", err
@@ -916,7 +917,7 @@ func uniqueStoreNameBind(skuBindInfos []*StoreSkuBindInfo) (outSkuBindInfos []*S
return outSkuBindInfos return outSkuBindInfos
} }
func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs []int, skuBindInfos []*StoreSkuBindInfo) (needSyncSkus []int, err error) { func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, isScale bool) (needSyncSkus []int, err error) {
if len(storeIDs)*len(skuBindInfos) > maxStoreNameBind2 { if len(storeIDs)*len(skuBindInfos) > maxStoreNameBind2 {
return nil, fmt.Errorf("门店商品信息大于%d", maxStoreNameBind2) return nil, fmt.Errorf("门店商品信息大于%d", maxStoreNameBind2)
} }
@@ -957,6 +958,10 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
} }
scaleFactor := float64(1)
if isScale {
scaleFactor = 100 / float64(jxutils.ConstrainPayPercentage(storeDetail.PayPercentage))
}
for _, skuBindInfo := range skuBindInfos { for _, skuBindInfo := range skuBindInfos {
// 关注且没有给价时需要尝试从store_sku_bind中得到已有的单价 // 关注且没有给价时需要尝试从store_sku_bind中得到已有的单价
needGetExistingUnitPrice := skuBindInfo.UnitPrice == 0 && skuBindInfo.IsFocus == 1 needGetExistingUnitPrice := skuBindInfo.UnitPrice == 0 && skuBindInfo.IsFocus == 1
@@ -1018,6 +1023,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
unitPrice = allBinds[0].SkuNamePrice unitPrice = allBinds[0].SkuNamePrice
} }
} }
unitPrice = int(float64(unitPrice) * scaleFactor)
for _, v := range allBinds { for _, v := range allBinds {
var num int64 var num int64
inSkuBind := inSkuBinsMap[v.RealSkuID] inSkuBind := inSkuBinsMap[v.RealSkuID]
@@ -1263,19 +1269,16 @@ func UpdateStoresSkusSale(ctx *jxcontext.Context, storeIDs []int, skuBindSkuInfo
return hint, err return hint, err
} }
func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode string, params map[string]interface{}, userName string) (num int64, err error) { func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID int, toStoreIDs []int, copyMode string, isScale bool, params map[string]interface{}, userName string) (num int64, err error) {
if copyMode != CopyStoreSkuModeFresh && copyMode != CopyStoreSkuModeUpdate && copyMode != CopyStoreSkuModeUpdatePrice { if copyMode != CopyStoreSkuModeFresh && copyMode != CopyStoreSkuModeUpdate && copyMode != CopyStoreSkuModeUpdatePrice {
return 0, fmt.Errorf("不支持的拷贝模式:%s", copyMode) return 0, fmt.Errorf("不支持的拷贝模式:%s", copyMode)
} }
db := dao.GetDB() db := dao.GetDB()
if err = checkStoreExisting(db, fromStoreID); err != nil { fromStore, err := checkStoreExisting(db, fromStoreID)
if err != nil {
return 0, err return 0, err
} }
if err = checkStoreExisting(db, toStoreID); err != nil {
return 0, err
}
sqlCatAndSku := "" sqlCatAndSku := ""
sqlCatAndSkuParams := make([]interface{}, 0) sqlCatAndSkuParams := make([]interface{}, 0)
if params["categoryIDs"] != nil { if params["categoryIDs"] != nil {
@@ -1302,7 +1305,13 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode
if params["pricePercentage"] != nil { if params["pricePercentage"] != nil {
pricePercentage = params["pricePercentage"].(int) pricePercentage = params["pricePercentage"].(int)
} }
errList := errlist.New()
for _, toStoreID := range toStoreIDs {
toStore, err := checkStoreExisting(db, toStoreID)
if err != nil {
errList.AddErr(err)
break
}
now := time.Now() now := time.Now()
if fromStoreID == toStoreID { if fromStoreID == toStoreID {
sql := ` sql := `
@@ -1337,13 +1346,18 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode
} }
sql += sqlCatAndSku sql += sqlCatAndSku
sqlParams = append(sqlParams, sqlCatAndSkuParams) sqlParams = append(sqlParams, sqlCatAndSkuParams)
num, err = dao.ExecuteSQL(db, sql, sqlParams) num2, err2 := dao.ExecuteSQL(db, sql, sqlParams)
return num, err if err2 != nil {
errList.AddErr(err2)
} else {
num += num2
}
break
} }
dao.Begin(db) dao.Begin(db)
defer func() { defer func() {
dao.Rollback(db)
if r := recover(); r != nil { if r := recover(); r != nil {
dao.Rollback(db)
panic(r) panic(r)
} }
}() }()
@@ -1387,10 +1401,14 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode
sqlDelete += sqlCatAndSku sqlDelete += sqlCatAndSku
sqlDeleteParams = append(sqlDeleteParams, sqlCatAndSkuParams) sqlDeleteParams = append(sqlDeleteParams, sqlCatAndSkuParams)
// globals.SugarLogger.Debug(sqlDelete) // globals.SugarLogger.Debug(sqlDelete)
if num, err = dao.ExecuteSQL(db, sqlDelete, sqlDeleteParams); err != nil { num2, err2 := dao.ExecuteSQL(db, sqlDelete, sqlDeleteParams)
return 0, err if err = err2; err != nil {
errList.AddErr(err)
dao.Rollback(db)
break
} }
globals.SugarLogger.Debugf("CopyStoreSkus trackInfo:%s num1:%d", ctx.GetTrackInfo(), num) num += num2
globals.SugarLogger.Debugf("CopyStoreSkus fromStoreID:%d, toStoreID:%d, trackInfo:%s num1:%d", fromStoreID, toStoreID, ctx.GetTrackInfo(), num2)
} }
isModifyStatus := 1 isModifyStatus := 1
syncStatus := model.SyncFlagStoreSkuOnlyMask syncStatus := model.SyncFlagStoreSkuOnlyMask
@@ -1398,10 +1416,18 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode
isModifyStatus = 0 isModifyStatus = 0
syncStatus = model.SyncFlagPriceMask syncStatus = model.SyncFlagPriceMask
} }
scaleFactor := float64(1)
if isScale {
fromPayPercentage := jxutils.ConstrainPayPercentage(fromStore.PayPercentage)
toPayPercentage := jxutils.ConstrainPayPercentage(toStore.PayPercentage)
scaleFactor = float64(fromPayPercentage) / float64(toPayPercentage)
}
// 处理toStore中与fromStore中都存在的 // 处理toStore中与fromStore中都存在的
sql := ` sql := `
UPDATE store_sku_bind t1 UPDATE store_sku_bind t1
JOIN store t11 ON t11.id = t1.store_id
LEFT JOIN store_sku_bind t0 ON t0.store_id = ? AND t0.sku_id = t1.sku_id AND t0.deleted_at = ? LEFT JOIN store_sku_bind t0 ON t0.store_id = ? AND t0.sku_id = t1.sku_id AND t0.deleted_at = ?
JOIN store t01 ON t01.id = t0.store_id
JOIN sku t2 ON t1.sku_id = t2.id/* AND t2.deleted_at = ?*/ JOIN sku t2 ON t1.sku_id = t2.id/* AND t2.deleted_at = ?*/
JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/
LEFT JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ? LEFT JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ?
@@ -1409,9 +1435,9 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode
t1.last_operator = ?, t1.last_operator = ?,
t1.updated_at = ?, t1.updated_at = ?,
t1.sub_store_id = 0, t1.sub_store_id = 0,
t1.price = IF(t0.price * ? / 100 > 0, t0.price * ? / 100, 1), t1.price = IF(t0.price * ? / 100 > 0, t0.price * ? / 100, 1) * ?,
t1.jx_price = IF(t0.jx_price * ? / 100 > 0, t0.jx_price * ? / 100, 1), t1.jx_price = IF(t0.jx_price * ? / 100 > 0, t0.jx_price * ? / 100, 1) * ?,
t1.unit_price = IF(t0.unit_price * ? / 100 > 0, t0.unit_price * ? / 100, 1), t1.unit_price = IF(t0.unit_price * ? / 100 > 0, t0.unit_price * ? / 100, 1) * ?,
t1.status = IF(? = 0, t1.status, t0.status), t1.status = IF(? = 0, t1.status, t0.status),
t1.jd_sync_status = t1.jd_sync_status | ?, t1.jd_sync_status = t1.jd_sync_status | ?,
t1.mtwm_sync_status = t1.mtwm_sync_status | ?, t1.mtwm_sync_status = t1.mtwm_sync_status | ?,
@@ -1428,10 +1454,13 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode
now, now,
pricePercentage, pricePercentage,
pricePercentage, pricePercentage,
scaleFactor,
pricePercentage, pricePercentage,
pricePercentage, pricePercentage,
scaleFactor,
pricePercentage, pricePercentage,
pricePercentage, pricePercentage,
scaleFactor,
isModifyStatus, isModifyStatus,
syncStatus, syncStatus,
syncStatus, syncStatus,
@@ -1442,19 +1471,23 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode
sql += sqlCatAndSku sql += sqlCatAndSku
sqlParams = append(sqlParams, sqlCatAndSkuParams) sqlParams = append(sqlParams, sqlCatAndSkuParams)
// globals.SugarLogger.Debug(sql) // globals.SugarLogger.Debug(sql)
num, err = dao.ExecuteSQL(db, sql, sqlParams) num2, err2 := dao.ExecuteSQL(db, sql, sqlParams)
globals.SugarLogger.Debugf("CopyStoreSkus trackInfo:%s num2:%d", ctx.GetTrackInfo(), num) globals.SugarLogger.Debugf("CopyStoreSkus fromStoreID:%d, toStoreID:%d, trackInfo:%s num2:%d", fromStoreID, toStoreID, ctx.GetTrackInfo(), num2)
if err != nil { if err = err2; err != nil {
return 0, err errList.AddErr(err)
dao.Rollback(db)
break
} }
num += num2
// 添加toStore中不存在但fromStore存在的 // 添加toStore中不存在但fromStore存在的
sql = ` sql = `
INSERT INTO store_sku_bind(created_at, updated_at, last_operator, deleted_at, store_id, sku_id, sub_store_id, price, jx_price, unit_price, status, INSERT INTO store_sku_bind(created_at, updated_at, last_operator, deleted_at, store_id, sku_id, sub_store_id, price, jx_price, unit_price, status,
jd_sync_status, ebai_sync_status, mtwm_sync_status) jd_sync_status, ebai_sync_status, mtwm_sync_status)
SELECT ?, ?, ?, ?, ?, SELECT ?, ?, ?, ?, ?,
t1.sku_id, 0, t1.sku_id, 0,
IF(t1.price * ? / 100 > 0, t1.price * ? / 100, 1), IF(t1.jx_price * ? / 100 > 0, t1.jx_price * ? / 100, 1), IF(t1.unit_price * ? / 100 > 0, t1.unit_price * ? / 100, 1), IF(t1.price * ? / 100 > 0, t1.price * ? / 100, 1) * ?,
IF(t1.jx_price * ? / 100 > 0, t1.jx_price * ? / 100, 1) * ?,
IF(t1.unit_price * ? / 100 > 0, t1.unit_price * ? / 100, 1) * ?,
IF(? = 0, ?, t1.status), ?, ?, ? IF(? = 0, ?, t1.status), ?, ?, ?
FROM store_sku_bind t1 FROM store_sku_bind t1
JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ? JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ?
@@ -1467,10 +1500,13 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode
now, now, userName, utils.DefaultTimeValue, toStoreID, now, now, userName, utils.DefaultTimeValue, toStoreID,
pricePercentage, pricePercentage,
pricePercentage, pricePercentage,
scaleFactor,
pricePercentage, pricePercentage,
pricePercentage, pricePercentage,
scaleFactor,
pricePercentage, pricePercentage,
pricePercentage, pricePercentage,
scaleFactor,
isModifyStatus, isModifyStatus,
model.SkuStatusDontSale, model.SkuStatusDontSale,
model.SyncFlagNewMask, model.SyncFlagNewMask,
@@ -1486,13 +1522,17 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode
} }
sql += sqlCatAndSku + " AND t0.id IS NULL" sql += sqlCatAndSku + " AND t0.id IS NULL"
sqlParams = append(sqlParams, sqlCatAndSkuParams) sqlParams = append(sqlParams, sqlCatAndSkuParams)
num, err = dao.ExecuteSQL(db, sql, sqlParams) num2, err = dao.ExecuteSQL(db, sql, sqlParams)
if err != nil { if err != nil {
return 0, err errList.AddErr(err)
dao.Rollback(db)
break
} }
globals.SugarLogger.Debugf("CopyStoreSkus trackInfo:%s num3:%d", ctx.GetTrackInfo(), num) num += num2
globals.SugarLogger.Debugf("CopyStoreSkus fromStoreID:%d, toStoreID:%d, trackInfo:%s num3:%d", fromStoreID, toStoreID, ctx.GetTrackInfo(), num2)
dao.Commit(db) dao.Commit(db)
return num, err }
return num, errList.GetErrListAsOne()
} }
func shouldPendingStorePriceChange(ctx *jxcontext.Context, storeID int, skuBindInfo *StoreSkuBindInfo) (shouldPending bool, err error) { func shouldPendingStorePriceChange(ctx *jxcontext.Context, storeID int, skuBindInfo *StoreSkuBindInfo) (shouldPending bool, err error) {
@@ -1648,7 +1688,7 @@ func AcceptStoreOpRequests(ctx *jxcontext.Context, reqIDs []int) (err error) {
} }
} }
if err2 == nil { if err2 == nil {
_, err2 := UpdateStoresSkus(ctx, []int{op.StoreID}, []*StoreSkuBindInfo{skuBindInfo}, false, false) _, err2 := UpdateStoresSkus(ctx, []int{op.StoreID}, []*StoreSkuBindInfo{skuBindInfo}, false, false, false)
isLocalSucess := true isLocalSucess := true
if err2 != nil { if err2 != nil {
subErrors[reqID] = err2 subErrors[reqID] = err2
@@ -1845,16 +1885,16 @@ func setStoreSkuBindStatus(skuBind *model.StoreSkuBind, status int8) {
skuBind.MtwmSyncStatus |= status skuBind.MtwmSyncStatus |= status
} }
func checkStoreExisting(db *dao.DaoDB, storeID int) (err error) { func checkStoreExisting(db *dao.DaoDB, storeID int) (store *model.Store, err error) {
store := &model.Store{} store = &model.Store{}
store.ID = storeID store.ID = storeID
if err = dao.GetEntity(db, store); err != nil { if err = dao.GetEntity(db, store); err != nil {
if err == orm.ErrNoRows { if err == orm.ErrNoRows {
return fmt.Errorf("门店:%d不存在", storeID) return nil, fmt.Errorf("门店:%d不存在", storeID)
} }
return err return nil, err
} }
return nil return store, nil
} }
func RefreshStoresSkuByVendor(ctx *jxcontext.Context, storeIDs []int, vendorID int, isAsync bool) (hint string, err error) { func RefreshStoresSkuByVendor(ctx *jxcontext.Context, storeIDs []int, vendorID int, isAsync bool) (hint string, err error) {

View File

@@ -716,14 +716,58 @@ func GetTimeMixByInt(begin1, end1, begin2, end2 int16) (beginAt, endAt int16) {
return beginAt, endAt return beginAt, endAt
} }
func OnCreateThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) { func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingType int8) (err error) {
return err for _, v := range getMultiStoreVendorInfoList() {
thingMap := &model.ThingMap{
ThingID: thingID,
ThingType: thingType,
VendorID: v.VendorID,
VendorOrgCode: v.OrgCode,
SyncStatus: model.SyncFlagNewMask,
}
dao.WrapAddIDCULDEntity(thingMap, ctx.GetUserName())
err = dao.CreateEntity(db, thingMap)
}
return nil
} }
func OnUpdateThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) { func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingType int8) (err error) {
return err for _, v := range getMultiStoreVendorInfoList() {
thingMap := &model.ThingMap{
ThingID: thingID,
ThingType: thingType,
VendorID: v.VendorID,
VendorOrgCode: v.OrgCode,
}
thingMap.DeletedAt = utils.DefaultTimeValue
if err = dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt); err == nil {
thingMap.SyncStatus |= model.SyncFlagModifiedMask
thingMap.LastOperator = ctx.GetUserName()
_, err = dao.UpdateEntity(db, thingMap)
}
}
return nil
} }
func OnDeleteThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) { func OnDeleteThing(ctx *jxcontext.Context, db *dao.DaoDB, thingID int64, thingType int8) (err error) {
return err for _, v := range getMultiStoreVendorInfoList() {
thingMap := &model.ThingMap{
ThingID: thingID,
ThingType: thingType,
VendorID: v.VendorID,
VendorOrgCode: v.OrgCode,
}
thingMap.DeletedAt = utils.DefaultTimeValue
if err = dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt); err == nil {
if model.IsSyncStatusNew(thingMap.SyncStatus) {
thingMap.SyncStatus = 0
} else {
thingMap.SyncStatus |= model.SyncFlagDeletedMask
}
_, err = dao.DeleteEntityLogically(db, thingMap, map[string]interface{}{
model.FieldSyncStatus: thingMap.SyncStatus,
}, ctx.GetUserName(), nil)
}
}
return nil
} }

View File

@@ -863,7 +863,7 @@ func UpdateJxPriceByWeimob(ctx *jxcontext.Context, storeIDs []int, isAsync, isCo
for _, v := range storeSkuBindInfoList { for _, v := range storeSkuBindInfoList {
skuBindInfos = append(skuBindInfos, v.(*cms.StoreSkuBindInfo)) skuBindInfos = append(skuBindInfos, v.(*cms.StoreSkuBindInfo))
} }
cms.UpdateStoresSkus(ctx, storeIDs, skuBindInfos, isAsync, isContinueWhenError) cms.UpdateStoresSkus(ctx, storeIDs, skuBindInfos, false, isAsync, isContinueWhenError)
case 2: case 2:
WriteToExcel3(task, dataStoreSkusSuccess.dataStoreSkusSuccessList, dataFailed.dataFailedList) WriteToExcel3(task, dataStoreSkusSuccess.dataStoreSkusSuccessList, dataFailed.dataFailedList)
} }

View File

@@ -326,6 +326,13 @@ func CaculatePriceByPricePack(l model.PricePercentagePack, defPricePercentage, p
return CaculateSkuVendorPrice(price, pricePercentage, priceAdd) return CaculateSkuVendorPrice(price, pricePercentage, priceAdd)
} }
func ConstrainPayPercentage(payPerCentage int) int {
if payPerCentage <= 50 {
payPerCentage = 70
}
return payPerCentage
}
func IsSkuSpecial(specQuality float32, specUnit string) bool { func IsSkuSpecial(specQuality float32, specUnit string) bool {
return int(specQuality) == model.SpecialSpecQuality && (specUnit == model.SpecialSpecUnit || specUnit == model.SpecialSpecUnit2) return int(specQuality) == model.SpecialSpecQuality && (specUnit == model.SpecialSpecUnit || specUnit == model.SpecialSpecUnit2)
} }

View File

@@ -901,7 +901,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
ORDER BY IF(t1.status < ?, IF(t1.vendor_id = ?, 0, 1), 0), t1.order_created_at DESC` ORDER BY IF(t1.status < ?, IF(t1.vendor_id = ?, 0, 1), 0), t1.order_created_at DESC`
sqlParams = append(sqlParams, model.OrderStatusEndBegin, model.VendorIDJX) sqlParams = append(sqlParams, model.OrderStatusEndBegin, model.VendorIDJX)
} else { } else {
if isIncludeSku && userID == "" { if isIncludeSku && userID == "" && len(ids) == 0 {
sql += ` sql += `
ORDER BY t1.id` ORDER BY t1.id`
} else { } else {

View File

@@ -67,8 +67,8 @@ func GetUsers(db *DaoDB, userType int, keyword string, userIDs []string, userID2
} }
if keyword != "" { if keyword != "" {
keywordLike := "%" + keyword + "%" keywordLike := "%" + keyword + "%"
sql += " AND (t1.user_id2 LIKE ? OR t1.mobile LIKE ? OR t1.email LIKE ? OR t1.name LIKE ?)" sql += " AND (t1.user_id LIKE ? OR t1.user_id2 LIKE ? OR t1.mobile LIKE ? OR t1.email LIKE ? OR t1.name LIKE ?)"
sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike) sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike)
} }
sql += " LIMIT ? OFFSET ?" sql += " LIMIT ? OFFSET ?"
sqlParams = append(sqlParams, pageSize, offset) sqlParams = append(sqlParams, pageSize, offset)

View File

@@ -321,7 +321,7 @@ type OrderPayRefund struct {
RefundID string `orm:"column(refund_id);unique;size(48)" json:"refundID"` RefundID string `orm:"column(refund_id);unique;size(48)" json:"refundID"`
VendorRefundID string `orm:"column(vendor_refund_id);unique;size(48)" json:"vendorRefundID"` VendorRefundID string `orm:"column(vendor_refund_id);unique;size(48)" json:"vendorRefundID"`
AfsOrderID string `orm:"column(afs_order_id);index;size(48)" json:"afsOrderID"` AfsOrderID string `orm:"column(afs_order_id);index;size(48)" json:"afsOrderID"` // AfsOrderID与RefundID的区别
VendorOrderID string `orm:"column(vendor_order_id);index;size(48)" json:"vendorOrderID"` VendorOrderID string `orm:"column(vendor_order_id);index;size(48)" json:"vendorOrderID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"` VendorID int `orm:"column(vendor_id)" json:"vendorID"`
TransactionID string `orm:"column(transaction_id);index;size(48)" json:"transactionID"` TransactionID string `orm:"column(transaction_id);index;size(48)" json:"transactionID"`

View File

@@ -14,13 +14,13 @@ type ThingMap struct {
VendorID int `orm:"column(vendor_id)" json:"vendorID"` VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
VendorThingID string `orm:"size(32);column(vendor_thing_id)" json:"vendorThingID"` VendorThingID string `orm:"size(32);column(vendor_thing_id);index" json:"vendorThingID"`
SyncStatus int8 `orm:"default(2)"` SyncStatus int8 `orm:"default(2)"`
} }
func (*ThingMap) TableUnique() [][]string { func (*ThingMap) TableUnique() [][]string {
return [][]string{ return [][]string{
[]string{"ThingID", "ThingType", "VendorID", "VendorOrgCode", "DeletedAt"}, []string{"ThingID", "ThingType", "VendorID", "VendorOrgCode", "DeletedAt"},
[]string{"VendorThingID", "ThingType", "VendorID", "VendorOrgCode", "DeletedAt"}, // []string{"VendorThingID", "ThingType", "VendorID", "VendorOrgCode", "DeletedAt"},
} }
} }

View File

@@ -256,8 +256,8 @@ func GenOrderNo(ctx *jxcontext.Context) (orderNo int64) {
func GenRefundID(order *model.GoodsOrder) (refundID int64) { func GenRefundID(order *model.GoodsOrder) (refundID int64) {
const suffix = 100000 const suffix = 100000
orderID := utils.Str2Int64(order.VendorOrderID) * suffix refundID = utils.Str2Int64(order.VendorOrderID) * suffix
orderID += int64(time.Now().Sub(order.OrderFinishedAt) / time.Minute) refundID += int64(time.Now().Sub(order.OrderFinishedAt) / time.Minute)
return refundID return refundID
} }
@@ -514,9 +514,11 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string)
if orderPay.Status == model.PayStatusYes { if orderPay.Status == model.PayStatusYes {
refundID := utils.Int64ToStr(GenRefundID(order)) refundID := utils.Int64ToStr(GenRefundID(order))
orderPayRefund, err2 := refundOrderByWX(ctx, orderPay, refundID) orderPayRefund, err2 := refundOrderByWX(ctx, orderPay, refundID)
if err = err2; err == nil { if err2 == nil {
dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName()) dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName())
errList.AddErr(dao.CreateEntity(dao.GetDB(), orderPay)) errList.AddErr(dao.CreateEntity(dao.GetDB(), orderPayRefund))
} else {
errList.AddErr(err2)
} }
} else { } else {
orderPay.Status = model.PayStatusCanceled orderPay.Status = model.PayStatusCanceled
@@ -524,7 +526,9 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string)
errList.AddErr(err2) errList.AddErr(err2)
} }
} }
if errList.GetErrListAsOne() == nil {
errList.AddErr(changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, reason)) errList.AddErr(changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, reason))
}
err = errList.GetErrListAsOne() err = errList.GetErrListAsOne()
} }
} else { } else {

View File

@@ -206,6 +206,7 @@ func (c *StoreSkuController) SyncStoresSkus() {
// @Param token header string true "认证token" // @Param token header string true "认证token"
// @Param storeIDs formData string true "门店ID列表" // @Param storeIDs formData string true "门店ID列表"
// @Param payload formData string true "json数据StoreSkuBindInfo对象数组" // @Param payload formData string true "json数据StoreSkuBindInfo对象数组"
// @Param isScale formData bool false "是否按门店结算比例缩放"
// @Param isContinueWhenError formData bool false "单个同步失败是否继续缺省false" // @Param isContinueWhenError formData bool false "单个同步失败是否继续缺省false"
// @Param isAsync formData bool false "是否异步操作" // @Param isAsync formData bool false "是否异步操作"
// @Success 200 {object} controllers.CallResult // @Success 200 {object} controllers.CallResult
@@ -218,7 +219,7 @@ func (c *StoreSkuController) UpdateStoresSkus() {
if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.Payload, &skuBindInfos); err != nil { if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.Payload, &skuBindInfos); err != nil {
return retVal, "", err return retVal, "", err
} }
retVal, err = cms.UpdateStoresSkus(params.Ctx, storeIDs, skuBindInfos, params.IsAsync, params.IsContinueWhenError) retVal, err = cms.UpdateStoresSkus(params.Ctx, storeIDs, skuBindInfos, params.IsScale, params.IsAsync, params.IsContinueWhenError)
return retVal, "", err return retVal, "", err
}) })
} }
@@ -247,17 +248,25 @@ func (c *StoreSkuController) UpdateStoresSkusByBind() {
// @Description 拷贝门店SKU信息此函数当前只是本地数据操作要同步到远端需要调用SyncStoresSkus // @Description 拷贝门店SKU信息此函数当前只是本地数据操作要同步到远端需要调用SyncStoresSkus
// @Param token header string true "认证token" // @Param token header string true "认证token"
// @Param fromStoreID formData int true "源门店ID" // @Param fromStoreID formData int true "源门店ID"
// @Param toStoreID formData int true "目标门店ID" // @Param toStoreID formData int false "目标门店ID"
// @Param toStoreIDs formData string false "目标门店ID列表"
// @Param copyMode formData string true "拷贝模式fresh:目标门店数据全部清除后拷贝update:确保指定的源数据全部拷贝,已有的忽略" // @Param copyMode formData string true "拷贝模式fresh:目标门店数据全部清除后拷贝update:确保指定的源数据全部拷贝,已有的忽略"
// @Param pricePercentage formData int false "价格调整百分比缺省为100%" // @Param pricePercentage formData int false "价格调整百分比缺省为100%"
// @Param categoryIDs formData string false "json数据skuName所属的类别[1,2,3]" // @Param categoryIDs formData string false "json数据skuName所属的类别[1,2,3]"
// @Param skuIDs formData string false "json数据skuID列表[1,2,3]" // @Param skuIDs formData string false "json数据skuID列表[1,2,3]"
// @Param isScale formData bool false "是否按门店结算比例缩放"
// @Success 200 {object} controllers.CallResult // @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult
// @router /CopyStoreSkus [post] // @router /CopyStoreSkus [post]
func (c *StoreSkuController) CopyStoreSkus() { func (c *StoreSkuController) CopyStoreSkus() {
c.callCopyStoreSkus(func(params *tStoreSkuCopyStoreSkusParams) (retVal interface{}, errCode string, err error) { c.callCopyStoreSkus(func(params *tStoreSkuCopyStoreSkusParams) (retVal interface{}, errCode string, err error) {
retVal, err = cms.CopyStoreSkus(params.Ctx, params.FromStoreID, params.ToStoreID, params.CopyMode, params.MapData, params.Ctx.GetUserName()) var toStoreIDs []int
if err = jxutils.Strings2Objs(params.ToStoreIDs, &toStoreIDs); err == nil {
if params.ToStoreID > 0 {
toStoreIDs = append(toStoreIDs, params.ToStoreID)
}
retVal, err = cms.CopyStoreSkus(params.Ctx, params.FromStoreID, toStoreIDs, params.CopyMode, params.IsScale, params.MapData, params.Ctx.GetUserName())
}
return retVal, "", err return retVal, "", err
}) })
} }

View File

@@ -32,7 +32,7 @@ func Init() {
orm.RegisterModel(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}, &model.StoreCourierMap{}) 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.SkuVendorCategory{}, &model.StoreSkuCategoryMap{}, &model.SkuName{}, &model.Sku{}, &model.SkuNamePlaceBind{}, &model.StoreSkuBind{})
orm.RegisterModel(&model.SkuCategory{}) orm.RegisterModel(&model.SkuCategory{})
// orm.RegisterModel(&model.ThingMap{}) orm.RegisterModel(&model.ThingMap{})
orm.RegisterModel(&model.AuthBind{}, &model.User{}) orm.RegisterModel(&model.AuthBind{}, &model.User{})
@@ -61,7 +61,7 @@ func Init() {
orm.RegisterModel(&model.UserDeliveryAddress{}) orm.RegisterModel(&model.UserDeliveryAddress{})
orm.RegisterModel(&model.UserCartItem{}) orm.RegisterModel(&model.UserCartItem{})
orm.RegisterModel(&model.OrderPay{}) orm.RegisterModel(&model.OrderPay{}, &model.OrderPayRefund{})
// create table // create table
orm.RunSyncdb("default", false, true) orm.RunSyncdb("default", false, true)
} }