Files
jx-callback/business/jxstore/cms/store.go
gazebo d8907cf010 - sku category man almost ok.
- mysql connect str add utf8mb4.
2018-09-09 20:43:48 +08:00

324 lines
10 KiB
Go

package cms
import (
"errors"
"strconv"
"strings"
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler/basesch"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
)
type StoreExt struct {
model.Store
CityName string `json:"cityName"`
DistrictName string `json:"districtName"`
JdID string `orm:"column(jd_id)" json:"jdID"`
ElmID string `orm:"column(elm_id)" json:"elmID"`
EbaiID string `orm:"column(ebai_id)" json:"ebaiID"`
}
type StoresInfo struct {
TotalCount int `json:"totalCount"`
Stores []*StoreExt `json:"stores"`
}
var (
ErrMissingInput = errors.New("没有有效的输入参数")
ErrCanNotVendor = errors.New("vendorID参数不合法")
)
func GetPlaces(parentCode int, vendorID int, includeDisabled bool) ([]*model.Place, error) {
db := dao.GetDB()
places := []*model.Place{}
sql := "SELECT * FROM place WHERE enabled = 1 "
if includeDisabled {
sql = "1 = 1 "
}
if vendorID >= 0 {
if vendorID == model.VendorIDJD {
return places, dao.GetRows(db, &places, sql+"AND jd_code <> 0 AND level >= 2")
}
return nil, ErrHaveNotImplementedYet
}
return places, dao.GetRows(db, &places, sql+"AND parent_code = ?", parentCode)
}
func UpdatePlaces(places []map[string]interface{}, userName string) (num int64, err error) {
if len(places) == 0 {
return 0, ErrMissingInput
}
for _, place := range places {
if place["code"] == nil {
return 0, ErrMissingInput
}
placeid := &model.Place{}
globals.SugarLogger.Debug(utils.Format4Output(place, false))
valid, _ := jxutils.FilterMapByFieldList(place, []string{"jdCode", "enabled", "mtpsPrice"})
valid["updatedAt"] = time.Now()
valid["lastOperator"] = userName
globals.SugarLogger.Debug(valid)
if num, err = dao.UpdateEntityByKV(nil, placeid, valid, utils.Params2Map("Code", place["code"])); err != nil {
return num, err
}
}
return num, err
}
func UpdatePlace(placeCode int, payload map[string]interface{}, userName string) (num int64, err error) {
payload["code"] = placeCode
return UpdatePlaces([]map[string]interface{}{payload}, userName)
}
func GetStores(keyword string, params map[string]interface{}, offset, pageSize int) (retVal *StoresInfo, err error) {
sql := `
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
WHERE`
sqlParams := make([]interface{}, 0)
if keyword != "" {
keywordLike := "%" + keyword + "%"
sql += " (t1.name LIKE ? OR t1.address LIKE ? OR t1.tel1 LIKE ? OR t1.tel2 LIKE ? OR t1.last_operator LIKE ? OR city.name LIKE ?"
sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike)
if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil {
sql += " OR t1.id = ? OR t1.city_code = ? OR t1.district_code = ? OR t1.lng = ? OR t1.lat = ?"
sqlParams = append(sqlParams, keywordInt64, keywordInt64, keywordInt64, keywordInt64, keywordInt64)
}
sql += ")"
} else {
sql += " 1 = 1"
}
if params["id"] != nil {
sql += " AND t1.id = ?"
sqlParams = append(sqlParams, params["id"].(int))
}
if params["name"] != nil {
sql += " AND t1.name LIKE ?"
sqlParams = append(sqlParams, "%"+params["name"].(string)+"%")
}
if params["placeID"] != nil {
level := 2
if params["placeLevel"] != nil {
level = params["placeLevel"].(int)
}
if level == 2 {
sql += " AND t1.city_code = ?"
} else {
sql += " AND t1.district_code = ?"
}
sqlParams = append(sqlParams, params["placeID"].(int))
}
if params["address"] != nil {
sql += " AND t1.address LIKE ?"
sqlParams = append(sqlParams, "%"+params["address"].(string)+"%")
}
if params["tel"] != nil {
sql += " AND (t1.tel1 LIKE ? OR t1.tel2 LIKE ?)"
sqlParams = append(sqlParams, "%"+params["tel"].(string)+"%")
sqlParams = append(sqlParams, "%"+params["tel"].(string)+"%")
}
if params["fromStatus"] != nil {
fromStatus := params["fromStatus"].(int)
toStatus := fromStatus
if params["toStatus"] != nil {
toStatus = params["toStatus"].(int)
}
sql += " AND t1.status >= ? AND t1.status <= ?"
sqlParams = append(sqlParams, fromStatus, toStatus)
}
if vendorStoreCond := strings.ToUpper(utils.Interface2String(params["vendorStoreCond"])); vendorStoreCond == "AND" || vendorStoreCond == "OR" {
if vendorStoreCond == "AND" {
sql += " AND ( 1 = 1"
} else {
sql += " AND ( 1 = 0"
}
condMap := map[string]int{
"jdm": utils.Interface2DirectIntWithDefault(params["jdCond"], 0),
"elmm": utils.Interface2DirectIntWithDefault(params["elmCond"], 0),
"ebaim": utils.Interface2DirectIntWithDefault(params["ebaiCond"], 0),
}
for tableName, cond := range condMap {
if cond != 0 {
sql += " " + vendorStoreCond + " " + tableName
}
if cond == -1 {
sql += ".vendor_store_id IS NULL"
} else if cond == 1 {
sql += ".vendor_store_id IS NOT NULL"
}
}
sql += ")"
}
sqlCount := "SELECT COUNT(*) ct\n" + sql
type tcount struct {
Ct int
}
countInfo := []tcount{}
db := dao.GetDB()
if err = dao.GetRows(db, &countInfo, sqlCount, sqlParams...); err == nil {
sqlData := "SELECT t1.*, city.name city_name, district.name district_name, jdm.vendor_store_id jd_id, elmm.vendor_store_id elm_id, ebaim.vendor_store_id ebai_id\n" + sql + `
ORDER BY id
LIMIT ? OFFSET ?`
if pageSize == 0 {
pageSize = model.DefPageSize
}
if offset < 0 {
offset = 0
}
sqlParams = append(sqlParams, pageSize, offset)
retVal := &StoresInfo{
TotalCount: countInfo[0].Ct,
}
err = dao.GetRows(db, &retVal.Stores, sqlData, sqlParams...)
return retVal, err
}
return nil, err
}
func GetVendorStore(vendorStoreID string, vendorID int) (retVal *StoreExt, err error) {
handler := basesch.FixedBaseScheduler.GetPurchasePlatformFromVendorID(vendorID)
if handler != nil {
result, err2 := handler.ReadStore(vendorStoreID)
if err = err2; err == nil {
retVal = &StoreExt{
Store: *result,
}
db := dao.GetDB()
if city, err2 := dao.GetPlaceByCode(db, result.CityCode); err2 == nil {
retVal.CityName = city.Name
}
if district, err2 := dao.GetPlaceByCode(db, result.DistrictCode); err2 == nil {
retVal.DistrictName = district.Name
}
return retVal, nil
}
return nil, err
}
return nil, ErrCanNotVendor
}
func UpdateStore(storeID int, payload map[string]interface{}, userName string) (num int64, err error) {
store := &model.Store{}
store.ID = storeID
valid := jxutils.NormalMakeMapByStructObject(payload, store, userName)
db := dao.GetDB()
if num, err = dao.UpdateEntityByKV(db, store, valid, nil); err == nil {
dummy := &model.StoreMap{}
_, err2 := dao.UpdateEntityByKV(db, dummy, utils.Params2Map("SyncStatus", model.SyncFlagModifiedMask), utils.Params2Map("StoreID", store.ID))
if err = err2; err == nil {
if err = dao.GetEntity(db, store); err == nil {
err = SyncStore2Vendor(db, -1, store, false, userName)
}
}
}
return num, err
}
func CreateStore(store *model.Store, userName string) (id int, err error) {
store.ID = 0
store.LastOperator = userName
store.CreatedAt = time.Now()
store.UpdatedAt = store.CreatedAt
if err = dao.CreateEntity(nil, store); err == nil {
return store.ID, nil
}
return 0, err
}
func SyncStore2Vendor(db *dao.DaoDB, vendorID int, store *model.Store, isForce bool, userName string) (err error) {
if db == nil {
db = dao.GetDB()
}
storeMaps, err := GetStoreVendorMaps(db, store.ID, -1)
if err == nil {
// globals.SugarLogger.Debug(utils.Format4Output(store, false))
copiedStore := *store
for _, storeMap := range storeMaps {
if (vendorID == -1 || storeMap.VendorID == vendorID) && (isForce || storeMap.SyncStatus != 0) {
copiedStore.Status = mergeStoreStatus(store.Status, storeMap.Status)
if err = GetPurchaseHandler(storeMap.VendorID).UpdateStore(storeMap.VendorStoreID, &copiedStore, userName); err == nil {
storeMap.SyncStatus = 0
dao.UpdateEntity(db, storeMap, "SyncStatus")
}
}
}
}
return err
}
func GetStoreVendorMaps(db *dao.DaoDB, storeID int, vendorID int) (storeMaps []*model.StoreMap, err error) {
if vendorID == -1 {
err = dao.GetRows(db, &storeMaps, "SELECT * FROM store_map WHERE store_id = ?", storeID)
} else {
err = dao.GetRows(db, &storeMaps, "SELECT * FROM store_map WHERE store_id = ? AND vendor_id = ?", storeID, vendorID)
}
return storeMaps, err
}
func AddStoreVendorMap(db *dao.DaoDB, storeMap *model.StoreMap, userName string) (outStoreMap *model.StoreMap, err error) {
store, err := GetPurchaseHandler(storeMap.VendorID).ReadStore(storeMap.VendorStoreID)
if err == nil {
storeMap.DeliveryType = store.DeliveryType
storeMap.Status = store.Status
outStoreMap = storeMap
if err = dao.CreateEntity(db, storeMap); err == nil {
}
}
return outStoreMap, err
}
func DeleteStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, userName string) (num int64, err error) {
storeMap := &model.StoreMap{}
return dao.DeleteEntity(db, storeMap, utils.Params2Map("StoreID", storeID, "VendorID", vendorID))
}
func UpdateStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, payload map[string]interface{}, userName string) (num int64, err error) {
if db == nil {
db = dao.GetDB()
}
if vendorStoreID := utils.Interface2String(payload["vendorStoreID"]); vendorStoreID != "" {
jdStore, err2 := GetPurchaseHandler(vendorID).ReadStore(vendorStoreID)
if err = err2; err == nil {
payload["deliveryType"] = jdStore.DeliveryType
}
}
if err == nil {
dummyStoreMap := &model.StoreMap{}
valid := jxutils.NormalMakeMapByStructObject(payload, dummyStoreMap, userName)
if valid["status"] != nil {
valid["SyncStatus"] = model.SyncFlagModifiedMask
}
globals.SugarLogger.Debug(utils.Format4Output(valid, false))
if num, err = dao.UpdateEntityByKV(db, dummyStoreMap, valid, utils.Params2Map("StoreID", storeID, "VendorID", vendorID)); err == nil {
if valid["status"] != nil {
store := &model.Store{}
store.ID = storeID
if err = dao.GetEntity(db, store); err == nil {
err = SyncStore2Vendor(db, vendorID, store, true, userName)
}
}
}
}
return num, err
}
// 合并得到最终的门店状态
func mergeStoreStatus(status int, vendorStatus int) int {
if status < vendorStatus {
return status
}
return vendorStatus
}