| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- package model
- import (
- "crawler/config"
- "crawler/service"
- "database/sql"
- "encoding/json"
- "errors"
- "fmt"
- "strconv"
- "strings"
- "time"
- )
- type MovieWeeklyModel struct {
- SearchWeeklyBoxOfficeParams
- SearchWeeklyBoxOfficeList
- WeeklyBoxOfficeInfo
- }
- // 일별 박스오피스 검색 변수
- type SearchWeeklyBoxOfficeParams struct {
- Key string `form:"key" url:"key" binding:"required"`
- TargetDt string `form:"targetDt" url:"targetDt" binding:"required"`
- WeekGb string `form:"weekGb" url:"weekGb,omitempty"`
- ItemPerPage string `form:"itemPerPage" url:"itemPerPage,omitempty"`
- MultiMovieYn string `form:"multiMovieYn" url:"multiMovieYn,omitempty"`
- RepNationCd string `form:"repNationCd" url:"repNationCd,omitempty"`
- WideAreaCd string `form:"wideAreaCd" url:"wideAreaCd,omitempty"`
- }
- // 일별 박스오피스 응답 변수
- type SearchWeeklyBoxOfficeList struct {
- BoxOfficeResult struct {
- BoxofficeType string `json:"boxofficeType"`
- ShowRange string `json:"showRange"`
- YearWeekTime string `json:"yearWeekTime"`
- WeeklyBoxOfficeList []WeeklyBoxOfficeInfo `json:"weeklyBoxOfficeList"`
- } `json:"boxOfficeResult"`
- }
- type WeeklyBoxOfficeInfo struct {
- Rnum string `json:"rnum"`
- Rank string `json:"rank"`
- RankInten string `json:"rankInten"`
- RankOldAndNew string `json:"rankOldAndNew"`
- MovieCd string `json:"movieCd"`
- MovieNm string `json:"movieNm"`
- OpenDt string `json:"openDt"`
- SalesAmt string `json:"salesAmt"`
- SalesShare string `json:"salesShare"`
- SalesInten string `json:"salesInten"`
- SalesChange string `json:"salesChange"`
- SalesAcc string `json:"salesAcc"`
- AudiCnt string `json:"audiCnt"`
- AudiInten string `json:"audiInten"`
- AudiChange string `json:"audiChange"`
- AudiAcc string `json:"audiAcc"`
- ScrnCnt string `json:"scrnCnt"`
- ShowCnt string `json:"showCnt"`
- }
- type MovieWeeklyTable struct {
- WeeklyID int
- BoxofficeType *string
- ShowRange *string
- YearWeekTime *string
- Rnum *int
- Rank *int
- RankInten *int
- RankOldAndNew *string
- MovieCd string
- MovieNm *string
- OpenDt *string
- SalesAmt *int
- SalesShare *float64
- SalesInten *int
- SalesChange *float64
- SalesAcc *int
- AudiCnt *int
- AudiInten *int
- AudiChange *float64
- AudiAcc *int
- ScrnCnt *int
- ShowCnt *int
- UpdatedAt *string
- CreatedAt string
- Detail *MovieDetailTable
- }
- func (this *MovieWeeklyModel) Total() int {
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = "SELECT COUNT(*) FROM tb_movie_weekly;"
- total = 0
- )
- err := conn.QueryRow(query).Scan(&total)
- if err != nil {
- db.SetErrorLog(err, query)
- return total
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select total movie weekly")
- return total
- }
- func (this *MovieWeeklyModel) List(ids string) ([]MovieWeeklyTable, error) {
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = fmt.Sprintf("SELECT * FROM tb_movie_weekly WHERE id IN (%s);", ids)
- list = make([]MovieWeeklyTable, 0)
- )
- rows, err := conn.Query(query)
- if err != nil && err != sql.ErrNoRows {
- db.SetErrorLog(err, query)
- return list, err
- }
- defer rows.Close()
- for rows.Next() {
- var row MovieWeeklyTable
- if err = rows.Scan(
- &row.WeeklyID, &row.BoxofficeType, &row.ShowRange, &row.YearWeekTime, &row.Rnum, &row.Rank, &row.RankInten,
- &row.RankOldAndNew, &row.MovieCd, &row.MovieNm, &row.OpenDt, &row.SalesAmt,
- &row.SalesShare, &row.SalesInten, &row.SalesChange, &row.SalesAcc, &row.AudiCnt,
- &row.AudiInten, &row.AudiChange, &row.AudiAcc, &row.ScrnCnt, &row.ShowCnt,
- &row.UpdatedAt, &row.CreatedAt); err != nil {
- return list, err
- }
- list = append(list, row)
- }
- if err = rows.Err(); err != nil {
- return list, err
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select movie week")
- return list, nil
- }
- func (this *MovieWeeklyModel) Insert(list SearchWeeklyBoxOfficeList) error {
- if len(list.BoxOfficeResult.WeeklyBoxOfficeList) <= 0 {
- return nil
- }
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = `
- INSERT INTO tb_movie_weekly (
- box_office_type, show_range, year_week_time, rnum, ` + "`rank`" + `, rank_Inten,
- rank_old_and_new, movie_cd, movie_nm, open_dt, sales_amt,
- sales_share, sales_Inten, sales_change, sales_acc,
- audi_cnt, audi_Inten, audi_change, audi_acc,
- scrn_cnt, show_cnt, updated_at, created_at
- )
- VALUES
- `
- vals = []interface{}{}
- dup string
- )
- for _, row := range list.BoxOfficeResult.WeeklyBoxOfficeList {
- query += `(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NOW()),`
- data := this.DataFilter(list.BoxOfficeResult.BoxofficeType, list.BoxOfficeResult.ShowRange, list.BoxOfficeResult.YearWeekTime, row)
- vals = append(vals,
- data.BoxofficeType, data.ShowRange, data.YearWeekTime, data.Rnum, data.Rank, data.RankInten,
- data.RankOldAndNew, data.MovieCd, data.MovieNm, data.OpenDt, data.SalesAmt,
- data.SalesShare, data.SalesInten, data.SalesChange, data.SalesAcc,
- data.AudiCnt, data.AudiInten, data.AudiChange, data.AudiAcc,
- data.ScrnCnt, data.ShowCnt)
- dup += `box_office_type = VALUES(box_office_type), show_range = VALUES(show_range), year_week_time = VALUES(year_week_time),
- rnum = VALUES(rnum), ` + "`rank`" + ` = VALUES(` + "`rank`" + `), rank_Inten = VALUES(rank_Inten), rank_old_and_new = VALUES(rank_old_and_new),
- movie_cd = VALUES(movie_cd), movie_nm = VALUES(movie_nm), open_dt = VALUES(open_dt),
- sales_amt = VALUES(sales_amt), sales_share = VALUES(sales_share), sales_Inten = VALUES(sales_Inten),
- sales_change = VALUES(sales_change), sales_acc = VALUES(sales_acc), audi_cnt = VALUES(audi_cnt),
- audi_Inten = VALUES(audi_Inten), audi_change = VALUES(audi_change), audi_acc = VALUES(audi_acc),
- scrn_cnt = VALUES(scrn_cnt), show_cnt = VALUES(show_cnt), updated_at = NOW(),`
- }
- query = query[0 : len(query)-1]
- dup = dup[0 : len(dup)-1]
- query += `ON DUPLICATE KEY UPDATE ` + dup
- stmt, err := conn.Prepare(query)
- if err != nil {
- db.SetErrorLog(err, query)
- return err
- }
- defer stmt.Close()
- _, err = stmt.Exec(vals...)
- if err != nil {
- db.SetErrorLog(err, query)
- return err
- }
- db.SetGeneralLog(config.GL_ACTION_WRITE, query, "insert movie week")
- return nil
- }
- func (this *MovieWeeklyModel) LastInsertIDs(movieCd []string, targetDt string) (string, error) {
- if movieCd == nil || targetDt == "" {
- return "", errors.New("날짜를 지정해주세요.")
- }
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = fmt.Sprintf("SELECT id FROM tb_movie_weekly WHERE year_week_time = CONCAT(?, ?) AND movie_cd IN (%s);", strings.Join(movieCd, ", "))
- ids = make([]string, 0)
- t, _ = time.Parse("20060102", targetDt)
- year, week = t.ISOWeek()
- )
- rows, err := conn.Query(query, year, fmt.Sprintf("%02d", week))
- if err != nil && err != sql.ErrNoRows {
- db.SetErrorLog(err, query)
- return "", err
- }
- for rows.Next() {
- var id string
- if err = rows.Scan(&id); err != nil {
- return "", err
- }
- ids = append(ids, id)
- }
- if err = rows.Err(); err != nil {
- return "", err
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select ids movie week")
- return strings.Join(ids, ","), nil
- }
- func (this *MovieWeeklyModel) DataFilter(boxofficeType, showRange, yearWeekTime string, row WeeklyBoxOfficeInfo) MovieWeeklyTable {
- var result MovieWeeklyTable
- result.MovieCd = row.MovieCd
- result.BoxofficeType = &boxofficeType
- result.ShowRange = &showRange
- result.YearWeekTime = &yearWeekTime
- if row.Rnum != "" {
- rnum, _ := strconv.Atoi(row.Rnum)
- result.Rnum = &rnum
- } else {
- result.Rnum = nil
- }
- if row.Rank != "" {
- rank, _ := strconv.Atoi(row.Rank)
- result.Rank = &rank
- } else {
- result.Rank = nil
- }
- if row.RankInten != "" {
- rankInten, _ := strconv.Atoi(row.RankInten)
- result.RankInten = &rankInten
- } else {
- result.RankInten = nil
- }
- if row.RankOldAndNew != "" {
- result.RankOldAndNew = &row.RankOldAndNew
- } else {
- result.RankOldAndNew = nil
- }
- if row.MovieNm != "" {
- result.MovieNm = &row.MovieNm
- } else {
- result.MovieNm = nil
- }
- if row.OpenDt != "" {
- result.OpenDt = &row.OpenDt
- } else {
- result.OpenDt = nil
- }
- if row.SalesAmt != "" {
- salesAmt, _ := strconv.Atoi(row.SalesAmt)
- result.SalesAmt = &salesAmt
- } else {
- result.SalesAmt = nil
- }
- if row.SalesShare != "" {
- salesShare, _ := strconv.ParseFloat(row.SalesShare, 8)
- result.SalesShare = &salesShare
- } else {
- result.SalesShare = nil
- }
- if row.SalesInten != "" {
- salesInten, _ := strconv.Atoi(row.SalesInten)
- result.SalesInten = &salesInten
- } else {
- result.SalesInten = nil
- }
- if row.SalesChange != "" {
- salesChange, _ := strconv.ParseFloat(row.SalesChange, 8)
- result.SalesChange = &salesChange
- } else {
- result.SalesChange = nil
- }
- if row.SalesAcc != "" {
- salesAcc, _ := strconv.Atoi(row.SalesAcc)
- result.SalesAcc = &salesAcc
- } else {
- result.SalesAcc = nil
- }
- if row.AudiCnt != "" {
- audiCnt, _ := strconv.Atoi(row.AudiCnt)
- result.AudiCnt = &audiCnt
- } else {
- result.AudiCnt = nil
- }
- if row.AudiInten != "" {
- audiInten, _ := strconv.Atoi(row.AudiInten)
- result.AudiInten = &audiInten
- } else {
- result.AudiInten = nil
- }
- if row.AudiChange != "" {
- audiChange, _ := strconv.ParseFloat(row.AudiChange, 8)
- result.AudiChange = &audiChange
- } else {
- result.AudiChange = nil
- }
- if row.AudiAcc != "" {
- audiAcc, _ := strconv.Atoi(row.AudiAcc)
- result.AudiAcc = &audiAcc
- } else {
- result.AudiAcc = nil
- }
- if row.ScrnCnt != "" {
- scrnCnt, _ := strconv.Atoi(row.ScrnCnt)
- result.ScrnCnt = &scrnCnt
- } else {
- result.ScrnCnt = nil
- }
- if row.ShowCnt != "" {
- showCnt, _ := strconv.Atoi(row.ShowCnt)
- result.ShowCnt = &showCnt
- } else {
- result.ShowCnt = nil
- }
- return result
- }
- func (this *MovieWeeklyModel) MakeParams(req SearchWeeklyBoxOfficeParams) (string, error) {
- params, err := json.Marshal(WeeklyBoxOfficeListParams{
- TargetDt: req.TargetDt,
- WeekGb: req.WeekGb,
- ItemPerPage: req.ItemPerPage,
- MultiMovieYn: req.MultiMovieYn,
- RepNationCd: req.RepNationCd,
- WideAreaCd: req.WideAreaCd,
- })
- return string(params), err
- }
- func (this *MovieWeeklyModel) Info(dailyID int) (MovieWeeklyTable, error) {
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = "SELECT * FROM tb_movie_weekly WHERE id = ?;"
- info MovieWeeklyTable
- )
- err := conn.QueryRow(query, dailyID).Scan(
- &info.WeeklyID, &info.BoxofficeType, &info.ShowRange, &info.YearWeekTime, &info.Rnum,
- &info.Rank, &info.RankInten, &info.RankOldAndNew,
- &info.MovieCd, &info.MovieNm, &info.OpenDt,
- &info.SalesAmt, &info.SalesShare, &info.SalesInten, &info.SalesChange, &info.SalesAcc,
- &info.AudiCnt, &info.AudiInten, &info.AudiChange, &info.AudiAcc,
- &info.ScrnCnt, &info.ShowCnt, &info.UpdatedAt, &info.CreatedAt,
- )
- if err != nil && err != sql.ErrNoRows {
- db.SetErrorLog(err, query)
- return info, err
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select movie weekly")
- return info, nil
- }
|