This commit is contained in:
邹宗楠
2022-08-11 14:23:06 +08:00
parent 7efcd3a614
commit c845eabe69
32 changed files with 231 additions and 212 deletions

View File

@@ -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 (

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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))
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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 (

View File

@@ -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)
}

View File

@@ -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
}