You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
377 lines
11 KiB
377 lines
11 KiB
package dao |
|
|
|
import ( |
|
"context" |
|
|
|
"encoding/json" |
|
"go-common/app/service/openplatform/ticket-item/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"strconv" |
|
|
|
"github.com/jinzhu/gorm" |
|
) |
|
|
|
// ProjectMainInfo 项目版本内容 |
|
type ProjectMainInfo struct { |
|
Name string `json:"name"` |
|
Type string `json:"type"` |
|
Size string `json:"size"` |
|
ProvinceID string `json:"province_id"` |
|
CityID string `json:"city_id"` |
|
DistrictID string `json:"district_id"` |
|
VenueID string `json:"venue_id"` |
|
PlaceID string `json:"place_id"` |
|
StartTime int32 `json:"start_time"` |
|
EndTime int32 `json:"end_time"` |
|
Docs []ImgInfo `json:"docs"` |
|
Screens []Screen `json:"screens"` |
|
TicketsSingle []TicketSingle `json:"tickets_single"` |
|
TicketsPass []TicketPass `json:"tickets_pass"` |
|
TicketsAllPass []TicketPass `json:"tickets_allpass"` |
|
PerformanceImg PerformanceImg `json:"performance_image"` |
|
PerformanceDesc string `json:"performance_desc"` |
|
SellingProp string `json:"selling_prop"` |
|
TagIDs []string `json:"tag_ids"` |
|
GuestIDs []int64 `json:"guest_ids"` |
|
GuestImgs []GuestImg `json:"guest_imgs"` |
|
CompID string `json:"comp_id"` |
|
Label string `json:"label"` |
|
SponsorType string `json:"sponsor_type"` |
|
} |
|
|
|
// ImgInfo 图片信息 |
|
type ImgInfo struct { |
|
URL string `json:"url"` |
|
Desc string `json:"desc"` |
|
} |
|
|
|
// GuestImg 嘉宾图片信息 |
|
type GuestImg struct { |
|
ID int64 `json:"id"` |
|
ImgURL string `json:"img_url"` |
|
} |
|
|
|
// Screen 场次信息 |
|
type Screen struct { |
|
ScreenName string `json:"screen_name"` |
|
ScreenStartTime int32 `json:"screen_start_time"` |
|
ScreenEndTime int32 `json:"screen_end_time"` |
|
ScreenType string `json:"screen_type"` |
|
PickSeat int32 `json:"pick_seat"` |
|
TicketType string `json:"ticket_type"` |
|
DeliveryType string `json:"delivery_type"` |
|
ScreenID string `json:"screen_id"` |
|
} |
|
|
|
// TicketSingle 单场票信息 |
|
type TicketSingle struct { |
|
Name string `json:"name"` |
|
Type string `json:"type"` |
|
Color string `json:"color"` |
|
BuyLimit string `json:"buy_limit"` |
|
PayValue int64 `json:"pay_value"` |
|
PayMethod string `json:"pay_method"` |
|
Desc string `json:"descrp"` |
|
TicketID string `json:"ticket_sc_id"` |
|
BuyLimitNum []string `json:"buy_limit_num"` |
|
} |
|
|
|
// TicketPass 通票信息 |
|
type TicketPass struct { |
|
Name string `json:"name"` |
|
LinkTicket int32 `json:"link_ticket"` |
|
LinkScreens []int32 `json:"link_screens"` |
|
Color string `json:"color"` |
|
BuyLimit string `json:"buy_limit"` |
|
PayValue int64 `json:"pay_value"` |
|
PayMethod string `json:"pay_method"` |
|
Desc string `json:"descrp"` |
|
TicketID string `json:"ticket_sc_id"` |
|
BuyLimitNum []string `json:"buy_limit_num"` |
|
} |
|
|
|
// PerformanceImg 项目图片信息 |
|
type PerformanceImg struct { |
|
First ImgInfo `json:"first"` |
|
Banner ImgInfo `json:"banner"` |
|
} |
|
|
|
const ( |
|
// BuyNumLimit 默认限购值 |
|
BuyNumLimit = `{"per":8}` |
|
) |
|
|
|
// AddProject 项目初始化 |
|
func (d *Dao) AddProject(c context.Context, verID uint64) (pid int64, err error) { |
|
|
|
var verExtInfo model.VersionExt |
|
if dbErr := d.db.Where("ver_id = ?", verID).First(&verExtInfo).Error; dbErr != nil { |
|
log.Error("获取项目版本详情失败:%s", dbErr) |
|
return 0, dbErr |
|
} |
|
|
|
decodedMainInfo := d.GetDefaultMainInfo() |
|
err = json.Unmarshal([]byte(verExtInfo.MainInfo), &decodedMainInfo) |
|
if err != nil { |
|
return |
|
} |
|
|
|
// 开启事务 |
|
tx := d.db.Begin() |
|
|
|
// 创建新project |
|
var project model.Item |
|
if project, err = d.CreateProject(c, tx, verID, decodedMainInfo); err != nil { |
|
return |
|
} |
|
pid = project.ID |
|
if pid == 0 { |
|
tx.Rollback() |
|
log.Error("pid not initialized") |
|
return 0, ecode.TicketPidIsEmpty |
|
} |
|
|
|
// 创建新项目详情在project_extra表 |
|
if err = d.CreateProjectExtInfo(c, tx, pid, decodedMainInfo.PerformanceDesc); err != nil { |
|
return |
|
} |
|
|
|
// 创建场次screen |
|
scIDList := make(map[int32]int64) |
|
scStartTimes := make(map[int32]int32) |
|
scEndTimes := make(map[int32]int32) |
|
var screen model.Screen |
|
for k, v := range decodedMainInfo.Screens { |
|
screenType, _ := strconv.ParseInt(v.ScreenType, 10, 64) |
|
ticketType, _ := strconv.ParseInt(v.TicketType, 10, 64) |
|
deliveryType, _ := strconv.ParseInt(v.DeliveryType, 10, 64) |
|
screen = model.Screen{ |
|
ProjectID: pid, |
|
Name: v.ScreenName, |
|
StartTime: v.ScreenStartTime, |
|
EndTime: v.ScreenEndTime, |
|
Type: int32(screenType), |
|
TicketType: int32(ticketType), |
|
DeliveryType: int32(deliveryType), |
|
PickSeat: v.PickSeat, |
|
ScreenType: 1, // 单场票场次 |
|
} |
|
if screen, err = d.CreateOrUpdateScreen(c, tx, screen); err != nil { |
|
return |
|
} |
|
// 获取的screen自增id复制到maininfo内 |
|
decodedMainInfo.Screens[k].ScreenID = strconv.FormatInt(screen.ID, 10) |
|
scIDList[int32(k)] = screen.ID |
|
scStartTimes[int32(k)] = screen.StartTime |
|
scEndTimes[int32(k)] = screen.EndTime |
|
} |
|
|
|
// 创建票价 |
|
TkSingleIDList := make(map[int32]int64) |
|
TkSingleTypeList := make(map[int32]int32) |
|
var tkPrice model.TicketPrice |
|
for k, v := range decodedMainInfo.TicketsSingle { |
|
saleType, _ := strconv.ParseInt(v.Type, 10, 64) |
|
buyLimit, _ := strconv.ParseInt(v.BuyLimit, 10, 64) |
|
payMethod, _ := strconv.ParseInt(v.PayMethod, 10, 64) |
|
ticketID, baseErr := model.GetTicketIDFromBase() |
|
if ticketID == 0 || baseErr != nil { |
|
tx.Rollback() |
|
log.Error("baseCenter获取ticketID失败 ticketid:%s,baseErr:%s", ticketID, baseErr) |
|
return 0, baseErr |
|
} |
|
tkPrice = model.TicketPrice{ |
|
ID: ticketID, |
|
ProjectID: pid, |
|
Desc: v.Name, |
|
Type: 1, // 单场票 |
|
SaleType: int32(saleType), |
|
Color: v.Color, |
|
BuyLimit: int32(buyLimit), |
|
PaymentMethod: int32(payMethod), |
|
PaymentValue: v.PayValue, |
|
DescDetail: v.Desc, |
|
IsSale: 1, // 可售 |
|
IsRefund: -10, // 不可退 |
|
OriginPrice: -1, // 未設置 |
|
MarketPrice: -1, |
|
SaleStart: TimeNull, // 0000-00-00 00:00:00 |
|
SaleEnd: TimeNull, |
|
} |
|
if tkPrice, err = d.CreateOrUpdateTkPrice(c, tx, tkPrice, 0); err != nil { |
|
return |
|
} |
|
|
|
//票价限购 |
|
limitData := d.FormatByPrefix(v.BuyLimitNum, "buy_limit_") |
|
if err = d.CreateOrUpdateTkPriceExtra(c, tx, limitData, ticketID, pid); err != nil { |
|
return |
|
} |
|
|
|
// 获取的ticketPrice自增id复制到mainInfo内 |
|
decodedMainInfo.TicketsSingle[k].TicketID = strconv.FormatInt(tkPrice.ID, 10) |
|
TkSingleIDList[int32(k)] = ticketID |
|
TkSingleTypeList[int32(k)] = int32(saleType) |
|
|
|
} |
|
|
|
var passScID, allPassScID int64 |
|
// 创建通票场次 |
|
passScID, err = d.GetOrUpdatePassSc(c, tx, pid, decodedMainInfo.TicketsPass, scStartTimes, scEndTimes, scTypePass, 0) |
|
if err != nil { |
|
return |
|
} |
|
decodedMainInfo.TicketsPass, err = d.InsertOrUpdateTkPass(c, tx, pid, passScID, decodedMainInfo.TicketsPass, TkTypePass, scIDList, TkSingleIDList, TkSingleTypeList) |
|
if err != nil { |
|
return |
|
} |
|
// 创建联票场次 |
|
allPassScID, err = d.GetOrUpdatePassSc(c, tx, pid, decodedMainInfo.TicketsAllPass, scStartTimes, scEndTimes, scTypeAllPass, 0) |
|
if err != nil { |
|
return |
|
} |
|
decodedMainInfo.TicketsAllPass, err = d.InsertOrUpdateTkPass(c, tx, pid, allPassScID, decodedMainInfo.TicketsAllPass, TkTypeAllPass, scIDList, TkSingleIDList, TkSingleTypeList) |
|
if err != nil { |
|
return |
|
} |
|
|
|
// 创建标签 |
|
for _, tagID := range decodedMainInfo.TagIDs { |
|
err = d.CreateTag(c, tx, pid, tagID) |
|
if err != nil { |
|
return |
|
} |
|
} |
|
|
|
// 创建嘉宾 |
|
guestImgMap := make(map[int64]string) |
|
// 组合嘉宾对应头像map |
|
if decodedMainInfo.GuestIDs != nil { |
|
if decodedMainInfo.GuestImgs == nil { |
|
var guestInfoList []model.Guest |
|
if err = d.db.Select("id, guest_img").Where("id IN (?)", decodedMainInfo.GuestIDs).Find(&guestInfoList).Error; err != nil { |
|
log.Error("获取嘉宾信息失败:%s", err) |
|
tx.Rollback() |
|
return |
|
} |
|
for _, v := range guestInfoList { |
|
guestImgMap[v.ID] = v.GuestImg |
|
} |
|
} else { |
|
for _, v := range decodedMainInfo.GuestImgs { |
|
guestImgMap[v.ID] = v.ImgURL |
|
} |
|
} |
|
} |
|
|
|
var position int64 |
|
for _, guestID := range decodedMainInfo.GuestIDs { |
|
if err = tx.Create(&model.ProjectGuest{ |
|
ProjectID: pid, |
|
GuestID: guestID, |
|
Position: position, |
|
GuestImg: guestImgMap[guestID], |
|
}).Error; err != nil { |
|
log.Error("项目嘉宾添加失败:%s", err) |
|
tx.Rollback() |
|
return |
|
} |
|
position++ |
|
} |
|
|
|
// 将有场次票价id的mainInfo更新到version_ext |
|
encodedMainInfo, jsonErr := json.Marshal(decodedMainInfo) |
|
if jsonErr != nil { |
|
log.Error("JSONEncode MainInfo失败") |
|
tx.Rollback() |
|
return pid, jsonErr |
|
} |
|
|
|
finalMainInfo := string(encodedMainInfo) |
|
if len(finalMainInfo) > 4000 { |
|
log.Error("信息量过大") |
|
tx.Rollback() |
|
return pid, ecode.TicketMainInfoTooLarge |
|
} |
|
|
|
// 编辑version_ext |
|
err = tx.Model(&model.VersionExt{}).Where("ver_id = ? and type = ?", verID, 1).Update("main_info", finalMainInfo).Error |
|
if err != nil { |
|
tx.Rollback() |
|
log.Error("更新versionext失败: %s", err) |
|
} |
|
|
|
// 提交事务 |
|
tx.Commit() |
|
|
|
return pid, nil |
|
} |
|
|
|
// CreateProject 灌入项目表 |
|
func (d *Dao) CreateProject(c context.Context, tx *gorm.DB, verID uint64, decodedMainInfo ProjectMainInfo) (project model.Item, err error) { |
|
|
|
// 创建新project |
|
venueID, _ := strconv.ParseInt(decodedMainInfo.VenueID, 10, 64) |
|
placeID, _ := strconv.ParseInt(decodedMainInfo.PlaceID, 10, 64) |
|
compID, _ := strconv.ParseInt(decodedMainInfo.CompID, 10, 64) |
|
projectType, _ := strconv.ParseInt(decodedMainInfo.Type, 10, 64) |
|
projectSponsorType, _ := strconv.ParseInt(decodedMainInfo.SponsorType, 10, 64) |
|
performanceImg, _ := json.Marshal(decodedMainInfo.PerformanceImg) |
|
projectInfo := model.Item{ |
|
Name: decodedMainInfo.Name, |
|
StartTime: decodedMainInfo.StartTime, |
|
EndTime: decodedMainInfo.EndTime, |
|
VenueID: venueID, |
|
PlaceID: placeID, |
|
CompID: compID, |
|
PerformanceImage: string(performanceImg), |
|
TicketDesc: decodedMainInfo.SellingProp, |
|
Type: int32(projectType), |
|
VerID: verID, |
|
SponsorType: int32(projectSponsorType), |
|
Label: decodedMainInfo.Label, |
|
BuyNumLimit: BuyNumLimit, |
|
IsSale: 1, // 默认值可售 |
|
ExpressFee: -2, //默认值 |
|
} |
|
|
|
if err = tx.Create(&projectInfo).Error; err != nil { |
|
log.Error("新建项目失败:%s", err) |
|
tx.Rollback() |
|
return model.Item{}, err |
|
} |
|
|
|
return projectInfo, nil |
|
} |
|
|
|
// CreateProjectExtInfo 灌入项目详情表 |
|
func (d *Dao) CreateProjectExtInfo(c context.Context, tx *gorm.DB, projectID int64, performanceDesc string) (err error) { |
|
|
|
projectExtInfo := model.ItemDetail{ |
|
ProjectID: projectID, |
|
PerformanceDesc: performanceDesc, |
|
} |
|
|
|
if err = tx.Create(&projectExtInfo).Error; err != nil { |
|
log.Error("新建项目详情失败:%s", err) |
|
tx.Rollback() |
|
return err |
|
} |
|
|
|
return nil |
|
} |
|
|
|
// GetDefaultMainInfo 获取初始化数组的mainInfo |
|
func (d *Dao) GetDefaultMainInfo() ProjectMainInfo { |
|
return ProjectMainInfo{ |
|
Docs: []ImgInfo{}, |
|
Screens: []Screen{}, |
|
TicketsSingle: []TicketSingle{}, |
|
TicketsPass: []TicketPass{}, |
|
TicketsAllPass: []TicketPass{}, |
|
TagIDs: []string{}, |
|
GuestIDs: []int64{}, |
|
GuestImgs: []GuestImg{}, |
|
} |
|
}
|
|
|