company.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. package model
  2. import (
  3. "crawler/config"
  4. "crawler/service"
  5. "database/sql"
  6. "encoding/json"
  7. "log"
  8. "strings"
  9. )
  10. // 영화사 목록 검색 변수
  11. type SearchCompanyListParams struct {
  12. Key string `form:"key" url:"key" binding:"required"`
  13. CurPage int `form:"curPage" url:"curPage,omitempty"`
  14. ItemPerPage int `form:"itemPerPage" url:"itemPerPage,omitempty"`
  15. CompanyNm string `form:"companyNm" url:"companyNm,omitempty"`
  16. CeoNm string `form:"ceoNm" url:"ceoNm,omitempty"`
  17. CompanyPartCd string `form:"companyPartCd" url:"companyPartCd,omitempty"`
  18. }
  19. // 영화사 목록 응답 변수
  20. type SearchCompanyList struct {
  21. CompanyListResult struct {
  22. TotCnt int `json:"totCnt"`
  23. Source string `json:"source"`
  24. CompanyList []CompanyListInfo `json:"companyList"`
  25. } `json:"companyListResult"`
  26. }
  27. type CompanyListInfo struct {
  28. CompanyCd string `json:"companyCd"`
  29. CompanyNm string `json:"companyNm"`
  30. CompanyNmEn string `json:"companyNmEn"`
  31. CompanyPartNames string `json:"companyPartNames"`
  32. CeoNm string `json:"ceoNm"`
  33. FilmoNames string `json:"filmoNames"`
  34. }
  35. // 영화사 상세 검색 변수
  36. type SearchCompanyInfoParams struct {
  37. Key string `form:"key" url:"key" binding:"required"`
  38. CompanyCd string `form:"companyCd" url:"companyCd" binding:"required"`
  39. }
  40. // 영화사 상세 응답 변수
  41. type SearchCompanyInfo struct {
  42. CompanyInfoResult struct {
  43. Source string `json:"source"`
  44. CompanyInfo CompanyInfo `json:"companyInfo"`
  45. } `json:"companyInfoResult"`
  46. }
  47. type CompanyInfo struct {
  48. CompanyCd string `json:"companyCd"`
  49. CompanyNm string `json:"companyNm"`
  50. CompanyNmEn string `json:"companyNmEn"`
  51. CeoNm string `json:"ceoNm"`
  52. Parts []CompanyPart `json:"parts"`
  53. Filmos []CompanyFilmo `json:"filmos"`
  54. }
  55. type CompanyPart struct {
  56. CompanyPartNm string `json:"companyPartNm"`
  57. }
  58. type CompanyFilmo struct {
  59. MovieCd string `json:"movieCd"`
  60. MovieNm string `json:"movieNm"`
  61. CompanyPartNm string `json:"companyPartNm"`
  62. }
  63. // ---- DB 계층 (tb_company / tb_company_filmo) ----
  64. type CompanyModel struct{}
  65. // tb_company 로우
  66. type CompanyTable struct {
  67. CompanyID int
  68. CompanyCd string
  69. CompanyNm *string
  70. CompanyNmEn *string
  71. CeoNm *string
  72. CompanyPartNames *string
  73. Parts *string
  74. FilmoNames *string
  75. UpdatedAt *string
  76. CreatedAt string
  77. }
  78. func (this *CompanyModel) Total() int {
  79. var (
  80. db = service.DB_MOVIEW
  81. conn = db.SQLDB
  82. query = "SELECT COUNT(*) FROM tb_company;"
  83. total = 0
  84. )
  85. err := conn.QueryRow(query).Scan(&total)
  86. if err != nil {
  87. db.SetErrorLog(err, query)
  88. return total
  89. }
  90. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select total company")
  91. return total
  92. }
  93. func (this *CompanyModel) IsExists(companyCd string) bool {
  94. var (
  95. db = service.DB_MOVIEW
  96. conn = db.SQLDB
  97. query = "SELECT IF(COUNT(*) <= 0, 0, 1) AS `exists` FROM tb_company WHERE company_cd = ?;"
  98. exists = false
  99. )
  100. err := conn.QueryRow(query, companyCd).Scan(&exists)
  101. if err != nil {
  102. db.SetErrorLog(err, query)
  103. return exists
  104. }
  105. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select exists company")
  106. return exists
  107. }
  108. // 목록 API 결과 upsert (company_part_names, filmo_names 채움)
  109. func (this *CompanyModel) Insert(list []CompanyListInfo) error {
  110. if len(list) <= 0 {
  111. return nil
  112. }
  113. var (
  114. db = service.DB_MOVIEW
  115. conn = db.SQLDB
  116. query = `
  117. INSERT INTO tb_company (
  118. company_cd, company_nm, company_nm_en, ceo_nm,
  119. company_part_names, filmo_names, updated_at, created_at
  120. )
  121. VALUES
  122. `
  123. vals = []interface{}{}
  124. )
  125. for _, row := range list {
  126. query += `(?, ?, ?, ?, ?, ?, NULL, NOW()),`
  127. vals = append(vals,
  128. row.CompanyCd, nullStr(row.CompanyNm), nullStr(row.CompanyNmEn), nullStr(row.CeoNm),
  129. nullStr(row.CompanyPartNames), nullStr(row.FilmoNames))
  130. }
  131. query = query[0 : len(query)-1]
  132. query += `
  133. ON DUPLICATE KEY UPDATE
  134. company_nm = VALUES(company_nm), company_nm_en = VALUES(company_nm_en), ceo_nm = VALUES(ceo_nm),
  135. company_part_names = VALUES(company_part_names), filmo_names = VALUES(filmo_names), updated_at = NOW();
  136. `
  137. stmt, err := conn.Prepare(query)
  138. if err != nil {
  139. db.SetErrorLog(err, query)
  140. return err
  141. }
  142. defer stmt.Close()
  143. _, err = stmt.Exec(vals...)
  144. if err != nil {
  145. db.SetErrorLog(err, query)
  146. return err
  147. }
  148. db.SetGeneralLog(config.GL_ACTION_WRITE, query, "insert company list")
  149. return nil
  150. }
  151. // 상세 API 결과 upsert (parts JSON 채움)
  152. func (this *CompanyModel) InsertInfo(info CompanyInfo) error {
  153. if info.CompanyCd == "" {
  154. return nil
  155. }
  156. var (
  157. db = service.DB_MOVIEW
  158. conn = db.SQLDB
  159. query = `
  160. INSERT INTO tb_company (
  161. company_cd, company_nm, company_nm_en, ceo_nm, parts, updated_at, created_at
  162. )
  163. VALUES (?, ?, ?, ?, ?, NULL, NOW())
  164. ON DUPLICATE KEY UPDATE
  165. company_nm = VALUES(company_nm), company_nm_en = VALUES(company_nm_en),
  166. ceo_nm = VALUES(ceo_nm), parts = VALUES(parts), updated_at = NOW();
  167. `
  168. parts interface{}
  169. )
  170. if len(info.Parts) > 0 {
  171. b, _ := json.Marshal(info.Parts)
  172. parts = string(b)
  173. } else {
  174. parts = nil
  175. }
  176. _, err := conn.Exec(query,
  177. info.CompanyCd, nullStr(info.CompanyNm), nullStr(info.CompanyNmEn), nullStr(info.CeoNm), parts)
  178. if err != nil {
  179. db.SetErrorLog(err, query)
  180. return err
  181. }
  182. db.SetGeneralLog(config.GL_ACTION_WRITE, query, "insert company info")
  183. return nil
  184. }
  185. // 필모그래피 upsert (tb_company_filmo)
  186. func (this *CompanyModel) InsertFilmos(companyCd string, filmos []CompanyFilmo) error {
  187. if companyCd == "" || len(filmos) <= 0 {
  188. return nil
  189. }
  190. var (
  191. db = service.DB_MOVIEW
  192. conn = db.SQLDB
  193. query = `
  194. INSERT INTO tb_company_filmo (company_cd, movie_cd, movie_nm, company_part_nm, created_at)
  195. VALUES
  196. `
  197. vals = []interface{}{}
  198. )
  199. for _, f := range filmos {
  200. if f.MovieCd == "" {
  201. continue
  202. }
  203. query += `(?, ?, ?, ?, NOW()),`
  204. vals = append(vals, companyCd, f.MovieCd, nullStr(f.MovieNm), nullStr(f.CompanyPartNm))
  205. }
  206. if len(vals) == 0 {
  207. return nil
  208. }
  209. query = query[0 : len(query)-1]
  210. query += `
  211. ON DUPLICATE KEY UPDATE movie_nm = VALUES(movie_nm);
  212. `
  213. stmt, err := conn.Prepare(query)
  214. if err != nil {
  215. db.SetErrorLog(err, query)
  216. return err
  217. }
  218. defer stmt.Close()
  219. _, err = stmt.Exec(vals...)
  220. if err != nil {
  221. db.SetErrorLog(err, query)
  222. return err
  223. }
  224. db.SetGeneralLog(config.GL_ACTION_WRITE, query, "insert company filmo")
  225. return nil
  226. }
  227. // 상세(parts) 미수집 영화사 코드 조회
  228. func (this *CompanyModel) CompanyInfoExcludeCodes() []string {
  229. var (
  230. db = service.DB_MOVIEW
  231. conn = db.SQLDB
  232. query = `SELECT company_cd FROM tb_company WHERE parts IS NULL ORDER BY id ASC;`
  233. code []string
  234. )
  235. rows, err := conn.Query(query)
  236. if err != nil && err != sql.ErrNoRows {
  237. db.SetErrorLog(err, query)
  238. return code
  239. }
  240. defer rows.Close()
  241. for rows.Next() {
  242. var cd string
  243. if err := rows.Scan(&cd); err != nil {
  244. log.Println(err)
  245. continue
  246. }
  247. code = append(code, cd)
  248. }
  249. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select company_cd exclude codes")
  250. return code
  251. }
  252. func nullStr(s string) interface{} {
  253. if strings.TrimSpace(s) == "" {
  254. return nil
  255. }
  256. return s
  257. }