package dao import ( "sort" "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) // 带购物平台信息的 type StoreDetail struct { model.Store VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"` VendorStatus int `json:"vendor_status"` // 取值同Store.Status DeliveryFee int `json:"deliveryFee"` SyncStatus int8 `orm:"default(2)" json:"syncStatus"` PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格 PricePercentagePackStr string `orm:"size(4096)" json:"-"` // PricePercentagePackObj model.PricePercentagePack `orm:"-" json:"-"` AutoPickup int8 `orm:"default(1)" json:"autoPickup"` // 是否自动拣货 DeliveryType int8 `orm:"default(0)" json:"deliveryType"` // 配送类型 DeliveryCompetition int8 `orm:"default(1)" json:"deliveryCompetition"` // 是否支持配送竞争 IsSync int8 `orm:"default(1)" json:"isSync"` // 是否同步 DistrictName string `json:"districtName"` CityName string `json:"cityName"` } // 带快递门店信息的 type StoreDetail2 struct { model.Store VendorID int `orm:"column(vendor_id)" json:"vendorID"` VendorStoreID string `orm:"column(vendor_store_id)" json:"vendorStoreID"` // 这个其实是京西快递门店ID的概念 CourierStatus int `json:"courierStatus"` AuditStatus int `json:"auditStatus"` DistrictName string `json:"districtName"` CityName string `json:"cityName"` } func (s *StoreDetail) GetPricePerentage(price int) (pricePercentage int) { return pricePercentage } func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (storeDetail *StoreDetail, err error) { sql := ` SELECT t1.*, t2.vendor_store_id, t2.status vendor_status, t2.delivery_fee, t2.sync_status, t2.price_percentage, t3.value price_percentage_pack_str, t2.auto_pickup, t2.delivery_type, t2.delivery_competition, t2.is_sync, district.name district_name, city.name city_name FROM store t1 JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ? LEFT JOIN place city ON city.code = t1.city_code LEFT JOIN place district ON district.code = t1.district_code LEFT JOIN new_config t3 ON t3.key = t2.price_percentage_pack AND t3.type = ? AND t3.deleted_at = ? WHERE t1.deleted_at = ? ` sqlParams := []interface{}{ vendorID, utils.DefaultTimeValue, model.ConfigTypePricePack, utils.DefaultTimeValue, utils.DefaultTimeValue, } if storeID > 0 { sql += " AND t1.id = ?" sqlParams = append(sqlParams, storeID) } if vendorStoreID != "" { sql += " AND t2.vendor_store_id = ?" sqlParams = append(sqlParams, vendorStoreID) } storeDetail = &StoreDetail{} if err = GetRow(db, storeDetail, sql, sqlParams...); err == nil { storeDetail.PricePercentagePackObj = PricePercentagePack2Obj(storeDetail.PricePercentagePackStr) return storeDetail, nil } return nil, err } func GetStoreDetail(db *DaoDB, storeID, vendorID int) (storeDetail *StoreDetail, err error) { return getStoreDetail(db, storeID, vendorID, "") } func GetStoreDetailByVendorStoreID(db *DaoDB, vendorStoreID string, vendorID int) (storeDetail *StoreDetail, err error) { return getStoreDetail(db, 0, vendorID, vendorStoreID) } func GetPossibleStoresByPlaceName(db *DaoDB, cityName, provinceName string) (storeList []*StoreDetail, err error) { sqlList := []string{ ` SELECT t1.*, t5.vendor_store_id FROM store t1 JOIN place t2 ON t2.code = t1.city_code AND t2.name = ? LEFT JOIN store_map t5 ON t1.id = t5.store_id AND t5.vendor_id = ? AND t5.deleted_at = ? WHERE t1.status = ? AND (SELECT COUNT(*) FROM store_map t10 WHERE t10.store_id = t1.id AND t10.deleted_at = '1970-01-01 00:00:00' AND t10.status <> ?) > 0 `, ` SELECT t1.*, t5.vendor_store_id FROM store t1 JOIN place t2 ON t2.code = t1.city_code JOIN place t3 ON t3.code = t2.parent_code AND t3.name = ? LEFT JOIN store_map t5 ON t1.id = t5.store_id AND t5.vendor_id = ? AND t5.deleted_at = ? WHERE t1.status = ? AND (SELECT COUNT(*) FROM store_map t10 WHERE t10.store_id = t1.id AND t10.deleted_at = '1970-01-01 00:00:00' AND t10.status <> ?) > 0 `, ` SELECT t1.*, t5.vendor_store_id FROM store t1 LEFT JOIN store_map t5 ON t1.id = t5.store_id AND t5.vendor_id = ? AND t5.deleted_at = ? WHERE t1.status = ? AND (SELECT COUNT(*) FROM store_map t10 WHERE t10.store_id = t1.id AND t10.deleted_at = '1970-01-01 00:00:00' AND t10.status <> ?) > 0 `, } sqlParamsList := [][]interface{}{ []interface{}{ cityName, model.VendorIDWSC, utils.DefaultTimeValue, model.StoreStatusOpened, model.StoreStatusDisabled, }, []interface{}{ provinceName, model.VendorIDWSC, utils.DefaultTimeValue, model.StoreStatusOpened, model.StoreStatusDisabled, }, []interface{}{ model.VendorIDWSC, utils.DefaultTimeValue, model.StoreStatusOpened, model.StoreStatusDisabled, }, } for k := range sqlList { if err = GetRows(db, &storeList, sqlList[k], sqlParamsList[k]); err != nil { return nil, err } if len(storeList) > 0 { return storeList, nil } } // 正常是不应该达到这里的 return storeList, err } // 这个返回的地点信息是城市 func GetStoreDetail2(db *DaoDB, storeID int, vendorStoreID string, vendorID int) (storeDetail *StoreDetail2, err error) { sql := ` SELECT t1.*, city.name city_name, district.name district_name, t3.vendor_store_id, t3.vendor_id, t3.status courier_status, t3.audit_status FROM store t1 LEFT JOIN place city ON city.code = t1.city_code LEFT JOIN place district ON district.code = t1.district_code LEFT JOIN store_courier_map t3 ON t3.store_id = t1.id AND t3.vendor_id = ? AND t3.deleted_at = ? WHERE t1.deleted_at = ?` sqlParams := []interface{}{ vendorID, utils.DefaultTimeValue, utils.DefaultTimeValue, } if storeID != 0 { sql += " AND t1.id = ?" sqlParams = append(sqlParams, storeID) } if vendorStoreID != "" { sql += " AND t3.vendor_store_id = ?" sqlParams = append(sqlParams, vendorStoreID) } err = GetRow(db, &storeDetail, sql, sqlParams...) return storeDetail, err } func GetStoreCourierList(db *DaoDB, storeID, status int) (courierStoreList []*model.StoreCourierMap, err error) { sql := ` SELECT t1.* FROM store_courier_map t1 WHERE t1.deleted_at = ? AND t1.store_id = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, storeID, } if status != model.StoreStatusAll { sql += " AND t1.status = ?" sqlParams = append(sqlParams, status) } if err = GetRows(db, &courierStoreList, sql, sqlParams...); err == nil { return courierStoreList, nil } return nil, err } func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs []int, status, isSync int, pricePack string) (storeMapList []*model.StoreMap, err error) { sql := ` SELECT t1.* FROM store_map t1 WHERE t1.deleted_at = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, } if len(vendorIDs) > 0 { sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" sqlParams = append(sqlParams, vendorIDs) } if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if status != model.StoreStatusAll { sql += " AND t1.status = ?" sqlParams = append(sqlParams, status) } if isSync != model.StoreIsSyncAll { sql += " AND t1.is_sync = ?" sqlParams = append(sqlParams, isSync) } if pricePack != "" { sql += " AND t1.price_percentage_pack = ?" sqlParams = append(sqlParams, pricePack) } sql += " ORDER BY t1.store_id DESC, t1.vendor_id" if err = GetRows(db, &storeMapList, sql, sqlParams...); err == nil { return storeMapList, nil } return nil, err } // 此函数在检测到一个门店的所有平台状态一样,且不为StoreStatusOpened时, // 将平台门店状态全部改为StoreStatusOpened,则把京西门店状态改为之前那个统一的平台门店状态 func FormalizeStoreStatus(db *DaoDB, storeID, storeStatus int) (err error) { sql := ` SELECT DISTINCT t1.status FROM store_map t1 WHERE t1.deleted_at = ? AND t1.store_id = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, storeID, } var statusList []int if err = GetRows(db, &statusList, sql, sqlParams...); err == nil { if len(statusList) == 1 { if statusList[0] != model.StoreStatusOpened { Begin(db) defer func() { if r := recover(); r != nil || err != nil { Rollback(db) if r != nil { panic(r) } } }() if storeStatus != statusList[0] { store := &model.Store{} store.ID = storeID if _, err = UpdateEntityLogically(db, store, map[string]interface{}{ model.FieldStatus: statusList[0], }, model.AdminName, nil); err != nil { return err } } if _, err = UpdateEntityLogically(db, &model.StoreMap{}, map[string]interface{}{ model.FieldStatus: model.StoreStatusOpened, }, model.AdminName, map[string]interface{}{ model.FieldStoreID: storeID, model.FieldDeletedAt: utils.DefaultTimeValue, }); err != nil { return err } Commit(db) } } } return err } func GetVendorStoreSnapshot(db *DaoDB, snapshotAt time.Time) (snapshotList []*model.VendorStoreSnapshot, err error) { sql := ` SELECT * FROM vendor_store_snapshot t1 WHERE t1.snapshot_at = ?` err = GetRows(db, &snapshotList, sql, snapshotAt) return snapshotList, err } func DeleteVendorStoreSnapshot(db *DaoDB, minSnapshotAt time.Time) (err error) { _, err = ExecuteSQL(db, ` DELETE t1 FROM vendor_store_snapshot t1 WHERE t1.snapshot_at < ? `, minSnapshotAt) return err } func GetRebindPrinterStoreList(db *DaoDB) (storeList []*model.Store, err error) { err = GetRows(db, &storeList, ` SELECT * FROM store t1 WHERE t1.deleted_at = ? AND printer_vendor_id >= ? AND printer_bind_info <> '' `, utils.DefaultTimeValue, model.VendorIDPrinterBegin) return storeList, err } func PricePercentagePack2Obj(packStr string) (obj model.PricePercentagePack) { if packStr != "" { if err := utils.UnmarshalUseNumber([]byte(packStr), &obj); err == nil { for _, v := range obj { if v.PricePercentage >= 500 || v.PricePercentage <= 80 { return nil } } sort.Sort(obj) } } return obj } func AddStoreCategoryMap(db *DaoDB, storeID, categoryID int, vendorID int, vendorCategoryID string, status int8, userName string) (err error) { storeCat := &model.StoreSkuCategoryMap{ StoreID: storeID, CategoryID: categoryID, MtwmSyncStatus: model.SyncFlagNewMask, EbaiSyncStatus: model.SyncFlagNewMask, WscSyncStatus: model.SyncFlagNewMask, } storeCat.DeletedAt = utils.DefaultTimeValue if err = GetEntity(db, storeCat, model.FieldStoreID, model.FieldCategoryID, model.FieldDeletedAt); err != nil && !IsNoRowsError(err) { return err } if vendorID == model.VendorIDMTWM { storeCat.MtwmID = vendorCategoryID storeCat.MtwmSyncStatus = status } else if vendorID == model.VendorIDEBAI || vendorID == model.VendorIDWSC { intVendorCategoryID := utils.Str2Int64WithDefault(vendorCategoryID, 0) if vendorID == model.VendorIDEBAI { storeCat.EbaiID = intVendorCategoryID storeCat.EbaiSyncStatus = status } else { storeCat.WscID = intVendorCategoryID storeCat.WscSyncStatus = status } } else { panic("unsupported vendor") } if storeCat.ID == 0 { WrapAddIDCULDEntity(storeCat, userName) if err = CreateEntity(db, storeCat); IsDuplicateError(err) { err = nil } } else { WrapUpdateULEntity(storeCat, userName) _, err = UpdateEntity(db, storeCat) } return err } func GetStoreMapByStoreID(db *DaoDB, storeID, vendorID int) (storeMap *model.StoreMap, err error) { if db == nil { db = GetDB() } storeMap = &model.StoreMap{ StoreID: storeID, VendorID: vendorID, } storeMap.DeletedAt = utils.DefaultTimeValue if err = GetEntity(db, storeMap, model.FieldStoreID, model.FieldVendorID, model.FieldDeletedAt); err != nil { if err != orm.ErrNoRows { globals.SugarLogger.Warnf("GetStoreMapByStoreID storeID:%d, vendorID:%d read storeMap failed with error:%v", storeID, vendorID, err) } return nil, err } return storeMap, nil } func FakeGetStoreMapByStoreID(db *DaoDB, storeID, vendorID int) (storeMap *model.StoreMap, err error) { vendorID2 := vendorID if vendorID == model.VendorIDWSC { vendorID2 = model.VendorIDJD // 微商城的属性以京东属性为准(以免再绑定) } if storeMap, err = GetStoreMapByStoreID(db, storeID, vendorID2); vendorID == model.VendorIDWSC && IsNoRowsError(err) { err = nil storeMap = &model.StoreMap{ StoreID: storeID, VendorID: vendorID2, Status: model.StoreStatusOpened, PricePercentage: 100, AutoPickup: 1, DeliveryType: model.StoreDeliveryTypeByStore, // DeliveryFee DeliveryCompetition: 1, IsSync: 1, } } return storeMap, err } func GetOpenedStoreCouriersByStoreID(db *DaoDB, storeID, vendorID int) (storeMaps []*model.StoreCourierMap, err error) { if db == nil { db = GetDB() } if err = utils.CallFuncLogError(func() error { sql := ` SELECT * FROM store_courier_map WHERE store_id = ? AND status = ? AND deleted_at = ? ` sqlParams := []interface{}{ storeID, model.StoreStatusOpened, utils.DefaultTimeValue, } if vendorID != -1 { sql += " AND vendor_id = ?" sqlParams = append(sqlParams, vendorID) } return GetRows(db, &storeMaps, sql, sqlParams...) }, "GetStoreCouriersByStoreID storeID:%d, vendorID:%d", storeID, vendorID); err != nil { return nil, err } return storeMaps, nil } func GetStoreList4Role(db *DaoDB, shortRoleName string) (storeList []*model.Store, err error) { sql := ` SELECT t1.* FROM store t1 WHERE t1.deleted_at = ? AND (t1.market_man_role = ? OR t1.operator_role = ?)` sqlParams := []interface{}{ utils.DefaultTimeValue, shortRoleName, shortRoleName, } err = GetRows(db, &storeList, sql, sqlParams...) return storeList, err }