Files
jx-callback/business/jxstore/cms/store.go
2018-09-16 12:55:23 +08:00

318 lines
10 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package cms
import (
"errors"
"strconv"
"strings"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
)
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("没有有效的输入参数")
ErrCanNotFindVendor = 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{}
valid := dao.NormalMakeMapByFieldList(place, []string{"jdCode", "enabled", "mtpsPrice"}, userName)
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)
}
// todo 门店绑定信息可以考虑以数组形式返回,而不是现在这样
func GetStores(keyword string, params map[string]interface{}, offset, pageSize int) (retVal *StoresInfo, err error) {
sqlFrom := `
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
`
sqlWhere := `
WHERE
`
sqlParams := make([]interface{}, 0)
if keyword != "" {
keywordLike := "%" + keyword + "%"
sqlWhere += " (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 {
sqlWhere += " 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)
}
sqlWhere += ")"
} else {
sqlWhere += " 1 = 1"
}
if params["storeID"] != nil {
sqlWhere += " AND t1.id = ?"
sqlParams = append(sqlParams, params["storeID"].(int))
}
if params["name"] != nil {
sqlWhere += " 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 {
sqlWhere += " AND t1.city_code = ?"
} else {
sqlWhere += " AND t1.district_code = ?"
}
sqlParams = append(sqlParams, params["placeID"].(int))
}
if params["address"] != nil {
sqlWhere += " AND t1.address LIKE ?"
sqlParams = append(sqlParams, "%"+params["address"].(string)+"%")
}
if params["tel"] != nil {
sqlWhere += " AND (t1.tel1 LIKE ? OR t1.tel2 LIKE ?)"
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
if params["toStatus"] != nil {
toStatus = params["toStatus"].(int)
}
sqlWhere += " AND t1.status >= ? AND t1.status <= ?"
sqlParams = append(sqlParams, fromStatus, toStatus)
}
if vendorStoreCond := strings.ToUpper(utils.Interface2String(params["vendorStoreCond"])); vendorStoreCond == "AND" || vendorStoreCond == "OR" {
sqlVendorStoreCond := ""
if vendorStoreCond == "AND" {
sqlVendorStoreCond += " AND ( 1 = 1"
} else {
sqlVendorStoreCond += " 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 {
sqlVendorStoreCond += " " + vendorStoreCond + " " + tableName
}
if cond == -1 {
sqlVendorStoreCond += ".vendor_store_id IS NULL"
} else if cond == 1 {
sqlVendorStoreCond += ".vendor_store_id IS NOT NULL"
}
}
if sqlVendorStoreCond != " AND ( 1 = 0" {
sqlWhere += sqlVendorStoreCond + ")"
}
}
sql := "SELECT SQL_CALC_FOUND_ROWS 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" +
sqlFrom + sqlWhere + `
ORDER BY t1.id
LIMIT ? OFFSET ?`
if pageSize == 0 {
pageSize = model.DefPageSize
}
if offset < 0 {
offset = 0
}
sqlParams = append(sqlParams, pageSize, offset)
retVal = &StoresInfo{}
db := dao.GetDB()
dao.Begin(db)
if err = dao.GetRows(db, &retVal.Stores, sql, sqlParams...); err == nil {
countInfo := &struct{ Ct int }{}
if err = dao.GetRow(db, countInfo, "SELECT FOUND_ROWS() ct"); err == nil {
retVal.TotalCount = countInfo.Ct
}
}
dao.Commit(db)
return retVal, err
}
func GetVendorStore(vendorStoreID string, vendorID int) (retVal *StoreExt, err error) {
if handler := GetPurchaseHandler(vendorID); 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, ErrCanNotFindVendor
}
func UpdateStore(storeID int, payload map[string]interface{}, userName string) (num int64, err error) {
store := &model.Store{}
store.ID = storeID
valid := dao.NormalMakeMapByStructObject(payload, store, userName)
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)
}
}
}
}
return num, err
}
func CreateStore(store *model.Store, userName string) (id int, err error) {
dao.WrapAddIDCULEntity(store, userName)
if err = dao.CreateEntity(nil, store); err == nil {
return store.ID, nil
}
return 0, err
}
func GetStoreVendorMaps(db *dao.DaoDB, storeID int, vendorID int) (storeMaps []*model.StoreMap, err error) {
cond := map[string]interface{}{
model.FieldStoreID: storeID,
}
if vendorID != -1 {
cond[model.FieldVendorID] = vendorID
}
return storeMaps, dao.GetEntities(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)
storeMap.StoreID = storeID
storeMap.VendorID = vendorID
storeMap.DeliveryType = store.DeliveryType
storeMap.Status = store.Status
storeMap.SyncStatus = model.SyncFlagModifiedMask // 新增绑定门店是修改的概念
if err = dao.CreateEntity(db, storeMap); err == nil {
outStoreMap = storeMap
err = CurVendorSync.SyncStore(db, storeMap.VendorID, store, true, userName)
}
}
} else {
err = ErrCanNotFindVendor
}
return outStoreMap, err
}
func DeleteStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, userName string) (num int64, err error) {
storeMap := &model.StoreMap{
StoreID: storeID,
VendorID: vendorID,
}
return dao.DeleteEntity(db, storeMap, model.FieldStoreID, model.FieldVendorID)
}
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 != "" {
if handler := GetPurchaseHandler(vendorID); handler != nil {
jdStore, err2 := handler.ReadStore(vendorStoreID)
if err = err2; err == nil {
payload["deliveryType"] = jdStore.DeliveryType
}
} else {
err = ErrCanNotFindVendor
}
}
if err == nil {
dummyStoreMap := &model.StoreMap{}
valid := dao.NormalMakeMapByStructObject(payload, dummyStoreMap, userName)
if len(valid) > 0 {
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 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)
}
}
}
}
}
return num, err
}