Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"const.go",
"param.go",
"reponse.go",
"saleflag.go",
"tables.go",
"ticket.go",
"util.go",
],
importpath = "go-common/app/service/openplatform/ticket-item/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/service/openplatform/ticket-item/api/grpc/v1:go_default_library",
"//app/service/openplatform/ticket-item/conf:go_default_library",
"//library/log:go_default_library",
"//library/time:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,33 @@
package model
// 票价
// 额外属性字段名
const (
TkBuyNumLimitNormal = "buy_limit_0"
TkBuyNumLimitVip = "buy_limit_1"
TkBuyNumLimitAnnualVip = "buy_limit_2"
// TimeNull 空时间0000-00-00 00:00:00
TimeNull = -62135596800
// 版本类型
//VerTypeProject = 1
VerTypeBulletin = 2
//VerTypePjCancel = 3
VerTypeBanner = 4
//版本状态
VerStatusOffShelfManual = -1
VerStatusOffShelfForced = -2
VerStatusNotReviewed = 0
VerStatusReadyForReview = 1
VerStatusRejected = 2
VerStatusReadyForSale = 3
VerStatusOnShelf = 4
VerStatusNoSalesinfo = 5
//版本审核操作
VerReviewReject = 0
VerReviewPass = 1
)

View File

@@ -0,0 +1,123 @@
package model
// ParamID ID类型请求
type ParamID struct {
ID int64 `form:"id" validate:"gt=0,required"`
}
// ParamCards 卡片类型请求
type ParamCards struct {
IDs string `form:"ids" validate:"gt=0,required"`
}
// ParamBill 项目订单信息请求
type ParamBill struct {
IDs string `form:"ids" validate:"gt=0,required"`
Sids string `form:"sids"`
Tids string `form:"tids"`
}
// GuestParam 嘉宾参数
type GuestParam struct {
ID uint32 `form:"id"`
Name string `form:"name" validate:"required"`
GuestImg string `form:"guestimg" validate:"required"`
Description string `form:"description"`
GuestID int64 `form:"guestid"`
}
// GuestStatusParam 嘉宾状态
type GuestStatusParam struct {
ID int64 `form:"id" validate:"required"`
Status int8 `form:"status"`
}
// GuestSearchParam 嘉宾搜索
type GuestSearchParam struct {
Keyword string `form:"keyword"`
Ps int `form:"ps"`
Pn int `form:"pn"`
}
// VenueSearchParam 场馆搜索参数
type VenueSearchParam struct {
PageParam
ProvinceID int `form:"province_id"`
CityID int `form:"city_id"`
ID int `form:"id"`
Name string `form:"name"`
}
// VersionSearchParam 版本搜索参数
type VersionSearchParam struct {
Type int `form:"type"`
TargetItem int `form:"target_item"`
ItemName string `form:"item_name"`
Status []int `form:"status"`
PageParam
}
// PageParam 分页参数
type PageParam struct {
Pn int `form:"pn" validate:"min=1,gte=1"`
Ps int `form:"ps" validate:"min=1,max=10000"`
}
// AreaInfoParam areaInfo接口请求
type AreaInfoParam struct {
ID int64 `form:"id" validate:"min=0"` // 待修改区域的ID为0表示创建
AID string `form:"a_id" validate:"min=1,max=16"` // 区域自定义编号
Name string `form:"name" validate:"min=1,max=16"` // 区域名
Place int64 `form:"place" validate:"min=1"` // 所属场地ID
Coordinate string `form:"coordinate" validate:"min=1"` // 区域坐标
}
// PlaceInfoParam placeInfo接口请求
type PlaceInfoParam struct {
ID int64 `form:"id" validate:"min=0"` // 待修改场地的ID为0表示创建
Status int32 `form:"status" validate:"min=0,max=1"` // 状态
Name string `form:"name" validate:"max=16"` // 场地名
BasePic string `form:"base_pic" validate:"max=128"` // 场地底图
Venue int64 `form:"venue" validate:"min=1"` // 场馆ID
DWidth int32 `form:"d_width" validate:"min=0"` // mis画框宽度
DHeight int32 `form:"d_height" validate:"min=0"` // mis画框高度
}
// SeatInfoParam seatInfo接口请求
type SeatInfoParam struct {
Area int64 `form:"area" validate:"min=1"` // 区域ID
SeatsNum int32 `form:"seats_num" validate:"min=0"` // 座位数
SeatMap string `form:"seat_map" validate:"min=1"` // 座位图
Seats string `form:"seats"` // 座位数组JSON
Width int32 `form:"width" validate:"min=1"` // 坐区宽度
Height int32 `form:"height" validate:"min=1"` // 坐区高度
RowList string `form:"row_list" validate:"min=1"` // 行号序列
SeatStart string `form:"seat_start" validate:"min=1"` // 座位起始坐标
}
// SeatStockParam seatStock接口请求
type SeatStockParam struct {
Screen int64 `form:"screen" validate:"min=1"` // 场次ID
Area int64 `form:"area" validate:"min=1"` // 区域ID
SeatInfo string `form:"seat_info"` // 座位票种定义数组JSON
}
// RemoveSeatOrdersParam removeSeatOrders接口请求
type RemoveSeatOrdersParam struct {
Price int64 `form:"price" validate:"min=1"` // 票价ID
}
// VenueInfoParam venueInfo接口请求
type VenueInfoParam struct {
ID int64 `form:"id" validate:"min=0"` // 待修改场馆的ID为0表示创建
Name string `form:"name" validate:"max=25"` // 场馆名
Status int32 `form:"status" validate:"min=0,max=1"` // 状态 1-启用 0-停用
Province int64 `form:"provid" validate:"min=0"` // 省份ID
City int64 `form:"cityid" validate:"min=0"` // 城市ID
District int64 `form:"distid" validate:"min=0"` // 区县ID
AddressDetail string `form:"addr" validate:"min=0,max=60"` // 详细地址
Coordinate string `form:"coordinate" validate:"min=0"` // 场馆地图坐标及类型字段
Traffic string `form:"traff" validate:"min=0,max=100"` // 交通信息
}

