cronJobs.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package cronjob
  2. import (
  3. "encoding/csv"
  4. "encoding/xml"
  5. "fmt"
  6. "kng_feed_api/helper"
  7. "kng_feed_api/model"
  8. "log"
  9. "os"
  10. "path/filepath"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. func CreateXMLFeed() {
  16. type Category struct {
  17. Text string `xml:",chardata"`
  18. Id string `xml:"id,attr"`
  19. ParentId string `xml:"parentId,attr"`
  20. URL string `xml:"url,attr"`
  21. }
  22. type Param struct {
  23. Text string `xml:",chardata"`
  24. Name string `xml:"name,attr"`
  25. }
  26. type Offer struct {
  27. Id string `xml:"id,attr"`
  28. Available string `xml:"available,attr"`
  29. Name string `xml:"name"`
  30. URL string `xml:"url"`
  31. CategoryId string `xml:"categoryId"`
  32. Vendor string `xml:"vendor"`
  33. Param []Param `xml:"param"`
  34. }
  35. type Shop struct {
  36. Name string `xml:"name"`
  37. URL string `xml:"url"`
  38. Category []Category `xml:"categories>category"`
  39. Offer []Offer `xml:"offers>offer"`
  40. }
  41. type YamlCatalog struct {
  42. XMLName xml.Name `xml:"yml_catalog"`
  43. Date string `xml:"date,attr"`
  44. Shop Shop `xml:"shop"`
  45. }
  46. fmt.Println("CRON JOB WORK - FROM EXTERNAL FILE ", time.Now())
  47. categoryRows, err := model.GetAllCategories()
  48. if err != nil {
  49. return
  50. }
  51. rows, err := model.GetAllProducts()
  52. if err != nil {
  53. return
  54. }
  55. var ymlCatalog = &YamlCatalog{}
  56. timeNow := time.Now().UTC()
  57. ymlCatalog.Date = timeNow.Format("2006-01-02 15:04")
  58. var shop = &Shop{}
  59. shop.Name = "ООО КНЯГИНЯ"
  60. shop.URL = "https://b2bn.kngnn.ru"
  61. for _, value := range categoryRows {
  62. var category = Category{
  63. Text: value.Name,
  64. ParentId: value.ParentId,
  65. Id: value.Id,
  66. URL: value.Id,
  67. }
  68. shop.Category = append(shop.Category, category)
  69. }
  70. var categoryCrossDocking = Category{
  71. Text: "Кросс-Докинг",
  72. ParentId: "1",
  73. Id: "999",
  74. URL: "999",
  75. }
  76. shop.Category = append(shop.Category, categoryCrossDocking)
  77. for _, value := range rows {
  78. var offer = Offer{
  79. Id: value.CodeCarCaDe,
  80. Available: "true",
  81. Name: value.Name,
  82. URL: "https://b2bn.kngnn.ru/?item-code=" + value.CodeUT10,
  83. CategoryId: value.CategoryId,
  84. Vendor: value.Manufacturer,
  85. }
  86. if offer.CategoryId == "" {
  87. offer.CategoryId = categoryCrossDocking.Id
  88. offer.Param = append(offer.Param, Param{
  89. Text: "1",
  90. Name: "cross_docking",
  91. })
  92. } else {
  93. offer.Param = append(offer.Param, Param{
  94. Text: "0",
  95. Name: "cross_docking",
  96. })
  97. }
  98. offer.Param = append(offer.Param, Param{
  99. Text: value.CodeUT10,
  100. Name: "code",
  101. })
  102. offer.Param = append(offer.Param, Param{
  103. Text: value.CodeUT10,
  104. Name: "code_ut10",
  105. })
  106. offer.Param = append(offer.Param, Param{
  107. Text: value.Manufacturer,
  108. Name: "manufacturer",
  109. })
  110. offer.Param = append(offer.Param, Param{
  111. Text: value.ArticleNumber,
  112. Name: "article_number",
  113. })
  114. offer.Param = append(offer.Param, Param{
  115. Text: value.Brand,
  116. Name: "brand",
  117. })
  118. offer.Param = append(offer.Param, Param{
  119. Text: value.Unit,
  120. Name: "unit",
  121. })
  122. offer.Param = append(offer.Param, Param{
  123. Text: value.GroupLimit,
  124. Name: "group_limit",
  125. })
  126. offer.Param = append(offer.Param, Param{
  127. Text: value.GroupPrice,
  128. Name: "group_price",
  129. })
  130. offer.Param = append(offer.Param, Param{
  131. Text: value.NumberCatalog,
  132. Name: "number_catalog",
  133. })
  134. offer.Param = append(offer.Param, Param{
  135. Text: value.NumberDrawing,
  136. Name: "number_drawing",
  137. })
  138. offer.Param = append(offer.Param, Param{
  139. Text: value.NumberBrand,
  140. Name: "number_brand",
  141. })
  142. offer.Param = append(offer.Param, Param{
  143. Text: value.NumberArticle,
  144. Name: "number_article",
  145. })
  146. offer.Param = append(offer.Param, Param{
  147. Text: value.NumberSuffix,
  148. Name: "number_suffix",
  149. })
  150. offer.Param = append(offer.Param, Param{
  151. Text: strconv.FormatBool(value.Deficit),
  152. Name: "deficit",
  153. })
  154. offer.Param = append(offer.Param, Param{
  155. Text: strconv.FormatFloat(value.Width, 'f', 6, 64),
  156. Name: "width",
  157. })
  158. offer.Param = append(offer.Param, Param{
  159. Text: strconv.FormatFloat(value.Height, 'f', 6, 64),
  160. Name: "height",
  161. })
  162. offer.Param = append(offer.Param, Param{
  163. Text: strconv.FormatFloat(value.Weight, 'f', 6, 64),
  164. Name: "weight",
  165. })
  166. offer.Param = append(offer.Param, Param{
  167. Text: strconv.FormatFloat(value.Length, 'f', 6, 64),
  168. Name: "length",
  169. })
  170. offer.Param = append(offer.Param, Param{
  171. Text: strconv.FormatFloat(value.Multiple, 'f', 6, 64),
  172. Name: "multiple",
  173. })
  174. if value.IdNumbers != nil {
  175. numbers := strings.Split(*value.IdNumbers, ";")
  176. for idx, num := range numbers {
  177. offer.Param = append(offer.Param, Param{
  178. Text: num,
  179. Name: "article_number" + strconv.Itoa(idx+1),
  180. })
  181. }
  182. }
  183. if value.Certificates != nil {
  184. certificates := strings.Split(*value.IdNumbers, ";")
  185. for idx, cert := range certificates {
  186. offer.Param = append(offer.Param, Param{
  187. Text: cert,
  188. Name: "certificate" + strconv.Itoa(idx+1),
  189. })
  190. }
  191. }
  192. shop.Offer = append(shop.Offer, offer)
  193. }
  194. ymlCatalog.Shop = *shop
  195. byteXmlText, err := xml.MarshalIndent(ymlCatalog, " ", " ")
  196. if err != nil {
  197. log.Printf(err.Error())
  198. } else {
  199. var Header = `<?xml version="1.0" encoding="UTF-8"?>` + "\n"
  200. var byteXmlTextWithHeader = []byte(Header + string(byteXmlText))
  201. err := os.WriteFile(filepath.Join(helper.RootDir(), "feed.xml"), byteXmlTextWithHeader, 0666)
  202. if err != nil {
  203. log.Printf(err.Error())
  204. }
  205. }
  206. }
  207. func CreateCSVDeltaFeed() {
  208. log.Println("DELTA FEED WORK - FROM EXTERNAL FILE ", helper.RootDir())
  209. rows, err := model.GetAllAvailability()
  210. if err != nil {
  211. log.Printf("Не удалось получить данные для формирования дельта-фида из базы по причине [%s]", err)
  212. return
  213. }
  214. file, err := os.Create(filepath.Join(helper.RootDir(), "delta.csv"))
  215. if err != nil {
  216. log.Printf("Не удалось сформировать пустой файл дельта-фида по причине [%s]", err)
  217. return
  218. }
  219. defer file.Close()
  220. csvWriter := csv.NewWriter(file)
  221. csvWriter.Comma = ';'
  222. defer csvWriter.Flush()
  223. var records [][]string
  224. for _, row := range rows {
  225. var record []string
  226. record = append(record, row.CodeCarCaDe)
  227. record = append(record, "1")
  228. record = append(record, strconv.Itoa(row.Available))
  229. records = append(records, record)
  230. }
  231. writeError := csvWriter.WriteAll(records)
  232. if writeError != nil {
  233. log.Printf("Не удалось сохранить файл дельта-фида на диск по причине [%s]", writeError)
  234. return
  235. }
  236. }