package services import ( "context" "encoding/json" "eta/eta_data_analysis/models" "eta/eta_data_analysis/services/base_from_yongyi" "eta/eta_data_analysis/utils" "fmt" "github.com/patrickmn/go-cache" "github.com/rdlucklib/rdluck_tools/http" "github.com/tealeg/xlsx" "io/fs" "os" "path/filepath" "strings" "time" ) /* 日度-商品猪出栏价 日度-商品猪标肥价差 日度-商品猪全国均价和宰量 日度-屠宰企业屠宰量 周度-商品猪出栏价 周度-体重 周度-屠宰厂宰前活猪重 周度-各体重段价差 周度-50公斤二元母猪价格 周度-规模场15公斤仔猪出栏价 周度-宰后结算价 周度-冻品库存 周度-冻品库存多样本 周度-猪肉价(前三等级白条均价) 月度出栏完成率 月度计划出栏量 月度-能繁母猪存栏(2020年2月新增) 月度-小猪存栏(2020年5月新增) 月度-中猪存栏(2020年5月新增) 月度-大猪存栏(2020年5月新增) 月度-商品猪出栏量 */ func HandleYongyiExcelDaily(filePath string) (err error) { //filePath := fmt.Sprintf("%s/%s_day.xlsx", utils.YongyiFilePath, time.Now().Format(utils.FormatDate)) xlFile, err := xlsx.OpenFile(filePath) if err != nil { err = fmt.Errorf("打开文件失败, Err: %s", err) utils.FileLog.Info(fmt.Sprintf("打开文件:%s 失败, Err: %s", filePath, err)) return } terminalCode := utils.TerminalCode for _, sheet := range xlFile.Sheet { var indexList []*models.YongyiExcelIndex switch sheet.Name { case "出栏价": indexList, err = base_from_yongyi.HandleYongyiExcelDaily1(sheet) case "标肥价差": indexList, err = base_from_yongyi.HandleYongyiExcelDaily2(sheet) case "价格+宰量": indexList, err = base_from_yongyi.HandleYongyiExcelDaily3(sheet) case "屠宰企业日度屠宰量": indexList, err = base_from_yongyi.HandleYongyiExcelDaily4(sheet) default: continue } if err != nil { utils.FileLog.Info(fmt.Sprintf("解析sheet:%s 失败, Err: %s", sheet.Name, err)) continue } if len(indexList) > 0 { params := make(map[string]interface{}) params["List"] = indexList params["TerminalCode"] = terminalCode result, e := PostEdbLib(params, utils.LIB_ROUTE_YONGYI_HANDLE) if e != nil { b, _ := json.Marshal(params) utils.FileLog.Info(fmt.Sprintf("sheet :%s PostEdbLib err: %s, params: %s", sheet.Name, e.Error(), string(b))) return } resp := new(models.BaseEdbLibResponse) if e := json.Unmarshal(result, &resp); e != nil { utils.FileLog.Info(fmt.Sprintf("sheet :%s json.Unmarshal err: %s", sheet.Name, e)) continue } if resp.Ret != 200 { utils.FileLog.Info(fmt.Sprintf("sheet :%s Msg: %s, ErrMsg: %s", sheet.Name, resp.Msg, resp.ErrMsg)) continue } } } return } func HandleYongyiExcelWeekly(filePath string) (err error) { // filePath := fmt.Sprintf("%s/%s_week.xlsx", utils.YongyiFilePath, time.Now().Format(utils.FormatDate)) xlFile, err := xlsx.OpenFile(filePath) if err != nil { err = fmt.Errorf("打开文件失败, Err: %s", err) utils.FileLog.Info(fmt.Sprintf("打开文件:%s 失败, Err: %s", filePath, err)) return } terminalCode := utils.TerminalCode for _, sheet := range xlFile.Sheet { var indexList []*models.YongyiExcelIndex switch sheet.Name { case "周度-商品猪出栏价": indexList, err = base_from_yongyi.HandleYongyiExcelWeekly1(sheet) case "周度-体重": indexList, err = base_from_yongyi.HandleYongyiExcelWeekly2(sheet) case "周度-屠宰厂宰前活猪重": indexList, err = base_from_yongyi.HandleYongyiExcelWeekly3(sheet) case "周度-各体重段价差": indexList, err = base_from_yongyi.HandleYongyiExcelWeekly4(sheet) case "周度-50公斤二元母猪价格", "周度-规模场15公斤仔猪出栏价", "周度-宰后结算价", "周度-冻品库存", "周度-猪肉价(前三等级白条均价)": indexList, err = base_from_yongyi.HandleYongyiExcelWeekly5(sheet) case "周度-冻品库存多样本", "月度出栏完成率": indexList, err = base_from_yongyi.HandleYongyiExcelWeekly6(sheet) case "月度计划出栏量": indexList, err = base_from_yongyi.HandleYongyiExcelWeekly7(sheet) case "月度-能繁母猪存栏(2020年2月新增)": indexList, err = base_from_yongyi.HandleYongyiExcelWeekly8(sheet) case "月度-小猪存栏(2020年5月新增)", "月度-中猪存栏(2020年5月新增)", "月度-大猪存栏(2020年5月新增)": indexList, err = base_from_yongyi.HandleYongyiExcelWeekly9(sheet) case "月度-商品猪出栏量": indexList, err = base_from_yongyi.HandleYongyiExcelWeekly10(sheet) default: continue } if err != nil { utils.FileLog.Info(fmt.Sprintf("解析sheet:%s 失败, Err: %s", sheet.Name, err)) continue } if len(indexList) > 0 { params := make(map[string]interface{}) params["List"] = indexList params["TerminalCode"] = terminalCode result, e := PostEdbLib(params, utils.LIB_ROUTE_YONGYI_HANDLE) if e != nil { b, _ := json.Marshal(params) utils.FileLog.Info(fmt.Sprintf("sheet :%s PostEdbLib err: %s, params: %s", sheet.Name, e.Error(), string(b))) return } resp := new(models.BaseEdbLibResponse) if e := json.Unmarshal(result, &resp); e != nil { utils.FileLog.Info(fmt.Sprintf("sheet :%s json.Unmarshal err: %s", sheet.Name, e)) continue } if resp.Ret != 200 { utils.FileLog.Info(fmt.Sprintf("sheet :%s Msg: %s, ErrMsg: %s", sheet.Name, resp.Msg, resp.ErrMsg)) continue } } } return } const ( YongyiDownloadUrl = "http://127.0.0.1:7010/yongyi/download" ) // YongyiDownloadDaily // @Description: 调用python服务去涌益咨询官网下载日度excel文件 // @datetime 2023-12-19 09:39:05 func YongyiDownloadDaily(cont context.Context) (err error) { // todo 判断文件是否已经下载,如果已经下载到则无需重复下载 var cacheClient *cache.Cache if cacheClient == nil { cacheClient = cache.New(365*24*time.Hour, 365*24*time.Hour) } // 2023年12月19日涌益咨询日度数据 path := fmt.Sprintf("%s/%s%s", utils.YongyiFilePath, time.Now().Format(utils.FormatDateYearMonthDay), "涌益咨询日度数据.xlsx") _, ok := cacheClient.Get(path) fmt.Println("YongyiDownloadDaily: " + path) if ok { utils.FileLog.Info("YongyiDownloadDaily: 文件已存在无需再下载") return } url := fmt.Sprintf("%s?dayFlag=1&weekFlag=0", YongyiDownloadUrl) fmt.Println("YongyiDownload URL:" + url) body, err := http.Get(url) if err != nil { utils.FileLog.Info("YongyiDownload Err:" + err.Error()) return } utils.FileLog.Debug("YongyiDownload Result:" + string(body)) return } // YongyiDownloadWeekyly // @Description: 调用python服务去涌益咨询官网下载周度excel文件 // @datetime 2023-12-19 09:39:05 func YongyiDownloadWeekyly(cont context.Context) (err error) { weekFlag := 1 week := time.Now().Weekday() if week != time.Thursday { //每周四,处理周度文件 return } // 判断文件是否已经下载,如果已经下载到则无需重复下载 var cacheClient *cache.Cache if cacheClient == nil { cacheClient = cache.New(365*24*time.Hour, 365*24*time.Hour) } // 2023.11.10-2023.11.16涌益咨询 周度数据.xlsx // 获取本周的时间范围, 即当前时间 endDate := time.Now().Format(utils.FormatDatePoint) startDate := time.Now().AddDate(0, 0, -6).Format(utils.FormatDatePoint) path := fmt.Sprintf("%s/%s-%s%s", utils.YongyiFilePath, startDate, endDate, "涌益咨询 周度数据.xlsx") fmt.Println("YongyiDownloadWeekyly: " + path) _, ok := cacheClient.Get(path) if ok { utils.FileLog.Info("YongyiDownloadWeekyly: 文件已存在无需再下载") return } url := fmt.Sprintf("%s?dayFlag=0&weekFlag=%d", YongyiDownloadUrl, weekFlag) fmt.Println("YongyiDownload URL:" + url) body, err := http.Get(url) if err != nil { utils.FileLog.Info("YongyiDownload Err:" + err.Error()) return } utils.FileLog.Debug("YongyiDownload Result:" + string(body)) return } // 监听涌溢咨询文件夹是否有新增的excel文件 func ReadWatchYongyiFile(cont context.Context) (err error) { fmt.Println("ReadWatchYongyiFile start") defer func() { if err != nil { fmt.Println("ReadWatchYongyiFile Err:" + err.Error()) } }() var cacheClient *cache.Cache if cacheClient == nil { cacheClient = cache.New(365*24*time.Hour, 365*24*time.Hour) } err = filepath.Walk(utils.YongyiFilePath, func(path string, info fs.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() { fmt.Println("ReadWatchYongyiFile path" + path) fileInfo, err := os.Stat(path) if err != nil { fmt.Println("os.Stat:", err.Error()) } winFileAttr := fileInfo.Sys().(*syscall.Win32FileAttributeData) modifyTimeStr := utils.SecondToTime(winFileAttr.LastWriteTime.Nanoseconds() / 1e9).Format(utils.FormatDateTime) fmt.Println("ReadWatchYongyiFile modifyTimeStr" + modifyTimeStr) existModifyTime, ok := cacheClient.Get(path) fmt.Println("ReadWatchYongyiFile existModifyTime" + existModifyTime.(string)) if ok { existModifyTimeStr := existModifyTime.(string) if existModifyTimeStr != modifyTimeStr { if strings.Contains(path, "涌益咨询") && strings.Contains(path, "日度") { time.Sleep(time.Second * 10) err = HandleYongyiExcelDaily(path) } else if strings.Contains(path, "涌益咨询") && strings.Contains(path, "周度") { time.Sleep(time.Second * 10) err = HandleYongyiExcelWeekly(path) } } } else { if strings.Contains(path, "涌益咨询") && strings.Contains(path, "日度") { time.Sleep(time.Second * 10) err = HandleYongyiExcelDaily(path) } else if strings.Contains(path, "涌益咨询") && strings.Contains(path, "周度") { time.Sleep(time.Second * 10) err = HandleYongyiExcelWeekly(path) } } cacheClient.Delete(path) cacheClient.Set(path, modifyTimeStr, 24*time.Hour) } return nil }) return }