movieWeekly.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. package model
  2. import (
  3. "crawler/config"
  4. "crawler/service"
  5. "database/sql"
  6. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. type MovieWeeklyModel struct {
  14. SearchWeeklyBoxOfficeParams
  15. SearchWeeklyBoxOfficeList
  16. WeeklyBoxOfficeInfo
  17. }
  18. // 일별 박스오피스 검색 변수
  19. type SearchWeeklyBoxOfficeParams struct {
  20. Key string `form:"key" url:"key" binding:"required"`
  21. TargetDt string `form:"targetDt" url:"targetDt" binding:"required"`
  22. WeekGb string `form:"weekGb" url:"weekGb,omitempty"`
  23. ItemPerPage string `form:"itemPerPage" url:"itemPerPage,omitempty"`
  24. MultiMovieYn string `form:"multiMovieYn" url:"multiMovieYn,omitempty"`
  25. RepNationCd string `form:"repNationCd" url:"repNationCd,omitempty"`
  26. WideAreaCd string `form:"wideAreaCd" url:"wideAreaCd,omitempty"`
  27. }
  28. // 일별 박스오피스 응답 변수
  29. type SearchWeeklyBoxOfficeList struct {
  30. BoxOfficeResult struct {
  31. BoxofficeType string `json:"boxofficeType"`
  32. ShowRange string `json:"showRange"`
  33. YearWeekTime string `json:"yearWeekTime"`
  34. WeeklyBoxOfficeList []WeeklyBoxOfficeInfo `json:"weeklyBoxOfficeList"`
  35. } `json:"boxOfficeResult"`
  36. }
  37. type WeeklyBoxOfficeInfo struct {
  38. Rnum string `json:"rnum"`
  39. Rank string `json:"rank"`
  40. RankInten string `json:"rankInten"`
  41. RankOldAndNew string `json:"rankOldAndNew"`
  42. MovieCd string `json:"movieCd"`
  43. MovieNm string `json:"movieNm"`
  44. OpenDt string `json:"openDt"`
  45. SalesAmt string `json:"salesAmt"`
  46. SalesShare string `json:"salesShare"`
  47. SalesInten string `json:"salesInten"`
  48. SalesChange string `json:"salesChange"`
  49. SalesAcc string `json:"salesAcc"`
  50. AudiCnt string `json:"audiCnt"`
  51. AudiInten string `json:"audiInten"`
  52. AudiChange string `json:"audiChange"`
  53. AudiAcc string `json:"audiAcc"`
  54. ScrnCnt string `json:"scrnCnt"`
  55. ShowCnt string `json:"showCnt"`
  56. }
  57. type MovieWeeklyTable struct {
  58. WeeklyID int
  59. BoxofficeType *string
  60. ShowRange *string
  61. YearWeekTime *string
  62. Rnum *int
  63. Rank *int
  64. RankInten *int
  65. RankOldAndNew *string
  66. MovieCd string
  67. MovieNm *string
  68. OpenDt *string
  69. SalesAmt *int
  70. SalesShare *float64
  71. SalesInten *int
  72. SalesChange *float64
  73. SalesAcc *int
  74. AudiCnt *int
  75. AudiInten *int
  76. AudiChange *float64
  77. AudiAcc *int
  78. ScrnCnt *int
  79. ShowCnt *int
  80. UpdatedAt *string
  81. CreatedAt string
  82. Detail *MovieDetailTable
  83. }
  84. func (this *MovieWeeklyModel) Total() int {
  85. var (
  86. db = service.DB_MOVIEW
  87. conn = db.SQLDB
  88. query = "SELECT COUNT(*) FROM tb_movie_weekly;"
  89. total = 0
  90. )
  91. err := conn.QueryRow(query).Scan(&total)
  92. if err != nil {
  93. db.SetErrorLog(err, query)
  94. return total
  95. }
  96. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select total movie weekly")
  97. return total
  98. }
  99. func (this *MovieWeeklyModel) List(ids string) ([]MovieWeeklyTable, error) {
  100. var (
  101. db = service.DB_MOVIEW
  102. conn = db.SQLDB
  103. query = fmt.Sprintf("SELECT * FROM tb_movie_weekly WHERE id IN (%s);", ids)
  104. list = make([]MovieWeeklyTable, 0)
  105. )
  106. rows, err := conn.Query(query)
  107. if err != nil && err != sql.ErrNoRows {
  108. db.SetErrorLog(err, query)
  109. return list, err
  110. }
  111. defer rows.Close()
  112. for rows.Next() {
  113. var row MovieWeeklyTable
  114. if err = rows.Scan(
  115. &row.WeeklyID, &row.BoxofficeType, &row.ShowRange, &row.YearWeekTime, &row.Rnum, &row.Rank, &row.RankInten,
  116. &row.RankOldAndNew, &row.MovieCd, &row.MovieNm, &row.OpenDt, &row.SalesAmt,
  117. &row.SalesShare, &row.SalesInten, &row.SalesChange, &row.SalesAcc, &row.AudiCnt,
  118. &row.AudiInten, &row.AudiChange, &row.AudiAcc, &row.ScrnCnt, &row.ShowCnt,
  119. &row.UpdatedAt, &row.CreatedAt); err != nil {
  120. return list, err
  121. }
  122. list = append(list, row)
  123. }
  124. if err = rows.Err(); err != nil {
  125. return list, err
  126. }
  127. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select movie week")
  128. return list, nil
  129. }
  130. func (this *MovieWeeklyModel) Insert(list SearchWeeklyBoxOfficeList) error {
  131. if len(list.BoxOfficeResult.WeeklyBoxOfficeList) <= 0 {
  132. return nil
  133. }
  134. var (
  135. db = service.DB_MOVIEW
  136. conn = db.SQLDB
  137. query = `
  138. INSERT INTO tb_movie_weekly (
  139. box_office_type, show_range, year_week_time, rnum, rank, rank_Inten,
  140. rank_old_and_new, movie_cd, movie_nm, open_dt, sales_amt,
  141. sales_share, sales_Inten, sales_change, sales_acc,
  142. audi_cnt, audi_Inten, audi_change, audi_acc,
  143. scrn_cnt, show_cnt, updated_at, created_at
  144. )
  145. VALUES
  146. `
  147. vals = []interface{}{}
  148. dup string
  149. )
  150. for _, row := range list.BoxOfficeResult.WeeklyBoxOfficeList {
  151. query += `(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NOW()),`
  152. data := this.DataFilter(list.BoxOfficeResult.BoxofficeType, list.BoxOfficeResult.ShowRange, list.BoxOfficeResult.YearWeekTime, row)
  153. vals = append(vals,
  154. data.BoxofficeType, data.ShowRange, data.YearWeekTime, data.Rnum, data.Rank, data.RankInten,
  155. data.RankOldAndNew, data.MovieCd, data.MovieNm, data.OpenDt, data.SalesAmt,
  156. data.SalesShare, data.SalesInten, data.SalesChange, data.SalesAcc,
  157. data.AudiCnt, data.AudiInten, data.AudiChange, data.AudiAcc,
  158. data.ScrnCnt, data.ShowCnt)
  159. dup += `box_office_type = VALUES(box_office_type), show_range = VALUES(show_range), year_week_time = VALUES(year_week_time),
  160. rnum = VALUES(rnum), rank = VALUES(rank), rank_Inten = VALUES(rank_Inten), rank_old_and_new = VALUES(rank_old_and_new),
  161. movie_cd = VALUES(movie_cd), movie_nm = VALUES(movie_nm), open_dt = VALUES(open_dt),
  162. sales_amt = VALUES(sales_amt), sales_share = VALUES(sales_share), sales_Inten = VALUES(sales_Inten),
  163. sales_change = VALUES(sales_change), sales_acc = VALUES(sales_acc), audi_cnt = VALUES(audi_cnt),
  164. audi_Inten = VALUES(audi_Inten), audi_change = VALUES(audi_change), audi_acc = VALUES(audi_acc),
  165. scrn_cnt = VALUES(scrn_cnt), show_cnt = VALUES(show_cnt), updated_at = NOW(),`
  166. }
  167. query = query[0 : len(query)-1]
  168. dup = dup[0 : len(dup)-1]
  169. query += `ON DUPLICATE KEY UPDATE ` + dup
  170. stmt, err := conn.Prepare(query)
  171. if err != nil {
  172. db.SetErrorLog(err, query)
  173. return err
  174. }
  175. defer stmt.Close()
  176. _, err = stmt.Exec(vals...)
  177. if err != nil {
  178. db.SetErrorLog(err, query)
  179. return err
  180. }
  181. db.SetGeneralLog(config.GL_ACTION_WRITE, query, "insert movie week")
  182. return nil
  183. }
  184. func (this *MovieWeeklyModel) LastInsertIDs(movieCd []string, targetDt string) (string, error) {
  185. if movieCd == nil || targetDt == "" {
  186. return "", errors.New("날짜를 지정해주세요.")
  187. }
  188. var (
  189. db = service.DB_MOVIEW
  190. conn = db.SQLDB
  191. query = fmt.Sprintf("SELECT id FROM tb_movie_weekly WHERE year_week_time = CONCAT(?, ?) AND movie_cd IN (%s);", strings.Join(movieCd, ", "))
  192. ids = make([]string, 0)
  193. t, _ = time.Parse("20060102", targetDt)
  194. year, week = t.ISOWeek()
  195. )
  196. rows, err := conn.Query(query, year, fmt.Sprintf("%02d", week))
  197. if err != nil && err != sql.ErrNoRows {
  198. db.SetErrorLog(err, query)
  199. return "", err
  200. }
  201. for rows.Next() {
  202. var id string
  203. if err = rows.Scan(&id); err != nil {
  204. return "", err
  205. }
  206. ids = append(ids, id)
  207. }
  208. if err = rows.Err(); err != nil {
  209. return "", err
  210. }
  211. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select ids movie week")
  212. return strings.Join(ids, ","), nil
  213. }
  214. func (this *MovieWeeklyModel) DataFilter(boxofficeType, showRange, yearWeekTime string, row WeeklyBoxOfficeInfo) MovieWeeklyTable {
  215. var result MovieWeeklyTable
  216. result.MovieCd = row.MovieCd
  217. result.BoxofficeType = &boxofficeType
  218. result.ShowRange = &showRange
  219. result.YearWeekTime = &yearWeekTime
  220. if row.Rnum != "" {
  221. rnum, _ := strconv.Atoi(row.Rnum)
  222. result.Rnum = &rnum
  223. } else {
  224. result.Rnum = nil
  225. }
  226. if row.Rank != "" {
  227. rank, _ := strconv.Atoi(row.Rank)
  228. result.Rank = &rank
  229. } else {
  230. result.Rank = nil
  231. }
  232. if row.RankInten != "" {
  233. rankInten, _ := strconv.Atoi(row.RankInten)
  234. result.RankInten = &rankInten
  235. } else {
  236. result.RankInten = nil
  237. }
  238. if row.RankOldAndNew != "" {
  239. result.RankOldAndNew = &row.RankOldAndNew
  240. } else {
  241. result.RankOldAndNew = nil
  242. }
  243. if row.MovieNm != "" {
  244. result.MovieNm = &row.MovieNm
  245. } else {
  246. result.MovieNm = nil
  247. }
  248. if row.OpenDt != "" {
  249. result.OpenDt = &row.OpenDt
  250. } else {
  251. result.OpenDt = nil
  252. }
  253. if row.SalesAmt != "" {
  254. salesAmt, _ := strconv.Atoi(row.SalesAmt)
  255. result.SalesAmt = &salesAmt
  256. } else {
  257. result.SalesAmt = nil
  258. }
  259. if row.SalesShare != "" {
  260. salesShare, _ := strconv.ParseFloat(row.SalesShare, 8)
  261. result.SalesShare = &salesShare
  262. } else {
  263. result.SalesShare = nil
  264. }
  265. if row.SalesInten != "" {
  266. salesInten, _ := strconv.Atoi(row.SalesInten)
  267. result.SalesInten = &salesInten
  268. } else {
  269. result.SalesInten = nil
  270. }
  271. if row.SalesChange != "" {
  272. salesChange, _ := strconv.ParseFloat(row.SalesChange, 8)
  273. result.SalesChange = &salesChange
  274. } else {
  275. result.SalesChange = nil
  276. }
  277. if row.SalesAcc != "" {
  278. salesAcc, _ := strconv.Atoi(row.SalesAcc)
  279. result.SalesAcc = &salesAcc
  280. } else {
  281. result.SalesAcc = nil
  282. }
  283. if row.AudiCnt != "" {
  284. audiCnt, _ := strconv.Atoi(row.AudiCnt)
  285. result.AudiCnt = &audiCnt
  286. } else {
  287. result.AudiCnt = nil
  288. }
  289. if row.AudiInten != "" {
  290. audiInten, _ := strconv.Atoi(row.AudiInten)
  291. result.AudiInten = &audiInten
  292. } else {
  293. result.AudiInten = nil
  294. }
  295. if row.AudiChange != "" {
  296. audiChange, _ := strconv.ParseFloat(row.AudiChange, 8)
  297. result.AudiChange = &audiChange
  298. } else {
  299. result.AudiChange = nil
  300. }
  301. if row.AudiAcc != "" {
  302. audiAcc, _ := strconv.Atoi(row.AudiAcc)
  303. result.AudiAcc = &audiAcc
  304. } else {
  305. result.AudiAcc = nil
  306. }
  307. if row.ScrnCnt != "" {
  308. scrnCnt, _ := strconv.Atoi(row.ScrnCnt)
  309. result.ScrnCnt = &scrnCnt
  310. } else {
  311. result.ScrnCnt = nil
  312. }
  313. if row.ShowCnt != "" {
  314. showCnt, _ := strconv.Atoi(row.ShowCnt)
  315. result.ShowCnt = &showCnt
  316. } else {
  317. result.ShowCnt = nil
  318. }
  319. return result
  320. }
  321. func (this *MovieWeeklyModel) MakeParams(req SearchWeeklyBoxOfficeParams) (string, error) {
  322. params, err := json.Marshal(WeeklyBoxOfficeListParams{
  323. TargetDt: req.TargetDt,
  324. WeekGb: req.WeekGb,
  325. ItemPerPage: req.ItemPerPage,
  326. MultiMovieYn: req.MultiMovieYn,
  327. RepNationCd: req.RepNationCd,
  328. WideAreaCd: req.WideAreaCd,
  329. })
  330. return string(params), err
  331. }
  332. func (this *MovieWeeklyModel) Info(dailyID int) (MovieWeeklyTable, error) {
  333. var (
  334. db = service.DB_MOVIEW
  335. conn = db.SQLDB
  336. query = "SELECT * FROM tb_movie_weekly WHERE id = ?;"
  337. info MovieWeeklyTable
  338. )
  339. err := conn.QueryRow(query, dailyID).Scan(
  340. &info.WeeklyID, &info.BoxofficeType, &info.ShowRange, &info.YearWeekTime, &info.Rnum,
  341. &info.Rank, &info.RankInten, &info.RankOldAndNew,
  342. &info.MovieCd, &info.MovieNm, &info.OpenDt,
  343. &info.SalesAmt, &info.SalesShare, &info.SalesInten, &info.SalesChange, &info.SalesAcc,
  344. &info.AudiCnt, &info.AudiInten, &info.AudiChange, &info.AudiAcc,
  345. &info.ScrnCnt, &info.ShowCnt, &info.UpdatedAt, &info.CreatedAt,
  346. )
  347. if err != nil && err != sql.ErrNoRows {
  348. db.SetErrorLog(err, query)
  349. return info, err
  350. }
  351. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select movie weekly")
  352. return info, nil
  353. }