diff --git a/business/model/act.go b/business/model/act.go index 5094dd643..85d04b23f 100644 --- a/business/model/act.go +++ b/business/model/act.go @@ -168,6 +168,7 @@ type ActStoreSkuMap struct { SyncStatus int8 `orm:"default(2)" json:"syncStatus"` VendorPrice int64 `json:"vendorPrice"` // 创建活动时的平台价格 ActualActPrice int64 `json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格 + EarningPrice int64 `json:"earningPrice"` // 活动商品设置,结算给门店老板的钱 } func (*ActStoreSkuMap) TableUnique() [][]string { @@ -213,3 +214,25 @@ type ActStoreSku2 struct { SpecUnit string `json:"-"` Comment string `json:"-"` } + +type StoreSkuAct struct { + ModelIDCUL + StoreID int `orm:"column(store_id)"` + SkuID int `orm:"column(sku_id);index"` + VendorID int `orm:"column(vendor_id)" json:"vendorID"` + + ActID int `orm:"column(act_id);index" json:"actID"` + VendorActID string `orm:"column(vendor_act_id);size(48);index" json:"vendorActID"` + SyncStatus int8 `orm:"default(2)" json:"syncStatus"` + VendorPrice int64 `json:"vendorPrice"` // 创建活动时的平台价格 + ActualActPrice int64 `json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格 + + EarningActID int `orm:"column(earning_act_id);index" json:"earningActID"` + EarningPrice int64 `json:"earningPrice"` +} + +func (*StoreSkuAct) TableUnique() [][]string { + return [][]string{ + []string{"StoreID", "SkuID", "VendorID"}, + } +} diff --git a/business/model/dao/act.go b/business/model/dao/act.go index 7ae5c09ab..bbd991c91 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -9,6 +9,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/globals/refutil" ) type ActMapPureInfo struct { @@ -438,3 +439,169 @@ func UpdateActStatusByTime(db *DaoDB, refTime time.Time) (num int64, err error) num, err = ExecuteSQL(db, sql, sqlParams...) return num, err } + +func ActStoreSkuMap2StoreSkuAct(actStoreSkuMap *model.ActStoreSkuMap, isCanceled bool) (storeSkuAct *model.StoreSkuAct) { + storeSkuAct = &model.StoreSkuAct{ + StoreID: actStoreSkuMap.StoreID, + SkuID: actStoreSkuMap.SkuID, + VendorID: actStoreSkuMap.VendorID, + } + storeSkuAct.CreatedAt = actStoreSkuMap.CreatedAt + storeSkuAct.UpdatedAt = actStoreSkuMap.UpdatedAt + storeSkuAct.LastOperator = actStoreSkuMap.LastOperator + + if actStoreSkuMap.ActualActPrice > 0 { + if isCanceled || !utils.IsTimeZero(actStoreSkuMap.DeletedAt) { + storeSkuAct.ActID = 0 + } else { + storeSkuAct.ActID = actStoreSkuMap.ActID + storeSkuAct.VendorActID = actStoreSkuMap.VendorActID + storeSkuAct.SyncStatus = actStoreSkuMap.SyncStatus + storeSkuAct.VendorPrice = actStoreSkuMap.VendorPrice + storeSkuAct.ActualActPrice = actStoreSkuMap.ActualActPrice + } + } + if actStoreSkuMap.EarningPrice > 0 { + if isCanceled || !utils.IsTimeZero(actStoreSkuMap.DeletedAt) { + storeSkuAct.EarningActID = 0 + } else { + storeSkuAct.EarningActID = actStoreSkuMap.ActID + storeSkuAct.EarningPrice = actStoreSkuMap.EarningPrice + } + } + return storeSkuAct +} + +func BatchUpdateActEntity(db *DaoDB, isCanceled bool, items []*KVUpdateItem) (num int64, err error) { + if globals.IsStoreSkuAct { + Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + Rollback(db) + if r != nil { + panic(r) + } + } + }() + + for _, v := range items { + if actStoreSku, ok := v.Item.(*model.ActStoreSkuMap); ok { + for k1, v1 := range v.KVs { + refutil.SetObjFieldByName(actStoreSku, k1, v1) + } + if err = CreateOrUpdateActStoreSku(db, ActStoreSkuMap2StoreSkuAct(actStoreSku, isCanceled)); err != nil { + return 0, err + } + } + } + } + + if _, err = BatchUpdateEntityByKV(db, items); err != nil { + return 0, err + } + + if globals.IsStoreSkuAct { + Commit(db) + } + return num, err +} + +func CreateOrUpdateActStoreSku(db *DaoDB, storeSkuAct *model.StoreSkuAct) (err error) { + storeSkuActCopy := *storeSkuAct + if err2 := GetEntity(db, &storeSkuActCopy, model.FieldStoreID, model.FieldSkuID, model.FieldVendorID); err2 == nil { + storeSkuAct.ID = storeSkuActCopy.ID + _, err = UpdateEntity(db, storeSkuAct) + } else if IsNoRowsError(err2) { + err = CreateEntity(db, storeSkuAct) + } else { + err = err2 + } + return err +} + +func GetStoresSkusAct(db *DaoDB, storeIDs, skuIDs, vendorIDs []int) (storeSkuActList []*model.StoreSkuAct, err error) { + sql := ` + SELECT * + FROM store_sku_act t1 + WHERE 1 = 1 + ` + sqlParams := []interface{}{} + if len(storeIDs) > 0 { + sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" + sqlParams = append(sqlParams, storeIDs) + } + if len(skuIDs) > 0 { + sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + if len(vendorIDs) > 0 { + sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" + sqlParams = append(sqlParams, vendorIDs) + } + err = GetRows(db, &storeSkuActList, sql, sqlParams...) + return storeSkuActList, err +} + +func GetStoresSkusAndActInfo(db *DaoDB, storeIDs, skuIDs, vendorIDs []int) (storeSkuAndActList []*StoreSkuAndAct, err error) { + storeSkuList, err := GetStoresSkusInfo(db, storeIDs, skuIDs) + if err == nil && len(storeSkuList) > 0 { + storeSkuActList, err2 := GetStoresSkusAct(db, storeIDs, skuIDs, vendorIDs) + if err = err2; err == nil { + actMap := make(map[int64][]*model.StoreSkuAct) + for _, v := range storeSkuActList { + actMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = append(actMap[jxutils.Combine2Int(v.StoreID, v.SkuID)], v) + } + for _, v := range storeSkuList { + storeSkuAct := &StoreSkuAndAct{ + StoreSkuBind: v, + ActMap: make(map[int]*model.StoreSkuAct), + } + for _, vv := range actMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] { + storeSkuAct.ActMap[vv.VendorID] = vv + } + storeSkuAndActList = append(storeSkuAndActList, storeSkuAct) + } + } + } + return storeSkuAndActList, err +} + +func GetConflictStoreSkuActInfo(db *DaoDB, vendorIDs []int, inStoreSkuActList []*model.StoreSkuAct) (outStoreSkuActList []*model.StoreSkuAct, err error) { + storeIDMap := make(map[int]int) + skuIDMap := make(map[int]int) + inStoreSkuActMap := make(map[int64]*model.StoreSkuAct) + for _, v := range inStoreSkuActList { + storeIDMap[v.StoreID] = 1 + skuIDMap[v.SkuID] = 1 + inStoreSkuActMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v + } + storeIDs := jxutils.IntMap2List(storeIDMap) + skuIDs := jxutils.IntMap2List(skuIDMap) + + sql := ` + SELECT * + FROM store_sku_act t1 + WHERE + t1.store_id IN (` + GenQuestionMarks(len(storeIDs)) + `) + AND t1.sku_id IN (` + GenQuestionMarks(len(skuIDs)) + `) + ` + sqlParams := []interface{}{ + storeIDs, + skuIDs, + } + if len(vendorIDs) > 0 { + sql += ` AND t1.vendor_Id IN (` + GenQuestionMarks(len(storeIDs)) + `)` + sqlParams = append(sqlParams, vendorIDs) + } + + var tmpStoreSkuActList []*model.StoreSkuAct + if err = GetRows(db, &tmpStoreSkuActList, sql, sqlParams...); err == nil { + for _, v := range tmpStoreSkuActList { + tmpStoreSkuAct := inStoreSkuActMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] + if tmpStoreSkuAct != nil && (tmpStoreSkuAct.ActualActPrice > 0 && v.ActID != 0 && v.SyncStatus == 0 || tmpStoreSkuAct.EarningPrice > 0 && v.EarningActID != 0) { + outStoreSkuActList = append(outStoreSkuActList, v) + } + } + } + return outStoreSkuActList, err +} diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 7eff33e86..0528624f1 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -819,55 +819,6 @@ func GetStoresSkusInfo(db *DaoDB, storeIDs, skuIDs []int) (storeSkuList []*model return storeSkuList, err } -func GetStoresSkusAndActInfo(db *DaoDB, storeIDs, skuIDs, vendorIDs []int) (storeSkuAndActList []*StoreSkuAndAct, err error) { - storeSkuList, err := GetStoresSkusInfo(db, storeIDs, skuIDs) - if err == nil && len(storeSkuList) > 0 { - storeSkuActList, err2 := GetStoresSkusAct(db, storeIDs, skuIDs, vendorIDs) - if err = err2; err == nil { - actMap := make(map[int64][]*model.StoreSkuAct) - for _, v := range storeSkuActList { - actMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = append(actMap[jxutils.Combine2Int(v.StoreID, v.SkuID)], v) - } - for _, v := range storeSkuList { - storeSkuAct := &StoreSkuAndAct{ - StoreSkuBind: v, - ActMap: make(map[int]*model.StoreSkuAct), - } - for _, vv := range actMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] { - storeSkuAct.ActMap[vv.VendorID] = vv - } - storeSkuAndActList = append(storeSkuAndActList, storeSkuAct) - } - } - } - return storeSkuAndActList, err -} - -func GetStoresSkusAct(db *DaoDB, storeIDs, skuIDs, vendorIDs []int) (storeSkuActList []*model.StoreSkuAct, err error) { - sql := ` - SELECT * - FROM store_sku_act t1 - WHERE t1.deleted_at = ? - ` - sqlParams := []interface{}{ - utils.DefaultTimeValue, - } - if len(storeIDs) > 0 { - sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" - sqlParams = append(sqlParams, storeIDs) - } - if len(skuIDs) > 0 { - sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" - sqlParams = append(sqlParams, skuIDs) - } - if len(vendorIDs) > 0 { - sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" - sqlParams = append(sqlParams, vendorIDs) - } - err = GetRows(db, &storeSkuActList, sql, sqlParams...) - return storeSkuActList, err -} - // vendorID, vendorStoreIDs和vendorSkuIDs都是必须参数 func GetStoresSkusInfoByVendorInfo(db *DaoDB, vendorID int, vendorStoreIDs, vendorSkuIDs []string) (storeSkuList []*StoreSkuBindWithVendorInfo, err error) { if len(vendorStoreIDs) == 0 || len(vendorSkuIDs) == 0 { diff --git a/business/model/store_sku.go b/business/model/store_sku.go index 91fc4fa5a..49aebbbc6 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -161,32 +161,3 @@ func (*StoreOpRequest) TableIndex() [][]string { []string{"StoreID", "Status", "Type"}, } } - -type StoreSkuAct struct { - ModelIDCULD // DeletedAt用于表示请求操作结束,而并不一定是删除 - - StoreID int `orm:"column(store_id)"` - SkuID int `orm:"column(sku_id)"` - VendorID int - - ActID int `orm:"column(act_id);index" json:"actID"` - VendorActID string `orm:"column(vendor_act_id);size(48);index" json:"vendorActID"` - SyncStatus int8 `orm:"default(2)" json:"syncStatus"` - VendorPrice int64 `json:"vendorPrice"` // 创建活动时的平台价格 - ActualActPrice int64 `json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格 - - EarningActID int `orm:"column(earning_act_id);index" json:"earningActID"` - EarningPrice int `json:"earningPrice"` -} - -func (*StoreSkuAct) TableUnique() [][]string { - return [][]string{ - []string{"StoreID", "SkuID", "VendorID", "DeletedAt"}, - } -} - -func (*StoreSkuAct) TableIndex() [][]string { - return [][]string{ - []string{"SkuID", "DeletedAt"}, - } -} diff --git a/business/partner/partner_act.go b/business/partner/partner_act.go index d5ad87018..e4db7ec86 100644 --- a/business/partner/partner_act.go +++ b/business/partner/partner_act.go @@ -61,7 +61,21 @@ func Act2ActMap(act *model.Act2) (actMap *model.ActMap) { } func ActStoreSku2ActStoreSkuMap(actStoreSku *model.ActStoreSku2) (actStoreSkuMap *model.ActStoreSkuMap) { - actStoreSkuMap = &model.ActStoreSkuMap{} + actStoreSkuMap = &model.ActStoreSkuMap{ + ModelIDCULD: actStoreSku.ModelIDCULD, + BindID: actStoreSku.MapID, + + ActID: actStoreSku.ActID, + StoreID: actStoreSku.StoreID, + SkuID: actStoreSku.SkuID, + VendorID: actStoreSku.VendorID, + VendorActID: actStoreSku.VendorActID, + SyncStatus: actStoreSku.SyncStatus, + VendorPrice: actStoreSku.VendorPrice, + ActualActPrice: actStoreSku.ActualActPrice, + + EarningPrice: actStoreSku.EarningPrice, + } actStoreSkuMap.ID = actStoreSku.MapID return actStoreSkuMap } @@ -86,13 +100,17 @@ func Act2Update(ctx *jxcontext.Context, act *model.Act2, syncStatus int) (item * func ActStoreSku2Update(ctx *jxcontext.Context, actStoreSkuList []*model.ActStoreSku2, syncStatus int) (items []*dao.KVUpdateItem) { for _, v := range actStoreSkuList { + v.SyncStatus = 0 + v.UpdatedAt = time.Now() + v.LastOperator = ctx.GetUserName() kvs := map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldUpdatedAt: time.Now(), - model.FieldLastOperator: ctx.GetUserName(), + model.FieldSyncStatus: v.SyncStatus, + model.FieldUpdatedAt: v.UpdatedAt, + model.FieldLastOperator: v.LastOperator, } if syncStatus == model.SyncFlagDeletedMask { - kvs[model.FieldDeletedAt] = time.Now() + v.DeletedAt = time.Now() + kvs[model.FieldDeletedAt] = v.DeletedAt } else if syncStatus == model.SyncFlagNewMask { kvs[model.FieldVendorActID] = v.VendorActID } diff --git a/business/partner/purchase/ebai/act.go b/business/partner/purchase/ebai/act.go index 3cd563bf1..316051e95 100644 --- a/business/partner/purchase/ebai/act.go +++ b/business/partner/purchase/ebai/act.go @@ -332,7 +332,7 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa return err }() db := dao.GetDB() - _, err2 := dao.BatchUpdateEntityByKV(db, updateItems) + _, err2 := dao.BatchUpdateActEntity(db, model.IsSyncStatusDelete(act.SyncStatus), updateItems) if err == nil { err = err2 } diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index ccda21745..03b82487e 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -341,7 +341,7 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa return err }() // globals.SugarLogger.Debug(utils.Format4Output(updateItems, false)) - _, err2 := dao.BatchUpdateEntityByKV(db, updateItems) + _, err2 := dao.BatchUpdateActEntity(db, model.IsSyncStatusDelete(act.SyncStatus), updateItems) if err == nil { err = err2 } diff --git a/business/partner/purchase/mtwm/act.go b/business/partner/purchase/mtwm/act.go index 4571a5b4b..e1547cd5c 100644 --- a/business/partner/purchase/mtwm/act.go +++ b/business/partner/purchase/mtwm/act.go @@ -207,7 +207,7 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa return err }() db := dao.GetDB() - _, err2 := dao.BatchUpdateEntityByKV(db, updateItems) + _, err2 := dao.BatchUpdateActEntity(db, model.IsSyncStatusDelete(act.SyncStatus), updateItems) if err == nil { err = err2 } diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 7cf4d35ef..4ba03b9c0 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -56,7 +56,9 @@ func Init() { orm.RegisterModel(&model.OrderFinancial{}, &model.AfsOrder{}, &model.OrderDiscountFinancial{}, &model.OrderSkuFinancial{}) orm.RegisterModel(&model.Act{}, &model.ActOrderRule{}, &model.ActStoreSku{}) orm.RegisterModel(&model.ActMap{}, &model.ActStoreSkuMap{}) - // orm.RegisterModel(&model.StoreSkuAct{}) + if globals.IsStoreSkuAct { + orm.RegisterModel(&model.StoreSkuAct{}) + } orm.RegisterModel(&model.NewConfig{}) diff --git a/globals/globals.go b/globals/globals.go index 90fbc0fed..39f1b31f7 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -8,12 +8,6 @@ import ( "go.uber.org/zap" ) -const ( - ErrStrAccessDB = "Error when access DB" - DebugStoreID = 100119 - DebugJdStoreID = "11738122" -) - var ( ReallyCallPlatformAPI bool ReallySendWeixinMsg bool @@ -54,6 +48,7 @@ var ( Jd2OrgCode string IsUseThingMap bool + IsStoreSkuAct bool OutputDebugMsgLevel int ) @@ -111,6 +106,7 @@ func Init() { Jd2OrgCode = beego.AppConfig.DefaultString("jd2OrgCode", "") IsUseThingMap = beego.AppConfig.DefaultBool("useThingMap", false) + IsStoreSkuAct = false } func IsCallbackAlwaysReturnSuccess() bool {