movieDaily.go 10 KB

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