123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- 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{},
- }
- }
|