View File

@@ -0,0 +1,58 @@
package model
// Response 标准返回结构
type Response struct {
Errno int64 `json:"errno"`
Msg string `json:"msg"`
Data []int64 `json:"data"`
}
// ListResp pagination
type ListResp struct {
Total int `json:"total"`
List interface{} `json:"list"`
}
// Page pagination
type Page struct {
Num int `json:"num"`
Size int `json:"size"`
Total int `json:"total"`
}
// VenueData 场馆
type VenueData struct {
ID int64 `json:"id"`
Name string `json:"name"`
CityID int `json:"city"`
CityName string `json:"city_name"`
ProvinceID int `json:"province"`
ProvinceName string `json:"province_name"`
DistrictID int `json:"district"`
DistrictName string `json:"district_name"`
AddressDetail string `json:"address_detail"`
PlaceNum int `json:"place_num"`
Status int `json:"status"`
Coordinate string `json:"coordinate"`
Traffic string `json:"traffic"`
Ctime string `json:"ctime"`
Mtime string `json:"mtime"`
}
// VersionSearchList .
type VersionSearchList struct {
Result []*Version `json:"result"`
Page *Page `json:"page"`
}
// GuestSearchList .
type GuestSearchList struct {
Result []*Guest `json:"result"`
Page *Page `json:"page"`
}
// VenueSearchList .
type VenueSearchList struct {
Result []*VenueData `json:"result"`
Page *Page `json:"page"`
}

View File

@@ -0,0 +1,31 @@
package model
import (
"time"
)
// SaleFlag...售卖状态状态
const (
SaleFlagNotBegin = 1 // 未开售
SaleFlagBegin = 2 // 预售中
SaleFlagEnd = 3 // 已停售
SaleFlagNotSale = 5 // 不可售
SaleFlagOut = 4 // 已售罄
SaleFlagTight = 6 // 库存紧张
)
// CalTkSaleFlag 计算SaleFlag
func (tk *TicketInfo) CalTkSaleFlag() (flag int32) {
current := time.Now().Unix()
if tk.IsSale == 0 {
flag = SaleFlagNotSale
} else if int64(tk.SaleStart) > current {
flag = SaleFlagNotBegin
} else if int64(tk.SaleEnd) < current {
flag = SaleFlagEnd
} else {
flag = SaleFlagBegin
}
return
}

View File

