- Store and StoreMap add DeletedAt.

This commit is contained in:
gazebo
2018-09-20 10:07:58 +08:00
parent f874c37d14
commit 9d88344ddb
14 changed files with 206 additions and 172 deletions

View File

@@ -111,7 +111,7 @@ func UpdatePlaces(places []map[string]interface{}, userName string) (num int64,
}
placeid := &model.Place{}
valid := dao.NormalMakeMapByFieldList(place, []string{"jdCode", "enabled", "mtpsPrice"}, userName)
if num, err = dao.UpdateEntityByKV(nil, placeid, valid, utils.Params2Map("Code", place["code"])); err != nil {
if num, err = dao.UpdateEntityLogically(nil, placeid, valid, userName, utils.Params2Map("Code", place["code"])); err != nil {
return num, err
}
}

View File

@@ -4,7 +4,6 @@ import (
"errors"
"strconv"
"strings"
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
@@ -29,7 +28,7 @@ func GetVendorCategories(vendorID int, parentID string) (vendorCats []*model.Sku
if parentID != "-1" {
cond[model.FieldParentID] = parentID
}
return vendorCats, dao.GetEntities(nil, &vendorCats, cond, false)
return vendorCats, dao.GetEntitiesByKV(nil, &vendorCats, cond, false)
}
// parentID 为-1表示所有
@@ -62,7 +61,7 @@ func UpdateCategory(categoryID int, payload map[string]interface{}, userName str
if len(valid) > 0 {
valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask
db := dao.GetDB()
if num, err = dao.UpdateEntityByKV(db, cat, valid, nil); err == nil {
if num, err = dao.UpdateEntityLogically(db, cat, valid, userName, nil); err == nil {
err = CurVendorSync.SyncCategory(db, categoryID, false, userName)
}
}
@@ -80,7 +79,7 @@ func ReorderCategories(parentID int, categoryIDs []int, userName string) (err er
parentCat = nil
}
if err == nil {
if err = dao.GetEntities(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil {
if err = dao.GetEntitiesByKV(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil {
catsLen := len(cats)
if catsLen != len(categoryIDs) {
return ErrInputCatsDoesntMatch
@@ -132,7 +131,7 @@ func DeleteCategory(categoryID int, isForce bool, userName string) (num int64, e
} else if countInfos[2].Ct != 0 {
return 0, errors.New("还有商品类别使用此类别,不能删除")
}
if num, err = dao.DeleteEntityLogically(db, cat, nil, userName, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask)); err == nil && num == 1 {
if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err == nil && num == 1 {
err = CurVendorSync.SyncCategory(db, cat.ID, false, userName)
}
}
@@ -348,7 +347,7 @@ func AddSkuName(skuNameExt *model.SkuNameExt, userName string) (outSkuNameExt *m
return nil, err
}
if tmpInfo.TotalCount != 1 {
// return nil, ErrEntityNotExist
return nil, ErrEntityNotExist
}
outSkuNameExt = tmpInfo.SkuNames[0]
err = CurVendorSync.SyncSku(db, outSkuNameExt.SkuName.ID, -1, false, userName)
@@ -369,7 +368,7 @@ func UpdateSkuName(nameID int, payload map[string]interface{}, userName string)
panic(r)
}
}()
if num, err = dao.UpdateEntityByKV(db, skuName, valid, nil); err == nil && num == 1 {
if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err == nil && num == 1 {
if utils.Interface2Int64WithDefault(payload["isGlobal"], 0) == 0 && payload["places"] != nil {
if places, ok := payload["places"].([]interface{}); ok {
if _, err = dao.ExecuteSQL(db, "DELETE FROM sku_name_place_bind WHERE name_id = ?", nameID); err == nil {
@@ -390,12 +389,14 @@ func UpdateSkuName(nameID int, payload map[string]interface{}, userName string)
}
if err == nil {
sku := &model.Sku{}
_, err2 := dao.UpdateEntityByKV(db, sku, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagModifiedMask), utils.Params2Map(model.FieldNameID, skuName.ID))
_, err2 := dao.UpdateEntityLogically(db, sku, map[string]interface{}{
model.FieldJdSyncStatus: model.SyncFlagModifiedMask,
}, userName, map[string]interface{}{
model.FieldNameID: nameID,
})
if err = err2; err == nil {
if err = dao.GetEntity(db, skuName); err == nil {
dao.Commit(db)
err2 = CurVendorSync.SyncSku(db, skuName.ID, -1, false, userName)
}
dao.Commit(db)
err2 = CurVendorSync.SyncSku(db, nameID, -1, false, userName)
}
}
}
@@ -421,12 +422,12 @@ func DeleteSkuName(nameID int, userName string) (num int64, err error) {
skuName.ID = nameID
if num, err = dao.DeleteEntityLogically(db, skuName, nil, userName, nil); err == nil && num == 1 {
dummy := &model.Sku{}
num2, err2 := dao.UpdateEntityByKV(db, dummy, map[string]interface{}{
model.FieldDeletedAt: time.Now(),
model.FieldLastOperator: userName,
num2, err2 := dao.DeleteEntityLogically(db, dummy, map[string]interface{}{
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
"Status": model.SkuStatusDeleted,
}, utils.Params2Map(model.FieldNameID, skuName.ID))
model.FieldStatus: model.SkuStatusDeleted,
}, userName, map[string]interface{}{
model.FieldNameID: nameID,
})
if err2 == nil {
dao.Commit(db)
if num2 > 0 {
@@ -466,7 +467,7 @@ func UpdateSku(skuID int, payload map[string]interface{}, userName string) (num
if len(valid) > 0 {
valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask
db := dao.GetDB()
if num, err = dao.UpdateEntityByKV(db, sku, valid, nil); err == nil {
if num, err = dao.UpdateEntityLogically(db, sku, valid, userName, nil); err == nil {
if num == 1 {
err = CurVendorSync.SyncSku(db, -1, sku.ID, false, userName)
} else {
@@ -481,7 +482,10 @@ func DeleteSku(skuID int, userName string) (num int64, err error) {
db := dao.GetDB()
sku := &model.Sku{}
sku.ID = skuID
if num, err = dao.DeleteEntityLogically(db, sku, nil, userName, nil); err == nil {
if num, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{
model.FieldStatus: model.SkuStatusDeleted,
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
}, userName, nil); err == nil {
if num == 1 {
err = CurVendorSync.SyncSku(db, -1, sku.ID, false, userName)
} else {

View File

@@ -38,12 +38,12 @@ func GetStores(keyword string, params map[string]interface{}, offset, pageSize i
FROM store t1
LEFT JOIN place city ON t1.city_code = city.code AND city.level = 2
LEFT JOIN place district ON t1.district_code = district.code AND district.level = 3
LEFT JOIN store_map jdm ON t1.id = jdm.store_id AND jdm.vendor_id = 0
LEFT JOIN store_map elmm ON t1.id = elmm.store_id AND elmm.vendor_id = 2
LEFT JOIN store_map ebaim ON t1.id = ebaim.store_id AND ebaim.vendor_id = 3
LEFT JOIN store_map jdm ON t1.id = jdm.store_id AND jdm.vendor_id = 0 AND jdm.deleted_at = '1970-01-01 00:00:00'
LEFT JOIN store_map elmm ON t1.id = elmm.store_id AND elmm.vendor_id = 2 AND elmm.deleted_at = '1970-01-01 00:00:00'
LEFT JOIN store_map ebaim ON t1.id = ebaim.store_id AND ebaim.vendor_id = 3 AND ebaim.deleted_at = '1970-01-01 00:00:00'
`
sqlWhere := `
WHERE
WHERE t1.deleted_at = '1970-01-01 00:00:00'
`
sqlParams := make([]interface{}, 0)
if keyword != "" {
@@ -89,17 +89,7 @@ func GetStores(keyword string, params map[string]interface{}, offset, pageSize i
sqlParams = append(sqlParams, "%"+params["tel"].(string)+"%")
sqlParams = append(sqlParams, "%"+params["tel"].(string)+"%")
}
// if params["cardCond"] != nil {
// cardCond := params["cardCond"].(int)
// if cardCond == -1 || cardCond == 1 {
// sqlFrom += "\nLEFT JOIN bill_info ON t1.store_id = bill_info.jx_store_id\n"
// if cardCond == -1 {
// sqlWhere += " AND bill_info.id IS NULL"
// } else {
// sqlWhere += " AND bill_info.id IS NOT NULL"
// }
// }
// }
if params["fromStatus"] != nil {
fromStatus := params["fromStatus"].(int)
toStatus := fromStatus
@@ -196,21 +186,34 @@ func UpdateStore(storeID int, payload map[string]interface{}, userName string) (
}
if len(valid) > 0 {
db := dao.GetDB()
if num, err = dao.UpdateEntityByKV(db, store, valid, nil); err == nil && num == 1 {
dummy := &model.StoreMap{}
_, err2 := dao.UpdateEntityByKV(db, dummy, utils.Params2Map(model.FieldSyncStatus, model.SyncFlagModifiedMask), utils.Params2Map(model.FieldStoreID, store.ID))
if err = err2; err == nil {
if err = dao.GetEntity(db, store); err == nil {
err = CurVendorSync.SyncStore(db, -1, store, false, userName)
}
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
if num, err = dao.UpdateEntityLogically(db, store, valid, userName, nil); err == nil && num == 1 {
dummy := &model.StoreMap{}
_, err2 := dao.UpdateEntityLogically(db, dummy, map[string]interface{}{
model.FieldSyncStatus: model.SyncFlagModifiedMask,
}, userName, map[string]interface{}{
model.FieldStoreID: store.ID,
})
if err = err2; err == nil {
dao.Commit(db)
err = CurVendorSync.SyncStore(db, -1, store.ID, false, userName)
}
}
if err != nil {
dao.Rollback(db)
}
}
return num, err
}
func CreateStore(store *model.Store, userName string) (id int, err error) {
dao.WrapAddIDCULEntity(store, userName)
dao.WrapAddIDCULDEntity(store, userName)
if err = dao.CreateEntity(nil, store); err == nil {
return store.ID, err
}
@@ -224,14 +227,14 @@ func GetStoreVendorMaps(db *dao.DaoDB, storeID int, vendorID int) (storeMaps []*
if vendorID != -1 {
cond[model.FieldVendorID] = vendorID
}
return storeMaps, dao.GetEntities(db, &storeMaps, cond, false)
return storeMaps, dao.GetEntitiesByKV(db, &storeMaps, cond, false)
}
func AddStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, storeMap *model.StoreMap, userName string) (outStoreMap *model.StoreMap, err error) {
if handler := GetPurchaseHandler(storeMap.VendorID); handler != nil {
store, err := handler.ReadStore(storeMap.VendorStoreID)
if err == nil {
dao.WrapAddIDCULEntity(storeMap, userName)
dao.WrapAddIDCULDEntity(storeMap, userName)
storeMap.StoreID = storeID
storeMap.VendorID = vendorID
storeMap.DeliveryType = store.DeliveryType
@@ -248,12 +251,9 @@ func AddStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, storeMap *model.Sto
}
}()
if err = dao.CreateEntity(db, storeMap); err == nil {
store.ID = storeID
if err = dao.GetEntity(db, store); err == nil {
dao.Commit(db)
outStoreMap = storeMap
err = CurVendorSync.SyncStore(db, storeMap.VendorID, store, true, userName)
}
dao.Commit(db)
outStoreMap = storeMap
err = CurVendorSync.SyncStore(db, storeMap.VendorID, storeID, true, userName)
}
if err != nil {
dao.Rollback(db)
@@ -266,11 +266,17 @@ func AddStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, storeMap *model.Sto
}
func DeleteStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, userName string) (num int64, err error) {
storeMap := &model.StoreMap{
StoreID: storeID,
VendorID: vendorID,
storeMap := &model.StoreMap{}
if num, err = dao.DeleteEntityLogically(db, storeMap, map[string]interface{}{
model.FieldSyncStatus: model.SyncFlagDeletedMask,
model.FieldStatus: model.StoreStatusDisabled,
}, userName, map[string]interface{}{
model.FieldStoreID: storeID,
model.FieldVendorID: vendorID,
}); err == nil && num > 0 {
err = CurVendorSync.SyncStore(db, vendorID, storeID, true, userName)
}
return dao.DeleteEntity(db, storeMap, model.FieldStoreID, model.FieldVendorID)
return num, err
}
func UpdateStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, payload map[string]interface{}, userName string) (num int64, err error) {
@@ -294,16 +300,19 @@ func UpdateStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, payload map[stri
if valid["status"] != nil { // 对于store vendor map只有Status改变才需要同步到厂商
valid[model.FieldSyncStatus] = model.SyncFlagModifiedMask
}
if num, err = dao.UpdateEntityByKV(db, dummyStoreMap, valid, utils.Params2Map(model.FieldStoreID, storeID, model.FieldVendorID, vendorID)); err == nil {
if num, err = dao.UpdateEntityLogically(db, dummyStoreMap, valid, userName, map[string]interface{}{
model.FieldStoreID: storeID,
model.FieldVendorID: vendorID,
}); err == nil && num > 0 {
if valid["status"] != nil {
store := &model.Store{}
store.ID = storeID
if err = dao.GetEntity(db, store); err == nil {
err = CurVendorSync.SyncStore(db, vendorID, store, false, userName)
}
err = CurVendorSync.SyncStore(db, vendorID, storeID, false, userName)
}
}
}
}
return num, err
}
func DeleteStore(db *dao.DaoDB, storeID int, userName string) (num int64, err error) {
return 0, err
}

View File

@@ -296,12 +296,12 @@ func UpdateStoreSku(storeID int, skuBindInfo *StoreSkuBindInfo, userName string)
if ok {
if v.IsFocus == -1 {
delNum++
_, err = dao.DeleteEntityLogically(db, skuBind, nil, userName, map[string]interface{}{
_, err = dao.DeleteEntityLogically(db, skuBind, map[string]interface{}{
model.FieldStatus: model.StoreSkuBindStatusDeleted,
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
model.FieldElmSyncStatus: model.SyncFlagDeletedMask,
model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask,
})
}, userName, nil)
} else {
// todo 如果修改ebai与elm ID怎么处理呢
if v.IsFocus == 1 {

View File

@@ -3,7 +3,6 @@ package cms
import (
"errors"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler/basesch"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/model"
@@ -54,7 +53,7 @@ func (v *VendorSync) SyncCategory(db *dao.DaoDB, categoryID int, isForce bool, u
if categoryID > 0 {
cond[model.FieldID] = categoryID
}
if err = dao.GetEntities(db, &cats, cond, true); err == nil {
if err = dao.GetEntitiesByKV(db, &cats, cond, true); err == nil {
tasksch.RunTask("", func(batchItemList []interface{}, params ...interface{}) (interface{}, error) {
cat := batchItemList[0].(*model.SkuCategory)
if (cat.JdSyncStatus & model.SyncFlagDeletedMask) != 0 { //删除
@@ -76,17 +75,16 @@ func (v *VendorSync) SyncCategory(db *dao.DaoDB, categoryID int, isForce bool, u
return err
}
func (v *VendorSync) SyncStore(db *dao.DaoDB, vendorID int, store *model.Store, isForce bool, userName string) (err error) {
globals.SugarLogger.Debugf("SyncStore, store:%s", utils.Format4Output(store, true))
func (v *VendorSync) SyncStore(db *dao.DaoDB, vendorID, storeID int, isForce bool, userName string) (err error) {
globals.SugarLogger.Debugf("SyncStore, storeID:%d", storeID)
if db == nil {
db = dao.GetDB()
}
err = v.LoopStoreMap(db, store.ID, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) {
err = v.LoopStoreMap(db, storeID, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) {
storeMap := batchItemList[0].(*model.StoreMap)
globals.SugarLogger.Debugf("SyncStore, storeMap:%s", utils.Format4Output(store, true))
if (vendorID == -1 || vendorID == storeMap.VendorID) && (isForce || storeMap.SyncStatus != 0) {
if handler := GetPurchaseHandler(storeMap.VendorID); handler != nil {
if err = handler.UpdateStore(store.ID, userName); err == nil {
if err = handler.UpdateStore(storeID, userName); err == nil {
storeMap.SyncStatus = 0
_, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus)
}
@@ -116,7 +114,7 @@ func (v *VendorSync) SyncSku(db *dao.DaoDB, nameID, skuID int, isForce bool, use
if skuID != -1 {
cond[model.FieldID] = skuID
}
if err = dao.GetEntities(db, &skuList, cond, true); err == nil {
if err = dao.GetEntitiesByKV(db, &skuList, cond, true); err == nil {
tasksch.RunTask("", func(batchItemList []interface{}, params ...interface{}) (interface{}, error) {
sku := batchItemList[0].(*model.Sku)
if (skuID == -1 || skuID == sku.ID) && (isForce || sku.JdSyncStatus != 0) {

View File

@@ -48,13 +48,13 @@ func Init(objCreator func(objHint string) interface{}, interfaceTypes ...interfa
func (m *DurableTaskMan) LoadPendingTask() (err error) {
db := dao.GetDB()
tasks := make([]*model.DurableTask, 0)
if err = dao.GetEntities(db, &tasks, utils.Params2Map(model.FieldStatus, 0), true); err == nil {
if err = dao.GetEntitiesByKV(db, &tasks, utils.Params2Map(model.FieldStatus, 0), true); err == nil {
for _, task := range tasks {
dTask := &DurableTask{
data: task,
}
m.tasks[task.TaskID] = dTask
return dao.GetEntities(db, &dTask.items, utils.Params2Map(model.FieldStatus, 0), true)
return dao.GetEntitiesByKV(db, &dTask.items, utils.Params2Map(model.FieldStatus, 0), true)
}
}
return err

View File

@@ -3,11 +3,8 @@ package dao
import (
"errors"
"reflect"
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
"github.com/astaxie/beego/orm"
)
@@ -54,7 +51,6 @@ type DaoDB struct {
// }
// return err
// }
// beego orm的对于传代表字段的字串数据库字段名完全匹配区分大小写结构体字段名不区分大小写都可以
func GetDB() *DaoDB {
@@ -115,31 +111,6 @@ func GetEntity(db *DaoDB, item interface{}, cols ...string) (err error) {
return err
}
func GetEntities(db *DaoDB, item interface{}, conditions map[string]interface{}, isIncludeDeleted bool) (err error) {
if db == nil {
db = GetDB()
}
err = utils.CallFuncLogError(func() error {
typeInfo := reflect.TypeOf(item).Elem().Elem()
if typeInfo.Kind() == reflect.Ptr {
typeInfo = typeInfo.Elem()
}
qs := db.db.QueryTable(reflect.New(typeInfo).Interface())
for k, v := range conditions {
qs = qs.Filter(k, v)
}
qs = qs.Limit(-1)
if !isIncludeDeleted {
if _, ok := typeInfo.FieldByName(model.FieldDeletedAt); ok {
qs = qs.Filter(model.FieldDeletedAt, utils.DefaultTimeValue)
}
}
_, err = qs.All(item)
return err
}, reflect.TypeOf(item).Name())
return err
}
func UpdateEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err error) {
if db == nil {
db = GetDB()
@@ -151,25 +122,6 @@ func UpdateEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err e
return num, err
}
func UpdateEntityByKV(db *DaoDB, item interface{}, kvs map[string]interface{}, conditions map[string]interface{}) (num int64, err error) {
if db == nil {
db = GetDB()
}
err = utils.CallFuncLogError(func() error {
qs := db.db.QueryTable(item)
if conditions == nil {
qs = qs.Filter(model.FieldID, jxutils.GetObjFieldByName(item, model.FieldID))
} else {
for k, v := range conditions {
qs = qs.Filter(k, v)
}
}
num, err = qs.Update(kvs)
return err
}, reflect.TypeOf(item).Name())
return num, err
}
func CreateEntity(db *DaoDB, item interface{}) (err error) {
if db == nil {
db = GetDB()
@@ -192,31 +144,6 @@ func DeleteEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err e
return num, err
}
func DeleteEntityLogically(db *DaoDB, item interface{}, conditions map[string]interface{}, logicDeletedBy string, kvs map[string]interface{}) (num int64, err error) {
if db == nil {
db = GetDB()
}
err = utils.CallFuncLogError(func() error {
qs := db.db.QueryTable(item)
if len(conditions) == 0 {
qs = qs.Filter(model.FieldID, jxutils.GetObjFieldByName(item, model.FieldID))
} else {
for k, v := range conditions {
qs = qs.Filter(k, v)
}
}
qs = qs.Filter(model.FieldDeletedAt, utils.DefaultTimeValue)
updateValues := map[string]interface{}{
model.FieldDeletedAt: time.Now(),
model.FieldUpdatedAt: time.Now(),
model.FieldLastOperator: logicDeletedBy,
}
num, err = qs.Update(utils.MergeMaps(updateValues, kvs))
return err
}, reflect.TypeOf(item).Name())
return num, err
}
func ExecuteSQL(db *DaoDB, sql string, params ...interface{}) (num int64, err error) {
if db == nil {
db = GetDB()

View File

@@ -0,0 +1,71 @@
package dao
import (
"reflect"
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
)
// 这里面的函数要求实体是IDCUDL的即含有ID, UpdatedAt, LastOperator, DeletedAt字段
func GetEntitiesByKV(db *DaoDB, item interface{}, conditions map[string]interface{}, isIncludeDeleted bool) (err error) {
if db == nil {
db = GetDB()
}
err = utils.CallFuncLogError(func() error {
typeInfo := reflect.TypeOf(item).Elem().Elem()
if typeInfo.Kind() == reflect.Ptr {
typeInfo = typeInfo.Elem()
}
qs := db.db.QueryTable(reflect.New(typeInfo).Interface())
for k, v := range conditions {
qs = qs.Filter(k, v)
}
qs = qs.Limit(-1)
if !isIncludeDeleted {
if _, ok := typeInfo.FieldByName(model.FieldDeletedAt); ok {
qs = qs.Filter(model.FieldDeletedAt, utils.DefaultTimeValue)
}
}
_, err = qs.All(item)
return err
}, reflect.TypeOf(item).Name())
return err
}
func UpdateEntityByKV(db *DaoDB, item interface{}, kvs map[string]interface{}, conditions map[string]interface{}) (num int64, err error) {
if db == nil {
db = GetDB()
}
err = utils.CallFuncLogError(func() error {
qs := db.db.QueryTable(item)
if conditions == nil {
qs = qs.Filter(model.FieldID, jxutils.GetObjFieldByName(item, model.FieldID))
} else {
for k, v := range conditions {
qs = qs.Filter(k, v)
}
}
num, err = qs.Update(kvs)
return err
}, reflect.TypeOf(item).Name())
return num, err
}
func UpdateEntityLogically(db *DaoDB, item interface{}, kvs map[string]interface{}, userName string, conditions map[string]interface{}) (num int64, err error) {
return UpdateEntityByKV(db, item, utils.MergeMaps(kvs, map[string]interface{}{
model.FieldUpdatedAt: time.Now(),
model.FieldLastOperator: userName,
}), utils.MergeMaps(conditions, map[string]interface{}{
model.FieldDeletedAt: utils.DefaultTimeValue,
}))
}
func DeleteEntityLogically(db *DaoDB, item interface{}, kvs map[string]interface{}, userName string, conditions map[string]interface{}) (num int64, err error) {
return UpdateEntityLogically(db, item, utils.MergeMaps(kvs, map[string]interface{}{
model.FieldDeletedAt: time.Now(),
}), userName, conditions)
}

View File

@@ -44,17 +44,26 @@ func TestGetPlaceByName(t *testing.T) {
func TestUpdateKV(t *testing.T) {
dummy := &model.Store{}
kvs := map[string]interface{}{
"status": 100,
"Tel1": "tel1",
"tEl2": "tel2",
"deliverY_Range_type": 15,
"status": 100,
"Tel1": "tel1",
"tEl2": "tel2",
"deliveryRangeType": 15,
}
cond := map[string]interface{}{
"id": 100002,
}
num, err := UpdateEntityByKV(nil, dummy, kvs, cond)
num, err := UpdateEntityLogically(nil, dummy, kvs, "autotest", cond)
if err != nil {
t.Fatal(err)
}
t.Log(num)
}
func TestWrapAddIDCULEntity(t *testing.T) {
dummy := &model.Store{}
WrapAddIDCULEntity(dummy, "autotest")
if dummy.LastOperator != "autotest" {
t.Fatal("last operator is not same")
}
t.Log(dummy)
}

View File

@@ -16,17 +16,17 @@ func NormalFilterMapByStructObject(mapData map[string]interface{}, obj interface
func NormalMakeMapByStructObject(mapData map[string]interface{}, obj interface{}, userName string) (retVal map[string]interface{}) {
retVal, _ = NormalFilterMapByStructObject(mapData, obj)
if len(retVal) > 0 {
WrapUpdateULEntity(retVal, userName)
}
// if len(retVal) > 0 {
// WrapUpdateULEntity(retVal, userName)
// }
return retVal
}
func NormalMakeMapByFieldList(mapData map[string]interface{}, fields []string, userName string) (retVal map[string]interface{}) {
retVal, _ = jxutils.FilterMapByFieldList(mapData, fields)
if len(retVal) > 0 {
WrapUpdateULEntity(retVal, userName)
}
// if len(retVal) > 0 {
// WrapUpdateULEntity(retVal, userName)
// }
return retVal
}

View File

@@ -112,9 +112,9 @@ func init() {
}
type Store struct {
ModelIDCUL
ModelIDCULD
Name string `orm:"size(255);unique" json:"name"`
Name string `orm:"size(255)" json:"name"`
CityCode int `orm:"default(0);null" json:"cityCode"` // todo ?
DistrictCode int `orm:"default(0);null" json:"districtCode"` // todo ?
Address string `orm:"size(255)" json:"address"`
@@ -133,8 +133,14 @@ type Store struct {
DeliveryType int8 `orm:"-" json:"-"`
}
func (*Store) TableUnique() [][]string {
return [][]string{
[]string{"Name", "DeletedAt"},
}
}
type StoreSub struct {
ModelIDCUL
ModelIDCULD
StoreID int `orm:"column(store_id)"`
Index int // 子店序号为0表示主店
@@ -148,12 +154,12 @@ type StoreSub struct {
func (*StoreSub) TableUnique() [][]string {
return [][]string{
[]string{"StoreID", "Index"},
[]string{"StoreID", "Index", "DeletedAt"},
}
}
type StoreMap struct {
ModelIDCUL
ModelIDCULD
StoreID int `orm:"column(store_id)" json:"storeID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
@@ -170,13 +176,13 @@ type StoreMap struct {
func (*StoreMap) TableUnique() [][]string {
return [][]string{
[]string{"StoreID", "VendorID"},
[]string{"VendorStoreID", "VendorID"},
[]string{"StoreID", "VendorID", "DeletedAt"},
[]string{"VendorStoreID", "VendorID", "DeletedAt"},
}
}
type StoreCourierMap struct {
ModelIDCUL
ModelIDCULD
StoreID int `orm:"column(store_id)"`
VendorID int `orm:"column(vendor_id)"`
@@ -186,7 +192,7 @@ type StoreCourierMap struct {
func (*StoreCourierMap) TableUnique() [][]string {
return [][]string{
[]string{"StoreID", "VendorID"},
[]string{"VendorStoreID", "VendorID"},
[]string{"StoreID", "VendorID", "DeletedAt"},
[]string{"VendorStoreID", "VendorID", "DeletedAt"},
}
}

View File

@@ -109,7 +109,9 @@ func (p *PurchaseHandler) UpdateStore(storeID int, userName string) (err error)
}
// globals.SugarLogger.Debug(utils.Format4Output(params, false))
if globals.EnableStoreWrite {
err = api.EbaiAPI.ShopUpdate(params)
if err = api.EbaiAPI.ShopUpdate(params); err == nil {
// todo 设置 shop_id
}
}
}
return err

View File

@@ -26,6 +26,7 @@ type tJdStoreInfo struct {
JdStoreStatus int
VendorStoreID string `orm:"column(vendor_store_id)"`
RealLastOperator string
SyncStatus int
}
func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) {
@@ -82,15 +83,22 @@ func (p *PurchaseHandler) UpdateStore(storeID int, userName string) (err error)
var store tJdStoreInfo
sql := `
SELECT t1.*, city.jd_code jd_city_code, district.jd_code jd_district_code, t2.status jd_store_status, t2.vendor_store_id,
IF(t1.updated_at > t2.updated_at, t1.last_operator, t2.last_operator) real_last_operator
IF(t1.updated_at > t2.updated_at, t1.last_operator, t2.last_operator) real_last_operator, t2.sync_status
FROM store t1
JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ?
LEFT JOIN place city ON t1.city_code = city.code
LEFT JOIN place district ON t1.district_code = district.code
WHERE t1.id = ?`
WHERE t1.id = ?
ORDER BY t2.updated_at DESC
LIMIT 1;
`
if err = dao.GetRow(db, &store, sql, model.VendorIDJD, storeID); err == nil {
outSystemID := ""
if store.SyncStatus&model.SyncFlagDeletedMask == 0 {
outSystemID = utils.Int2Str(int(store.ID))
}
params := map[string]interface{}{
"outSystemId": utils.Int2Str(int(store.ID)), // todo 直接修改这个字段可能会有问题
"outSystemId": outSystemID, // todo 直接修改这个字段可能会有问题
"stationName": jxutils.ComposeStoreName(store.Name, partner.StoreNameSeparator, VendorStorePrefix),
"stationAddress": store.Address,
"serviceTimeStart1": JxOperationTime2JdOperationTime(store.OpenTime1),

View File

@@ -30,7 +30,7 @@ func Init() {
if globals.EnableStore {
orm.RegisterModel(&model.Place{})
orm.RegisterModel(&model.Store{}, &model.StoreSub{}, &model.StoreMap{})
orm.RegisterModel(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}, &model.StoreCourierMap{})
orm.RegisterModel(&model.SkuVendorCategory{}, &model.StoreSkuCategoryMap{}, &model.SkuName{}, &model.Sku{}, &model.SkuNamePlaceBind{}, &model.StoreSkuBind{})
// db.Set("gorm:table_options", "CHARSET=utf8mb4").AutoMigrate(&model.SkuCategory{})
orm.RegisterModel(&model.SkuCategory{})