288 lines
8.4 KiB
Go
288 lines
8.4 KiB
Go
package cms
|
||
|
||
import (
|
||
"fmt"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
|
||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/mobile"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/msg"
|
||
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
"git.rosy.net.cn/jx-callback/globals/api"
|
||
"github.com/qiniu/api.v7/storage"
|
||
)
|
||
|
||
const (
|
||
qiniuTokenExpires = 300 // 七牛TOKEN有效时间,5分钟
|
||
|
||
SendMsgTypeOpenStoreRequest = "openStoreRequest"
|
||
)
|
||
|
||
var (
|
||
serviceInfo map[string]interface{}
|
||
allowUpdatePlaceFieldsMap = map[string]bool{
|
||
"name": true,
|
||
"enabled": true,
|
||
"mtpsPrice": true,
|
||
}
|
||
|
||
receiveMsgUsersMap = map[string][]string{
|
||
SendMsgTypeOpenStoreRequest: []string{
|
||
// "石峰",
|
||
"徐建华",
|
||
"周扬",
|
||
},
|
||
}
|
||
)
|
||
|
||
func InitServiceInfo(version string, buildTime time.Time, gitCommit string) {
|
||
buildTimeStr := ""
|
||
if !utils.IsTimeZero(buildTime) {
|
||
buildTimeStr = utils.Time2Str(buildTime)
|
||
}
|
||
serviceInfo = map[string]interface{}{
|
||
"startupTime": utils.Time2Str(time.Now()),
|
||
"version": version,
|
||
"buildTime": buildTimeStr,
|
||
"gitCommit": gitCommit,
|
||
"metaData": map[string]interface{}{
|
||
"skuNamePrefix": model.SkuNamePrefixNames,
|
||
"skuNameUnit": model.UnitNames,
|
||
"skuSpecUnit": model.SpecUnitNames,
|
||
"skuStatus": model.SkuStatusName,
|
||
"storeDeliveryRangeType": model.DeliveryRangeTypeName,
|
||
"storeDeliveryType": model.DeliveryTypeName,
|
||
"storeStatus": model.StoreStatusName,
|
||
"categoryType": model.CategoryTypeName,
|
||
"vendorName": model.VendorChineseNames,
|
||
"orderStatus": model.OrderStatusName,
|
||
"waybillStatus": model.WaybillStatusName,
|
||
"bankName": model.BankName,
|
||
"promotionStatusName": model.PromotionStatusName,
|
||
"orderTypeName": model.OrderTypeName,
|
||
"taskStatusName": tasksch.TaskStatusName,
|
||
"opRequestTypeName": model.RequestTypeName,
|
||
"opRequestStatusName": model.RequestStatusName,
|
||
"storeMsgSendStatusName": model.StoreMsgSendStatusName,
|
||
"shopChineseNames": model.ShopChineseNames,
|
||
"printerVendorInfo": model.PrinterVendorInfo,
|
||
"purchaseVendorInfo": model.PurchaseVendorInfo,
|
||
"afsReasonTypeName": model.AfsReasonTypeName,
|
||
"afsAppealTypeName": model.AfsAppealTypeName,
|
||
"actTypeName": model.ActTypeName,
|
||
"actStatusName": model.ActStatusName,
|
||
"actCreateTypeName": model.ActCreateTypeName,
|
||
},
|
||
}
|
||
Init()
|
||
}
|
||
|
||
func GetServiceInfo(ctx *jxcontext.Context) interface{} {
|
||
return serviceInfo
|
||
}
|
||
|
||
func GetQiniuUploadToken(ctx *jxcontext.Context, suffix, hashCode string) (upTokenInfo map[string]interface{}, err error) {
|
||
imgURL := ""
|
||
if hashCode != "" {
|
||
db := dao.GetDB()
|
||
if skuName, err := dao.GetSkuNameByHashCode(db, hashCode); err == nil {
|
||
imgURL = skuName.Img
|
||
}
|
||
}
|
||
|
||
putPolicy := storage.PutPolicy{
|
||
Scope: globals.QiniuBucket,
|
||
Expires: qiniuTokenExpires,
|
||
}
|
||
upTokenInfo = map[string]interface{}{
|
||
"token": putPolicy.UploadToken(api.QiniuAPI),
|
||
"expires": putPolicy.Expires,
|
||
"fileName": jxutils.GenPicFileName(suffix),
|
||
"hit": imgURL != "",
|
||
"img": imgURL,
|
||
}
|
||
return upTokenInfo, err
|
||
}
|
||
|
||
func GetPlaces(ctx *jxcontext.Context, keyword string, includeDisabled bool, params map[string]interface{}) ([]*model.Place, error) {
|
||
sql := `
|
||
SELECT *
|
||
FROM place t1
|
||
WHERE 1 = 1
|
||
`
|
||
if !includeDisabled {
|
||
sql += " AND enabled = 1"
|
||
}
|
||
sqlParams := make([]interface{}, 0)
|
||
if keyword != "" {
|
||
sql += " AND (t1.name LIKE ?"
|
||
sqlParams = append(sqlParams, "%"+keyword+"%")
|
||
if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil {
|
||
sql += " OR t1.code = ?"
|
||
sqlParams = append(sqlParams, keywordInt64)
|
||
}
|
||
sql += ")"
|
||
}
|
||
if params["parentCode"] != nil {
|
||
sql += " AND t1.parent_code = ?"
|
||
sqlParams = append(sqlParams, params["parentCode"])
|
||
}
|
||
if params["level"] != nil {
|
||
sql += " AND t1.level = ?"
|
||
sqlParams = append(sqlParams, params["level"])
|
||
}
|
||
sql += " ORDER BY t1.level, t1.name"
|
||
// globals.SugarLogger.Debug(sql)
|
||
places := []*model.Place{}
|
||
return places, dao.GetRows(nil, &places, sql, sqlParams)
|
||
}
|
||
|
||
func UpdatePlaces(ctx *jxcontext.Context, places []map[string]interface{}, userName string) (num int64, err error) {
|
||
if len(places) == 0 {
|
||
return 0, ErrMissingInput
|
||
}
|
||
updateFields := []string{}
|
||
for k := range places[0] {
|
||
if allowUpdatePlaceFieldsMap[k] {
|
||
updateFields = append(updateFields, k)
|
||
}
|
||
}
|
||
for _, place := range places {
|
||
if place["code"] == nil {
|
||
return 0, ErrMissingInput
|
||
}
|
||
placeid := &model.Place{}
|
||
valid := dao.NormalMakeMapByFieldList(place, updateFields, userName)
|
||
if num, err = dao.UpdateEntityLogically(nil, placeid, valid, userName, utils.Params2Map("Code", place["code"])); err != nil {
|
||
return num, err
|
||
}
|
||
}
|
||
return num, err
|
||
}
|
||
|
||
func UpdatePlace(ctx *jxcontext.Context, placeCode int, payload map[string]interface{}, userName string) (num int64, err error) {
|
||
payload["code"] = placeCode
|
||
return UpdatePlaces(ctx, []map[string]interface{}{payload}, userName)
|
||
}
|
||
|
||
func GetCoordinateDistrictCode(ctx *jxcontext.Context, lng, lat float64) (code int, err error) {
|
||
return api.AutonaviAPI.GetCoordinateDistrictCode(lng, lat), nil
|
||
}
|
||
|
||
func SendMsg2Somebody(ctx *jxcontext.Context, mobileNum, verifyCode, msgType, msgContent string) (err error) {
|
||
if _, err = mobile.AutherObj.VerifySecret(mobileNum, verifyCode); err != nil {
|
||
return err
|
||
}
|
||
db := dao.GetDB()
|
||
for _, v := range receiveMsgUsersMap[msgType] {
|
||
user, err2 := dao.GetUserByID(db, "name", v)
|
||
if err2 == nil {
|
||
msg.SendUserMessage(user.GetID(), msgType, msgContent)
|
||
} else if err == nil {
|
||
err = err2
|
||
}
|
||
}
|
||
return err
|
||
}
|
||
|
||
func checkConfig(configType, value string) (err error) {
|
||
switch configType {
|
||
case model.ConfigTypePricePack:
|
||
if value != "" {
|
||
pricePack := dao.PricePercentagePack2Obj(value)
|
||
if pricePack == nil {
|
||
err = fmt.Errorf("配置:%s不合法", value)
|
||
}
|
||
}
|
||
default:
|
||
err = fmt.Errorf("当前只支持价格包配置:%s", model.ConfigTypePricePack)
|
||
}
|
||
return
|
||
}
|
||
|
||
func AddConfig(ctx *jxcontext.Context, key, configType, value string) (err error) {
|
||
if err = checkConfig(configType, value); err != nil {
|
||
return err
|
||
}
|
||
|
||
db := dao.GetDB()
|
||
conf := &model.NewConfig{
|
||
Key: key,
|
||
Type: configType,
|
||
Value: value,
|
||
}
|
||
dao.WrapAddIDCULDEntity(conf, ctx.GetUserName())
|
||
return dao.CreateEntity(db, conf)
|
||
}
|
||
|
||
func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
|
||
if err = checkConfig(configType, ""); err != nil {
|
||
return err
|
||
}
|
||
db := dao.GetDB()
|
||
storeMapList, err := dao.GetStoresMapList(db, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if len(storeMapList) > 0 {
|
||
var storeInfo []string
|
||
for _, v := range storeMapList {
|
||
storeInfo = append(storeInfo, fmt.Sprintf("门店:%d, 平台:%s", v.StoreID, model.VendorChineseNames[v.VendorID]))
|
||
}
|
||
return fmt.Errorf("还有门店在使用价格包:%s,门店信息:%s", key, strings.Join(storeInfo, ","))
|
||
}
|
||
_, err = dao.DeleteEntityLogically(db, &model.NewConfig{}, nil, ctx.GetUserName(), map[string]interface{}{
|
||
"Key": key,
|
||
"Type": configType,
|
||
})
|
||
return err
|
||
}
|
||
|
||
func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (err error) {
|
||
if err = checkConfig(configType, value); err != nil {
|
||
return err
|
||
}
|
||
|
||
db := dao.GetDB()
|
||
configList, err := dao.QueryConfigs(db, key, configType, "")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
storeMapList, err := dao.GetStoresMapList(db, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil || err != nil {
|
||
dao.Rollback(db)
|
||
if r != nil {
|
||
panic(r)
|
||
}
|
||
}
|
||
}()
|
||
if _, err = dao.UpdateEntityLogically(db, configList[0], map[string]interface{}{
|
||
"Value": value,
|
||
}, ctx.GetUserName(), nil); err != nil {
|
||
return err
|
||
}
|
||
for _, v := range storeMapList {
|
||
if _, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, &model.StoreSkuBind{}, nil, ctx.GetUserName(), map[string]interface{}{
|
||
model.FieldStoreID: v.StoreID,
|
||
}, dao.GetSyncStatusStructField(model.VendorNames[v.VendorID]), model.SyncFlagPriceMask); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
dao.Commit(db)
|
||
return err
|
||
}
|