| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- package model
- import (
- "crawler/config"
- "crawler/service"
- "net/url"
- "regexp"
- "strconv"
- )
- type MovieStatsModel struct {
- SearchBoxOfficeParams
- SearchBoxOfficeList
- BoxOfficeInfo
- MovieStatsTable
- }
- // 박스오피스 검색 변수
- type SearchBoxOfficeParams struct {
- ServiceKey string `form:"serviceKey" url:"serviceKey" binding:"required"`
- NumOfRows int `form:"numOfRows" url:"numOfRows,omitempty"`
- PageNo int `form:"pageNo" url:"pageNo,omitempty"`
- }
- // 박스오피스 응답 변수
- type SearchBoxOfficeList struct {
- Response struct {
- Header struct {
- ResultCode string `json:"resultCode"`
- ResultMsg string `json:"resultMsg"`
- } `json:"header"`
- Body struct {
- Items struct {
- Item []BoxOfficeInfo `json:"item"`
- } `json:"items"`
- NumOfRows string `json:"numOfRows"`
- PageNo string `json:"pageNo"`
- TotalCount string `json:"totalCount"`
- } `json:"body"`
- } `json:"response"`
- }
- type BoxOfficeInfo struct {
- Title string `json:"title"`
- AlternativeTitle string `json:"alternativeTitle"`
- Creator string `json:"creator"`
- RegDate string `json:"regDate"`
- CollectionDb string `json:"collectionDb"`
- SubjectCategory string `json:"subjectCategory"`
- SubjectKeyword string `json:"subjectKeyword"`
- Extent string `json:"extent"`
- Description string `json:"description"`
- SpatialCoverage string `json:"spatialCoverage"`
- Temporal string `json:"temporal"`
- Person string `json:"person"`
- Language string `json:"language"`
- SourceTitle string `json:"sourceTitle"`
- ReferenceIdentifier string `json:"referenceIdentifier"`
- Rights string `json:"rights"`
- CopyrightOthers string `json:"copyrightOthers"`
- Url string `json:"url"`
- Contributor string `json:"contributor"`
- }
- type MovieStatsTable struct {
- StatsID int
- MovieCd *string
- MovieNm *string
- ShowDt *int
- SaleAcc int
- AudiAcc int
- ScrnCnt int
- ShowCnt int
- RegDate *string
- CreatedAt string
- }
- func (this *MovieStatsModel) Insert(list []BoxOfficeInfo) error {
- if len(list) <= 0 {
- return nil
- }
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = `
- INSERT INTO tb_movie_stats (
- movie_cd, movie_nm, show_dt, sale_acc, audi_acc, scrn_cnt, show_cnt, reg_date, updated_at, created_at
- )
- VALUES
- `
- vals = []interface{}{}
- dup string
- )
- for _, row := range list {
- query += `(?, ?, ?, ?, ?, ?, ?, ?, NULL, NOW()),`
- data := this.DataFilter(row)
- vals = append(vals,
- data.MovieCd, data.MovieNm, data.ShowDt, data.SaleAcc, data.AudiAcc, data.ScrnCnt, data.ShowCnt, data.RegDate)
- dup += `movie_cd = VALUES(movie_cd), movie_nm = VALUES(movie_nm), show_dt = VALUES(show_dt),
- sale_acc = VALUES(sale_acc), audi_acc = VALUES(audi_acc), scrn_cnt = VALUES(scrn_cnt),
- show_cnt = VALUES(show_cnt), reg_date = VALUES(reg_date), updated_at = NOW(),`
- }
- query = query[0 : len(query)-1]
- dup = dup[0 : len(dup)-1]
- query += ` ON DUPLICATE KEY UPDATE ` + dup
- _, _ = conn.Exec("LOCK TABLE tb_movie_stats READ;")
- 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
- }
- _, _ = conn.Exec("UNLOCK TABLES;")
- db.SetGeneralLog(config.GL_ACTION_WRITE, query, "insert movie stats")
- return nil
- }
- func (this *MovieStatsModel) IsExists(movieCd string) bool {
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = "SELECT IF(COUNT(*) <= 0, 0, 1) AS `exists` FROM tb_movie_stats WHERE movie_cd = ?;"
- exists = false
- )
- err := conn.QueryRow(query, movieCd).Scan(&exists)
- if err != nil {
- db.SetErrorLog(err, query)
- return exists
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select exists movie stats")
- return exists
- }
- func (this *MovieStatsModel) Update(list []BoxOfficeInfo) error {
- if len(list) <= 0 {
- return nil
- }
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = `
- UPDATE tb_movie_stats SET
- movie_cd = ?, movie_nm = ?, show_dt = ?, sale_acc = ?, audi_acc = ?,
- scrn_cnt = ?, show_cnt = ?, reg_date = ?, updated_at = NOW()
- WHERE movie_cd = ?;
- `
- )
- for _, row := range list {
- data := this.DataFilter(row)
- _, err := conn.Exec(query,
- data.MovieCd, data.MovieNm, data.ShowDt, data.SaleAcc, data.AudiAcc, data.ScrnCnt, data.ShowCnt, data.RegDate, data.MovieCd)
- if err != nil {
- db.SetErrorLog(err, query)
- return err
- }
- }
- db.SetGeneralLog(config.GL_ACTION_MODIFY, query, "update movie stats")
- return nil
- }
- func (this *MovieStatsModel) DataFilter(row BoxOfficeInfo) MovieStatsTable {
- var result MovieStatsTable
- query, err := url.ParseQuery(row.Url)
- if err != nil {
- return result
- }
- var (
- movieCd = query.Get("dtCd")
- showDt = query.Get("showdt")
- )
- result.MovieCd = &movieCd
- if row.Title != "" {
- result.MovieNm = &row.Title
- } else {
- result.MovieNm = nil
- }
- if showDt != "" {
- s, _ := strconv.Atoi(query.Get("showdt"))
- result.ShowDt = &s
- } else {
- result.ShowDt = nil
- }
- // 매출액, 관객수, 스크린수, 상영횟수
- re := regexp.MustCompile("[0-9]+")
- stats := re.FindAllString(row.Description, -1)
- if stats[0] != "" {
- s, _ := strconv.Atoi(stats[0])
- result.SaleAcc = s
- }
- if stats[1] != "" {
- s, _ := strconv.Atoi(stats[1])
- result.AudiAcc = s
- }
- if stats[2] != "" {
- s, _ := strconv.Atoi(stats[2])
- result.ScrnCnt = s
- }
- if stats[3] != "" {
- s, _ := strconv.Atoi(stats[3])
- result.ShowCnt = s
- }
- if row.RegDate != "" {
- result.RegDate = &row.RegDate
- } else {
- result.RegDate = nil
- }
- return result
- }
|