diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 7a1316965..21c2445bf 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -630,7 +630,7 @@ func (c *OrderManager) RefreshHistoryOrdersEarningPrice(ctx *jxcontext.Context, if fromDate != "" && toDate != "" { fromDateParam = utils.Str2Time(fromDate) toDateParam = utils.Str2Time(toDate) - actList, _ := dao.QueryActs(db, actID, 0, math.MaxInt32, 0, "", -1, nil, nil, nil, 0, 0, 0, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue) + actList, _ := dao.QueryActs(db, actID, 0, math.MaxInt32, 0, "", -1, nil, nil, nil, 0, nil, 0, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue) if len(actList.Data) > 0 { actBeginAt := actList.Data[0].BeginAt actEndAt := actList.Data[0].EndAt @@ -660,7 +660,7 @@ func (c *OrderManager) RefreshHistoryOrdersEarningPrice(ctx *jxcontext.Context, return "", model.ErrCodeGeneralFailed, errors.New(fmt.Sprintf("未查询到相关结算活动,活动ID:[%d]", actID)) } } else if fromDate == "" && toDate == "" { - actList, _ := dao.QueryActs(db, actID, 0, math.MaxInt32, 0, "", -1, nil, nil, nil, 0, 0, 0, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue) + actList, _ := dao.QueryActs(db, actID, 0, math.MaxInt32, 0, "", -1, nil, nil, nil, 0, nil, 0, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue) if len(actList.Data) > 0 { orderList, _ = dao.QueryOrders(db, vendorOrderID, actID, vendorIDs, storeID, actList.Data[0].BeginAt, actList.Data[0].EndAt) } else { diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 70a24c64c..49e3cf5b7 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -151,6 +151,8 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Ac storeIDMap := make(map[int]int) skuIDMap := make(map[int]int) storeSkuParamMap := make(map[int][]*ActStoreSkuParam) + + actStoreSkuMap := make(map[int64]bool) var wrongSkuList []*ActStoreSkuParam for _, v := range actStoreSku { if act.Type == model.ActSkuFake && v.EarningPrice == 0 { @@ -159,6 +161,8 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Ac storeIDMap[v.StoreID] = 1 skuIDMap[v.SkuID] = 1 storeSkuParamMap[v.StoreID] = append(storeSkuParamMap[v.StoreID], v) + + actStoreSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = true } } if len(wrongSkuList) > 0 { @@ -167,14 +171,22 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Ac storeIDs := jxutils.IntMap2List(storeIDMap) skuIDs := jxutils.IntMap2List(skuIDMap) // 判断活动是否重叠的检查,当前忽略京东平台及所有结算信息 - if act.OverlapRule == model.OverlapRuleNormal { + if act.OverlapRule == model.OverlapRuleNormal && act.Type != model.ActSkuFake { effectActStoreSkuList, err := dao.GetEffectiveActStoreSkuInfo(db, 0, vendorIDs, act.Type, storeIDs, skuIDs, act.BeginAt, act.EndAt) if err != nil { globals.SugarLogger.Errorf("GetEffectiveActStoreSkuInfo can not get sku promotion info for error:%v", err) return nil, nil, nil, err } if len(effectActStoreSkuList) > 0 { - return nil, nil, nil, jsonerr.New(effectActStoreSkuList, model.ErrCodeJsonActSkuConflict) + var realEffectActStoreSkuList []*model.ActStoreSku2 + for _, v := range effectActStoreSkuList { + if actStoreSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] { + realEffectActStoreSkuList = append(realEffectActStoreSkuList, v) + } + } + if len(realEffectActStoreSkuList) > 0 { + return nil, nil, nil, jsonerr.New(realEffectActStoreSkuList, model.ErrCodeJsonActSkuConflict) + } } } @@ -685,7 +697,11 @@ func (a *ActManager) IsVendorActExist(ctx *jxcontext.Context, vendorActID string } func QueryActs(ctx *jxcontext.Context, actID int, offset, pageSize int, syncStatus int, keyword string, vendorID int, statusList, actTypeList, createTypeList []int, storeID, skuID, cityCode int, beginAt, endAt, createdAtFrom, createdAtTo time.Time) (pagedInfo *dao.PagedActListInfo, err error) { - return dao.QueryActs(dao.GetDB(), actID, offset, pageSize, syncStatus, keyword, vendorID, statusList, actTypeList, createTypeList, storeID, skuID, cityCode, beginAt, endAt, createdAtFrom, createdAtTo) + var skuIDs []int + if skuID > 0 { + skuIDs = []int{skuID} + } + return dao.QueryActs(dao.GetDB(), actID, offset, pageSize, syncStatus, keyword, vendorID, statusList, actTypeList, createTypeList, storeID, skuIDs, cityCode, beginAt, endAt, createdAtFrom, createdAtTo) } func GetActStoreSkuInfo(ctx *jxcontext.Context, actID int, vendorIDs []int, keyword string, offset, pageSize int) (retVal interface{}, err error) { @@ -889,7 +905,7 @@ func RefreshPageActs(ctx *jxcontext.Context, vendorIDs []int, createdFrom time.T return nil, err } // actInfo, err2 := dao.QueryActs(db, 0, 0, -1, -1, "", vendorID, nil, []int{model.ActCreateTypeSpider}, - // nil, 0, 0, 0, utils.DefaultTimeValue, utils.DefaultTimeValue, createdFrom, utils.DefaultTimeValue) + // nil, 0, nil, 0, utils.DefaultTimeValue, utils.DefaultTimeValue, createdFrom, utils.DefaultTimeValue) vendorActIDs, err2 := dao.GetExistVendorActIDs(db, vendorID) if err = err2; err != nil { return nil, err @@ -975,16 +991,15 @@ func RefreshPageActs(ctx *jxcontext.Context, vendorIDs []int, createdFrom time.T func DeleteSkusFromAct(ctx *jxcontext.Context, vendorID int, actTypes, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { db := dao.GetDB() actMap := make(map[int]*model.Act) - for _, skuID := range skuIDs { - pagedInfo, err2 := dao.QueryActs(db, 0, 0, -1, -1, "", vendorID, []int{model.ActStatusCreated}, actTypes, nil, 0, skuID, 0, - utils.DefaultTimeValue, utils.DefaultTimeValue, time.Now().Add(-24*30*3*time.Hour), utils.DefaultTimeValue) - if err = err2; err != nil { - return "", err - } - for _, v := range pagedInfo.Data { - actMap[v.Act.ID] = &v.Act - } + pagedInfo, err2 := dao.QueryActs(db, 0, 0, -1, -1, "", vendorID, []int{model.ActStatusCreated}, actTypes, nil, 0, skuIDs, 0, + utils.DefaultTimeValue, utils.DefaultTimeValue, time.Now().Add(-24*30*3*time.Hour), utils.DefaultTimeValue) + if err = err2; err != nil { + return "", err } + for _, v := range pagedInfo.Data { + actMap[v.Act.ID] = &v.Act + } + if len(actMap) == 0 { return "", nil } diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 307832df8..11f6656f5 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -1090,21 +1090,23 @@ func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err } } }() - for vendorID := range partner.PurchasePlatformHandlers { - storeSkuList, err := dao.GetStoreSkus2(db, vendorID, 0, []int{skuID}, false) - if err == nil { - for _, v := range storeSkuList { - v.Price = int64(jxutils.CaculateSkuPrice(int(v.UnitPrice), v.SpecQuality, v.SpecUnit, v.Unit)) - storeSku := &model.StoreSkuBind{} - storeSku.ID = v.BindID - if _, err = dao.UpdateEntityLogically(db, storeSku, map[string]interface{}{ - "Price": v.Price, - dao.GetSyncStatusStructField(model.VendorNames[vendorID]): v.SkuSyncStatus | model.SyncFlagPriceMask, - }, ctx.GetUserName(), nil); err != nil { - return err - } - } + 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) return err diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index fdd9b2ac3..de976ca29 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -13,6 +13,8 @@ import ( "time" "unicode" + "git.rosy.net.cn/jx-callback/business/jxstore/event" + "git.rosy.net.cn/baseapi" "git.rosy.net.cn/jx-callback/business/jxutils/excel" @@ -828,6 +830,10 @@ func UpdateStoresSkusByBind(ctx *jxcontext.Context, skuBindInfos []*StoreSkuBind } }() for _, storeID := range storeIDs { + fmt.Println(storeID) + for _, v := range skuBindInfosMap[storeID] { + fmt.Println(*v) + } skuIDs, err2 := updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosMap[storeID], false) if err = err2; err != nil { dao.Rollback(db) @@ -1035,6 +1041,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs if tmpStatus := getSkuSaleStatus(inSkuBind, skuBindInfo); tmpStatus != model.StoreSkuBindStatusNA { skuBind.Status = tmpStatus } + // err = AddEventDetail(model.OperateAdd, v.RealSkuID, model.ThingTypeSku, storeID, ctx.GetTrackInfo(), "", "") setStoreSkuBindStatus(skuBind, model.SyncFlagNewMask) dao.WrapAddIDCULDEntity(skuBind, userName) // globals.SugarLogger.Debug(utils.Format4Output(skuBind, false)) @@ -1059,8 +1066,8 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs } } else { skuBind = &v.StoreSkuBind - if skuBindInfo.IsFocus == -1 && isCanChangePrice { + // err = AddEventDetail(model.OperateDelete, skuBind.SkuID, model.ThingTypeSku, storeID, ctx.GetTrackInfo(), "", "") if num, err = dao.DeleteEntityLogically(db, skuBind, map[string]interface{}{ model.FieldStatus: model.StoreSkuBindStatusDeleted, model.FieldJdSyncStatus: model.SyncFlagDeletedMask, @@ -1072,7 +1079,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs } } else { // 用了SELECT FOR UPDATE后,只更新修改字段是没有必要的,暂时保留 - updateFieldMap := make(map[string]int) + updateFieldMap := make(map[string]interface{}) if skuBindInfo.IsFocus == 1 { // 关注之后再关注不操作 // skuBind.Status = model.StoreSkuBindStatusDontSale // 缺省不可售? // skuBind.DeletedAt = utils.DefaultTimeValue @@ -1089,33 +1096,36 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs setStoreSkuBindStatus(skuBind, model.SyncFlagSaleMask) updateFieldMap[model.FieldStatus] = 1 } - if skuBindInfo.UnitPrice != 0 && skuBind.UnitPrice != unitPrice && isCanChangePrice { // 这里是否需要加此条件限制 - skuBind.UnitPrice = unitPrice - skuBind.Price = jxutils.CaculateSkuPrice(unitPrice, v.SpecQuality, v.SpecUnit, v.SkuNameUnit) - skuBind.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), skuBind.Price) - setStoreSkuBindStatus(skuBind, model.SyncFlagPriceMask) - updateFieldMap["UnitPrice"] = 1 - updateFieldMap["Price"] = 1 - updateFieldMap["JxPrice"] = 1 + if skuBindInfo.UnitPrice != 0 && isCanChangePrice { // 这里是否需要加此条件限制 + price := jxutils.CaculateSkuPrice(unitPrice, v.SpecQuality, v.SpecUnit, v.SkuNameUnit) + jxPrice := jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), price) + if unitPrice != skuBind.UnitPrice || price != skuBind.Price || jxPrice != skuBind.JxPrice { + if price != skuBind.Price { + setStoreSkuBindStatus(skuBind, model.SyncFlagPriceMask) + updateFieldMap["Price"] = 1 + } + skuBind.UnitPrice = unitPrice + skuBind.Price = price + skuBind.JxPrice = jxPrice + updateFieldMap["UnitPrice"] = 1 + updateFieldMap["JxPrice"] = 1 + } } if skuBindInfo.StatusSaleBegin != 0 && skuBindInfo.StatusSaleEnd != 0 { if err := ValidateStruct(skuBindInfo); err != nil { - dao.Rollback(db) - return nil, fmt.Errorf("更改商品:%s, 可售时间不合法!时间范围:[%v] 至 [%v]", allBinds[0].Name, skuBindInfo.StatusSaleBegin, skuBindInfo.StatusSaleEnd) + globals.SugarLogger.Infof("更改商品:%s, 可售时间不合法!时间范围:[%v] 至 [%v]", allBinds[0].Name, skuBindInfo.StatusSaleBegin, skuBindInfo.StatusSaleEnd) + } else { + updateFieldMap["StatusSaleBegin"] = int(skuBindInfo.StatusSaleBegin) + updateFieldMap["StatusSaleEnd"] = int(skuBindInfo.StatusSaleEnd) + skuBind.StatusSaleBegin = skuBindInfo.StatusSaleBegin + skuBind.StatusSaleEnd = skuBindInfo.StatusSaleEnd } - updateFieldMap["StatusSaleBegin"] = int(skuBindInfo.StatusSaleBegin) - updateFieldMap["StatusSaleEnd"] = int(skuBindInfo.StatusSaleEnd) - skuBind.StatusSaleBegin = skuBindInfo.StatusSaleBegin - skuBind.StatusSaleEnd = skuBindInfo.StatusSaleEnd } - // todo 这里应该是不需处理这个信息的吧? - // if inSkuBind != nil && inSkuBind.EbaiID != 0 { - // skuBind.EbaiID = inSkuBind.EbaiID - // updateFieldMap["EbaiID"] = 1 - // } - // if inSkuBind != nil && inSkuBind.ElmID != 0 { - // skuBind.ElmID = inSkuBind.ElmID - // updateFieldMap["ElmID"] = 1 + // if updateFieldMap != nil { + // afterData := utils.MustMarshal(updateFieldMap) + // mapresult := refutil.FindMapAndStructMixed(updateFieldMap, skuBind) + // beforeData := utils.MustMarshal(mapresult) + // AddEventDetail(model.OperateUpdate, v.RealSkuID, model.ThingTypeSku, storeID, ctx.GetTrackInfo(), string(beforeData), string(afterData)) // } if len(updateFieldMap) > 0 { updateFieldMap[model.FieldJdSyncStatus] = 1 @@ -1124,9 +1134,11 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs updateFieldMap[model.FieldUpdatedAt] = 1 updateFieldMap[model.FieldLastOperator] = 1 - // setStoreSkuBindStatus(skuBind, model.SyncFlagModifiedMask) dao.WrapUpdateULEntity(skuBind, userName) - skuBind.AutoSaleAt = utils.DefaultTimeValue + if skuBind.Status == model.SkuStatusNormal { + updateFieldMap["AutoSaleAt"] = 1 + skuBind.AutoSaleAt = utils.DefaultTimeValue + } if num, err = dao.UpdateEntity(db, skuBind /*, utils.Map2KeySlice(updateFieldMap)...*/); err != nil { dao.Rollback(db) return nil, err @@ -1166,6 +1178,20 @@ func getSkuSaleStatus(inSkuBind *StoreSkuBindSkuInfo, skuNameBindInfo *StoreSkuB return model.StoreSkuBindStatusNA } +func AddEventDetail(operateType, thingID, thingType, storeID int, accessUUID, beforeData, afterData string) (err error) { + operateEventDetail := &model.OperateEventDetail{ + OperateType: operateType, + ThingID: thingID, + ThingType: thingType, + StoreID: storeID, + AccessUUID: accessUUID, + BeforeData: beforeData, + AfterData: afterData, + } + err = event.AddOperateEventDetail(operateEventDetail) + return err +} + func formatAutoSaleTime(autoSaleTime time.Time) (outAutoSaleTime time.Time) { if utils.IsTimeZero(autoSaleTime) { outAutoSaleTime = utils.DefaultTimeValue @@ -2921,60 +2947,153 @@ func GetCellForFocusStoreSkus(db *dao.DaoDB, rowNum int, row []string, sheetPara skuMap[skuID] = price } -func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { - var ( - skuNameMap = make(map[int][]*StoreSkuBindSkuInfo) - storeIDs []int - result1 []interface{} - ) +func FocusStoreSkusBySku(ctx *jxcontext.Context, skuBindInfos []*StoreSkuBindInfo, isAsync, isContinueWhenError bool) (hint string, err error) { + var result1 []interface{} db := dao.GetDB() - skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil) + taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: + taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + var ( + price int + payPercentage int + ) + skuBindInfo := batchItemList[0].(*StoreSkuBindInfo) + storeID := skuBindInfo.StoreID + skuID := skuBindInfo.Skus[0].SkuID + store, err := dao.GetStoreDetail(db, storeID, -1) + if err != nil { + return retVal, err + } + skuList, err := dao.GetSkus(db, []int{skuID}, nil, nil, nil) + if err != nil { + return retVal, err + } + if len(skuList) == 0 { + return retVal, fmt.Errorf("未查询到此商品!商品id :[%V]", skuID) + } + focusList, _ := dao.GetStoreSkuBindByNameID(db, storeID, skuList[0].NameID, model.StoreSkuBindStatusNormal) + //有关注过 + if len(focusList) > 0 { + price = focusList[0].UnitPrice + } else { + if store.PayPercentage < 50 { + payPercentage = 70 + } else { + payPercentage = store.PayPercentage + } + priceReferList, _ := dao.GetPriceReferSnapshotNoPage(db, []int{store.CityCode}, nil, []int{skuList[0].NameID}, utils.Time2Date(time.Now().AddDate(0, 0, -1))) + if len(priceReferList) > 0 { + price = priceReferList[0].MidUnitPrice * payPercentage / 100 + } + } + skuBindSkuInfo := &StoreSkuBindSkuInfo{ + SkuID: skuID, + IsSale: 1, + } + var skuBindSkuInfos []*StoreSkuBindSkuInfo + skuBindSkuInfos = append(skuBindSkuInfos, skuBindSkuInfo) + skuBindInfo2 := &StoreSkuBindInfo{ + StoreID: storeID, + NameID: skuList[0].NameID, + UnitPrice: price, + IsFocus: 1, + Skus: skuBindSkuInfos, + } + retVal = []*StoreSkuBindInfo{skuBindInfo2} + return retVal, err + } + taskParallel := tasksch.NewParallelTask("根据skuID部分关注商品", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, skuBindInfos) + tasksch.HandleTask(taskParallel, task, true).Run() + result1, _ = taskParallel.GetResult(0) + case 1: + var skuBindInfos []*StoreSkuBindInfo + for _, v := range result1 { + skuBindInfos = append(skuBindInfos, v.(*StoreSkuBindInfo)) + } + hint, err = UpdateStoresSkusByBind(ctx, skuBindInfos, isAsync, isContinueWhenError) + } + return result, err + } + taskSeq := tasksch.NewSeqTask2("根据skuID批量部分关注商品", 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 AutoFocusStoreSkusWithoutFocusForTopSkus(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { + db := dao.GetDB() + var ( + skuBindInfoList []*StoreSkuBindInfo + result1 []interface{} + ) storeList, err := dao.GetStoreList(db, nil, nil, "") taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { switch step { case 0: - for _, v := range storeList { - storeIDs = append(storeIDs, v.ID) - } - for _, v := range skuList { - skuNameMap[v.NameID] = append(skuNameMap[v.NameID], &StoreSkuBindSkuInfo{ - SkuID: v.ID, - IsSale: 1, - }) - } - case 1: taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - store := batchItemList[0].(*model.Store) - for k, v := range skuNameMap { - var price int - focusList, _ := dao.GetStoreSkuBindByNameID(db, store.ID, k, model.StoreSkuBindStatusNormal) - //有关注过 - if len(focusList) > 0 { - price = focusList[0].UnitPrice - } else { - var payPercentage int - if store.PayPercentage < 50 { - payPercentage = 70 - } else { - payPercentage = store.PayPercentage - } - priceReferList, _ := dao.GetPriceReferSnapshotNoPage(db, []int{store.CityCode}, nil, []int{k}, utils.Time2Date(time.Now().AddDate(0, 0, -1))) - if len(priceReferList) > 0 { - price = priceReferList[0].MidUnitPrice * payPercentage / 100 + v := batchItemList[0].(*model.Store) + var ( + skuName []*model.SkuName + skuNameMap = make(map[int]int) + ) + sql := ` + SELECT DISTINCT a.name_id id + FROM sku a + LEFT JOIN (SELECT DISTINCT b.name_id + FROM store_sku_bind a + JOIN sku b ON a.sku_id = b.id + WHERE a.deleted_at = ? + AND store_id = ?)b ON a.name_id = b.name_id + WHERE a.status = ? + AND a.deleted_at = ? + AND b.name_id IS NULL + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + v.ID, + model.SkuStatusNormal, + utils.DefaultTimeValue, + } + err = dao.GetRows(db, &skuName, sql, sqlParams...) + for _, v := range skuName { + skuNameMap[v.ID] = v.ID + } + skuNameAndPlaceList, err2 := GetTopSkusByCityCode(ctx, v.CityCode, v.ID) + if err2 != nil { + return retVal, err2 + } + var payPercentage int + if v.PayPercentage < 50 { + payPercentage = 70 + } else { + payPercentage = v.PayPercentage + } + if len(skuNameAndPlaceList) > 0 { + for _, vv := range skuNameAndPlaceList { + if skuNameMap[vv.ID] != 0 { + priceReferList, err := dao.GetPriceReferSnapshotNoPage(db, []int{vv.CityCode}, nil, []int{vv.ID}, utils.Time2Date(time.Now().AddDate(0, 0, -1))) + if err == nil && len(priceReferList) > 0 { + storeSkuBindInfo := &StoreSkuBindInfo{ + StoreID: v.ID, + NameID: vv.ID, + UnitPrice: priceReferList[0].MidUnitPrice * payPercentage / 100, + IsFocus: 1, + IsSale: 0, + } + skuBindInfoList = append(skuBindInfoList, storeSkuBindInfo) + } } } - skuBindInfo := &StoreSkuBindInfo{ - StoreID: store.ID, - NameID: k, - UnitPrice: price, - IsFocus: 1, - Skus: v, - } - retVal = []*StoreSkuBindInfo{skuBindInfo} } return retVal, err } - taskParallel := tasksch.NewParallelTask("根据skuID部分关注商品", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, storeList) + taskParallel := tasksch.NewParallelTask("自动关注畅销品", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, storeList) tasksch.HandleTask(taskParallel, task, true).Run() result1, _ = taskParallel.GetResult(0) case 2: @@ -2986,7 +3105,7 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContin } return result, err } - taskSeq := tasksch.NewSeqTask2("根据skuID批量部分关注商品", ctx, isContinueWhenError, taskSeqFunc, 3) + taskSeq := tasksch.NewSeqTask2("自动关注畅销品", ctx, isContinueWhenError, taskSeqFunc, 3) tasksch.HandleTask(taskSeq, nil, true).Run() if !isAsync { _, err = taskSeq.GetResult(0) @@ -2997,69 +3116,6 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContin return hint, err } -func AutoFocusStoreSkusWithoutFocusForTopSkus(ctx *jxcontext.Context) (err error) { - db := dao.GetDB() - var skuBindInfoList []*StoreSkuBindInfo - storeList, err := dao.GetStoreList(db, nil, nil, "") - for _, v := range storeList { - var ( - skuName []*model.SkuName - skuNameMap = make(map[int]int) - ) - sql := ` - SELECT DISTINCT a.name_id id - FROM sku a - LEFT JOIN (SELECT DISTINCT b.name_id - FROM store_sku_bind a - JOIN sku b ON a.sku_id = b.id - WHERE a.deleted_at = ? - AND store_id = ?)b ON a.name_id = b.name_id - WHERE a.status = ? - AND a.deleted_at = ? - AND b.name_id IS NULL - ` - sqlParams := []interface{}{ - utils.DefaultTimeValue, - v.ID, - model.SkuStatusNormal, - utils.DefaultTimeValue, - } - err = dao.GetRows(db, &skuName, sql, sqlParams...) - for _, v := range skuName { - skuNameMap[v.ID] = v.ID - } - skuNameAndPlaceList, err2 := GetTopSkusByCityCode(ctx, v.CityCode, v.ID) - if err2 != nil { - return err2 - } - var payPercentage int - if v.PayPercentage < 50 { - payPercentage = 70 - } else { - payPercentage = v.PayPercentage - } - if len(skuNameAndPlaceList) > 0 { - for _, vv := range skuNameAndPlaceList { - if skuNameMap[vv.ID] != 0 { - priceReferList, err := dao.GetPriceReferSnapshotNoPage(db, []int{vv.CityCode}, nil, []int{vv.ID}, utils.Time2Date(time.Now().AddDate(0, 0, -1))) - if err == nil && len(priceReferList) > 0 { - storeSkuBindInfo := &StoreSkuBindInfo{ - StoreID: v.ID, - NameID: vv.ID, - UnitPrice: priceReferList[0].MidUnitPrice * payPercentage / 100, - IsFocus: 1, - IsSale: 0, - } - skuBindInfoList = append(skuBindInfoList, storeSkuBindInfo) - } - } - } - } - } - UpdateStoresSkusByBind(ctx, skuBindInfoList, true, true) - return err -} - func AutoFocusStoreSkusWithoutFocus(ctx *jxcontext.Context, skuIDs []int, isSync bool) (err error) { var ( nameMap = make(map[int]*StoreSkuBindInfo) @@ -3075,8 +3131,8 @@ func AutoFocusStoreSkusWithoutFocus(ctx *jxcontext.Context, skuIDs []int, isSync }) } else { skuBindInfo := &StoreSkuBindInfo{ - UnitPrice: vv.UnitPrice, - NameID: vv.ID, + UnitPrice: int(vv.UnitPrice), + NameID: vv.NameID, StoreID: v.ID, Skus: []*StoreSkuBindSkuInfo{}, } @@ -3127,6 +3183,6 @@ func UpdateStoreSkuNamePrice(ctx *jxcontext.Context, storeID, nameID, unitPrice // for _, v := range skuList { // skuIDs = append(skuIDs, v.ID) // } - // actStoreSkuList, err :=dao.GetEffectiveActStoreSkuInfo(db, 0, nil, model.ActSkuDirectDown, []int{storeID}, skuIDs, time.Now(),time.Now()) + // actStoreSkuList, err := dao.GetEffectiveActStoreSkuInfo(db, 0, nil, model.ActSkuDirectDown, []int{storeID}, skuIDs, time.Now(), time.Now()) return hint, err } diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 1e2d82765..d99ba7444 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -209,7 +209,9 @@ func FullSyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo } func isStoreSkuSyncNeedDelete(storeSku *dao.StoreSkuSyncInfo) bool { - return model.IsSyncStatusDelete(storeSku.SkuSyncStatus) || storeSku.BindDeletedAt != utils.DefaultTimeValue || storeSku.BindID == 0 || storeSku.NameID == 0 + return model.IsSyncStatusDelete(storeSku.SkuSyncStatus) || + storeSku.BindDeletedAt != utils.DefaultTimeValue || storeSku.BindID == 0 || + storeSku.NameID == 0 || storeSku.NameStatus != model.SkuStatusNormal || storeSku.Status != model.SkuStatusNormal } func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSkuInfo) { @@ -253,7 +255,7 @@ func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyn if skuItem.VendorPrice > skuItem.BoxFee { skuItem.BoxFee = boxFee } - skuItem.MergedStatus = jxutils.MergeSkuStatus(skuItem.Status, skuItem.StoreSkuStatus) + skuItem.MergedStatus = jxutils.MergeSkuStatus(jxutils.MergeSkuStatus(skuItem.NameStatus, skuItem.Status), skuItem.StoreSkuStatus) skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) } } diff --git a/business/model/dao/act.go b/business/model/dao/act.go index cacbcdc6e..7ae5c09ab 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -186,7 +186,7 @@ func GetActStoreSkuVendorInfo(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs } func QueryActs(db *DaoDB, actID int, offset, pageSize int, syncStatus int, keyword string, vendorID int, statusList, actTypeList, createTypeList []int, - storeID, skuID, cityCode int, beginAt, endAt, createdAtFrom, createdAtTo time.Time) (pagedInfo *PagedActListInfo, err error) { + storeID int, skuIDs []int, cityCode int, beginAt, endAt, createdAtFrom, createdAtTo time.Time) (pagedInfo *PagedActListInfo, err error) { if actID == 0 && utils.IsTimeZero(createdAtFrom) && utils.IsTimeZero(beginAt) { return nil, fmt.Errorf("actID,createdAtFrom和beginAt中,至少要指定一个条件") } @@ -231,7 +231,7 @@ func QueryActs(db *DaoDB, actID int, offset, pageSize int, syncStatus int, keywo } sql += ")" } - if storeID > 0 || skuID > 0 || cityCode > 0 { + if storeID > 0 || len(skuIDs) > 0 || cityCode > 0 { sql += ` AND (SELECT COUNT(*) FROM act_store_sku t2` if cityCode > 0 { @@ -245,9 +245,9 @@ func QueryActs(db *DaoDB, actID int, offset, pageSize int, syncStatus int, keywo sql += " AND t2.store_id = ?" sqlParams = append(sqlParams, storeID) } - if skuID > 0 { - sql += " AND t2.sku_id = ?" - sqlParams = append(sqlParams, skuID) + if len(skuIDs) > 0 { + sql += " AND t2.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) } sql += ") > 0" } diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index fcbcabbdd..3b94744b0 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -99,6 +99,9 @@ type StoreSkuSyncInfo struct { SkuName string StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围 StatusSaleEnd int16 `json:"statusSaleEnd"` + JdSyncStatus int8 `orm:"default(2)"` + MtwmSyncStatus int8 `orm:"default(2)"` + EbaiSyncStatus int8 `orm:"default(2)"` } type MissingStoreSkuInfo struct { @@ -354,7 +357,7 @@ func newGetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty %s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time, t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t2.*, - t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, + t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, t13.%s desc_img, @@ -379,8 +382,8 @@ func newGetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty 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 = ? - LEFT JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ? AND t2.status = ? - LEFT JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ? AND t3.status = ? + LEFT JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ?/* AND t2.status = ?*/ + LEFT JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ?/* AND t3.status = ?*/ LEFT JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ? LEFT JOIN data_resource t11 ON t11.main_url = t3.img LEFT JOIN data_resource t12 ON t12.main_url = t3.img2 @@ -388,8 +391,8 @@ func newGetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty ` sqlParams := []interface{}{ vendorID, utils.DefaultTimeValue, - utils.DefaultTimeValue, model.SkuStatusNormal, - utils.DefaultTimeValue, model.SkuStatusNormal, + utils.DefaultTimeValue, // model.SkuStatusNormal, + utils.DefaultTimeValue, // model.SkuStatusNormal, utils.DefaultTimeValue, } if isSingleStorePF { @@ -561,7 +564,7 @@ func newGetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSync t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time, t1.store_id, t1.deleted_at bind_deleted_at, t2.*, t2.id sku_id, t2m.vendor_thing_id vendor_sku_id, - t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, + t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, t13.%s desc_img, @@ -569,7 +572,7 @@ func newGetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSync t4m.sync_status cat_sync_status, t4m.vendor_thing_id vendor_cat_id, t5skum.sync_status sku_cat_sync_status, t5skum.vendor_thing_id sku_vendor_cat_id FROM sku t2 - JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ? AND t3.status = ? + JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ?/* AND t3.status = ?*/ JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ? JOIN store_map sm ON sm.vendor_id = ? AND sm.store_id = ? AND sm.deleted_at = ? JOIN thing_map t2m ON t2m.thing_id = t2.id AND t2m.vendor_org_code = sm.vendor_org_code AND t2m.thing_type = ? AND t2m.vendor_id = ? AND t2m.deleted_at = ? @@ -580,17 +583,17 @@ func newGetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSync LEFT JOIN data_resource t11 ON t11.main_url = t3.img LEFT JOIN data_resource t12 ON t12.main_url = t3.img2 LEFT JOIN data_resource t13 ON t13.main_url = t3.desc_img - WHERE t2.deleted_at = ? AND t2.status = ? AND t2m.vendor_thing_id <> '' + WHERE t2.deleted_at = ?/* AND t2.status = ?*/ AND t2m.vendor_thing_id <> '' ORDER BY t1.price DESC` sqlParams := []interface{}{ - utils.DefaultTimeValue, model.SkuStatusNormal, + utils.DefaultTimeValue, // model.SkuStatusNormal, utils.DefaultTimeValue, vendorID, storeID, utils.DefaultTimeValue, model.ThingTypeSku, vendorID, utils.DefaultTimeValue, model.ThingTypeCategory, vendorID, utils.DefaultTimeValue, utils.DefaultTimeValue, model.ThingTypeCategory, vendorID, utils.DefaultTimeValue, - utils.DefaultTimeValue, model.SkuStatusNormal, + utils.DefaultTimeValue, // model.SkuStatusNormal, } fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql = fmt.Sprintf(sql, @@ -1185,7 +1188,7 @@ func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (storeSkuNameExt []*StoreSk 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, t4.ebai_sync_status, t4.mtwm_sync_status, - t4.jd_price, t4.ebai_price, t4.mtwm_price, t4.jx_price + t4.jd_price, t4.ebai_price, t4.mtwm_price, t4.jx_price, a.spec_quality sku_spec_quality, a.spec_unit sku_spec_unit FROM sku a JOIN sku_name t1 ON a.name_id = t1.id AND t1.deleted_at = ? JOIN store_sku_bind t4 ON t4.sku_id = a.id AND t4.deleted_at = ? @@ -1529,9 +1532,10 @@ func GetPriceReferPrice(db *DaoDB, cityCode int, skuID int, snapDate time.Time) return priceRefer, err } -func GetStoreSkusAndSkuName(db *DaoDB, storeIDs, skuIDs, nameIDs []int) (storeSkuNameExt []*StoreSkuNameExt, err error) { +func GetStoreSkusAndSkuName(db *DaoDB, storeIDs, skuIDs, nameIDs []int) (storeSkuSyncInfo []*StoreSkuSyncInfo, err error) { sql := ` - SELECT a.*,c.id + SELECT a.id bind_id, a.store_id, a.jd_sync_status, a.mtwm_sync_status, a.ebai_sync_status, a.unit_price, + c.id name_id, c.unit, b.* FROM store_sku_bind a JOIN sku b ON b.id = a.sku_id AND b.deleted_at = ? JOIN sku_name c ON c.id = b.name_id AND c.deleted_at = ? @@ -1554,6 +1558,6 @@ func GetStoreSkusAndSkuName(db *DaoDB, storeIDs, skuIDs, nameIDs []int) (storeSk sql += " AND b.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")" sqlParams = append(sqlParams, nameIDs) } - err = GetRows(db, &storeSkuNameExt, sql, sqlParams...) - return storeSkuNameExt, err + err = GetRows(db, &storeSkuSyncInfo, sql, sqlParams...) + return storeSkuSyncInfo, err } diff --git a/business/model/event.go b/business/model/event.go index 9a5a8cb9f..697dc803a 100644 --- a/business/model/event.go +++ b/business/model/event.go @@ -24,8 +24,8 @@ type OperateEventDetail struct { ThingType int `json:"thingType"` //各字段类型 StoreID int `orm:"column(store_id)" json:"storeID"` AccessUUID string `orm:"column(access_uuid)" json:"accessUUID"` - BeforeData string `orm:"size(32)" json:"beforeData"` - AfterData string `orm:"size(32)" json:"afterData"` + BeforeData string `orm:"size(255)" json:"beforeData"` + AfterData string `orm:"size(255)" json:"afterData"` } func (v *OperateEventDetail) TableIndex() [][]string { diff --git a/business/partner/purchase/ebai/waybill.go b/business/partner/purchase/ebai/waybill.go index 8a8f551ba..b8c202914 100644 --- a/business/partner/purchase/ebai/waybill.go +++ b/business/partner/purchase/ebai/waybill.go @@ -42,7 +42,7 @@ func (p *PurchaseHandler) GetWaybillStatusFromVendorStatus(vendorStatus string) func (c *PurchaseHandler) onWaybillMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaiapi.CallbackResponse) { order := c.callbackMsg2Waybill(msg) globals.SugarLogger.Debugf("ebai onWaybillMsg orderID:%s", order.VendorOrderID) - if order.Status == model.WaybillStatusAccepted { + if order.Status == model.WaybillStatusNew || order.Status == model.WaybillStatusAccepted { // 饿百新运单事件要查询快递员信息,因为可能事件错序 if result, err := api.EbaiAPI.OrderDeliveryGet(order.VendorOrderID); err != nil { globals.SugarLogger.Warnf("ebai onWaybillMsg orderID:%s OrderDeliveryGet failed with error:%v", order.VendorOrderID, err) return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, order.VendorOrderID) diff --git a/controllers/auth2.go b/controllers/auth2.go index e64d56176..d4c0160d9 100644 --- a/controllers/auth2.go +++ b/controllers/auth2.go @@ -79,7 +79,7 @@ func (c *Auth2Controller) SendVerifyCode() { // @Title 登录接口 // @Description 登录接口(微信与公众号登录不能直接调用此接口) -// @Param authType formData string true "登录类型,当前支持[localpass:本地账号密码,mobile:手机短信,wxqrcode:微信登录,weixinsns:微信公众号,weixinmini;小程序,ddstaff:钉钉企业,ddqrcode:钉钉扫码]" +// @Param authType formData string true "登录类型,当前支持[localpass:本地账号密码,mobile:手机短信,wxqrcode:微信登录,weixinsns:微信公众号,weixinmini;小程序,ddstaff:钉钉企业,ddqrcode:钉钉扫码,alipaycode:支付宝小程序]" // @Param authSecret formData string true "不同登录类型的登录秘密,如果是localpass登录类型,是md5后的值(空串不要md5)" // @Param authID formData string false "登录ID,登录类型为localpass时依赖于authIDType,其它为相应登录类型的id" // @Param authIDType formData string false "只有在登录类型为localpass时,才有意义,分别为:userid2:用户名,email,mobile" diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index dc1c5ae62..ba3b0e9e6 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -610,18 +610,19 @@ func (c *StoreSkuController) GetVendorStoreSkuPrice() { // @Title 根据skuID关注商品,价格为中位价,部分可售 // @Description 根据skuID关注商品,价格为中位价,部分可售 // @Param token header string true "认证token" -// @Param skuIDs formData string true "商品ID列表" +// @Param payload formData string true "json数据,StoreSkuBindInfo对象数组" // @Param isAsync formData bool true "是否异步,缺省是同步" // @Param isContinueWhenError formData bool true "单个同步失败是否继续,缺省false" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /FocusStoreSkusBySku [post] func (c *StoreSkuController) FocusStoreSkusBySku() { - var skuIDList []int + var skuBindInfos []*cms.StoreSkuBindInfo c.callFocusStoreSkusBySku(func(params *tStoreSkuFocusStoreSkusBySkuParams) (retVal interface{}, errCode string, err error) { - if jxutils.Strings2Objs(params.SkuIDs, &skuIDList); err == nil { - retVal, err = cms.FocusStoreSkusBySku(params.Ctx, skuIDList, params.IsAsync, params.IsContinueWhenError) + if err = jxutils.Strings2Objs(params.Payload, &skuBindInfos); err != nil { + return retVal, "", err } + retVal, err = cms.FocusStoreSkusBySku(params.Ctx, skuBindInfos, params.IsAsync, params.IsContinueWhenError) return retVal, "", err }) } diff --git a/globals/refutil/refutil.go b/globals/refutil/refutil.go index 412ca8b55..e6c81127d 100644 --- a/globals/refutil/refutil.go +++ b/globals/refutil/refutil.go @@ -91,6 +91,17 @@ func FilterMapByFieldList(mapData map[string]interface{}, fields []string) (vali return valid, invalid } +func FindMapAndStructMixed(mapData map[string]interface{}, obj interface{}) (valid map[string]interface{}) { + valid = make(map[string]interface{}) + map2 := utils.Struct2FlatMap(obj) + for k, v := range map2 { + if mapData[k] != nil { + valid[k] = v + } + } + return valid +} + func IsValueEqual(value1, value2 interface{}) bool { if value1 == nil || value2 == nil { return value1 == value2