bilibili-backup/app/service/openplatform/ticket-item/model/util.go
2019-04-22 02:59:20 +00:00

180 lines
3.6 KiB
Go

package model
import (
"encoding/json"
"fmt"
"go-common/app/service/openplatform/ticket-item/conf"
"go-common/library/log"
"io/ioutil"
"net/http"
"net/url"
"reflect"
"strconv"
"strings"
)
// UT Data
var (
DataID = int64(75)
DataIDs = []int64{75, 80}
DataSIDs = []int64{90, 133, 136}
DataTIDs = []int64{1179, 1180, 1368, 1360}
NoDataID = int64(100000000)
NoDataIDs = []int64{100000000, 100000001}
NoDataSIDs = []int64{100000000, 100000001}
NoDataTIDs = []int64{100000000, 100000001}
)
// JSONEncode 仿phpJSONEncode
func JSONEncode(v interface{}) string {
b, err := json.Marshal(v)
if err != nil {
log.Error("JSONEncode error(%v)", err)
return ""
}
return string(b)
}
// String2Int64 convert string slice([]string) to int64 slice([]int64)
func String2Int64(arr []string) (r []int64) {
var (
id int64
err error
)
for _, v := range arr {
if id, err = strconv.ParseInt(v, 10, 64); err != nil {
continue
}
r = append(r, id)
}
return
}
// UniqueInt64 Ints returns a unique subset of the int slice provided.
func UniqueInt64(input []int64) []int64 {
u := make([]int64, 0, len(input))
m := make(map[int64]bool)
for _, val := range input {
if _, ok := m[val]; !ok {
m[val] = true
u = append(u, val)
}
}
return u
}
// Min 获取数组中最小值
func Min(vars []int32) (minVar int32) {
if vars != nil {
minVar = vars[0]
for _, v := range vars {
if v < minVar {
minVar = v
}
}
}
return
}
// Max 获取数组中最大值
func Max(vars []int32) (maxVar int32) {
for _, v := range vars {
if v > maxVar {
maxVar = v
}
}
return
}
// GetTicketIDFromBase baseCenter获取票价id
func GetTicketIDFromBase() (int64, error) {
params := url.Values{}
params.Add("count", "1")
params.Add("biz_tag", "price")
params.Add("app_id", conf.Conf.BASECenter.AppID)
params.Add("app_token", conf.Conf.BASECenter.AppToken)
reqParam := params.Encode()
resp, err := http.Get(fmt.Sprintf(conf.Conf.BASECenter.URL+"orderid/get?%s", reqParam))
if err != nil {
log.Error("获取票价id HTTP REQUEST失败")
return 0, err
}
defer resp.Body.Close()
content, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Error("读取HTTP RESPONSE失败")
return 0, err
}
var result Response
if err := json.Unmarshal(content, &result); err != nil {
log.Error("json解析失败")
}
return result.Data[0], nil
}
var alphabetTable []string
// AlphabetTable 获取票价所需symbol的字母表
func AlphabetTable() []string {
if alphabetTable != nil {
return alphabetTable
}
result := make([]string, 52)
var i int
ch := 97
for i = 0; i < 26; i++ {
result[i] = string(ch + i)
}
ch = 65
j := i
for i = 0; i < 26; i++ {
result[j] = string(ch + i)
j++
}
alphabetTable = result
return alphabetTable
}
// ClassifyIDs 获取已经存在和需要被删除的id list
func ClassifyIDs(oldIDs []int64, newIDs []int64) (needDel []int64, existed []int64) {
newIDsMap := make(map[int64]int64)
for _, newID := range newIDs {
newIDsMap[newID] = newID
}
for _, oldID := range oldIDs {
if oldID == 0 {
continue
}
if _, ok := newIDsMap[oldID]; !ok {
needDel = append(needDel, oldID)
} else {
existed = append(existed, oldID)
}
}
return
}
// Implode 仅支持不同类型的数组
func Implode(glue string, list interface{}) string {
listValue := reflect.Indirect(reflect.ValueOf(list))
if listValue.Kind() != reflect.Slice {
// 数组以外类型返回空字符串
return ""
}
count := listValue.Len()
listStr := make([]string, 0, count)
for i := 0; i < count; i++ {
str := fmt.Sprint(listValue.Index(i).Interface())
listStr = append(listStr, str)
}
return strings.Join(listStr, glue)
}