@@ -0,0 +1,491 @@
package model
import (
"go-common/library/time"
)
// Venue 场馆表
type Venue struct {
ID int64
Name string
Status int32
Province int64
City int64
District int64
AddressDetail string
Traffic string
Coordinate string
PlaceNum int32
Ctime time.Time
Mtime time.Time
}
// Coor 项目图片结构
type Coor struct {
Type string
Coor string
}
// ItemDetail 项目详情表
type ItemDetail struct {
ProjectID int64 `json:"id"`
PerformanceDesc string `json:"detail"`
}
// Item 项目表
type Item struct {
ID int64
Name string
Status int32
IsSale int32
StartTime int32
EndTime int32
VenueID int64
PlaceID int64
CompID int64
ExpressFee int32
HasExpressFee int32
ExpressFreeFlag int32
PerformanceImage string
TicketDesc string
BuyNumLimit string
Recommend int32
PromoTags string
VerID uint64
BuyerInfo string
Type int32
SponsorType int32
Label string
Img *ItemImg
}
// ItemImg 项目图片结构
type ItemImg struct {
First struct {
URL string
Desc string
}
Banner struct {
URL string
Desc string
}
}
// Screen 场次表.
type Screen struct {
ID int64
Name string
Status int32
Type int32
TicketType int32
ScreenType int32
DeliveryType int32
PickSeat int32
StartTime int32
EndTime int32
ProjectID int64
SaleStart int64
SaleEnd int64
}
// TicketPrice 票价表
type TicketPrice struct {
ID int64
ParentID int64
Desc string
Type int32
SaleType int32
LinkSc string
LinkTicketID int64
Symbol string
Color string
BuyLimit int32
DescDetail string
ScreenID int64
IsSale int32
IsVisible int32
IsRefund int32
Price int32
OriginPrice int32
MarketPrice int32
ProjectID int64
PaymentMethod int32
PaymentValue int64
SaleTime string
SaleStart time.Time
SaleEnd time.Time
}
// TicketPriceExtra 票价额外表
type TicketPriceExtra struct {
ID int64
ProjectID int64
SkuID int64
Attrib string
Value string
IsDeleted int32
}
// Guest Build guest
type Guest struct {
ID int64 `json:"id"`
GuestImg string `json:"guest_img"`
Name string `json:"name"`
Description string `json:"description"`
Status int8 `json:"status"`
GuestID int64 `json:"guest_id"`
}
// ProjectGuest Build project_guest
type ProjectGuest struct {
ID int64 `json:"id"`
ProjectID int64 `json:"project_id"`
GuestID int64 `json:"guest_id"`
Position int64 `json:"position"`
GuestImg string `json:"guest_img"`
DeleteStatus int32 `json:"delete_status"`
}
// Bulletin Build bulletin
type Bulletin struct {
ID int64 `json:"id"`
Status int8 `json:"status"`
Title string `json:"title"`
Content string `json:"content"`
ProjectID int64 `json:"project_id"`
VerID uint64 `json:"ver_id"`
BulletinID int64 `json:"bulletin_id"`
Ctime time.Time `json:"ctime"`
Mtime time.Time `json:"mtime"`
}
// BulletinExtra Build BulletinExtra
type BulletinExtra struct {
ID int64 `json:"id"`
Detail string `json:"detail"`
BulletinID int64 `json:"bulletin_id"`
}
// Version Build Version
type Version struct {
ID int64 `json:"id"`
VerID uint64 `json:"ver_id"`
Type int32 `json:"type"`
Status int32 `json:"status"`
ItemName string `json:"item_name"`
Ver string `json:"ver"`
TargetItem int64 `json:"target_item"`
AutoPub int32 `json:"auto_pub"`
ParentID int64 `json:"parent_id"`
PubStart time.Time `json:"pub_start"`
PubEnd time.Time `json:"pub_end"`
For int64 `json:"for"`
}
// VersionExt Build
type VersionExt struct {
ID int64 `json:"id"`
VerID uint64 `json:"ver_id"`
Type int32 `json:"type"`
MainInfo string `json:"main_info"`
Ctime time.Time `json:"ctime"`
Mtime time.Time `json:"mtime"`
}
// VersionLog Build VersionLog
type VersionLog struct {
ID int64 `json:"id"`
VerID uint64 `json:"ver_id"`
Type int32 `json:"type"`
Log string `json:"item_name"`
IsPass int32 `json:"is_pass"`
Uname string `json:"uname"`
Ctime time.Time `json:"ctime"`
Mtime time.Time `json:"mtime"`
}
// UserWish 想去表
type UserWish struct {
ID int64 `json:"id"`
MID int64 `json:"mid"`
ItemID int64 `json:"item_id"`
Face string `json:"face"`
Ctime time.Time `json:"ctime"`
Mtime time.Time `json:"mtime"`
}
// Place 场地表
type Place struct {
ID int64 `json:"id"`
Name string `json:"name"`
BasePic string `json:"base_pic"`
Status int32 `json:"status"`
Venue int64 `json:"venue"`
DWidth int32 `json:"d_width"`
DHeight int32 `json:"d_height"`
Ctime time.Time `json:"ctime"`
Mtime time.Time `json:"mtime"`
}
// PlacePolygon 场地坐标表
type PlacePolygon struct {
ID int64 `json:"id"`
Coordinate string `json:"coordinate"`
}
// Area 区域表
type Area struct {
ID int64 `json:"id"`
AID string `json:"name"`
Name string `json:"base_pic"`
SeatsNum int32 `json:"seats_num"`
Width int32 `json:"width"`
Height int32 `json:"height"`
Place int64 `json:"venue"`
DeletedStatus int32 `json:"deleted_status"`
ColStart int32 `json:"col_start"`
ColType int32 `json:"col_type"`
ColDirection int32 `json:"col_direction"`
RowList string `json:"row_list"`
SeatStart string `json:"seat_start"`
Ctime time.Time `json:"ctime"`
Mtime time.Time `json:"mtime"`
}
// AreaSeats 区域座位表
type AreaSeats struct {
ID int64 `json:"id"`
X int32 `json:"x"`
Y int32 `json:"y"`
Label string `json:"label"`
Bgcolor string `json:"bgcolor"`
Area int64 `json:"area"`
Dstatus int32 `json:"dstatus"`
}
// AreaSeatmap 区域座位表
type AreaSeatmap struct {
ID int64 `json:"id"`
SeatMap string `json:"seat_map"`
}
//Promotion 拼团表
type Promotion struct {
ID int64 `json:"id"`
ItemID int64 `json:"item_id"`
SkuID int64 `json:"sku_id"`
Extra int64 `json:"extra"`
BeginTime int32 `json:"begin_time"`
EndTime int32 `json:"end_time"`
Status int32 `json:"status"`
}
//Stock 库存表
type Stock struct {
SkuID int64 `json:"sku_id"`
ParentSkuID int64 `json:"parent_sku_id"`
ItemID int64 `json:"item_id"`
Specs string `json:"specs"`
TotalStock int64 `json:"total_stock"`
Stock int64 `json:"stock"`
}
//ProjectTags 项目标签表
type ProjectTags struct {
ID int64 `json:"id"`
Status int32 `json:"status"`
ProjectID int64 `json:"project_id"`
TagID int64 `json:"tag_id"`
TagName string `json:"tag_name"`
}
// SeatOrder 座位
type SeatOrder struct {
ID int64 `json:"id"`
// 区域ID
AreaID int64 `json:"area_id"`
// 场次ID
ScreenID int64 `json:"screen_id"`
// 订单号
OrderID int64 `json:"order_id"`
// 行号
Row int32 `json:"row"`
// 列号
Col int32 `json:"col"`
// 状态 0-可售 1-已退票 2-已出票 3-已锁定 4-已预订
Status int32 `json:"status"`
// 价格ID
PriceID int64 `json:"price_id"`
// 价格
Price int32 `json:"price"`
// 操作IDbook.id或lock_rec.id
OpID int64 `json:"op_id"`
// 删除时间
DeletedAt time.Time `json:"deleted_at"`
}
// SeatSet 单场座位及价格配置表
type SeatSet struct {
ID int64 `json:"id"`
// 区域ID
AreaID int64 `json:"area_id"`
// 场次ID
ScreenID int64 `json:"screen_id"`
// 票价设置图
SeatChart string `json:"seat_chart"`
}
// Banner banner广告投放信息表
type Banner struct {
ID int64 `json:"id"`
PubStart time.Time `json:"pub_start"`
PubEnd time.Time `json:"pub_end"`
Status int32 `json:"status"`
Name string `json:"name"`
Pic string `json:"pic"`
URL string `json:"url"`
From string `json:"from"`
TargetID int64 `json:"target_id"`
TargetUser int32 `json:"target_user"`
}
// BannerDistrict banner区域关系表
type BannerDistrict struct {
ID int64 `json:"id"`
BannerID int64 `json:"banner_id"`
DistrictID int64 `json:"district_id"`
Position int32 `json:"position"`
SubPosition int32 `json:"sub_position"`
Order int32 `json:"order"`
}
// TableName project.
func (Item) TableName() string {
return "project"
}
// TableName project_extra.
func (ItemDetail) TableName() string {
return "project_extra"
}
// TableName project_guests
func (ProjectGuest) TableName() string {
return "project_guests"
}
// TableName project_bulletin
func (Bulletin) TableName() string {
return "project_bulletin"
}
// TableName bulletin_extra
func (BulletinExtra) TableName() string {
return "bulletin_extra"
}
// TableName venue.
func (Venue) TableName() string {
return "venue"
}
// TableName guest
func (Guest) TableName() string {
return "guest"
}
// TableName version
func (Version) TableName() string {
return "version"
}
// TableName version_ext
func (VersionExt) TableName() string {
return "version_ext"
}
// TableName version_log
func (VersionLog) TableName() string {
return "version_log"
}
// TableName screen
func (Screen) TableName() string {
return "screen"
}
// TableName ticket_price
func (TicketPrice) TableName() string {
return "ticket_price"
}
// TableName ticket_price_extra
func (TicketPriceExtra) TableName() string {
return "ticket_price_extra"
}
// TableName place
func (Place) TableName() string {
return "place"
}
// TableName place_polygon
func (PlacePolygon) TableName() string {
return "place_polygon"
}
// TableName user_wish
func (UserWish) TableName() string {
return "user_wish"
}
// TableName area
func (Area) TableName() string {
return "area"
}
// TableName area_seats
func (AreaSeats) TableName() string {
return "area_seats"
}
// TableName area_seatmap
func (AreaSeatmap) TableName() string {
return "area_seatmap"
}
// TableName promotion
func (Promotion) TableName() string {
return "promotion"
}
// TableName sku_stock
func (Stock) TableName() string {
return "sku_stock"
}
// TableName project_tag
func (ProjectTags) TableName() string {
return "project_tags"
}
// TableName seat_order
func (SeatOrder) TableName() string {
return "seat_order"
}
// TableName seat_set
func (SeatSet) TableName() string {
return "seat_set"
}
// TableName banner
func (Banner) TableName() string {
return "banner"
}
// TableName banner_district
func (BannerDistrict) TableName() string {
return "banner_district"
}

