From ac0e99b38d95c6e4053170ee4426ab98958efcc1 Mon Sep 17 00:00:00 2001 From: gazebo Date: Mon, 20 Jan 2020 16:22:31 +0800 Subject: [PATCH] =?UTF-8?q?+SyncSpecialAct=20Act=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=AD=97=E6=AE=B5IsSpecail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/act/act.go | 106 +++++++++++++++++++++++-- business/jxstore/cms/sync_store_sku.go | 4 +- business/model/act.go | 2 + business/model/dao/act.go | 8 +- business/model/dao/store_sku.go | 25 +++++- 5 files changed, 133 insertions(+), 12 deletions(-) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index ae20ce1f8..620b64220 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -870,13 +870,17 @@ func SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, actID int, vendor if handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformActHandler); handler != nil { tmpActMap := &model.ActMap{} tmpActMap.ID = actMap[vendorID].MapID - if err = handler.SyncAct(ctx, nil, actMap[vendorID], nil, actStoreSkuMap[vendorID]); err == nil { - retVal = []int{1} + if !globals.IsStoreSkuAct || actMap[vendorID].IsSpecial == 0 { + if err = handler.SyncAct(ctx, task, actMap[vendorID], nil, actStoreSkuMap[vendorID]); err == nil { + retVal = []int{1} + } else { + tmpActMap.Remark = utils.LimitUTF8StringLen(err.Error(), 1024) + } + // 保存最后一次同步错误信息 + dao.UpdateEntity(db, tmpActMap, "Remark") } else { - tmpActMap.Remark = utils.LimitUTF8StringLen(err.Error(), 1024) + SyncSpecialAct(ctx, task, actMap[vendorID], nil, actStoreSkuMap[vendorID]) } - // 保存最后一次同步错误信息 - dao.UpdateEntity(db, tmpActMap, "Remark") } else { globals.SugarLogger.Warnf("SyncAct strange actID:%d, vendorID:%d", actID, vendorID) } @@ -1150,3 +1154,95 @@ func ForceUpdateVendorPrice(ctx *jxcontext.Context, vendorID int, actType int, s } return hint, err } + +func SyncActStoreSku2StoreSkuAct(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, act *model.Act2) (err error) { + dao.Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + + sql := ` + UPDATE store_sku_act t1 + JOIN act_store_sku_map t2 ON t2.store_id = t1.store_id AND t2.sku_id = t1.sku_id AND t2.vendor_id = t1.vendor_id AND t2.act_id = ? AND t2.sync_status <> 0 + JOIN act_store_sku t3 ON t3.store_id = t1.store_id AND t3.sku_id = t1.sku_id AND t3.act_id = t2.act_id + SET + t1.act_percentage = IF(t2.sync_status & ? = 0 AND t3.deleted_at = ?, t3.price_percentage, 0), + t1.sync_status = ?, + t1.updated_at = NOW(), + t1.last_operator = ?, + t1.hint_act_id = t2.act_id + WHERE t1.vendor_id = ? + ` + sqlParams := []interface{}{ + act.ID, + model.SyncFlagDeletedMask, utils.DefaultTimeValue, + model.SyncFlagModifiedMask, + ctx.GetUserName(), + act.VendorID, + } + _, err = dao.ExecuteSQL(dao.GetDB(), sql, sqlParams...) + if err != nil { + return err + } + + sql = ` + INSERT INTO store_sku_act(id, created_at, updated_at, last_operator, store_id, sku_id, vendor_id, act_percentage, sync_status, hint_act_id) + SELECT 0, NOW(), NOW(), ?, t2.store_id, t2.sku_id, t2.vendor_id, t3.price_percentage, ?, t2.act_id + FROM act_store_sku_map t2 + JOIN act_store_sku t3 ON t3.store_id = t2.store_id AND t3.sku_id = t2.sku_id AND t3.act_id = t2.act_id + LEFT JOIN store_sku_act t1 ON t2.store_id = t1.store_id AND t2.sku_id = t1.sku_id AND t2.vendor_id = t1.vendor_id + WHERE t2.vendor_id = ? AND t2.act_id = ? AND t2.sync_status <> 0 AND t1.id IS NULL + ` + sqlParams = []interface{}{ + ctx.GetUserName(), model.SyncFlagModifiedMask, + act.VendorID, act.ID, + } + _, err = dao.ExecuteSQL(dao.GetDB(), sql, sqlParams...) + if err != nil { + return err + } + + sql = ` + UPDATE act_store_sku_map t2 + SET + t2.deleted_at = IF(t2.sync_status & ? = 0, t2.deleted_at, NOW()), + t2.sync_status = 0 + WHERE t2.vendor_id = ? AND t2.act_id = ? + ` + sqlParams = []interface{}{ + model.SyncFlagDeletedMask, + act.VendorID, act.ID, + } + _, err = dao.ExecuteSQL(dao.GetDB(), sql, sqlParams...) + if err != nil { + return err + } + + sql = ` + UPDATE act_map t4 + SET + t4.sync_status = 0 + WHERE t4.vendor_id = ? AND t4.act_id = ? + ` + sqlParams = []interface{}{ + act.VendorID, act.ID, + } + _, err = dao.ExecuteSQL(dao.GetDB(), sql, sqlParams...) + if err != nil { + return err + } + + dao.Commit(db) + return err +} + +func SyncSpecialAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + db := dao.GetDB() + err = SyncActStoreSku2StoreSkuAct(ctx, db, parentTask, act) + return err +} diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index ffd32161d..539dd03e6 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -1010,7 +1010,7 @@ func createStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor globals.SugarLogger.Debugf("createStoreSkuActs vendorID:%d, storeID:%d, storeSkuList:%s", vendorID, storeID, utils.Format4Output(storeSkuList, true)) skuIDs := putils.StoreSkuList2IDs(storeSkuList) db := dao.GetDB() - storeSkuActList, err := dao.GetStoresSkusAct(db, []int{storeID}, skuIDs, []int{vendorID}, 1, 0) + storeSkuActList, err := dao.GetStoresSkusAct(db, 0, []int{storeID}, skuIDs, []int{vendorID}, 1, 0) if err == nil { storeSkuList2, storeSkuActMap := parseStoreSkuActList(true, storeSkuList, storeSkuActList) if len(storeSkuList2) > 0 { @@ -1039,7 +1039,7 @@ func cancelStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor globals.SugarLogger.Debugf("cancelStoreSkuActs vendorID:%d, storeID:%d, storeSkuList:%s", vendorID, storeID, utils.Format4Output(storeSkuList, true)) skuIDs := putils.StoreSkuList2IDs(storeSkuList) db := dao.GetDB() - storeSkuActList, err := dao.GetStoresSkusAct(db, []int{storeID}, skuIDs, []int{vendorID}, 0, 0) + storeSkuActList, err := dao.GetStoresSkusAct(db, 0, []int{storeID}, skuIDs, []int{vendorID}, 0, 0) if err == nil { storeSkuList2, storeSkuActMap := parseStoreSkuActList(false, storeSkuList, storeSkuActList) if len(storeSkuList2) > 0 { diff --git a/business/model/act.go b/business/model/act.go index bb705d118..471c26eaf 100644 --- a/business/model/act.go +++ b/business/model/act.go @@ -66,6 +66,7 @@ type Act struct { LimitCount int `json:"limitCount"` // 每单限购数量 Source string `orm:"size(255)" json:"source"` CreateType int `json:"createType"` + IsSpecial int8 `json:"isSpecial"` // 是否是特殊绑定活动 OverlapRule int `json:"overlapRule"` PricePercentage int `json:"pricePercentage"` // 单品级活动才有效 BeginAt time.Time `orm:"type(datetime);index" json:"beginAt"` @@ -225,6 +226,7 @@ type StoreSkuAct struct { SyncStatus int8 `orm:"default(2)" json:"syncStatus"` // ActID int `orm:"column(act_id);index" json:"actID"` VendorActID string `orm:"column(vendor_act_id);size(48);index" json:"vendorActID"` + HintActID int `orm:"column(hint_act_id);size(48);index" json:"hintActID"` VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价 Remark string `orm:"column(remark);size(1024)" json:"remark"` diff --git a/business/model/dao/act.go b/business/model/dao/act.go index 4b13fa205..1b4a29877 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -511,13 +511,17 @@ func CreateOrUpdateActStoreSku(db *DaoDB, storeSkuAct *model.StoreSkuAct) (err e return err } -func GetStoresSkusAct(db *DaoDB, storeIDs, skuIDs, vendorIDs []int, minActPercentage, maxActPercentage int) (storeSkuActList []*model.StoreSkuAct, err error) { +func GetStoresSkusAct(db *DaoDB, hintActID int, storeIDs, skuIDs, vendorIDs []int, minActPercentage, maxActPercentage int) (storeSkuActList []*model.StoreSkuAct, err error) { sql := ` SELECT * FROM store_sku_act t1 WHERE 1 = 1 ` sqlParams := []interface{}{} + if hintActID > 0 { + sql += " AND t1.hint_act_id = ?" + sqlParams = append(sqlParams, hintActID) + } if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) @@ -545,7 +549,7 @@ func GetStoresSkusAct(db *DaoDB, storeIDs, skuIDs, vendorIDs []int, minActPercen func GetStoresSkusAndActInfo(db *DaoDB, storeIDs, skuIDs, vendorIDs []int, minActPercentage, maxActPercentage int) (storeSkuAndActList []*StoreSkuAndAct, err error) { storeSkuList, err := GetStoresSkusInfo(db, storeIDs, skuIDs) if err == nil && len(storeSkuList) > 0 { - storeSkuActList, err2 := GetStoresSkusAct(db, storeIDs, skuIDs, vendorIDs, minActPercentage, maxActPercentage) + storeSkuActList, err2 := GetStoresSkusAct(db, 0, storeIDs, skuIDs, vendorIDs, minActPercentage, maxActPercentage) if err = err2; err == nil { actMap := make(map[int64][]*model.StoreSkuAct) for _, v := range storeSkuActList { diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 69d058486..acda916ca 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -100,6 +100,11 @@ type StoreSkuSyncInfo struct { SkuName string StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围 StatusSaleEnd int16 `json:"statusSaleEnd"` + + VendorActID string `orm:"column(vendor_act_id);size(48)" json:"vendorActID"` + ActPercentage int `json:"actPercentage"` // 直降活动百分比 + ActSyncStatus int8 `orm:"default(2)" json:"actSyncStatus"` + VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价 } type MissingStoreSkuInfo struct { @@ -165,6 +170,7 @@ type StoreSkuVendorInfo struct { // 新活动信息 VendorActID string `orm:"column(vendor_act_id);size(48)" json:"vendorActID"` + HintActID int `orm:"column(hint_act_id);size(48);index" json:"hintActID"` ActPercentage int `json:"actPercentage"` // 直降活动百分比 ActSyncStatus int8 `orm:"default(2)" json:"actSyncStatus"` VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价 @@ -397,6 +403,10 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo t4m.vendor_thing_id vendor_cat_id, t5skum.vendor_thing_id sku_vendor_cat_id` } + if globals.IsStoreSkuAct { + sql += `, + act.vendor_act_id, act.act_percentage, act.sync_status act_sync_status, act.vendor_act_price` + } sql += ` FROM store_sku_bind t1 JOIN store_map t14 ON t14.store_id = t1.store_id AND t14.vendor_id = ? AND t14.deleted_at = ? @@ -413,6 +423,11 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo utils.DefaultTimeValue, // model.SkuStatusNormal, utils.DefaultTimeValue, } + if globals.IsStoreSkuAct { + sql += ` + LEFT JOIN store_sku_act act ON act.store_id = t1.store_id AND act.sku_id = t1.sku_id AND act.vendor_id = ?` + sqlParams = append(sqlParams, vendorID) + } if isSingleStorePF { sql += ` LEFT JOIN store_sku_category_map t5 ON t4.id = t5.category_id AND t5.store_id = t1.store_id AND t5.deleted_at = ? @@ -436,13 +451,17 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo sqlParams = append(sqlParams, storeID) } if mustDirty { - sql += " AND (t1.%s_sync_status <> 0 OR (%s <> %s AND t3.id IS NULL))" + sql += " AND (t1.%s_sync_status <> 0 OR (%s <> %s AND t3.id IS NULL)" fmtParams = append(fmtParams, fieldPrefix, skuVendorIDField) if isSingleStorePF { fmtParams = append(fmtParams, "0") } else { fmtParams = append(fmtParams, "''") } + // if globals.IsStoreSkuAct { + // sql += " OR act.sync_status <> 0" + // } + sql += ")" } else { sql += " AND t1.deleted_at = ?" sqlParams = append(sqlParams, utils.DefaultTimeValue) @@ -1240,7 +1259,7 @@ func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesI return err } storeMapMap = StoreMapList2Map(storeMapList) - storeSkuActList, err2 := GetStoresSkusAct(db, storeIDs, skuIDs, nil, 0, 0) + storeSkuActList, err2 := GetStoresSkusAct(db, 0, storeIDs, skuIDs, nil, 0, 0) if err = err2; err != nil { return err } @@ -1296,12 +1315,12 @@ func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesI vendorInfo.ActPercentage = storeSkuAct.ActPercentage vendorInfo.ActSyncStatus = storeSkuAct.SyncStatus vendorInfo.VendorActPrice = storeSkuAct.VendorActPrice + vendorInfo.HintActID = storeSkuAct.HintActID } if actStoreSku := actStoreSkuMap4Act.GetActStoreSku(skuName.StoreID, v.SkuID, vendorID); actStoreSku != nil { vendorInfo.ActPrice = int(actStoreSku.ActualActPrice) vendorInfo.ActID = actStoreSku.ActID - vendorInfo.VendorActID = actStoreSku.VendorActID vendorInfo.ActType = actStoreSku.Type vendorInfo.EarningPrice = int(jxutils.CaculateSkuEarningPrice(int64(v.BindPrice), int64(v.ActPrice), skuName.PayPercentage)) }