1
This commit is contained in:
@@ -208,6 +208,25 @@ var (
|
||||
0: "休息",
|
||||
1: "营业",
|
||||
}
|
||||
|
||||
UnionOrderStatusName = map[int]string{
|
||||
UnionOrderStatusNew: "新订单",
|
||||
UnionOrderStatusPay: "用户已支付",
|
||||
UnionOrderStatusTakeOver: "用户已确认收货",
|
||||
UnionOrderStatusAuditOver: "已审核",
|
||||
UnionOrderStatusFinish: "已完成(已结算)",
|
||||
UnionOrderStatusFail: "已退款(结算失败)",
|
||||
}
|
||||
)
|
||||
|
||||
//联盟订单状态
|
||||
const (
|
||||
UnionOrderStatusNew = 10 //已领券?还未支付
|
||||
UnionOrderStatusPay = 15 //已支付
|
||||
UnionOrderStatusTakeOver = 20 //确认收货,已收到货
|
||||
UnionOrderStatusAuditOver = 25 //审核成功,待结算
|
||||
UnionOrderStatusFinish = 110 //已结算
|
||||
UnionOrderStatusFail = 115 //审核失败,结算失败
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
|
||||
func GetDataResource(db *DaoDB, hashCode, fullURL string) (dataRes *model.DataResource, err error) {
|
||||
sql := `
|
||||
SELECT t1.*
|
||||
FROM data_resource t1
|
||||
WHERE 0 = 1`
|
||||
sqlParams := []interface{}{}
|
||||
if hashCode != "" {
|
||||
sql += " OR t1.hash_code = ?"
|
||||
sqlParams = append(sqlParams, hashCode)
|
||||
}
|
||||
if fullURL != "" {
|
||||
sql += " OR t1.main_url = ? OR t1.qiniu_url = ? OR t1.ebai_url = ? OR t1.mtwm_url = ?"
|
||||
sqlParams = append(sqlParams, fullURL, fullURL, fullURL, fullURL)
|
||||
}
|
||||
err = GetRow(db, &dataRes, sql, sqlParams...)
|
||||
return dataRes, err
|
||||
}
|
||||
|
||||
func GetNeedUploadDataResource(db *DaoDB) (dataResList []*model.DataResource, err error) {
|
||||
sql := `
|
||||
SELECT t1.*
|
||||
FROM data_resource t1
|
||||
WHERE t1.use_type <> 0 AND (t1.ebai_url = '' OR t1.mtwm_url = '')`
|
||||
err = GetRows(db, &dataResList, sql)
|
||||
return dataResList, err
|
||||
}
|
||||
@@ -1,307 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"reflect"
|
||||
"runtime/debug"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"github.com/astaxie/beego/client/orm"
|
||||
)
|
||||
|
||||
const (
|
||||
useGetRowsWhenGetRow = true
|
||||
transactionWarningSeconds = 10 * 60 // 5分钟
|
||||
)
|
||||
|
||||
type DaoDB struct {
|
||||
transactionLevel int
|
||||
Db orm.Ormer
|
||||
|
||||
transactionWatchTimer *time.Timer
|
||||
beginTransactionStack []byte
|
||||
}
|
||||
|
||||
// func GetRows(db *gorm.DB, inPtr interface{}, sql string, values ...interface{}) (err error) {
|
||||
// if db == nil {
|
||||
// db = gormdb.GetDB()
|
||||
// }
|
||||
// topTypeInfo := reflect.TypeOf(inPtr)
|
||||
// if topTypeInfo.Kind() != reflect.Ptr {
|
||||
// panic("SelectEntities inPtr should be slice ptr (*[]Type)")
|
||||
// }
|
||||
// typeInfo := topTypeInfo.Elem()
|
||||
// if typeInfo.Kind() != reflect.Slice {
|
||||
// panic("SelectEntities inPtr should be slice ptr (*[]Type)")
|
||||
// }
|
||||
// elmType := typeInfo.Elem()
|
||||
|
||||
// valueInfo := reflect.ValueOf(inPtr)
|
||||
// rows, err := db.Raw(sql, values...).Rows()
|
||||
// if err == nil {
|
||||
// defer rows.Close()
|
||||
// for rows.Next() {
|
||||
// var value reflect.Value
|
||||
// if elmType.Kind() == reflect.Ptr {
|
||||
// value = reflect.New(elmType.Elem())
|
||||
// } else {
|
||||
// value = reflect.New(elmType)
|
||||
// }
|
||||
// db.ScanRows(rows, value.Interface())
|
||||
// if elmType.Kind() != reflect.Ptr {
|
||||
// value = value.Elem()
|
||||
// }
|
||||
// valueInfo.Elem().Set(reflect.Append(valueInfo.Elem(), value))
|
||||
// }
|
||||
// return nil
|
||||
// }
|
||||
// return err
|
||||
// }
|
||||
// beego orm的对于传代表字段的字串,数据库字段名(完全匹配,区分大小写),结构体字段名(不区分大小写)都可以
|
||||
|
||||
func GetDB() *DaoDB {
|
||||
return &DaoDB{Db: orm.NewOrm()}
|
||||
}
|
||||
|
||||
func Begin(db *DaoDB) (txDB orm.TxOrmer, err error) {
|
||||
if db.transactionLevel == 0 {
|
||||
txDB, err = db.Db.Begin()
|
||||
if err == nil {
|
||||
db.startWatchTransaction()
|
||||
}
|
||||
}
|
||||
db.transactionLevel++
|
||||
return txDB, err
|
||||
}
|
||||
|
||||
func (db *DaoDB) startWatchTransaction() {
|
||||
db.beginTransactionStack = debug.Stack()
|
||||
db.transactionWatchTimer = utils.AfterFuncWithRecover(transactionWarningSeconds*time.Second, func() {
|
||||
globals.SugarLogger.Warnf("Begin Transaction too long, %s", string(db.beginTransactionStack))
|
||||
db.transactionWatchTimer = nil
|
||||
db.beginTransactionStack = nil
|
||||
})
|
||||
}
|
||||
|
||||
func (db *DaoDB) stopWatchTransaction() {
|
||||
if db.transactionWatchTimer != nil {
|
||||
db.transactionWatchTimer.Stop()
|
||||
db.transactionWatchTimer = nil
|
||||
db.beginTransactionStack = nil
|
||||
}
|
||||
}
|
||||
|
||||
func Commit(db *DaoDB, txDB orm.TxOrmer) (err error) {
|
||||
if db.transactionLevel == 1 {
|
||||
db.stopWatchTransaction()
|
||||
err = txDB.Commit()
|
||||
//err = db.Db.Commit()
|
||||
db.transactionLevel = 0
|
||||
} else if db.transactionLevel > 1 {
|
||||
db.transactionLevel--
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func Rollback(db *DaoDB, txDB orm.TxOrmer) (err error) {
|
||||
if db.transactionLevel > 0 {
|
||||
db.stopWatchTransaction()
|
||||
err = txDB.Rollback()
|
||||
//err = db.Db.Rollback()
|
||||
}
|
||||
db.transactionLevel = 0
|
||||
return err
|
||||
}
|
||||
|
||||
func GetRow(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
if !useGetRowsWhenGetRow { // beego QueryRow有bug,嵌入的struct不能正常绑定
|
||||
err = db.Db.Raw(sql, values).QueryRow(inPtr)
|
||||
} else {
|
||||
typeInfo := reflect.TypeOf(inPtr)
|
||||
if typeInfo.Kind() != reflect.Ptr {
|
||||
return errors.New("inPtr must be ptr")
|
||||
}
|
||||
slice := reflect.New(reflect.SliceOf(typeInfo.Elem()))
|
||||
if err = GetRows(db, slice.Interface(), sql, values...); err == nil {
|
||||
slice = slice.Elem()
|
||||
if slice.Len() > 0 {
|
||||
reflect.ValueOf(inPtr).Elem().Set(slice.Index(0))
|
||||
} else {
|
||||
return orm.ErrNoRows
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func GetRowTx(txDB orm.TxOrmer, inPtr interface{}, sql string, values ...interface{}) (err error) {
|
||||
if txDB == nil {
|
||||
return
|
||||
}
|
||||
if !useGetRowsWhenGetRow { // beego QueryRow有bug,嵌入的struct不能正常绑定
|
||||
err = txDB.Raw(sql, values).QueryRow(inPtr)
|
||||
//err = db.Db.Raw(sql, values).QueryRow(inPtr)
|
||||
} else {
|
||||
typeInfo := reflect.TypeOf(inPtr)
|
||||
if typeInfo.Kind() != reflect.Ptr {
|
||||
return errors.New("inPtr must be ptr")
|
||||
}
|
||||
slice := reflect.New(reflect.SliceOf(typeInfo.Elem()))
|
||||
if err = GetRowsTx(txDB, slice.Interface(), sql, values...); err == nil {
|
||||
slice = slice.Elem()
|
||||
if slice.Len() > 0 {
|
||||
reflect.ValueOf(inPtr).Elem().Set(slice.Index(0))
|
||||
} else {
|
||||
return orm.ErrNoRows
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func GetRows(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
_, err = db.Db.Raw(sql, values).QueryRows(inPtr)
|
||||
return err
|
||||
}
|
||||
|
||||
func GetRowsTx(txDB orm.TxOrmer, inPtr interface{}, sql string, values ...interface{}) (err error) {
|
||||
if txDB == nil {
|
||||
return
|
||||
}
|
||||
_, err = txDB.Raw(sql, values).QueryRows(inPtr)
|
||||
//_, err = db.Db.Raw(sql, values).QueryRows(inPtr)
|
||||
return err
|
||||
}
|
||||
|
||||
func GetEntity(db *DaoDB, item interface{}, cols ...string) (err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
err = utils.CallFuncLogErrorIgnore(func() error {
|
||||
return db.Db.Read(item, cols...)
|
||||
}, reflect.TypeOf(item).Name(), orm.ErrNoRows)
|
||||
return err
|
||||
}
|
||||
|
||||
func UpdateEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
num, err = db.Db.Update(item, cols...)
|
||||
if err != nil && !IsDuplicateError(err) {
|
||||
globals.SugarLogger.Errorf("UpdateEntity %s failed with error:%v", reflect.TypeOf(item).Name(), err)
|
||||
}
|
||||
return num, err
|
||||
}
|
||||
|
||||
func CreateEntity(db *DaoDB, item interface{}) (err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
if _, err = db.Db.Insert(item); err != nil && !IsDuplicateError(err) {
|
||||
globals.SugarLogger.Errorf("CreateEntity %s failed with error:%v", reflect.TypeOf(item).Name(), err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func UpdateEntityTx(txDB orm.TxOrmer, item interface{}, cols ...string) (num int64, err error) {
|
||||
if txDB == nil {
|
||||
return
|
||||
}
|
||||
num, err = txDB.Update(item, cols...)
|
||||
if err != nil && !IsDuplicateError(err) {
|
||||
globals.SugarLogger.Errorf("UpdateEntity %s failed with error:%v", reflect.TypeOf(item).Name(), err)
|
||||
}
|
||||
return num, err
|
||||
}
|
||||
|
||||
func CreateEntityTx(txDB orm.TxOrmer, item interface{}) (err error) {
|
||||
if txDB == nil {
|
||||
return
|
||||
}
|
||||
if _, err = txDB.Insert(item); err != nil && !IsDuplicateError(err) {
|
||||
globals.SugarLogger.Errorf("CreateEntity %s failed with error:%v", reflect.TypeOf(item).Name(), err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// InsertMulti执行成功后ID不会改写成正确的(象Insert一样)
|
||||
func CreateMultiEntities(db *DaoDB, item interface{}) (err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
if _, err = db.Db.InsertMulti(20, item); err != nil && !IsDuplicateError(err) {
|
||||
globals.SugarLogger.Errorf("CreateEntity %s failed with error:%v", reflect.TypeOf(item).Name(), err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func CreateOrUpdate(db *DaoDB, item interface{}, colConflitAndArgs ...string) (err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
_, err = db.Db.InsertOrUpdate(item, colConflitAndArgs...)
|
||||
return err
|
||||
}
|
||||
|
||||
func DeleteEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
err = utils.CallFuncLogError(func() error {
|
||||
num, err = db.Db.Delete(item, cols...)
|
||||
return err
|
||||
}, reflect.TypeOf(item).Name())
|
||||
return num, err
|
||||
}
|
||||
|
||||
func DeleteEntityTx(txDB orm.TxOrmer, item interface{}, cols ...string) (num int64, err error) {
|
||||
if txDB == nil {
|
||||
return
|
||||
}
|
||||
err = utils.CallFuncLogError(func() error {
|
||||
num, err = txDB.Delete(item, cols...)
|
||||
//num, err = db.Db.Delete(item, cols...)
|
||||
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()
|
||||
}
|
||||
err = utils.CallFuncLogError(func() error {
|
||||
result, err2 := db.Db.Raw(sql, params...).Exec()
|
||||
if err2 == nil {
|
||||
num, _ = result.RowsAffected()
|
||||
}
|
||||
return err2
|
||||
}, sql)
|
||||
return num, err
|
||||
}
|
||||
|
||||
// 此函数要求db在事务中,否则可能导致取得到的是另一个连接的数据
|
||||
func GetLastTotalRowCount(db *DaoDB) int {
|
||||
countInfo := &struct{ Ct int }{}
|
||||
if err := GetRow(db, countInfo, "SELECT FOUND_ROWS() ct"); err == nil {
|
||||
return countInfo.Ct
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetLastTotalRowCountTx(txDB orm.TxOrmer) int {
|
||||
countInfo := &struct{ Ct int }{}
|
||||
if err := GetRowTx(txDB, countInfo, "SELECT FOUND_ROWS() ct"); err == nil {
|
||||
return countInfo.Ct
|
||||
}
|
||||
return 0
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
|
||||
func GetAuthBind(db *DaoDB, bindType int, authType, authID string) (authBind *model.AuthBind, err error) {
|
||||
if bindType == model.AuthBindTypeAll || authType == "" || authID == "" {
|
||||
return nil, errors.New("bindType不是能all, authType和authID都要有值")
|
||||
}
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM auth_bind t1
|
||||
WHERE t1.deleted_at = ? AND t1.status = ? AND t1.bind_type = ? AND t1.type = ? AND t1.auth_id = ?`
|
||||
sqlParams := []interface{}{
|
||||
utils.DefaultTimeValue,
|
||||
model.AuthBindStatusNormal,
|
||||
bindType,
|
||||
authType,
|
||||
authID,
|
||||
}
|
||||
// globals.SugarLogger.Debugf("GetAuthBind sql:%s, sqlParams:%s", sql, utils.Format4Output(sqlParams, false))
|
||||
err = GetRow(db, &authBind, sql, sqlParams...)
|
||||
return authBind, err
|
||||
}
|
||||
|
||||
func GetUserBindAuthInfo(db *DaoDB, userID string, bindType int, typeList []string, authID, authID2, typeID string) (authList []*model.AuthBind, err error) {
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM auth_bind t1
|
||||
WHERE t1.deleted_at = ? AND t1.status = ?`
|
||||
sqlParams := []interface{}{
|
||||
utils.DefaultTimeValue,
|
||||
model.UserStatusNormal,
|
||||
}
|
||||
if userID != "" {
|
||||
sql += " AND t1.user_id = ?"
|
||||
sqlParams = append(sqlParams, userID)
|
||||
}
|
||||
if bindType != model.AuthBindTypeAll {
|
||||
sql += " AND t1.bind_type = ?"
|
||||
sqlParams = append(sqlParams, bindType)
|
||||
}
|
||||
if len(typeList) > 0 {
|
||||
sql += " AND t1.type IN (" + GenQuestionMarks(len(typeList)) + ")"
|
||||
sqlParams = append(sqlParams, typeList)
|
||||
}
|
||||
if authID != "" {
|
||||
sql += " AND t1.auth_id = ?"
|
||||
sqlParams = append(sqlParams, authID)
|
||||
}
|
||||
if authID2 != "" {
|
||||
sql += " AND t1.auth_id2 = ?"
|
||||
sqlParams = append(sqlParams, authID2)
|
||||
}
|
||||
if typeID != "" {
|
||||
sql += " AND t1.type_id = ?"
|
||||
sqlParams = append(sqlParams, typeID)
|
||||
}
|
||||
sql += " ORDER BY t1.type"
|
||||
err = GetRows(db, &authList, sql, sqlParams...)
|
||||
return authList, err
|
||||
}
|
||||
@@ -1,161 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/refutil"
|
||||
)
|
||||
|
||||
type KVUpdateItem struct {
|
||||
Item interface{}
|
||||
KVs map[string]interface{}
|
||||
}
|
||||
|
||||
// 这里面的函数要求实体是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.Limit(-1).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()
|
||||
}
|
||||
qs := db.Db.QueryTable(item)
|
||||
if conditions == nil {
|
||||
qs = qs.Filter(model.FieldID, refutil.GetObjFieldByName(item, model.FieldID))
|
||||
} else {
|
||||
for k, v := range conditions {
|
||||
qs = qs.Filter(k, v)
|
||||
}
|
||||
}
|
||||
num, err = qs.Update(kvs)
|
||||
if err != nil && !IsDuplicateError(err) {
|
||||
globals.SugarLogger.Errorf("UpdateEntityByKV %s failed with error:%v", reflect.TypeOf(item).Name(), err)
|
||||
}
|
||||
return num, err
|
||||
}
|
||||
|
||||
func BatchUpdateEntityByKV(db *DaoDB, items []*KVUpdateItem) (num int64, err error) {
|
||||
if len(items) > 0 {
|
||||
// 不用事务应该是OK的吧,用事务经常会导致死锁(不同平台在同步同一条数据)
|
||||
// Begin(db)
|
||||
// defer func() {
|
||||
// if r := recover(); r != nil || err != nil {
|
||||
// Rollback(db)
|
||||
// if r != nil {
|
||||
// panic(r)
|
||||
// }
|
||||
// }
|
||||
// }()
|
||||
|
||||
var item *KVUpdateItem
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
if item != nil {
|
||||
var bindID int64
|
||||
value := refutil.CheckAndGetStructValue(item.Item).FieldByName(model.FieldID)
|
||||
if value.IsValid() {
|
||||
bindID = value.Int()
|
||||
}
|
||||
globals.SugarLogger.Debugf("BatchUpdateEntityByKV panic, bindID:%d, KVs:%s", bindID, utils.Format4Output(item.KVs, true))
|
||||
}
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
|
||||
for _, item = range items {
|
||||
num2, err2 := UpdateEntityByKV(db, item.Item, item.KVs, nil)
|
||||
if err = err2; err != nil {
|
||||
return 0, err
|
||||
}
|
||||
num += num2
|
||||
}
|
||||
// Commit(db)
|
||||
}
|
||||
return num, nil
|
||||
}
|
||||
|
||||
func UpdateEntityLogically(db *DaoDB, item interface{}, kvs map[string]interface{}, userName string, conditions map[string]interface{}) (num int64, err error) {
|
||||
if conditions != nil && refutil.IsFieldExist(item, model.FieldDeletedAt) {
|
||||
conditions = utils.MergeMaps(conditions, map[string]interface{}{
|
||||
model.FieldDeletedAt: utils.DefaultTimeValue,
|
||||
})
|
||||
}
|
||||
params := map[string]interface{}{
|
||||
model.FieldUpdatedAt: time.Now(),
|
||||
}
|
||||
if userName != "" {
|
||||
params[model.FieldLastOperator] = userName
|
||||
}
|
||||
return UpdateEntityByKV(db, item, utils.MergeMaps(kvs, params), conditions)
|
||||
}
|
||||
|
||||
// 此函数会更新同步标志
|
||||
func UpdateEntityLogicallyAndUpdateSyncStatus(db *DaoDB, item interface{}, kvs map[string]interface{}, userName string, conditions map[string]interface{}, syncStatusFieldName string, valueMask int) (num int64, err error) {
|
||||
if conditions != nil && refutil.IsFieldExist(item, model.FieldDeletedAt) {
|
||||
conditions = utils.MergeMaps(conditions, map[string]interface{}{
|
||||
model.FieldDeletedAt: utils.DefaultTimeValue,
|
||||
})
|
||||
} else {
|
||||
conditions = map[string]interface{}{
|
||||
model.FieldID: refutil.GetObjFieldByName(item, model.FieldID),
|
||||
}
|
||||
}
|
||||
typeInfo := reflect.TypeOf(item)
|
||||
valueRows := reflect.New(reflect.SliceOf(typeInfo))
|
||||
rows := valueRows.Interface()
|
||||
if err = GetEntitiesByKV(db, rows, conditions, false); err == nil {
|
||||
// globals.SugarLogger.Debug(utils.Format4Output(rows, false))
|
||||
valueRows = reflect.Indirect(valueRows)
|
||||
for i := 0; i < valueRows.Len(); i++ {
|
||||
value := reflect.Indirect(valueRows.Index(i))
|
||||
status := value.FieldByName(syncStatusFieldName).Int() | int64(valueMask)
|
||||
params := map[string]interface{}{
|
||||
model.FieldUpdatedAt: time.Now(),
|
||||
syncStatusFieldName: status,
|
||||
}
|
||||
if userName != "" {
|
||||
params[model.FieldLastOperator] = userName
|
||||
}
|
||||
num2, err2 := UpdateEntityByKV(db, value.Interface(), utils.MergeMaps(kvs, params), nil)
|
||||
if err = err2; err == nil {
|
||||
num += num2
|
||||
} else {
|
||||
return num, err
|
||||
}
|
||||
}
|
||||
}
|
||||
return num, err
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"github.com/astaxie/beego/client/orm"
|
||||
"github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
func IsDuplicateError(err error) bool {
|
||||
if mysqlErr, ok := err.(*mysql.MySQLError); ok {
|
||||
if mysqlErr.Number == 1062 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func IsNoRowsError(err error) bool {
|
||||
return err == orm.ErrNoRows
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
|
||||
// QueryUserPrinter 查询用户打印机
|
||||
func QueryUserPrinter(userId, printNo string) (*model.Printer, error) {
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM printer
|
||||
WHERE 1 = 1 AND deleted_at = ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
utils.DefaultTimeValue,
|
||||
}
|
||||
|
||||
if printNo != "" {
|
||||
sql += " AND print_no = ?"
|
||||
sqlParams = append(sqlParams, printNo)
|
||||
}
|
||||
if userId != "" {
|
||||
sql += " AND user_id = ?"
|
||||
sqlParams = append(sqlParams, userId)
|
||||
}
|
||||
var printer = &model.Printer{}
|
||||
err := GetRow(GetDB(), &printer, sql, sqlParams)
|
||||
return printer, err
|
||||
}
|
||||
|
||||
func GetPrinters(db *DaoDB, appID int, printNo string, status, statusNeq int) (printers []*model.Printer, err error) {
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM printer
|
||||
WHERE 1 = 1 AND deleted_at = ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
utils.DefaultTimeValue,
|
||||
}
|
||||
if appID != 0 {
|
||||
sql += " AND app_id = ?"
|
||||
sqlParams = append(sqlParams, appID)
|
||||
}
|
||||
if printNo != "" {
|
||||
sql += " AND print_no = ?"
|
||||
sqlParams = append(sqlParams, printNo)
|
||||
}
|
||||
if status != 0 {
|
||||
sql += " AND status = ?"
|
||||
sqlParams = append(sqlParams, status)
|
||||
}
|
||||
if statusNeq != 0 {
|
||||
sql += " AND status <> ?"
|
||||
sqlParams = append(sqlParams, statusNeq)
|
||||
}
|
||||
err = GetRows(db, &printers, sql, sqlParams)
|
||||
return printers, err
|
||||
}
|
||||
|
||||
func GetPrintMsgs(db *DaoDB, printNo, msgID string, status, statusNeq int) (printMsgs []*model.PrintMsg, err error) {
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM print_msg
|
||||
WHERE 1 = 1 AND deleted_at = ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
utils.DefaultTimeValue,
|
||||
}
|
||||
if status != model.PrintMsgAll {
|
||||
sql += " AND status = ?"
|
||||
sqlParams = append(sqlParams, status)
|
||||
}
|
||||
if statusNeq != model.PrintMsgAll {
|
||||
sql += " AND status <> ?"
|
||||
sqlParams = append(sqlParams, statusNeq)
|
||||
}
|
||||
if printNo != "" {
|
||||
sql += " AND print_no = ?"
|
||||
sqlParams = append(sqlParams, printNo)
|
||||
}
|
||||
if msgID != "" {
|
||||
sql += " AND msg_id = ?"
|
||||
sqlParams = append(sqlParams, msgID)
|
||||
}
|
||||
err = GetRows(db, &printMsgs, sql, sqlParams)
|
||||
return printMsgs, err
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
)
|
||||
|
||||
func TestGetUsers(t *testing.T) {
|
||||
userList, _, err := GetUsers(GetDB(), 0, "", nil, nil, []string{"18180948107"}, 0, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(utils.Format4Output(userList, false))
|
||||
}
|
||||
@@ -1,214 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/globals/refutil"
|
||||
)
|
||||
|
||||
func IDCULDFilterMapByStructObject(mapData map[string]interface{}, obj interface{}, isCheckValue bool) (valid map[string]interface{}, invalid map[string]interface{}) {
|
||||
// 这里必须用首字母小写,因为是用于访问map,是需要完全匹配的
|
||||
return refutil.FilterMapByStructObject(mapData, obj, nil, []string{"id", "createdAt", "updatedAt", "finishedAt", "deletedAt", "syncStatus", "lastOperator"}, isCheckValue)
|
||||
}
|
||||
|
||||
func NormalMakeMapByStructObject(mapData map[string]interface{}, obj interface{}, userName string) (retVal map[string]interface{}) {
|
||||
retVal, _ = IDCULDFilterMapByStructObject(mapData, obj, false)
|
||||
return retVal
|
||||
}
|
||||
|
||||
func StrictMakeMapByStructObject(mapData map[string]interface{}, obj interface{}, userName string) (retVal map[string]interface{}) {
|
||||
retVal, _ = IDCULDFilterMapByStructObject(mapData, obj, true)
|
||||
return retVal
|
||||
}
|
||||
|
||||
func IDCULDFilterMapByStructObject2(mapData map[string]interface{}, obj interface{}, objPtr interface{}, isCheckValue bool) (valid map[string]interface{}, invalid map[string]interface{}) {
|
||||
return refutil.FilterMapByStructObject(mapData, obj, objPtr, []string{"id", "createdAt", "updatedAt", "finishedAt", "deletedAt", "syncStatus", "lastOperator"}, isCheckValue)
|
||||
}
|
||||
|
||||
//根据传进来的objPtr去修改它的值
|
||||
func StrictMakeMapByStructObject2(mapData map[string]interface{}, obj interface{}, objPtr interface{}, userName string) (retVal map[string]interface{}) {
|
||||
retVal, _ = IDCULDFilterMapByStructObject2(mapData, obj, objPtr, true)
|
||||
return retVal
|
||||
}
|
||||
|
||||
func NormalMakeMapByFieldList(mapData map[string]interface{}, fields []string, userName string) (retVal map[string]interface{}) {
|
||||
retVal, _ = refutil.FilterMapByFieldList(mapData, fields)
|
||||
return retVal
|
||||
}
|
||||
|
||||
func WrapAddIDCULEntity(item interface{}, lastOperator string) interface{} {
|
||||
now := time.Now()
|
||||
if mapData, ok := item.(map[string]interface{}); ok {
|
||||
mapData[model.FieldID] = 0
|
||||
mapData[model.FieldCreatedAt] = now
|
||||
mapData[model.FieldUpdatedAt] = now
|
||||
mapData[model.FieldLastOperator] = lastOperator
|
||||
} else {
|
||||
value := refutil.CheckAndGetStructValue(item)
|
||||
nowValue := reflect.ValueOf(now)
|
||||
value.FieldByName(model.FieldID).SetInt(0)
|
||||
value.FieldByName(model.FieldCreatedAt).Set(nowValue)
|
||||
value.FieldByName(model.FieldUpdatedAt).Set(nowValue)
|
||||
value.FieldByName(model.FieldLastOperator).SetString(lastOperator)
|
||||
}
|
||||
return item
|
||||
}
|
||||
|
||||
func WrapAddIDCULDEntity(item interface{}, lastOperator string) interface{} {
|
||||
if mapData, ok := item.(map[string]interface{}); ok {
|
||||
mapData[model.FieldDeletedAt] = utils.DefaultTimeValue
|
||||
} else {
|
||||
value := refutil.CheckAndGetStructValue(item)
|
||||
value.FieldByName(model.FieldDeletedAt).Set(reflect.ValueOf(utils.DefaultTimeValue))
|
||||
}
|
||||
return WrapAddIDCULEntity(item, lastOperator)
|
||||
}
|
||||
|
||||
func WrapUpdateULEntity(item interface{}, lastOperator string) interface{} {
|
||||
now := time.Now()
|
||||
if mapData, ok := item.(map[string]interface{}); ok {
|
||||
mapData[model.FieldUpdatedAt] = now
|
||||
mapData[model.FieldLastOperator] = lastOperator
|
||||
} else {
|
||||
value := refutil.CheckAndGetStructValue(item)
|
||||
nowValue := reflect.ValueOf(now)
|
||||
value.FieldByName(model.FieldUpdatedAt).Set(nowValue)
|
||||
value.FieldByName(model.FieldLastOperator).SetString(lastOperator)
|
||||
}
|
||||
return item
|
||||
}
|
||||
|
||||
func GenQuestionMarks(count int) (marks string) {
|
||||
if count > 0 {
|
||||
if count == 1 {
|
||||
marks = "?"
|
||||
} else {
|
||||
builder := &strings.Builder{}
|
||||
builder.Grow(1 + (count-1)*3)
|
||||
builder.WriteString("?")
|
||||
for i := 1; i < count; i++ {
|
||||
builder.WriteString(", ?")
|
||||
}
|
||||
marks = builder.String()
|
||||
}
|
||||
}
|
||||
return marks
|
||||
}
|
||||
|
||||
func ConvertStructFieldPrefix(prefix string) string {
|
||||
return prefix
|
||||
}
|
||||
|
||||
func ConvertJsonFieldPrefix(prefix string) string {
|
||||
return strings.ToLower(prefix)
|
||||
}
|
||||
|
||||
func ConvertDBFieldPrefix(prefix string) string {
|
||||
return strings.ToLower(prefix)
|
||||
}
|
||||
|
||||
func GetVendorThingIDStructField(prefix string) string {
|
||||
return ConvertStructFieldPrefix(prefix) + "ID"
|
||||
}
|
||||
|
||||
func GetVendorThingIDJsonField(prefix string) string {
|
||||
return ConvertJsonFieldPrefix(prefix) + "ID"
|
||||
}
|
||||
|
||||
func GetVendorThingIDDBField(prefix string) string {
|
||||
return ConvertDBFieldPrefix(prefix) + "_id"
|
||||
}
|
||||
|
||||
func GetSyncStatusStructField(prefix string) string {
|
||||
return ConvertStructFieldPrefix(prefix) + "SyncStatus"
|
||||
}
|
||||
|
||||
func GetSyncStatusJsonField(prefix string) string {
|
||||
return ConvertJsonFieldPrefix(prefix) + "SyncStatus"
|
||||
}
|
||||
|
||||
func GetSyncStatusDBField(prefix string) string {
|
||||
return ConvertDBFieldPrefix(prefix) + "_sync_status"
|
||||
}
|
||||
|
||||
func GetVendorPriceStructField(prefix string) string {
|
||||
return ConvertStructFieldPrefix(prefix) + "Price"
|
||||
}
|
||||
|
||||
func GetVendorPriceJsonField(prefix string) string {
|
||||
return ConvertJsonFieldPrefix(prefix) + "Price"
|
||||
}
|
||||
|
||||
func GetVendorPriceDBField(prefix string) string {
|
||||
return ConvertDBFieldPrefix(prefix) + "_price"
|
||||
}
|
||||
|
||||
func GetCategoryIDStructField(prefix string) string {
|
||||
return ConvertStructFieldPrefix(prefix) + "CategoryID"
|
||||
}
|
||||
|
||||
func GetCategoryIDJsonField(prefix string) string {
|
||||
return ConvertJsonFieldPrefix(prefix) + "CategoryID"
|
||||
}
|
||||
|
||||
func GetCategoryIDDBField(prefix string) string {
|
||||
return ConvertDBFieldPrefix(prefix) + "_category_id"
|
||||
}
|
||||
|
||||
func GetVendorLockTimeStructField(prefix string) string {
|
||||
return ConvertStructFieldPrefix(prefix) + "LockTime"
|
||||
}
|
||||
|
||||
func value2Value(srcValue, dstValue reflect.Value, copyType int) {
|
||||
srcType := srcValue.Type()
|
||||
for i := 0; i < srcType.NumField(); i++ {
|
||||
fieldName := srcType.Field(i).Name
|
||||
if dstFieldvalue := dstValue.FieldByName(fieldName); dstFieldvalue.IsValid() {
|
||||
srcFieldValue := srcValue.FieldByName(fieldName)
|
||||
if false { //dstFieldvalue.Kind() == reflect.Struct {
|
||||
fmt.Printf("%v, %v\n", utils.Format4Output(srcFieldValue.Interface(), false), utils.Format4Output(dstFieldvalue.Interface(), false))
|
||||
value2Value(srcFieldValue, dstFieldvalue, copyType)
|
||||
} else {
|
||||
// fmt.Printf("%v, %v\n", srcFieldValue.Interface(), dstFieldvalue.Interface())
|
||||
dstFieldvalue.Set(srcFieldValue)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// func copyBetweenNoramAndNullObj(src, dst interface{}, copyType int) {
|
||||
// dstValue := reflect.ValueOf(dst)
|
||||
// if dstValue.Kind() != reflect.Ptr {
|
||||
// panic("ObjNormal2Null dst must be ptr of struct")
|
||||
// }
|
||||
// srcValue := reflect.ValueOf(src)
|
||||
// if srcValue.Kind() == reflect.Ptr {
|
||||
// srcValue = srcValue.Elem()
|
||||
// }
|
||||
// value2Value(srcValue, dstValue.Elem(), copyType)
|
||||
// }
|
||||
|
||||
// func ObjNormal2Null(src, dst interface{}) {
|
||||
// copyBetweenNoramAndNullObj(src, dst, 1)
|
||||
// }
|
||||
|
||||
// func ObjNull2Normal(src, dst interface{}) {
|
||||
// copyBetweenNoramAndNullObj(src, dst, 2)
|
||||
// }
|
||||
|
||||
func IsVendorThingIDEmpty(vendorThingID string) bool {
|
||||
return vendorThingID == "" || vendorThingID == "0"
|
||||
}
|
||||
|
||||
func GetAuthType4Vendor(vendorID int) (authType string) {
|
||||
authType = ConvertJsonFieldPrefix(model.VendorNames[vendorID])
|
||||
if authType != "" {
|
||||
authType = "vendor." + authType
|
||||
}
|
||||
return authType
|
||||
}
|
||||
@@ -1,272 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
|
||||
type OperateEventExt struct {
|
||||
model.OperateEvent
|
||||
Detail []*model.OperateEventDetail `json:"detail"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
func DeleteOperateEventDetail(db *DaoDB, deleteTime time.Time) (err error) {
|
||||
sql := `
|
||||
DELETE FROM a
|
||||
USING operate_event_detail a,operate_event b
|
||||
WHERE a.access_uuid = b.access_uuid
|
||||
AND b.created_at < ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
deleteTime,
|
||||
}
|
||||
_, err = ExecuteSQL(db, sql, sqlParams...)
|
||||
return err
|
||||
}
|
||||
|
||||
func DeleteOperateEvent(db *DaoDB, deleteTime time.Time) (err error) {
|
||||
sql := `
|
||||
DELETE FROM operate_event
|
||||
WHERE created_at < ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
deleteTime,
|
||||
}
|
||||
_, err = ExecuteSQL(db, sql, sqlParams...)
|
||||
return err
|
||||
}
|
||||
|
||||
func GetOperateEvents(db *DaoDB, name string, apiFunctions []string, operateTypes, skuIDs, storeIDs []int, fromTime, toTime time.Time, keyword string, errType, offset, pageSize int) (operateEventExt []*OperateEventExt, totalCount int, err error) {
|
||||
sql := `
|
||||
SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*, c.name
|
||||
FROM operate_event a
|
||||
`
|
||||
if len(operateTypes) > 0 || len(skuIDs) > 0 || len(storeIDs) > 0 || keyword != "" {
|
||||
sql += " LEFT JOIN operate_event_detail b ON a.access_uuid = b.access_uuid"
|
||||
}
|
||||
sql += `
|
||||
LEFT JOIN user c ON c.user_id = a.user_id
|
||||
WHERE 1=1
|
||||
`
|
||||
sqlParams := []interface{}{}
|
||||
if errType == 1 {
|
||||
sql += " AND a.err_msg = ''"
|
||||
}
|
||||
if errType == -1 {
|
||||
sql += " AND a.err_msg <> ''"
|
||||
}
|
||||
if name != "" {
|
||||
sql += " AND c.name LIKE ?"
|
||||
sqlParams = append(sqlParams, "%"+name+"%")
|
||||
}
|
||||
if !utils.IsTimeZero(fromTime) {
|
||||
sql += " AND a.created_at >= ?"
|
||||
sqlParams = append(sqlParams, fromTime)
|
||||
}
|
||||
if !utils.IsTimeZero(toTime) {
|
||||
sql += " AND a.created_at <= ?"
|
||||
sqlParams = append(sqlParams, toTime)
|
||||
}
|
||||
if len(apiFunctions) > 0 {
|
||||
sql += " AND a.api_function IN (" + GenQuestionMarks(len(apiFunctions)) + ")"
|
||||
sqlParams = append(sqlParams, apiFunctions)
|
||||
}
|
||||
if len(operateTypes) > 0 {
|
||||
sql += " AND b.operate_type IN (" + GenQuestionMarks(len(operateTypes)) + ")"
|
||||
sqlParams = append(sqlParams, operateTypes)
|
||||
}
|
||||
if len(skuIDs) > 0 {
|
||||
sql += " AND b.thing_id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
|
||||
sqlParams = append(sqlParams, skuIDs)
|
||||
}
|
||||
if len(storeIDs) > 0 {
|
||||
sql += " AND b.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||
sqlParams = append(sqlParams, storeIDs)
|
||||
}
|
||||
if keyword != "" {
|
||||
sql += " AND ("
|
||||
var apiList []string
|
||||
for k, v := range model.ApiFunctionName {
|
||||
if strings.Contains(v, keyword) {
|
||||
apiList = append(apiList, k)
|
||||
}
|
||||
}
|
||||
if len(apiList) > 0 {
|
||||
sql += "a.api_function IN (" + GenQuestionMarks(len(apiList)) + ") OR"
|
||||
sqlParams = append(sqlParams, apiList)
|
||||
}
|
||||
sql += " a.err_msg LIKE ? OR b.thing_id LIKE ? OR b.store_id LIKE ? OR c.name LIKE ? OR a.user_id LIKE ?)"
|
||||
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
|
||||
}
|
||||
sql += `
|
||||
ORDER BY a.created_at DESC
|
||||
LIMIT ? OFFSET ?
|
||||
`
|
||||
sqlParams = append(sqlParams, pageSize, offset)
|
||||
txDB, _ := Begin(db)
|
||||
defer Commit(db, txDB)
|
||||
if err = GetRowsTx(txDB, &operateEventExt, sql, sqlParams...); err == nil {
|
||||
totalCount = GetLastTotalRowCountTx(txDB)
|
||||
}
|
||||
var (
|
||||
accessUUidList []string
|
||||
details []*model.OperateEventDetail
|
||||
detailMap = make(map[string][]*model.OperateEventDetail)
|
||||
)
|
||||
for _, v := range operateEventExt {
|
||||
accessUUidList = append(accessUUidList, v.AccessUUID)
|
||||
}
|
||||
if len(accessUUidList) == 0 {
|
||||
return operateEventExt, totalCount, err
|
||||
}
|
||||
sql2 := `
|
||||
SELECT *
|
||||
FROM operate_event_detail
|
||||
WHERE access_uuid IN (` + GenQuestionMarks(len(accessUUidList)) + `)
|
||||
`
|
||||
sqlParams2 := []interface{}{accessUUidList}
|
||||
err = GetRows(db, &details, sql2, sqlParams2...)
|
||||
for _, v := range details {
|
||||
detailMap[v.AccessUUID] = append(detailMap[v.AccessUUID], v)
|
||||
}
|
||||
for _, v := range operateEventExt {
|
||||
if detailMap[v.AccessUUID] != nil {
|
||||
v.Detail = detailMap[v.AccessUUID]
|
||||
}
|
||||
}
|
||||
return operateEventExt, totalCount, err
|
||||
}
|
||||
|
||||
type GetMessageGroupsResult struct {
|
||||
model.MessageGroup
|
||||
Avatar string `json:"avatar"`
|
||||
LastMessageType int `json:"lastMessageType"`
|
||||
LastContent string `json:"lastContent"`
|
||||
LastTime time.Time `json:"lastTime"`
|
||||
LastUserName string `json:"lastUserName"`
|
||||
UserName string `json:"userName"`
|
||||
UnReadMessageCount int `json:"unReadMessageCount"`
|
||||
MessageGroupMembers []*GetMessageGroupsMemberResult `json:"messageGroupMembers"`
|
||||
}
|
||||
|
||||
type GetMessageGroupsMemberResult struct {
|
||||
model.User
|
||||
model.MessageGroupMember
|
||||
}
|
||||
|
||||
func GetMessageGroups(db *DaoDB, userID string, groupID, groupType int, isMember bool, userID2 string) (messageGroupsResult []*GetMessageGroupsResult, err error) {
|
||||
sql := `
|
||||
SELECT a.*, b.name user_name, b.avatar
|
||||
FROM message_group a
|
||||
LEFT JOIN user b ON b.user_id = a.user_id
|
||||
WHERE a.deleted_at = ?
|
||||
`
|
||||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
||||
if userID != "" {
|
||||
sql += " AND a.user_id = ?"
|
||||
sqlParams = append(sqlParams, userID)
|
||||
}
|
||||
if groupType != 0 {
|
||||
sql += " AND a.type = ?"
|
||||
sqlParams = append(sqlParams, groupType)
|
||||
}
|
||||
if groupID != 0 {
|
||||
sql += " AND a.group_id LIKE ?"
|
||||
sqlParams = append(sqlParams, utils.Int2Str(groupID)+"%")
|
||||
}
|
||||
if err = GetRows(db, &messageGroupsResult, sql, sqlParams); err == nil {
|
||||
if isMember {
|
||||
for _, v := range messageGroupsResult {
|
||||
var messageGroupMembers []*GetMessageGroupsMemberResult
|
||||
sql2 := `
|
||||
SELECT a.*, b.*
|
||||
FROM message_group_member a
|
||||
LEFT JOIN user b ON b.user_id = a.member_user_id
|
||||
WHERE a.group_id = ?
|
||||
AND a.deleted_at = ?
|
||||
`
|
||||
sqlParams2 := []interface{}{v.GroupID, utils.DefaultTimeValue}
|
||||
if userID2 != "" {
|
||||
sql2 += ` AND member_user_id = ?`
|
||||
sqlParams2 = append(sqlParams2, userID2)
|
||||
}
|
||||
if err = GetRows(db, &messageGroupMembers, sql2, sqlParams2); err == nil {
|
||||
v.MessageGroupMembers = messageGroupMembers
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return messageGroupsResult, err
|
||||
}
|
||||
|
||||
func GetMessageGroupMembers(db *DaoDB, groupID, groupType int, memberUserID string) (messageGroupMembers []*model.MessageGroupMember, err error) {
|
||||
sqlParams := []interface{}{}
|
||||
sql := `
|
||||
SELECT a.*
|
||||
FROM message_group_member a
|
||||
`
|
||||
if groupType != 0 {
|
||||
sql += ` JOIN message_group b ON b.group_id = a.group_id AND b.type = ? AND b.deleted_at = ?`
|
||||
sqlParams = append(sqlParams, groupType, utils.DefaultTimeValue)
|
||||
}
|
||||
sql += `
|
||||
WHERE a.deleted_at = ?
|
||||
`
|
||||
sqlParams = append(sqlParams, utils.DefaultTimeValue)
|
||||
if groupID != 0 {
|
||||
sql += " AND a.group_id = ?"
|
||||
sqlParams = append(sqlParams, groupID)
|
||||
}
|
||||
if memberUserID != "" {
|
||||
sql += " AND a.member_user_id = ?"
|
||||
sqlParams = append(sqlParams, memberUserID)
|
||||
}
|
||||
err = GetRows(db, &messageGroupMembers, sql, sqlParams)
|
||||
return messageGroupMembers, err
|
||||
}
|
||||
|
||||
//得到某个用户所在所有群组
|
||||
func GetUserMessageGroups(db *DaoDB, userID string) (messageGroup []*model.MessageGroup, err error) {
|
||||
sql := `
|
||||
SELECT group_id
|
||||
FROM message_group
|
||||
WHERE deleted_at = ? AND user_id = ?
|
||||
UNION
|
||||
SELECT group_id
|
||||
FROM message_group_member
|
||||
WHERE deleted_at = ? AND member_user_id = ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
utils.DefaultTimeValue, userID,
|
||||
utils.DefaultTimeValue, userID,
|
||||
}
|
||||
err = GetRows(db, &messageGroup, sql, sqlParams)
|
||||
messageGroup = append(messageGroup, &model.MessageGroup{
|
||||
GroupID: model.SysGroupID,
|
||||
})
|
||||
return messageGroup, err
|
||||
}
|
||||
|
||||
func GetMessageGroupRead(db *DaoDB, userID string, groupID int) (messageGroupReads []*model.MessageGroupRead, err error) {
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM message_group_read a
|
||||
WHERE 1 = 1
|
||||
`
|
||||
sqlParams := []interface{}{}
|
||||
if userID != "" {
|
||||
sql += ` AND a.user_id = ?`
|
||||
sqlParams = append(sqlParams, userID)
|
||||
}
|
||||
if groupID != 0 {
|
||||
sql += ` AND a.group_id = ?`
|
||||
sqlParams = append(sqlParams, groupID)
|
||||
}
|
||||
err = GetRows(db, &messageGroupReads, sql, sqlParams...)
|
||||
return messageGroupReads, err
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils/errlist"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
|
||||
func QueryConfigs(db *DaoDB, key, configType, keyword string) (configList []*model.NewConfig, err error) {
|
||||
sql := `
|
||||
SELECT
|
||||
t1.*
|
||||
FROM new_config t1
|
||||
WHERE t1.deleted_at = ?`
|
||||
sqlParams := []interface{}{
|
||||
utils.DefaultTimeValue,
|
||||
}
|
||||
if key != "" {
|
||||
sql += " AND t1.key = ?"
|
||||
sqlParams = append(sqlParams, key)
|
||||
}
|
||||
if configType != "" {
|
||||
sql += " AND t1.type = ?"
|
||||
sqlParams = append(sqlParams, configType)
|
||||
}
|
||||
if keyword != "" {
|
||||
keywordLike := "%" + keyword + "%"
|
||||
sql += " AND (t1.type LIKE ? OR t1.key LIKE ? OR value LIKE ?)"
|
||||
sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike)
|
||||
}
|
||||
|
||||
err = GetRows(db, &configList, sql, sqlParams...)
|
||||
if err == nil && len(configList) == 0 && key != "" {
|
||||
err = fmt.Errorf("条件:key:%s,type:%s,keyword:%s不能找到配置", key, configType, keyword)
|
||||
}
|
||||
return configList, err
|
||||
}
|
||||
|
||||
func ValidateRoles(db *DaoDB, roles ...string) (err error) {
|
||||
errList := errlist.New()
|
||||
for _, v := range roles {
|
||||
if v != "" {
|
||||
_, err2 := QueryConfigs(db, v, model.ConfigTypeRole, "")
|
||||
errList.AddErr(err2)
|
||||
}
|
||||
}
|
||||
return errList.GetErrListAsOne()
|
||||
}
|
||||
|
||||
func GetSysConfigAsInt64(db *DaoDB, key string) (value int64, err error) {
|
||||
configList, err := QueryConfigs(db, key, model.ConfigTypeSys, "")
|
||||
if err == nil && len(configList) > 0 {
|
||||
value = utils.Str2Int64WithDefault(configList[0].Value, 0)
|
||||
} else if true { //IsNoRowsError(err) { // todo 暂时忽略所有错误
|
||||
err = nil
|
||||
}
|
||||
return value, err
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"github.com/astaxie/beego/client/orm"
|
||||
)
|
||||
|
||||
const (
|
||||
EnableCondAll = 0
|
||||
EnableCondEnalbed = 1
|
||||
EnableCondDisabled = 2
|
||||
)
|
||||
|
||||
func GetPlaceByCode(db *DaoDB, code int) (place *model.Place, err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
place = &model.Place{
|
||||
Code: code,
|
||||
}
|
||||
err = GetEntity(db, place, "Code")
|
||||
return place, err
|
||||
}
|
||||
|
||||
func GetPlacesByCond(db *DaoDB, enableCond int) (placeList []*model.Place, err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM place
|
||||
WHERE level = 2
|
||||
`
|
||||
if enableCond == EnableCondEnalbed {
|
||||
sql += " AND enabled = 1"
|
||||
} else if enableCond == EnableCondDisabled {
|
||||
sql += " AND enabled = 0"
|
||||
}
|
||||
sql += " ORDER BY code"
|
||||
err = GetRows(db, &placeList, sql)
|
||||
return placeList, err
|
||||
}
|
||||
|
||||
func GetPlaceByName(db *DaoDB, name string, level int, parentCode int) (place *model.Place, err error) {
|
||||
if db == nil {
|
||||
db = GetDB()
|
||||
}
|
||||
cols := []string{
|
||||
"Name",
|
||||
"Level",
|
||||
}
|
||||
place = &model.Place{
|
||||
Name: name,
|
||||
Level: int8(level),
|
||||
}
|
||||
if parentCode != 0 {
|
||||
cols = append(cols, "ParentCode")
|
||||
place.ParentCode = parentCode
|
||||
|
||||
}
|
||||
if err = GetEntity(db, place, cols...); err == orm.ErrNoRows {
|
||||
err = db.Db.Raw("SELECT * FROM place WHERE parent_code = ? AND level = ? AND name LIKE ?", parentCode, level, "%"+name+"%").QueryRow(place)
|
||||
}
|
||||
return place, err
|
||||
}
|
||||
@@ -2,9 +2,6 @@ package model
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -94,26 +91,6 @@ type ShopPickingVoice struct {
|
||||
WaitPickingVoice int `json:"wait_picking_voice"` // 待拣货语音[1打开]
|
||||
}
|
||||
|
||||
func GetPrintSetting(printNo string) (*PrintSettingObj, error) {
|
||||
sql := ` SELECT * FROM print_setting WHERE print_no = ? and deleted_at = ? `
|
||||
sqlParams := []interface{}{
|
||||
printNo,
|
||||
utils.DefaultTimeValue,
|
||||
}
|
||||
|
||||
var printSetting *PrintSetting
|
||||
if err := dao.GetRows(dao.GetDB(), &printSetting, sql, sqlParams...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if printSetting == nil {
|
||||
return nil, errors.New("数据查询异常")
|
||||
}
|
||||
|
||||
return UnMarshalString2Json(printSetting)
|
||||
}
|
||||
|
||||
// 将打印机设置转换一下
|
||||
|
||||
// UnMarshalString2Json 将字符串设置转换为对象设置
|
||||
func UnMarshalString2Json(param *PrintSetting) (*PrintSettingObj, error) {
|
||||
var (
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -51,26 +49,3 @@ const (
|
||||
SettingOpen = 1 // 开启
|
||||
SettingClose = -1 // 关闭
|
||||
)
|
||||
|
||||
// SelectUserDefaultTemp 查询用户默认模板
|
||||
func SelectUserDefaultTemp(userId string, tempType string) (*SystemTemp, bool, error) {
|
||||
var result *SystemTemp
|
||||
if err := dao.GetRow(dao.GetDB(), &result, `SELECT * FROM system_temp WHERE user_id = ? AND temp_type = ? AND is_use = ? AND deleted_at = ? ORDER BY created_at desc `, []interface{}{userId, tempType, 1, utils.DefaultTimeValue}...); err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
return result, true, nil
|
||||
}
|
||||
|
||||
// QuerySystemTemp 查询系统模板
|
||||
func QuerySystemTemp() ([]*SystemTemp, error) {
|
||||
var result []*SystemTemp
|
||||
if err := dao.GetRows(dao.GetDB(), &result, `SELECT * FROM system_temp WHERE user_id = ? ORDER BY created_at desc `, []interface{}{"system_user"}...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// AddTemp 添加模板数据
|
||||
func AddTemp(param *SystemTemp) error {
|
||||
return dao.CreateEntity(dao.GetDB(), param)
|
||||
}
|
||||
|
||||
@@ -1,438 +0,0 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var SystemTempObj map[string]*SystemTemp
|
||||
|
||||
func init() {
|
||||
SystemTempObj = make(map[string]*SystemTemp, 0)
|
||||
sysTempList, err := QuerySystemTemp()
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debug("query system temp err :", err)
|
||||
return
|
||||
}
|
||||
if len(sysTempList) <= 0 {
|
||||
globals.SugarLogger.Debug("query system temp err :", "system temp don't have")
|
||||
// 不存在系统模板,初始化系统模板
|
||||
//InitSystemTemp()
|
||||
}
|
||||
temp := make(map[string]*SystemTemp, 0)
|
||||
for _, v := range sysTempList {
|
||||
temp[v.TempSize] = v
|
||||
SystemTempObj[v.TempSize] = v
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
param := &SystemTemp{
|
||||
CreatedAt: &now,
|
||||
UpdatedAt: &now,
|
||||
LastOperator: "system",
|
||||
DeletedAt: &utils.DefaultTimeValue,
|
||||
TempName: "",
|
||||
TempRank: SystemTempKey,
|
||||
Temp: "",
|
||||
UserId: "system_user",
|
||||
TempType: TempTypeMerchant,
|
||||
TempSize: SystemTempSizeBig,
|
||||
PrintSn: "system",
|
||||
IsUse: 1,
|
||||
}
|
||||
|
||||
// 初始化大字体模板
|
||||
if _, v := temp[SystemTempSizeBig]; !v {
|
||||
param.TempName = "system" + SystemTempSizeBig
|
||||
param.Temp = SystemTempValue
|
||||
if err := AddTemp(param); err != nil {
|
||||
globals.SugarLogger.Debug("init system temp err :", err)
|
||||
}
|
||||
SystemTempObj[SystemTempSizeBig] = param
|
||||
}
|
||||
|
||||
// 初始化中字体模板
|
||||
if _, v := temp[SystemTempSizeMedium]; !v {
|
||||
param.TempName = "system" + SystemTempSizeMedium
|
||||
medium := strings.Replace(SystemTempValue, "<b>", "<hb>", -1)
|
||||
medium2 := strings.Replace(medium, "</b>", "</hb>", -1)
|
||||
param.Temp = medium2
|
||||
param.TempSize = SystemTempSizeMedium
|
||||
param.IsUse = 2
|
||||
if err := AddTemp(param); err != nil {
|
||||
globals.SugarLogger.Debug("init system temp err :", err)
|
||||
}
|
||||
SystemTempObj[SystemTempSizeMedium] = param
|
||||
}
|
||||
|
||||
// 初始化小字体模板
|
||||
if _, v := temp[SystemTempSizeSmall]; !v {
|
||||
param.TempName = "system" + SystemTempSizeSmall
|
||||
medium := strings.Replace(SystemTempValue, "<b>", " ", -1)
|
||||
medium2 := strings.Replace(medium, "</b>", " ", -1)
|
||||
param.Temp = medium2
|
||||
param.TempSize = SystemTempSizeSmall
|
||||
param.IsUse = 2
|
||||
if err := AddTemp(param); err != nil {
|
||||
globals.SugarLogger.Debug("init system temp err :", err)
|
||||
}
|
||||
SystemTempObj[SystemTempSizeSmall] = param
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MakePrintMsgOnTemp 将打印数据渲染到模板当中
|
||||
func MakePrintMsgOnTemp(param map[string]string, userId string) (string, error) {
|
||||
// 查询用户默认模板,不存在则使用系统默认模板
|
||||
var userTemp *SystemTemp
|
||||
userTemp, isHave, err := SelectUserDefaultTemp(userId, TempTypeMerchant)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if userTemp == nil || !isHave {
|
||||
userTemp = SystemTempObj[SystemTempSizeBig]
|
||||
}
|
||||
|
||||
// 需要打印数据
|
||||
printMsg := ""
|
||||
printValue := make([]interface{}, 0, 0)
|
||||
for _, v := range strings.Split(userTemp.TempRank, ",") {
|
||||
switch v {
|
||||
case "skuName", "skuNumber", "skuPrice", "skuAllPrice", "allSkuTypeCount", "allSkuCount":
|
||||
continue
|
||||
case "goodsListDetail":
|
||||
printMsg += TempTag[v]
|
||||
skuList := make([]*SkuListPrintOrder, 0, 0)
|
||||
if err := json.Unmarshal([]byte(param[v]), skuList); err != nil {
|
||||
return "", err
|
||||
}
|
||||
for i := 0; i < len(skuList); i++ {
|
||||
printMsg += TempTag["skuName"]
|
||||
printMsg += TempTag["skuNumber"]
|
||||
printMsg += TempTag["skuPrice"]
|
||||
printMsg += TempTag["skuAllPrice"]
|
||||
printValue = append(printValue, skuList[i].SkuName, skuList[i].SkuName, skuList[i].SalePrice, skuList[i].TotalCountPrice)
|
||||
if skuList[i].Upc != "" {
|
||||
printMsg += TempTag["sku"]
|
||||
printValue = append(printValue, skuList[i].Upc)
|
||||
}
|
||||
|
||||
}
|
||||
case "businessType":
|
||||
if param[v] == "2" { // 是预订单
|
||||
printMsg += TempTag[v]
|
||||
}
|
||||
default:
|
||||
printMsg += TempTag[v]
|
||||
printValue = append(printValue, param[v])
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return strings.Replace(fmt.Sprintf(strings.Replace(printMsg, "\n", "", -1), printValue...), "\\n", "\r\n", -1), nil
|
||||
}
|
||||
|
||||
// MakePrintMsgOnTempVoice 制作平台语音
|
||||
func MakePrintMsgOnTempVoice(param map[string]string, setting *PrintSettingObj, userId string) (string, error) {
|
||||
// 打订单
|
||||
if param[OrderStatusPrint] != "" {
|
||||
// 订单提示设置
|
||||
printMsg, err := PrinterOrderVoice(param, setting, userId)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return printMsg, nil
|
||||
}
|
||||
|
||||
// 打运单
|
||||
if param[WayBillStatusPrint] != "" {
|
||||
switch param[WayBillStatusPrint] {
|
||||
case utils.Int2Str(WaybillStatusCourierAssigned): // 分配骑手
|
||||
return PrintWayBillOrderStatus(param, setting), nil
|
||||
case utils.Int2Str(WaybillStatusDeliverReminder): // 催单
|
||||
printVoiceMsg := ``
|
||||
printVoiceValue := make([]interface{}, 0, 0)
|
||||
printVoiceMsg, printVoiceValue = SyntheticSpeech(printVoiceMsg, printVoiceValue, param)
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, ReminderOrderVoice)
|
||||
return strings.Replace(fmt.Sprintf(strings.Replace(printVoiceMsg, "\n", "", -1), printVoiceValue...), "\\n", "\r\n", -1), nil
|
||||
case utils.Int2Str(WaybillStatusDelivered): // 送达
|
||||
printVoiceMsg := ``
|
||||
printVoiceValue := make([]interface{}, 0, 0)
|
||||
printVoiceMsg, printVoiceValue = SyntheticSpeech(printVoiceMsg, printVoiceValue, param)
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, FinialsOrderVoice)
|
||||
return strings.Replace(fmt.Sprintf(strings.Replace(printVoiceMsg, "\n", "", -1), printVoiceValue...), "\\n", "\r\n", -1), nil
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 门店状态
|
||||
if param[StoreStatusPrint] != "" {
|
||||
return PrintStoreStatus(param, setting), nil
|
||||
}
|
||||
|
||||
// 进店咨询
|
||||
if param[EnterTheStorePrint] != "" {
|
||||
return `<sound>19</sound>`, nil
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// PrinterOrderVoice 打印机订单提示设置
|
||||
func PrinterOrderVoice(param map[string]string, setting *PrintSettingObj, userId string) (string, error) {
|
||||
var (
|
||||
printVoiceMsg string //语音信息
|
||||
printVoiceValue = make([]interface{}, 0, 0)
|
||||
textMsg string // 文本信息
|
||||
err error
|
||||
)
|
||||
// 称谓设置/平台语音设置
|
||||
if (setting.CallNameSetting == 64 || setting.CallNameSetting == 65 || setting.CallNameSetting == 66) && setting.SystemVoice == SettingOpen {
|
||||
// 老板
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, setting.CallNameSetting)
|
||||
}
|
||||
|
||||
// 订单状态
|
||||
switch param[OrderStatusPrint] {
|
||||
// 新订单
|
||||
case utils.Int2Str(OrderStatusNew):
|
||||
// 订单设置
|
||||
if setting.OrderVoiceSetting.PrintOrder == SettingOpen { // 打印订单
|
||||
textMsg, err = MakePrintMsgOnTemp(param, userId)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
if setting.OrderVoiceSetting.OrderNotice == SettingOpen && setting.SystemVoice == SettingOpen { // 订单通知
|
||||
printVoiceMsg += `<sound>%s</sound><sound>%s</sound>` // 你来新订单了
|
||||
printVoiceValue = append(printVoiceValue, NewOrderVoice)
|
||||
printVoiceMsg, printVoiceValue = SyntheticSpeech(printVoiceMsg, printVoiceValue, param)
|
||||
}
|
||||
// 申请取消
|
||||
case utils.Int2Str(ApplyOrderCancel):
|
||||
// 订单设置
|
||||
if setting.OrderVoiceSetting.UserOrderCancel == SettingOpen { // 申请取消打印
|
||||
textMsg, err = MakePrintMsgOnTemp(param, userId)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
if setting.OrderVoiceSetting.UserOrderCancelVoice == SettingOpen && setting.SystemVoice == SettingOpen { // 申请取消语音
|
||||
printVoiceMsg += `<sound>%s</sound><sound>%s</sound>` // 你来新订单了
|
||||
printVoiceValue = append(printVoiceValue, ApplyCancelVoice)
|
||||
printVoiceMsg, printVoiceValue = SyntheticSpeech(printVoiceMsg, printVoiceValue, param)
|
||||
}
|
||||
// 申请退款
|
||||
case utils.Int2Str(ApplyOrderRefund):
|
||||
// 订单设置
|
||||
if setting.OrderVoiceSetting.RefundOrder == SettingOpen { // 取消打印订单
|
||||
textMsg, err = MakePrintMsgOnTemp(param, userId)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
if setting.OrderVoiceSetting.RefundOrderVoice == SettingOpen && setting.SystemVoice == SettingOpen {
|
||||
if setting.OrderVoiceSetting.OrderNotice == SettingOpen && setting.SystemVoice == SettingOpen {
|
||||
printVoiceMsg, printVoiceValue = SyntheticSpeech(printVoiceMsg, printVoiceValue, param)
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, ApplyRefundVoice)
|
||||
}
|
||||
}
|
||||
// 取消打印
|
||||
case utils.Int2Str(OrderStatusCanceled):
|
||||
// 订单设置
|
||||
if setting.OrderVoiceSetting.BusinessOrderCancel == SettingOpen { // 取消打印订单
|
||||
textMsg, err = MakePrintMsgOnTemp(param, userId)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
if setting.OrderVoiceSetting.BusinessOrderCancelVoice == SettingOpen && setting.SystemVoice == SettingOpen {
|
||||
if setting.OrderVoiceSetting.OrderNotice == SettingOpen && setting.SystemVoice == SettingOpen { // 订单取消语音通知
|
||||
printVoiceMsg, printVoiceValue = SyntheticSpeech(printVoiceMsg, printVoiceValue, param)
|
||||
printVoiceMsg += `<sound>%s</sound>` // 你来新订单了
|
||||
printVoiceValue = append(printVoiceValue, CancelOrderVoice)
|
||||
}
|
||||
}
|
||||
|
||||
case utils.Int2Str(OrderStatusAccepted): // 待拣货
|
||||
if setting.PickingSetting.WaitPickingPrint == SettingOpen { // 打印订单
|
||||
textMsg, err = MakePrintMsgOnTemp(param, userId)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
if setting.PickingSetting.WaitPickingVoice == SettingOpen && setting.SystemVoice == SettingOpen { // 订单通知
|
||||
printVoiceMsg += `<sound>%s</sound><sound>%s</sound>` // 你有订单未拣货
|
||||
printVoiceValue = append(printVoiceValue, WaitPickUpOrderVoice)
|
||||
printVoiceMsg, printVoiceValue = SyntheticSpeech(printVoiceMsg, printVoiceValue, param)
|
||||
}
|
||||
case utils.Int2Str(OrderStatusWaitAccepted): // 待接单
|
||||
if setting.PickingSetting.WaitPickingPrint == SettingOpen { // 打印订单
|
||||
textMsg, err = MakePrintMsgOnTemp(param, userId)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
if setting.PickingSetting.WaitPickingVoice == SettingOpen && setting.SystemVoice == SettingOpen { // 订单通知
|
||||
printVoiceMsg += `<sound>%s</sound><sound>%s</sound>` // 你有订单未接单(订单未处理)
|
||||
printVoiceValue = append(printVoiceValue, WaitOrderVoice)
|
||||
printVoiceMsg, printVoiceValue = SyntheticSpeech(printVoiceMsg, printVoiceValue, param)
|
||||
}
|
||||
case utils.Int2Str(OrderStatusRejection): // 拒收
|
||||
if setting.CustomerVoiceSetting.CustomerRejectionVoice == SettingOpen && setting.SystemVoice == SettingOpen {
|
||||
// 暂无语音打印
|
||||
}
|
||||
if setting.CustomerVoiceSetting.CustomerRejectionPrint == SettingOpen { // 客户拒收打印
|
||||
rejection := ``
|
||||
rejectionValue := make([]interface{}, 0, 0)
|
||||
rejection += `<center><b>客户拒收信息:</b></center><br>`
|
||||
rejection += `<center><b>订单号: %s</b></center><br>`
|
||||
rejection += `<center><b>订单来源: %s # %s</b></center><br>`
|
||||
rejection += `<center><b>拒收原因: %s</b></center><br>`
|
||||
rejectionValue = append(rejectionValue, param[OrderNoPrint], param[VendorNamePrint], param[VendorOrderNoPrint], param[RejectionReasonPrint])
|
||||
textMsg = strings.Replace(fmt.Sprintf(strings.Replace(rejection, "\n", "", -1), rejectionValue...), "\\n", "\r\n", -1)
|
||||
}
|
||||
|
||||
case utils.Int2Str(OrderStatusCustomerService): // 客服退款
|
||||
if setting.CustomerVoiceSetting.CustcareRefundVoice == SettingOpen && setting.SystemVoice == SettingOpen {
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, BusinessResponsibilityVoice)
|
||||
}
|
||||
if setting.CustomerVoiceSetting.CustcareRefundPrint == SettingOpen {
|
||||
rejection := ``
|
||||
rejectionValue := make([]interface{}, 0, 0)
|
||||
rejection += `<center><b>客服退款详情:</b></center><br>`
|
||||
rejection += `<center><b>订单号: %s</b></center><br>`
|
||||
rejection += `<center><b>订单来源: %s # %s</b></center><br>`
|
||||
rejection += `<center><b>退款原因: %s</b></center><br>`
|
||||
rejection += `<center><b>退款时间: %s</b></center><br>`
|
||||
rejectionValue = append(rejectionValue, param[OrderNoPrint], param[VendorNamePrint], param[VendorOrderNoPrint], param[CustcareRefundReasonPrint], utils.Time2DateStr(time.Now()))
|
||||
textMsg = strings.Replace(fmt.Sprintf(strings.Replace(rejection, "\n", "", -1), rejectionValue...), "\\n", "\r\n", -1)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
voice := strings.Replace(fmt.Sprintf(strings.Replace(printVoiceMsg, "\n", "", -1), printVoiceValue...), "\\n", "\r\n", -1)
|
||||
return voice + textMsg, nil
|
||||
}
|
||||
|
||||
// PrintWayBillOrderStatus 打印运单类通知消息
|
||||
func PrintWayBillOrderStatus(param map[string]string, setting *PrintSettingObj) string {
|
||||
var (
|
||||
printVoiceMsg string //语音信息
|
||||
printVoiceValue = make([]interface{}, 0, 0)
|
||||
textMsg string // 文本信息
|
||||
textMsgValue = make([]interface{}, 0, 0) // 文本信息
|
||||
)
|
||||
|
||||
switch param[WayBillStatusPrint] {
|
||||
case utils.Int2Str(WaybillStatusAccepted), utils.Int2Str(WaybillStatusCourierAssigned): // 分配骑手
|
||||
if setting.RiderVoiceSetting.RiderTakeOrder == SettingOpen { // 打印订单
|
||||
textMsg += `<center><b>接单骑手信息:</b></center><br>`
|
||||
textMsg += `<center><b>骑手姓名: %s</b></center><br>`
|
||||
textMsg += `<center><b>骑手电话: %s</b></center><br>`
|
||||
textMsg += `<center><b>接单时间: %s</b></center><br>`
|
||||
textMsg += `<center><b>订单来源: %s</b></center><br>`
|
||||
textMsg += `<center><b>单号: #%s</b></center><br>`
|
||||
textMsgValue = append(textMsgValue, param[RiderNamePrint], param[RiderPhonePrint], utils.Time2DateStr(time.Now()), param[VendorNamePrint], param[VendorOrderNoPrint])
|
||||
}
|
||||
}
|
||||
if setting.RiderVoiceSetting.RiderTakeOrderVoice == SettingOpen && setting.SystemVoice == SettingOpen { // 骑手接单语音通知
|
||||
printVoiceMsg += `<sound>%s</sound><sound>%s</sound>` // 骑手已经接单了
|
||||
printVoiceValue = append(printVoiceValue, RiderGetOrderVoice)
|
||||
}
|
||||
|
||||
msg := strings.Replace(fmt.Sprintf(strings.Replace(textMsg, "\n", "", -1), textMsgValue...), "\\n", "\r\n", -1)
|
||||
voice := strings.Replace(fmt.Sprintf(strings.Replace(printVoiceMsg, "\n", "", -1), printVoiceValue...), "\\n", "\r\n", -1)
|
||||
return voice + msg
|
||||
}
|
||||
|
||||
// PrintStoreStatus 打印门店状态
|
||||
func PrintStoreStatus(param map[string]string, setting *PrintSettingObj) string {
|
||||
var (
|
||||
printVoiceMsg string //语音信息
|
||||
printVoiceValue = make([]interface{}, 0, 0)
|
||||
textMsg string // 文本信息
|
||||
textMsgValue = make([]interface{}, 0, 0)
|
||||
)
|
||||
|
||||
// 离线打印文本开启
|
||||
if setting.PickingSetting.BusinessOffLine == SettingOpen {
|
||||
textMsg += `<center><b>门店下线通知</b></center><br>`
|
||||
textMsg += `<center><b>门店:%s</b></center><br>`
|
||||
textMsg += `<center><b>平台:%s</b></center><br>`
|
||||
textMsg += `<center><b>下线时间:%s</b></center><br>`
|
||||
textMsgValue = append(textMsgValue, param[EBailOrderNoPrint], param[VendorNamePrint], utils.Time2DateStr(time.Now()))
|
||||
}
|
||||
// 离线打印语音开启
|
||||
if setting.SystemVoice == SettingOpen && setting.PickingSetting.BusinessOffLineVoice == SettingOpen {
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, StoreOfflineVoice)
|
||||
}
|
||||
voice := strings.Replace(fmt.Sprintf(strings.Replace(printVoiceMsg, "\n", "", -1), printVoiceValue...), "\\n", "\r\n", -1)
|
||||
msg := strings.Replace(fmt.Sprintf(strings.Replace(textMsg, "\n", "", -1), textMsgValue...), "\\n", "\r\n", -1)
|
||||
|
||||
return voice + msg
|
||||
}
|
||||
|
||||
// SyntheticSpeech 合成语音 (美团xxx号订单)
|
||||
func SyntheticSpeech(printVoiceMsg string, printVoiceValue []interface{}, param map[string]string) (string, []interface{}) {
|
||||
printVoiceMsg += `<sound>%s</sound>` // 美团
|
||||
switch param[VendOrIDPrint] {
|
||||
case utils.Int2Str(VendorIDJD): // 京东
|
||||
printVoiceValue = append(printVoiceValue, JdVoice)
|
||||
case utils.Int2Str(VendorIDMTWM): // 美团
|
||||
printVoiceValue = append(printVoiceValue, MtVoice)
|
||||
case utils.Int2Str(VendorIDELM): // 饿了么
|
||||
printVoiceValue = append(printVoiceValue, ElmVoice)
|
||||
case utils.Int2Str(VendorIDEBAI): // 饿百
|
||||
printVoiceValue = append(printVoiceValue, ElmVoice)
|
||||
case utils.Int2Str(VendorIDJDShop): // 京东商城
|
||||
printVoiceValue = append(printVoiceValue, JdToHose)
|
||||
case utils.Int2Str(VendorIDTT): // 抖音
|
||||
// 暂无
|
||||
}
|
||||
if param[VendorOrderNoPrint] != "" {
|
||||
switch len(param[VendorOrderNoPrint]) {
|
||||
case 1:
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, NumberVoiceMap[param[VendorOrderNoPrint]])
|
||||
case 2:
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, NumberVoiceMap[param[VendorOrderNoPrint][:1]+"0"])
|
||||
if param[VendorOrderNoPrint][1:] != "0" {
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, NumberVoiceMap[param[VendorOrderNoPrint][1:]])
|
||||
}
|
||||
case 3:
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, NumberVoiceMap[param[VendorOrderNoPrint][0:1]+"00"])
|
||||
if param[VendorOrderNoPrint][1:2] == "0" && param[VendorOrderNoPrint][2:] == "0" {
|
||||
|
||||
} else if param[VendorOrderNoPrint][1:2] == "0" && param[VendorOrderNoPrint][2:] != "0" {
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, NumberVoiceMap[param[VendorOrderNoPrint][1:2]])
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, NumberVoiceMap[param[VendorOrderNoPrint][2:]])
|
||||
} else if param[VendorOrderNoPrint][1:2] != "0" && param[VendorOrderNoPrint][2:] == "0" {
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, NumberVoiceMap[param[VendorOrderNoPrint][1:2]+"0"])
|
||||
} else if param[VendorOrderNoPrint][1:2] != "0" && param[VendorOrderNoPrint][2:] != "0" {
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, NumberVoiceMap[param[VendorOrderNoPrint][1:2]+"0"])
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, NumberVoiceMap[param[VendorOrderNoPrint][2:]])
|
||||
}
|
||||
}
|
||||
}
|
||||
printVoiceMsg += `<sound>%s</sound>`
|
||||
printVoiceValue = append(printVoiceValue, OrderNoVoice)
|
||||
return printVoiceMsg, printVoiceValue
|
||||
}
|
||||
Reference in New Issue
Block a user