View File

@@ -0,0 +1,58 @@
package model
import (
item "go-common/app/service/openplatform/ticket-item/api/grpc/v1"
"strconv"
)
// TicketInfo 票价综合字段
type TicketInfo struct {
TicketPrice
BuyNumLimit map[string]*TicketPriceExtra
}
// FormatTicketBuyLimit 格式化票价购票限制
func (t *TicketInfo) FormatTicketBuyLimit(limit *item.TicketBuyNumLimit) {
limit.Normal = make(map[int32]int64)
limit.Vip = make(map[int32]int64)
limit.AnnualVip = make(map[int32]int64)
if ext, ok := t.BuyNumLimit[TkBuyNumLimitNormal]; ok {
limit.Normal = ext.ParseBuyLimit()
}
if ext, ok := t.BuyNumLimit[TkBuyNumLimitVip]; ok {
limit.Vip = ext.ParseBuyLimit()
}
if ext, ok := t.BuyNumLimit[TkBuyNumLimitAnnualVip]; ok {
limit.AnnualVip = ext.ParseBuyLimit()
}
}
// ParseBuyLimit parse 购票限制成map
func (ext *TicketPriceExtra) ParseBuyLimit() (m map[int32]int64) {
var (
i int32
max int32
l int32
)
l = 2
max = 6
r := []rune(ext.Value)
m = make(map[int32]int64)
for i = 0; i < max+1; i++ {
m[i] = ext.SliceBuyLimit(r, i*l, (i+1)*l)
}
return m
}
// SliceBuyLimit 分割等级购票限制
func (ext *TicketPriceExtra) SliceBuyLimit(r []rune, start int32, end int32) int64 {
slice := string(r[start:end])
if i, err := strconv.ParseInt(slice, 10, 64); err == nil {
return i
} else if slice == "**" {
return -1
} else {
return 0
}
}

View File

@@ -0,0 +1,179 @@
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)
}