diff --git a/cmd/cus_eng_con_sys.go b/cmd/cus_eng_con_sys.go index 4c33458..ec31667 100644 --- a/cmd/cus_eng_con_sys.go +++ b/cmd/cus_eng_con_sys.go @@ -2,16 +2,22 @@ package cmd import ( "cu-helper/cus-eng-con-sys/config" + "cu-helper/cus-eng-con-sys/cryptokit" "cu-helper/cus-eng-con-sys/model" "cu-helper/cus-eng-con-sys/service" + "strings" + "time" + "github.com/go-resty/resty/v2" + "github.com/mizuki1412/go-core-kit/class/exception" "github.com/mizuki1412/go-core-kit/init/initkit" "github.com/mizuki1412/go-core-kit/library/commonkit" "github.com/mizuki1412/go-core-kit/library/filekit" + "github.com/mizuki1412/go-core-kit/service/configkit" "github.com/mizuki1412/go-core-kit/service/logkit" + "github.com/spf13/cast" "github.com/spf13/cobra" "github.com/tidwall/gjson" - "time" ) func init() { @@ -25,7 +31,23 @@ var engSysCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { initkit.BindFlags(cmd) config.Init() - run() + pro := configkit.Get(config.EngProcess, "") + if pro == "" { + run() + } + client := resty.New().SetRetryCount(5).SetRetryWaitTime(15 * time.Second) + h := model.NewHeader("application/x-www-form-urlencoded; charset=UTF-8") + header := h.GenReqParam() + f := model.NewTaskTodo(cast.ToString(pro)) + form := f.GenReqParam() + resp, err := client.R(). + SetHeaders(header).SetFormData(form).Post(config.UrlPrefix + "/zjgd/frm/workflow/taskToDo.action") + if err != nil { + panic(exception.New(err.Error())) + } + dataOri := strings.Trim(resp.String(), `"`) + data := cryptokit.Decrypt(dataOri) + _ = filekit.WriteFile("kr.json", []byte(data)) }, } @@ -75,4 +97,5 @@ func run() { func defFlagsEng(cmd *cobra.Command) { cmd.Flags().String(config.EngSysSid, "", "Specify the sid") + cmd.Flags().String(config.EngProcess, "", "Specify the process") } diff --git a/cmd/gen_con_order.go b/cmd/gen_con_order.go index ddb99ba..7a9e7f6 100644 --- a/cmd/gen_con_order.go +++ b/cmd/gen_con_order.go @@ -2,14 +2,16 @@ package cmd import ( "fmt" + "log" + "path/filepath" + "strings" + "time" + "github.com/mizuki1412/go-core-kit/class/exception" "github.com/mizuki1412/go-core-kit/init/initkit" "github.com/mizuki1412/go-core-kit/service/configkit" "github.com/spf13/cobra" "github.com/xuri/excelize/v2" - "path/filepath" - "strings" - "time" ) func init() { @@ -22,16 +24,107 @@ var gcoCmd = &cobra.Command{ Short: "Generate construction order", Run: func(cmd *cobra.Command, args []string) { initkit.BindFlags(cmd) - handleGco() + tp := configkit.GetString("gco.type", "kr") + if tp == "kr" { + handleGcoKr() + } else if tp == "lx" { + handleGcoLx() + } }, } func defFlagsGco(cmd *cobra.Command) { cmd.Flags().String("gco.template", "", "*Specify the template used to generate construction order") cmd.Flags().String("gco.file", "", "*Specify the file used to generate construction order") + cmd.Flags().String("gco.type", "", "*Specify the type used to generate construction order") +} + +func handleGcoLx() { + templatePath := configkit.GetString("gco.template", "/Users/leo/Desktop/归档/集客零星/模板.xlsx") + filePath := configkit.GetString("gco.file", "/Users/leo/Desktop/归档/集客零星/集客零星资源归档.xlsx") + + src, err := excelize.OpenFile(filePath) + if err != nil { + panic(exception.New(err.Error())) + } + defer src.Close() + + rows, err := src.GetRows("施工单2026年") // todo 每年修改 + if err != nil { + panic(exception.New("缺少 Sheet:施工单2026年")) // todo 每年修改 + } + + // 跳过表头 + for i, row := range rows { + if i == 0 { + continue + } + + // 防止越界 + getVal := func(idx int) string { + if idx >= len(row) { + return "" + } + return strings.TrimSpace(row[idx]) + } + + // Y列(索引24)标记为1 + if getVal(24) != "1" { + continue + } + + // 打开模板 + tpl, err := excelize.OpenFile(templatePath) + if err != nil { + log.Println("打开模板失败:", err) + continue + } + + sheet := "Sheet1" + + // 映射填充 + _ = tpl.SetCellValue(sheet, "B2", getVal(2)) // C -> B2 + _ = tpl.SetCellValue(sheet, "B3", getVal(0)) // A -> B3 + _ = tpl.SetCellValue(sheet, "B4", getVal(12)) // M -> B4 + _ = tpl.SetCellValue(sheet, "D4", getVal(13)) // N -> D4 + _ = tpl.SetCellValue(sheet, "B5", getVal(3)) // D -> B5 + _ = tpl.SetCellValue(sheet, "B6", getVal(14)) // O -> B6 + _ = tpl.SetCellValue(sheet, "B7", getVal(10)) // K -> B7 + _ = tpl.SetCellValue(sheet, "D7", getVal(11)) // L -> D7 + _ = tpl.SetCellValue(sheet, "B8", getVal(8)) // I -> B8 + _ = tpl.SetCellValue(sheet, "B9", getVal(9)) // J -> B9 + + // 文件名:B列-C列.xlsx + fileName := fmt.Sprintf("%s-%s.xlsx", getVal(1), getVal(2)) + + // 清理非法文件名字符 + fileName = strings.ReplaceAll(fileName, "/", "_") + fileName = strings.ReplaceAll(fileName, "\\", "_") + fileName = strings.ReplaceAll(fileName, ":", "_") + fileName = strings.ReplaceAll(fileName, "*", "_") + fileName = strings.ReplaceAll(fileName, "?", "_") + fileName = strings.ReplaceAll(fileName, "\"", "_") + fileName = strings.ReplaceAll(fileName, "<", "_") + fileName = strings.ReplaceAll(fileName, ">", "_") + fileName = strings.ReplaceAll(fileName, "|", "_") + + // 保存路径(默认保存在模板同目录) + outPath := filepath.Join(filepath.Dir(templatePath), "施工单", fileName) + + if err := tpl.SaveAs(outPath); err != nil { + log.Println("保存失败:", outPath, err) + _ = tpl.Close() + continue + } + + _ = tpl.Close() + + fmt.Println("生成施工单:", outPath) + } + fmt.Println("全部生成完成") } -func handleGco() { +func handleGcoKr() { templatePath := configkit.GetString("gco.template", "/Users/leo/Desktop/归档/公众扩容/施工单模板.xlsx") filePath := configkit.GetString("gco.file", "/Users/leo/Downloads/扩容需求表.xlsx") src, err := excelize.OpenFile(filePath) @@ -58,7 +151,11 @@ func handleGco() { } // 必要字段 - var dVal, eVal, fVal, gVal, dPrefix string + var bVal, dVal, eVal, fVal, gVal, lVal, dPrefix string + + if len(row) > 1 { + bVal = strings.TrimSpace(row[1]) + } if len(row) > 3 { dVal = strings.TrimSpace(row[3]) @@ -81,6 +178,9 @@ func handleGco() { if len(row) > 6 { gVal = strings.TrimSpace(row[6]) } + if len(row) > 11 { + lVal = strings.TrimSpace(row[11]) + } // 打开模板(每次都打开一次,保证生成多份文件不会覆盖) tpl, err := excelize.OpenFile(templatePath) @@ -108,7 +208,7 @@ func handleGco() { // 输出文件名(F列 + D列) outName := "" - if fVal == "" || fVal == "等无条件自动工单" { + if fVal == "" || fVal == "等无条件自动工单" || fVal == "需下" { outName = fmt.Sprintf("%s.xlsx", dVal) } else { outName = fmt.Sprintf("%s-%s.xlsx", dVal, fVal) @@ -125,6 +225,11 @@ func handleGco() { outName = finishDateStr + "需完成" + outName } thisMonth := time.Now().Format("2006.01") + bVal = strings.TrimSuffix(bVal, "网格") + if lVal == "市公司整批扩容二级分光器清单" { + outName = "(" + bVal + ")" + outName + thisMonth = "批量二级" + time.Now().Format("2006.1.2") + } outPath := filepath.Join(filepath.Dir(templatePath), "施工单", thisMonth, outName) err = tpl.SaveAs(outPath) if err != nil { @@ -132,7 +237,6 @@ func handleGco() { } tpl.Close() - fmt.Println("生成施工单:", outPath) } diff --git a/cmd/gen_con_plan.go b/cmd/gen_con_plan.go new file mode 100644 index 0000000..21167b0 --- /dev/null +++ b/cmd/gen_con_plan.go @@ -0,0 +1,280 @@ +package cmd + +import ( + "fmt" + "github.com/mizuki1412/go-core-kit/init/initkit" + "github.com/mizuki1412/go-core-kit/service/configkit" + "github.com/spf13/cobra" + "github.com/xuri/excelize/v2" + "regexp" + "strconv" + "strings" + "time" +) + +func init() { + rootCmd.AddCommand(gcpCmd) + defFlagsGcp(gcpCmd) +} + +var gcpCmd = &cobra.Command{ + Use: "gcp", + Short: "Generate construction plan", + Run: func(cmd *cobra.Command, args []string) { + initkit.BindFlags(cmd) + templatePath := configkit.GetString("gcp.template", "/Users/leo/Desktop/归档/公众扩容/在途工单通报/模板.xlsx") + filePath1 := configkit.GetString("gcp.file1", "/Users/leo/Downloads/宽带在途工单进展反馈表.xlsx") + filePath2 := configkit.GetString("gcp.file2", "/Users/leo/Downloads/扩容需求表.xlsx") + _ = ProcessExcelData(filePath1, filePath2, templatePath) + }, +} + +func defFlagsGcp(cmd *cobra.Command) { + cmd.Flags().String("gcp.template", "", "*Specify the template used to generate construction plan") + cmd.Flags().String("gcp.file1", "", "*Specify the file1 used to generate construction plan") + cmd.Flags().String("gcp.file2", "", "*Specify the file2 used to generate construction plan") +} + +// ====================== 对外入口 ====================== + +func ProcessExcelData(broadbandPath string, expansionPath string, templatePath string) error { + template, err := excelize.OpenFile(templatePath) + if err != nil { + return err + } + defer template.Close() + dateFmt := "yyyy年mm月dd日" + dateStyle, err := template.NewStyle(&excelize.Style{ + CustomNumFmt: &dateFmt, + }) + if err != nil { + return err + } + templateSheet := template.GetSheetName(0) + writeRow := 2 // 模板从第2行写 + today := time.Now() + + // ---------------- 宽带在途工单 ---------------- + if err := processBroadband(template, templateSheet, broadbandPath, &writeRow, today, dateStyle); err != nil { + return err + } + + // ---------------- 扩容需求表 ---------------- + if err := processExpansion(template, templateSheet, expansionPath, &writeRow, today, dateStyle); err != nil { + return err + } + filename := time.Now().Format("20060102") + ".xlsx" + return template.SaveAs("/Users/leo/Desktop/归档/公众扩容/在途工单通报/通报表格/" + filename) +} + +// ====================== 宽带在途 ====================== + +func processBroadband(template *excelize.File, templateSheet string, path string, writeRow *int, today time.Time, dateStyle int) error { + + f, err := excelize.OpenFile(path) + if err != nil { + return err + } + defer f.Close() + + sheet := f.GetSheetName(0) + rows, err := f.GetRows(sheet) + if err != nil { + return err + } + + reDay := regexp.MustCompile(`(\d+)`) + + for i := 1; i < len(rows); i++ { + row := rows[i] + + // A列 == 西湖 + if getCell(row, 0) != "西湖" { + continue + } + // O列 == 需建设处理 + if getCell(row, 14) != "需建设处理" { + continue + } + + // D列 → 地址 + address := getCell(row, 3) + if address == "" { + continue + } + + // H列 → 填报日期 + dateStr, err := f.GetCellValue(sheet, fmt.Sprintf("H%d", i+1)) + if err != nil || dateStr == "" { + continue + } + reportTime, err := parseExcelTime(dateStr) + if err != nil { + continue + } + // 写模板 + template.SetCellValue(templateSheet, fmt.Sprintf("A%d", *writeRow), address) + template.SetCellValue(templateSheet, fmt.Sprintf("F%d", *writeRow), reportTime) + template.SetCellStyle( + templateSheet, + fmt.Sprintf("F%d", *writeRow), + fmt.Sprintf("F%d", *writeRow), + dateStyle, + ) + // S列:X日通 + colS := getCell(row, 18) + if m := reDay.FindStringSubmatch(colS); len(m) == 2 { + days, _ := strconv.Atoi(m[1]) + + // C列:几日通 + template.SetCellValue(templateSheet, fmt.Sprintf("C%d", *writeRow), days) + + // D列:需完成日期 + finishDate := reportTime.AddDate(0, 0, days) + template.SetCellValue(templateSheet, fmt.Sprintf("D%d", *writeRow), finishDate) + template.SetCellStyle( + templateSheet, + fmt.Sprintf("D%d", *writeRow), + fmt.Sprintf("D%d", *writeRow), + dateStyle, + ) + // E列:是否超时 + if today.After(finishDate) { + template.SetCellValue(templateSheet, fmt.Sprintf("E%d", *writeRow), "是") + } else { + template.SetCellValue(templateSheet, fmt.Sprintf("E%d", *writeRow), "否") + } + } + + // G列:工单历时 + duration := int(today.Sub(reportTime).Hours() / 24) + if duration < 0 { + duration = 0 + } + template.SetCellValue(templateSheet, fmt.Sprintf("G%d", *writeRow), duration) + + *writeRow++ + } + + return nil +} + +// ====================== 扩容需求 ====================== + +func processExpansion(template *excelize.File, templateSheet string, path string, writeRow *int, today time.Time, dateStyle int) error { + + f, err := excelize.OpenFile(path) + if err != nil { + return err + } + defer f.Close() + + sheet := f.GetSheetName(0) + rows, err := f.GetRows(sheet) + if err != nil { + return err + } + + for i := 1; i < len(rows); i++ { + row := rows[i] + + // P列为空 + if strings.TrimSpace(getCell(row, 15)) != "" { + continue + } + // X列 == 1 + if getCell(row, 23) != "1" { + continue + } + + //D列 → 地址 + address := getCell(row, 3) + if address == "" { + continue + } + + // N列 → 填报日期 + dateStr, err := f.GetCellValue(sheet, fmt.Sprintf("N%d", i+1)) + if err != nil || dateStr == "" { + continue + } + + reportTime, err := parseExcelTime(dateStr) + if err != nil { + continue + } + + template.SetCellValue(templateSheet, fmt.Sprintf("A%d", *writeRow), address) + template.SetCellValue(templateSheet, fmt.Sprintf("F%d", *writeRow), reportTime) + template.SetCellStyle( + templateSheet, + fmt.Sprintf("F%d", *writeRow), + fmt.Sprintf("F%d", *writeRow), + dateStyle, + ) + // G列:工单历时 + duration := int(today.Sub(reportTime).Hours() / 24) + if duration < 0 { + duration = 0 + } + template.SetCellValue(templateSheet, fmt.Sprintf("G%d", *writeRow), duration) + + *writeRow++ + } + + return nil +} + +// ====================== 工具函数 ====================== + +func parseExcelTime(val string) (time.Time, error) { + val = strings.TrimSpace(val) + if val == "" { + return time.Time{}, fmt.Errorf("empty time") + } + + // 1️⃣ Excel 原生数值(最优先) + if f, err := strconv.ParseFloat(val, 64); err == nil { + return excelize.ExcelDateToTime(f, false) + } + + // 2️⃣ 中文日期:11月23日 / 11月23号 + reCN := regexp.MustCompile(`^(\d{1,2})月(\d{1,2})([日号])?$`) + if m := reCN.FindStringSubmatch(val); len(m) > 0 { + month, _ := strconv.Atoi(m[1]) + day, _ := strconv.Atoi(m[2]) + //todo + year := 0 + if month >= 11 { + year = 2025 // 默认用当前年 + } + year = time.Now().Year() // 默认用当前年 + return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.Local), nil + } + + // 3️⃣ 常见字符串格式 + layouts := []string{ + "2006-01-02", + "2006/01/02", + "2006-01-02 15:04", + "2006/01/02 15:04", + "2006-01-02 15:04:05", + "2006/01/02 15:04:05", + } + + for _, layout := range layouts { + if t, err := time.ParseInLocation(layout, val, time.Local); err == nil { + return t, nil + } + } + + return time.Time{}, fmt.Errorf("cannot parse time: %s", val) +} + +// 安全取单元格 +func getCell(row []string, idx int) string { + if idx >= len(row) { + return "" + } + return strings.TrimSpace(row[idx]) +} diff --git a/cmd/high_opt_loss.go b/cmd/high_opt_loss.go index 6f5f132..fe8f006 100644 --- a/cmd/high_opt_loss.go +++ b/cmd/high_opt_loss.go @@ -3,6 +3,7 @@ package cmd import ( "cu-helper/wms/common" "cu-helper/wms/service" + "github.com/mizuki1412/go-core-kit/init/initkit" "github.com/mizuki1412/go-core-kit/service/logkit" "github.com/spf13/cobra" @@ -19,9 +20,8 @@ var highOpticalLossCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { initkit.BindFlags(cmd) m1 := service.ReqGetHighOptLossUnderList() - m2 := service.ReqGetHighOptLossHistoryList() logkit.Info("拿到光衰数据,开始生成...") - common.GenExcelFile(m1, m2) + common.GenExcelFile(m1) }, } diff --git a/cmd/iom.go b/cmd/iom.go index 61cadb6..c285e22 100644 --- a/cmd/iom.go +++ b/cmd/iom.go @@ -1,6 +1,9 @@ package cmd import ( + "strings" + "time" + "github.com/go-resty/resty/v2" "github.com/mizuki1412/go-core-kit/class/exception" "github.com/mizuki1412/go-core-kit/init/initkit" @@ -10,8 +13,6 @@ import ( "github.com/spf13/cast" "github.com/spf13/cobra" "github.com/tidwall/gjson" - "strings" - "time" ) func init() { @@ -73,11 +74,11 @@ func runIOM() { treeZhuang := gjson.Get(resp.String(), "data").Array() for _, zhuang := range treeZhuang { //拿幢获取单元 - //zhuangHao := gjson.Get(zhuang.String(), "name").String() + zhuangHao := gjson.Get(zhuang.String(), "name").String() //TODO ALL: ALL的时候注释掉 - //if zhuangHao == "0幢" || zhuangHao == "0号楼" { - // continue - //} + if zhuangHao == "0幢" || zhuangHao == "0号楼" { + continue + } _ = commonkit.RecoverFuncWrapper(func() { resp, err = client.R(). SetHeaders(map[string]string{ @@ -144,106 +145,9 @@ func runIOM() { for _, shi := range treeShi { _ = commonkit.RecoverFuncWrapper(func() { //TODO ALL: 如果删除全部,注释if,只运行else - //if cast.ToInt(temp) >= 3 { - // //大于等于3层的:每个室取消关联 - // resp, err = client.R(). - // SetHeaders(map[string]string{ - // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - // "Content-Type": "application/json;charset=UTF-8", - // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - // }). - // SetQueryParams(map[string]string{ - // "regionId": "A", - // "districtId": districtId, - // "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), - // "roadId": "11", - // }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryStandardAddress") - // if err != nil || resp.IsError() { - // panic(exception.New("获取地址详情失败")) - // } - // //判断用户是否为0,设备是否有关联 - // userCount := gjson.Get(resp.String(), "0.userCount").String() - // eqptCount := gjson.Get(resp.String(), "0.eqptCount").String() - // if userCount == "0" && eqptCount != "0" { - // //用户为0,并且有设备关联 - // resp, err = client.R(). - // SetHeaders(map[string]string{ - // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - // "Content-Type": "application/json;charset=UTF-8", - // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - // }). - // SetQueryParams(map[string]string{ - // "regionId": "A", - // "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), - // }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryEqpts") - // if err != nil || resp.IsError() { - // panic(exception.New("获取设备详情失败")) - // } - // nodeID := gjson.Get(resp.String(), "0.eqptNodeId").Int() - // //取消关联 - // resp, err = client.R(). - // SetHeaders(map[string]string{ - // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - // "Content-Type": "application/json;charset=UTF-8", - // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - // }). - // SetBody(map[string]interface{}{ - // "eqptNodeIds": []int64{nodeID}, - // "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), - // "oldAddrId": gjson.Get(shi.String(), "standardAddrId").String(), - // "regionId": "A", - // }).Post("http://132.151.25.19:15609/prod-api/resource/list/updateEqptStandAddress") - // logkit.Info("已取消关联:" + gjson.Get(shi.String(), "detailName").String()) - // //删除单独一室 - // m := shi.Map() - // resultMap := make(map[string]interface{}) - // for k, v := range m { - // resultMap[k] = v.Value() - // } - // resp, err = client.R(). - // SetHeaders(map[string]string{ - // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - // "Content-Type": "application/json;charset=UTF-8", - // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - // }). - // SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") - // if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { - // panic(exception.New("Invalid失败")) - // } - // logkit.Info("已删除室:" + gjson.Get(shi.String(), "detailName").String()) - // } else { - // logkit.Info("@@@存在用户/无设备@@@" + gjson.Get(shi.String(), "detailName").String()) - // } - //} else { - //小于3层的:除了101、102、201、202以及商铺的不取消,其他取消并invalid - //TODO ALL: 如果删除全部,name和下面的if判断2行 - //name := gjson.Get(shi.String(), "name").String() - //if name != "101室" && name != "102室" && name != "201室" && name != "202室" && !strings.Contains(name, "商铺") { - resp, err = client.R(). - SetHeaders(map[string]string{ - "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - "Content-Type": "application/json;charset=UTF-8", - "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - }). - SetQueryParams(map[string]string{ - "regionId": "A", - "districtId": districtId, - "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), - "roadId": "11", - }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryStandardAddress") - if err != nil || resp.IsError() { - panic(exception.New("获取地址详情失败")) - } - //判断用户是否为0,设备是否有关联 - userCount := gjson.Get(resp.String(), "0.userCount").String() - eqptCount := gjson.Get(resp.String(), "0.eqptCount").String() - if userCount == "0" && eqptCount != "0" { - //用户为0,并且有设备关联 + //大于等于3层的:每个室取消关联 + name := gjson.Get(shi.String(), "name").String() + if name != "101室" && name != "201室" && name != "301室" && name != "401室" { resp, err = client.R(). SetHeaders(map[string]string{ "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), @@ -253,151 +157,249 @@ func runIOM() { }). SetQueryParams(map[string]string{ "regionId": "A", + "districtId": districtId, "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), - }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryEqpts") + "roadId": "11", + }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryStandardAddress") if err != nil || resp.IsError() { - panic(exception.New("获取设备详情失败")) - } - var nodeIDs []int64 - gjson.Parse(resp.String()).ForEach(func(key, value gjson.Result) bool { - nodeIDs = append(nodeIDs, value.Get("eqptNodeId").Int()) - return true // 返回true以继续遍历 - }) - //取消关联 - resp, err = client.R(). - SetHeaders(map[string]string{ - "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - "Content-Type": "application/json;charset=UTF-8", - "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - }). - SetBody(map[string]interface{}{ - "eqptNodeIds": nodeIDs, - "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), - "oldAddrId": gjson.Get(shi.String(), "standardAddrId").String(), - "regionId": "A", - }).Post("http://132.151.25.19:15609/prod-api/resource/list/updateEqptStandAddress") - logkit.Info("已取消关联:" + gjson.Get(shi.String(), "detailName").String()) - //删除单独一室 - m := shi.Map() - resultMap := make(map[string]interface{}) - for k, v := range m { - resultMap[k] = v.Value() + panic(exception.New("获取地址详情失败")) } - resp, err = client.R(). - SetHeaders(map[string]string{ - "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - "Content-Type": "application/json;charset=UTF-8", - "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - }). - SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") - if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { - panic(exception.New("Invalid失败")) + //判断用户是否为0,设备是否有关联 + userCount := gjson.Get(resp.String(), "0.userCount").String() + eqptCount := gjson.Get(resp.String(), "0.eqptCount").String() + if userCount == "0" && eqptCount != "0" { + //用户为0,并且有设备关联 + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetQueryParams(map[string]string{ + "regionId": "A", + "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), + }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryEqpts") + if err != nil || resp.IsError() { + panic(exception.New("获取设备详情失败")) + } + nodeID := gjson.Get(resp.String(), "0.eqptNodeId").Int() + //取消关联 + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(map[string]interface{}{ + "eqptNodeIds": []int64{nodeID}, + "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), + "oldAddrId": gjson.Get(shi.String(), "standardAddrId").String(), + "regionId": "A", + }).Post("http://132.151.25.19:15609/prod-api/resource/list/updateEqptStandAddress") + logkit.Info("已取消关联:" + gjson.Get(shi.String(), "detailName").String()) + //删除单独一室 + m := shi.Map() + resultMap := make(map[string]interface{}) + for k, v := range m { + resultMap[k] = v.Value() + } + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") + if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + panic(exception.New("Invalid失败")) + } + logkit.Info("已删除室:" + gjson.Get(shi.String(), "detailName").String()) + } else { + logkit.Info("@@@存在用户/无设备@@@" + gjson.Get(shi.String(), "detailName").String()) } - logkit.Info("已删除室:" + gjson.Get(shi.String(), "detailName").String()) - } else { - logkit.Info("@@@存在用户/无设备@@@" + gjson.Get(shi.String(), "detailName").String()) - logkit.Info("用户数:" + userCount + ",设备数:" + eqptCount) + //} else { + // //小于3层的:除了101、102、201、202以及商铺的不取消,其他取消并invalid + // //TODO ALL: 如果删除全部,name和下面的if判断2行 + // name := gjson.Get(shi.String(), "name").String() + // if name != "101室" && name != "102室" && name != "201室" && name != "202室" && !strings.Contains(name, "商铺") { + // resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetQueryParams(map[string]string{ + // "regionId": "A", + // "districtId": districtId, + // "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), + // "roadId": "11", + // }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryStandardAddress") + // if err != nil || resp.IsError() { + // panic(exception.New("获取地址详情失败")) + // } + // //判断用户是否为0,设备是否有关联 + // userCount := gjson.Get(resp.String(), "0.userCount").String() + // eqptCount := gjson.Get(resp.String(), "0.eqptCount").String() + // if userCount == "0" && eqptCount != "0" { + // //用户为0,并且有设备关联 + // resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetQueryParams(map[string]string{ + // "regionId": "A", + // "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), + // }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryEqpts") + // if err != nil || resp.IsError() { + // panic(exception.New("获取设备详情失败")) + // } + // var nodeIDs []int64 + // gjson.Parse(resp.String()).ForEach(func(key, value gjson.Result) bool { + // nodeIDs = append(nodeIDs, value.Get("eqptNodeId").Int()) + // return true // 返回true以继续遍历 + // }) + // //取消关联 + // resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetBody(map[string]interface{}{ + // "eqptNodeIds": nodeIDs, + // "standardAddrId": gjson.Get(shi.String(), "standardAddrId").String(), + // "oldAddrId": gjson.Get(shi.String(), "standardAddrId").String(), + // "regionId": "A", + // }).Post("http://132.151.25.19:15609/prod-api/resource/list/updateEqptStandAddress") + // logkit.Info("已取消关联:" + gjson.Get(shi.String(), "detailName").String()) + // //删除单独一室 + // m := shi.Map() + // resultMap := make(map[string]interface{}) + // for k, v := range m { + // resultMap[k] = v.Value() + // } + // resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") + // if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + // panic(exception.New("Invalid失败")) + // } + // logkit.Info("已删除室:" + gjson.Get(shi.String(), "detailName").String()) + // } else { + // logkit.Info("@@@存在用户/无设备@@@" + gjson.Get(shi.String(), "detailName").String()) + // logkit.Info("用户数:" + userCount + ",设备数:" + eqptCount) + // } + // } } - //} - //} }) } //处理完每个室后,对于大于等于3层的,直接删除整层,删除前要先POST验证,如果还有用户,会报错拦截 //TODO ALL:如果要删除全部,注释if - //if cast.ToInt(temp) >= 3 { - m := ceng.Map() - resultMap := make(map[string]interface{}) - for k, v := range m { - resultMap[k] = v.Value() - } - resp, err = client.R(). - SetHeaders(map[string]string{ - "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - "Content-Type": "application/json;charset=UTF-8", - "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - }). - SetBody(resultMap).Post("http://132.151.25.19:15609/prod-api/address/standard/confirm/invalid") - if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { - panic(exception.New("有用户,无法删除层:" + gjson.Get(ceng.String(), "detailName").String())) - } - resp, err = client.R(). - SetHeaders(map[string]string{ - "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - "Content-Type": "application/json;charset=UTF-8", - "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - }). - SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") - if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { - panic(exception.New("Invalid失败")) - } - logkit.Info("已删除整层:" + gjson.Get(ceng.String(), "detailName").String()) + //if cast.ToInt(temp) >= 2 { + // m := ceng.Map() + // resultMap := make(map[string]interface{}) + // for k, v := range m { + // resultMap[k] = v.Value() + // } + // resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetBody(resultMap).Post("http://132.151.25.19:15609/prod-api/address/standard/confirm/invalid") + // if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + // panic(exception.New("有用户,无法删除层:" + gjson.Get(ceng.String(), "detailName").String())) + // } + // resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") + // if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + // panic(exception.New("Invalid失败")) + // } + // logkit.Info("已删除整层:" + gjson.Get(ceng.String(), "detailName").String()) //} }) } //处理完每个层后,删除每个单元,删除前要先POST验证,如果还有用户,会报错拦截 - m := danyuan.Map() - resultMap := make(map[string]interface{}) - for k, v := range m { - resultMap[k] = v.Value() - } - resp, err = client.R(). - SetHeaders(map[string]string{ - "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - "Content-Type": "application/json;charset=UTF-8", - "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - }). - SetBody(resultMap).Post("http://132.151.25.19:15609/prod-api/address/standard/confirm/invalid") - if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { - panic(exception.New("有用户,无法删除单元:" + gjson.Get(danyuan.String(), "detailName").String())) - } - resp, err = client.R(). - SetHeaders(map[string]string{ - "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - "Content-Type": "application/json;charset=UTF-8", - "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - }). - SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") - if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { - panic(exception.New("Invalid失败")) - } - logkit.Info("已删除整单元:" + gjson.Get(danyuan.String(), "detailName").String()) + //m := danyuan.Map() + //resultMap := make(map[string]interface{}) + //for k, v := range m { + // resultMap[k] = v.Value() + //} + //resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetBody(resultMap).Post("http://132.151.25.19:15609/prod-api/address/standard/confirm/invalid") + //if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + // panic(exception.New("有用户,无法删除单元:" + gjson.Get(danyuan.String(), "detailName").String())) + //} + //resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") + //if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + // panic(exception.New("Invalid失败")) + //} + //logkit.Info("已删除整单元:" + gjson.Get(danyuan.String(), "detailName").String()) }) } //处理完每个单元后,删除每幢,删除前要先POST验证,如果还有用户,会报错拦截 - m := zhuang.Map() - resultMap := make(map[string]interface{}) - for k, v := range m { - resultMap[k] = v.Value() - } - resp, err = client.R(). - SetHeaders(map[string]string{ - "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - "Content-Type": "application/json;charset=UTF-8", - "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - }). - SetBody(resultMap).Post("http://132.151.25.19:15609/prod-api/address/standard/confirm/invalid") - if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { - panic(exception.New("有用户,无法删除幢:" + gjson.Get(zhuang.String(), "detailName").String())) - } - resp, err = client.R(). - SetHeaders(map[string]string{ - "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), - "Content-Type": "application/json;charset=UTF-8", - "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - }). - SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") - if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { - panic(exception.New("Invalid失败")) - } - logkit.Info("已删除整幢:" + gjson.Get(zhuang.String(), "detailName").String()) + //m := zhuang.Map() + //resultMap := make(map[string]interface{}) + //for k, v := range m { + // resultMap[k] = v.Value() + //} + //resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetBody(resultMap).Post("http://132.151.25.19:15609/prod-api/address/standard/confirm/invalid") + //if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + // panic(exception.New("有用户,无法删除幢:" + gjson.Get(zhuang.String(), "detailName").String())) + //} + //resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") + //if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + // panic(exception.New("Invalid失败")) + //} + //logkit.Info("已删除整幢:" + gjson.Get(zhuang.String(), "detailName").String()) }) } } diff --git a/cmd/iom3.go b/cmd/iom3.go new file mode 100644 index 0000000..c3b156c --- /dev/null +++ b/cmd/iom3.go @@ -0,0 +1,392 @@ +package cmd + +import ( + "github.com/go-resty/resty/v2" + "github.com/mizuki1412/go-core-kit/class/exception" + "github.com/mizuki1412/go-core-kit/init/initkit" + "github.com/mizuki1412/go-core-kit/library/commonkit" + "github.com/mizuki1412/go-core-kit/service/configkit" + "github.com/mizuki1412/go-core-kit/service/logkit" + "github.com/spf13/cast" + "github.com/spf13/cobra" + "github.com/tidwall/gjson" + "github.com/xuri/excelize/v2" + "time" +) + +func init() { + rootCmd.AddCommand(iom3Cmd) + defFlagsIOM3(iom3Cmd) +} + +var iom3Cmd = &cobra.Command{ + Use: "iom3", + Short: "Batch processing operations of the iom", + Run: func(cmd *cobra.Command, args []string) { + initkit.BindFlags(cmd) + res := readExcelWaitDel() + runIOM3(res) + }, +} + +func defFlagsIOM3(cmd *cobra.Command) { + cmd.Flags().String("token", "", "*Specify the token of IOM") + cmd.Flags().String("file", "", "*Specify the path of IOM file") +} + +var client = resty.New().SetRetryCount(5).SetRetryWaitTime(20 * time.Second) + +func runIOM3(data map[string][][]string) { + //先处理11级地址 + data11 := data["11"] + for _, v := range data11 { + _ = commonkit.RecoverFuncWrapper(func() { + queryEqptsAndInvalid(v[3], v[0], v[1], v[2]) + }) + } + data10 := data["10"] + for _, v := range data10 { + _ = commonkit.RecoverFuncWrapper(func() { + queryEqptsAndInvalid2(v[3], v[0], v[1], v[2]) + }) + } + data9 := data["9"] + for _, v := range data9 { + _ = commonkit.RecoverFuncWrapper(func() { + queryEqptsAndInvalid2(v[3], v[0], v[1], v[2]) + }) + } + data8 := data["8"] + for _, v := range data8 { + _ = commonkit.RecoverFuncWrapper(func() { + queryEqptsAndInvalid2(v[3], v[0], v[1], v[2]) + }) + } + data7 := data["7"] + for _, v := range data7 { + _ = commonkit.RecoverFuncWrapper(func() { + queryEqptsAndInvalid2(v[3], v[0], v[1], v[2]) + }) + } +} + +func queryEqptsAndInvalid(districtId, standardAddrId, roadId, parentId string) { + //获取上一级地址 + resp, err := client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(map[string]interface{}{ + "districtId": districtId, + "parentAddrId": parentId, + "regionId": "A", + "roadId": roadId, + }).Post("http://132.151.25.19:15609/prod-api/address/standard/list/tree") + if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + panic(exception.New("获取TreeThis失败")) + } + treeThis := gjson.Get(resp.String(), "data").Array() + for _, this := range treeThis { + if this.Get("standardAddrId").String() != standardAddrId { + continue + } + logkit.Info("开始处理:" + this.Get("detailName").String()) + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetQueryParams(map[string]string{ + "regionId": "A", + "districtId": districtId, + "standardAddrId": standardAddrId, + "roadId": roadId, + }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryStandardAddress") + if err != nil || resp.IsError() { + panic(exception.New("获取地址详情失败")) + } + //判断用户是否为0,设备是否有关联 + userCount := gjson.Get(resp.String(), "0.userCount").String() + eqptCount := gjson.Get(resp.String(), "0.eqptCount").String() + if userCount == "0" { + if eqptCount != "0" { + //用户为0,并且有设备关联,取消关联后删除 + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetQueryParams(map[string]string{ + "regionId": "A", + "standardAddrId": standardAddrId, + }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryEqpts") + if err != nil || resp.IsError() { + panic(exception.New("获取设备详情失败")) + } + nodeID := gjson.Get(resp.String(), "0.eqptNodeId").Int() + //取消关联 + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(map[string]interface{}{ + "eqptNodeIds": []int64{nodeID}, + "standardAddrId": standardAddrId, + "oldAddrId": standardAddrId, + "regionId": "A", + }).Post("http://132.151.25.19:15609/prod-api/resource/list/updateEqptStandAddress") + logkit.Info("已取消关联:" + gjson.Get(this.String(), "detailName").String()) + m := this.Map() + resultMap := make(map[string]interface{}) + for k, v := range m { + resultMap[k] = v.Value() + } + //resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetBody(resultMap).Post("http://132.151.25.19:15609/prod-api/address/standard/confirm/invalid") + //if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + // panic(exception.New("有用户,无法删除:" + gjson.Get(this.String(), "detailName").String())) + //} + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") + if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + panic(exception.New("Invalid失败")) + } + logkit.Info("已删除:" + gjson.Get(this.String(), "detailName").String()) + } else { + //用户为0,并且没有设备关联,直接删除 + m := this.Map() + resultMap := make(map[string]interface{}) + for k, v := range m { + resultMap[k] = v.Value() + } + //resp, err = client.R(). + // SetHeaders(map[string]string{ + // "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + // "Content-Type": "application/json;charset=UTF-8", + // "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + // "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + // }). + // SetBody(resultMap).Post("http://132.151.25.19:15609/prod-api/address/standard/confirm/invalid") + //if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + // panic(exception.New("有用户,无法删除:" + gjson.Get(this.String(), "detailName").String())) + //} + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") + if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + panic(exception.New("Invalid失败")) + } + logkit.Info("已删除:" + gjson.Get(this.String(), "detailName").String()) + } + } else { + logkit.Info("@@@存在用户@@@" + gjson.Get(this.String(), "detailName").String()) + } + break + } +} + +func queryEqptsAndInvalid2(districtId, standardAddrId, roadId, parentId string) { + //获取上一级地址 + resp, err := client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(map[string]interface{}{ + "districtId": districtId, + "parentAddrId": parentId, + "regionId": "A", + "roadId": roadId, + }).Post("http://132.151.25.19:15609/prod-api/address/standard/list/tree") + if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + panic(exception.New("获取TreeThis失败")) + } + treeThis := gjson.Get(resp.String(), "data").Array() + for _, this := range treeThis { + if this.Get("standardAddrId").String() != standardAddrId { + continue + } + logkit.Info("开始处理:" + this.Get("detailName").String()) + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetQueryParams(map[string]string{ + "regionId": "A", + "districtId": districtId, + "standardAddrId": standardAddrId, + "roadId": roadId, + }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryStandardAddress") + if err != nil || resp.IsError() { + panic(exception.New("获取地址详情失败")) + } + //判断用户是否为0,设备是否有关联 + userCount := gjson.Get(resp.String(), "0.userCount").String() + eqptCount := gjson.Get(resp.String(), "0.eqptCount").String() + if userCount == "0" { + if eqptCount != "0" { + //用户为0,并且有设备关联,取消关联后删除 + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetQueryParams(map[string]string{ + "regionId": "A", + "standardAddrId": standardAddrId, + }).Get("http://132.151.25.19:15609/prod-api/resource/list/queryEqpts") + if err != nil || resp.IsError() { + panic(exception.New("获取设备详情失败")) + } + nodeID := gjson.Get(resp.String(), "0.eqptNodeId").Int() + //取消关联 + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(map[string]interface{}{ + "eqptNodeIds": []int64{nodeID}, + "standardAddrId": standardAddrId, + "oldAddrId": standardAddrId, + "regionId": "A", + }).Post("http://132.151.25.19:15609/prod-api/resource/list/updateEqptStandAddress") + logkit.Info("已取消关联:" + gjson.Get(this.String(), "detailName").String()) + m := this.Map() + resultMap := make(map[string]interface{}) + for k, v := range m { + resultMap[k] = v.Value() + } + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(resultMap).Post("http://132.151.25.19:15609/prod-api/address/standard/confirm/invalid") + if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + panic(exception.New("有用户,无法删除:" + gjson.Get(this.String(), "detailName").String())) + } + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") + if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + panic(exception.New("Invalid失败")) + } + logkit.Info("已删除:" + gjson.Get(this.String(), "detailName").String()) + } else { + //用户为0,并且没有设备关联,直接删除 + m := this.Map() + resultMap := make(map[string]interface{}) + for k, v := range m { + resultMap[k] = v.Value() + } + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(resultMap).Post("http://132.151.25.19:15609/prod-api/address/standard/confirm/invalid") + if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + panic(exception.New("有用户,无法删除:" + gjson.Get(this.String(), "detailName").String())) + } + resp, err = client.R(). + SetHeaders(map[string]string{ + "Authorization": "HaoXian " + cast.ToString(configkit.Get("token", "")), + "Content-Type": "application/json;charset=UTF-8", + "Cookie": "Admin-Expires-In=720; Admin-Token=" + cast.ToString(configkit.Get("token", "")), + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + }). + SetBody(resultMap).Put("http://132.151.25.19:15609/prod-api/address/standard/invalid") + if err != nil || resp.IsError() || gjson.Get(resp.String(), "code").Int() != 200 { + panic(exception.New("Invalid失败")) + } + logkit.Info("已删除:" + gjson.Get(this.String(), "detailName").String()) + } + } else { + logkit.Info("@@@存在用户@@@" + gjson.Get(this.String(), "detailName").String()) + } + break + } +} + +func readExcelWaitDel() map[string][][]string { + // 打开 Excel 文件 + f, err := excelize.OpenFile(configkit.GetString("file", "/Users/leo/Downloads/标准地址0112J待删除.xlsx")) + if err != nil { + logkit.Fatal(err) + } + defer func() { + // 关闭文件 + if err := f.Close(); err != nil { + logkit.Fatal(err) + } + }() + + var result [][]string + m := make(map[string][][]string) + + // 获取 Excel 表的行 + rows, err := f.GetRows("标准地址") + if err != nil { + logkit.Fatal(err) + } + + // 遍历每一行,从第二行开始 + for i, row := range rows { + if i == 0 { + // 跳过标题行 + continue + } + if len(row) >= 14 { // 确保至少有 4 列 + currentRow := []string{row[0], row[3], row[5], row[14]} //0标准地址id 3地址层级 5上级地址id 14区县编码 + result = append(result, currentRow) + m[row[3]] = append(m[row[3]], currentRow) + } + } + return m +} diff --git a/cmd/supply.go b/cmd/supply.go index 4780aec..49df46b 100644 --- a/cmd/supply.go +++ b/cmd/supply.go @@ -40,11 +40,14 @@ var exchangeArr []*exchange type exchange struct { changeNo string + backDateNo string + rootOrderNo string inProject string outProject string goodsName string unit string productsNums float64 + realNum float64 realPrice float64 remainderRealAmount float64 inOut string @@ -65,7 +68,7 @@ func handleList() { "pageNum": "1", "pageSize": "8000", "type": "out", - }).Post("https://inneruscm.chinaunicom.cn:10003/api/biz-service-order/outer/v1.0/bizChange/findChangeOrderForPage") + }).Post("https://uscmxc.chinaunicom.cn:10003/api/biz-service-order/outer/v1.0/bizChange/findChangeOrderForPage") if err != nil || resp.IsError() || gjson.Get(resp.String(), "success").Bool() != true { panic(exception.New("获取调拨(调出)列表失败")) } @@ -84,9 +87,11 @@ func handleList() { //} id := v.Get("id").String() changeNo := v.Get("changeNo").String() + backDateNo := v.Get("backDateNo").String() + rootOrderNo := v.Get("rootOrderNo").String() note := v.Get("note").String() _ = commonkit.RecoverFuncWrapper(func() { - getDetail(id, "out", changeNo, inProject, outProject, note) + getDetail(id, "out", changeNo, backDateNo, rootOrderNo, inProject, outProject, note) }) } resp, err = supplyClient.R(). @@ -100,7 +105,7 @@ func handleList() { "pageNum": "1", "pageSize": "8000", "type": "in", - }).Post("https://inneruscm.chinaunicom.cn:10003/api/biz-service-order/outer/v1.0/bizChange/findChangeOrderForPage") + }).Post("https://uscmxc.chinaunicom.cn:10003/api/biz-service-order/outer/v1.0/bizChange/findChangeOrderForPage") if err != nil || resp.IsError() || gjson.Get(resp.String(), "success").Bool() != true { panic(exception.New("获取调拨(调入)列表失败")) } @@ -118,14 +123,16 @@ func handleList() { //} id := v.Get("id").String() changeNo := v.Get("changeNo").String() + backDateNo := v.Get("backDateNo").String() + rootOrderNo := v.Get("rootOrderNo").String() note := v.Get("note").String() _ = commonkit.RecoverFuncWrapper(func() { - getDetail(id, "in", changeNo, inProject, outProject, note) + getDetail(id, "in", changeNo, backDateNo, rootOrderNo, inProject, outProject, note) }) } } -func getDetail(id, inOut, changeNo, inProject, outProject, note string) { +func getDetail(id, inOut, changeNo, backDateNo, rootOrderNo, inProject, outProject, note string) { //time.Sleep(200 * time.Millisecond) resp, err := supplyClient.R(). SetHeaders(map[string]string{ @@ -135,19 +142,23 @@ func getDetail(id, inOut, changeNo, inProject, outProject, note string) { }).SetBody(map[string]string{ "id": id, "type": inOut, - }).Post("https://inneruscm.chinaunicom.cn:10003/api/biz-service-order/outer/v1.0/bizChange/findChangeOrderDetailed") + }).Post("https://uscmxc.chinaunicom.cn:10003/api/biz-service-order/outer/v1.0/bizChange/findChangeOrderDetailed") if err != nil || resp.IsError() || gjson.Get(resp.String(), "success").Bool() != true { panic(exception.New("获取详情失败! " + changeNo)) } detailList := gjson.Get(resp.String(), "data.changeOrderProduct").Array() + for _, v := range detailList { goodsName := v.Get("goodsName").String() unit := v.Get("unit").String() productsNums := v.Get("productsNums").String() realPrice := v.Get("realPrice").String() productsAmount := v.Get("productsAmount").String() + realNum := v.Get("realNums").String() ex := new(exchange) ex.changeNo = changeNo + ex.backDateNo = backDateNo + ex.rootOrderNo = rootOrderNo ex.inProject = inProject ex.outProject = outProject ex.goodsName = goodsName @@ -156,6 +167,7 @@ func getDetail(id, inOut, changeNo, inProject, outProject, note string) { ex.realPrice = cast.ToFloat64(realPrice) ex.remainderRealAmount = cast.ToFloat64(productsAmount) ex.note = note + ex.realNum = cast.ToFloat64(realNum) if inOut == "in" { ex.inOut = "调入" } else if inOut == "out" { @@ -172,7 +184,7 @@ func genExcelFile() { f := excelize.NewFile() // 设置表头 - headers := []string{"序号", "调拨单号", "物资名称", "单位", "数量", "单价", "总价", "调出项目", "调入项目", "调入调出"} + headers := []string{"序号", "原采购订单", "调拨单号", "调拨源", "物资名称", "单位", "数量", "剩/转固数量", "单价", "总价", "调出项目", "调入项目", "调入调出", "备注"} for i, header := range headers { cell, _ := excelize.CoordinatesToCellName(i+1, 1) f.SetCellValue("Sheet1", cell, header) @@ -180,22 +192,25 @@ func genExcelFile() { // 填充数据 for i, ex := range exchangeArr { - row := i + 2 // 数据从第2行开始 - f.SetCellValue("Sheet1", "A"+strconv.Itoa(row), i+1) // 序号 - f.SetCellValue("Sheet1", "B"+strconv.Itoa(row), ex.changeNo) // 调拨单号 - f.SetCellValue("Sheet1", "C"+strconv.Itoa(row), ex.goodsName) // 物资名称 - f.SetCellValue("Sheet1", "D"+strconv.Itoa(row), ex.unit) // 单位 - f.SetCellValue("Sheet1", "E"+strconv.Itoa(row), ex.productsNums) // 数量 - f.SetCellValue("Sheet1", "F"+strconv.Itoa(row), ex.realPrice) // 单价 - f.SetCellValue("Sheet1", "G"+strconv.Itoa(row), ex.remainderRealAmount) // 总价 - f.SetCellValue("Sheet1", "H"+strconv.Itoa(row), ex.outProject) // 调出项目 - f.SetCellValue("Sheet1", "I"+strconv.Itoa(row), ex.inProject) // 调入项目 - f.SetCellValue("Sheet1", "J"+strconv.Itoa(row), ex.inOut) - f.SetCellValue("Sheet1", "K"+strconv.Itoa(row), ex.note) // 调入调出 + row := i + 2 // 数据从第2行开始 + f.SetCellValue("Sheet1", "A"+strconv.Itoa(row), i+1) // 序号 + f.SetCellValue("Sheet1", "B"+strconv.Itoa(row), ex.rootOrderNo) + f.SetCellValue("Sheet1", "C"+strconv.Itoa(row), ex.changeNo) // 调拨单号 + f.SetCellValue("Sheet1", "D"+strconv.Itoa(row), ex.backDateNo) // 调拨源 + f.SetCellValue("Sheet1", "E"+strconv.Itoa(row), ex.goodsName) // 物资名称 + f.SetCellValue("Sheet1", "F"+strconv.Itoa(row), ex.unit) // 单位 + f.SetCellValue("Sheet1", "G"+strconv.Itoa(row), ex.productsNums) // 数量 + f.SetCellValue("Sheet1", "H"+strconv.Itoa(row), ex.realNum) //剩/转固数量 + f.SetCellValue("Sheet1", "I"+strconv.Itoa(row), ex.realPrice) // 单价 + f.SetCellValue("Sheet1", "J"+strconv.Itoa(row), ex.remainderRealAmount) // 总价 + f.SetCellValue("Sheet1", "K"+strconv.Itoa(row), ex.outProject) // 调出项目 + f.SetCellValue("Sheet1", "L"+strconv.Itoa(row), ex.inProject) // 调入项目 + f.SetCellValue("Sheet1", "M"+strconv.Itoa(row), ex.inOut) + f.SetCellValue("Sheet1", "N"+strconv.Itoa(row), ex.note) // 备注 } // 保存文件 - if err := f.SaveAs("/Users/leo/Documents/erp调拨-all.xlsx"); err != nil { + if err := f.SaveAs("/Users/leo/Documents/erp调拨-syj.xlsx"); err != nil { panic(exception.New("保存文件失败...")) } } diff --git a/cmd/test.go b/cmd/test.go index 9db5a42..24be816 100644 --- a/cmd/test.go +++ b/cmd/test.go @@ -1,16 +1,21 @@ package cmd import ( + "crypto/md5" + "encoding/base64" + "encoding/hex" + "encoding/json" "fmt" + "log" + "strconv" + "time" + "github.com/mizuki1412/go-core-kit/class/exception" "github.com/mizuki1412/go-core-kit/service/logkit" "github.com/spf13/cast" "github.com/spf13/cobra" "github.com/tidwall/gjson" "github.com/xuri/excelize/v2" - "log" - "strconv" - "time" ) func init() { @@ -21,14 +26,44 @@ var testCmd = &cobra.Command{ Use: "test", Short: "Only for test", Run: func(cmd *cobra.Command, args []string) { - extractColumnsLoss() - + fff() }, } +func md5str(s string) string { + h := md5.Sum([]byte(s)) + return hex.EncodeToString(h[:]) +} + +func getToken(timestamp, systemCode string) string { + return md5str(timestamp + systemCode) +} + +func getPostKey(data interface{}) string { + b, _ := json.Marshal(data) + return base64.StdEncoding.EncodeToString(b) +} + +func fff() { + systemCode := "3axgoA2bKgTjANbCPaeKMkeGe/8uTzyv17kjLC0CWV7fyM3keJwlg0WWyeYsXCWrm40/i7cL1TMsY4zThYj3dkKEnmCqRhMiRYJ7n/0l0dMLsKeFHDStUL1HSfQ/WjFQ9cWnR5Jm/MUD/F2w9SkmOTwU5jT6zZ7gG2SV3AzCh/IFo+BE7KWY1tkrH+xCPRWGRDCOHOGAI8JbDHSBMpbvU2eWTUfZyjMTzzvTu++3CN6OWMqigMP3O07NkcKXhhn9L4CJtigxPdTBN3ubKLRGcId+7JmJGvI4sCJBMEky913nDtqyr/8iORDZI7xT/QUUQYBwSs2ys5HsbJv7C7jAURUt5UhTS0CRqTxVlkUKm6iS0/e6MxODvcIYb6eUopOTzUhQu7KSj4CELD9v3oxJXARN+kXLFZ3LukRTe8Oo+PgTxZS2jgc5hMLpT4G9eBkHXoIPrx8ddGwik2q1xhSX1VviJSU5JtM6HtM1m5BfBV0" // 👈 从前端拿到 + + timestamp := "20260415123456000" // 按页面格式生成 + token := getToken(timestamp, systemCode) + + data := map[string]interface{}{ + "evtTime": timestamp, + "token": token, + } + + postKey := getPostKey(data) + + fmt.Println("token:", token) + fmt.Println("postKey:", postKey) +} + func extractColumnsLoss() { // 打开 Excel 文件 - f, err := excelize.OpenFile("/Users/leo/Documents/竣工与调度光衰单 (79).xlsx") + f, err := excelize.OpenFile("/Users/leo/Documents/竣工与调度光衰单 (21).xlsx") if err != nil { log.Fatal(err) } @@ -56,9 +91,9 @@ func extractColumnsLoss() { for i, row := range data { resp, err := lawClient.R(). SetHeaders(map[string]string{ - "Authorization": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxNTY1NzE3NTEyNCIsInVzZXJJZCI6IjE2NjUiLCJuYW1lIjoi6K646ZyW5Y2TIiwiZXhwIjoxNzQyMjE0NTI2LCJuYmYiOjE3NDIxOTY1MjZ9.eVclGWTTxAVOjvV9NK4T_FCF2DngXkz_g6JYz2Ik4H8oLZW9Q1iEW3WLtwVUCiyW1qPLIITictdFzAeM6sbT7Wmvg4HbOHJNWxNJtkoB8xAAFBBE9r9ri8cXUz_Actt5WAhM5K4U42ed0TLtifC1KuXxgwMRervaqxuWBzjzhQY", + "Authorization": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxNTY1NzE3NTEyNCIsInVzZXJJZCI6IjE2NjUiLCJuYW1lIjoi6K646ZyW5Y2TIiwiZXhwIjoxNzYxOTE2NTAwLCJuYmYiOjE3NjE4OTg1MDB9.DBqqShxxp5dwLrKYzuKFneRnqQub5V5ocbwFSAa5DvmHww3iWWAHLRD9bPkoE20CSDqcVjOj2MjkttaT3EarYqVhPxTdXtS0rddWTZaRDiMkO5GOFRvdlb-404h2YCUtxoubM0033v9jBKF_VgjMphUo_w8VjizqzcouucBlNtE", "Content-type": "application/json;charset=UTF-8", - "Cookie": "Admin-Token=eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxNTY1NzE3NTEyNCIsInVzZXJJZCI6IjE2NjUiLCJuYW1lIjoi6K646ZyW5Y2TIiwiZXhwIjoxNzQyMjE0NTI2LCJuYmYiOjE3NDIxOTY1MjZ9.eVclGWTTxAVOjvV9NK4T_FCF2DngXkz_g6JYz2Ik4H8oLZW9Q1iEW3WLtwVUCiyW1qPLIITictdFzAeM6sbT7Wmvg4HbOHJNWxNJtkoB8xAAFBBE9r9ri8cXUz_Actt5WAhM5K4U42ed0TLtifC1KuXxgwMRervaqxuWBzjzhQY; sysName=%E8%AE%B8%E9%9C%96%E5%8D%93", + "Cookie": "Admin-Token=eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxNTY1NzE3NTEyNCIsInVzZXJJZCI6IjE2NjUiLCJuYW1lIjoi6K646ZyW5Y2TIiwiZXhwIjoxNzYxOTE2NTAwLCJuYmYiOjE3NjE4OTg1MDB9.DBqqShxxp5dwLrKYzuKFneRnqQub5V5ocbwFSAa5DvmHww3iWWAHLRD9bPkoE20CSDqcVjOj2MjkttaT3EarYqVhPxTdXtS0rddWTZaRDiMkO5GOFRvdlb-404h2YCUtxoubM0033v9jBKF_VgjMphUo_w8VjizqzcouucBlNtE; sysName=%E8%AE%B8%E9%9C%96%E5%8D%93", }).SetBody(map[string]interface{}{ "endTime": cast.ToString(time.Now().Format("2006-01-02")), "eqpLoid": row, @@ -71,14 +106,24 @@ func extractColumnsLoss() { fmt.Println(err) } else { res := gjson.Get(resp.String(), "data.rows").Array() - f.SetCellValue("{worksheet}", "AZ"+strconv.Itoa(i+2), res[0].Get("onu_rx_power").String()) - f.SetCellValue("{worksheet}", "BA"+strconv.Itoa(i+2), res[1].Get("onu_rx_power").String()) - f.SetCellValue("{worksheet}", "BB"+strconv.Itoa(i+2), res[2].Get("onu_rx_power").String()) - f.SetCellValue("{worksheet}", "BC"+strconv.Itoa(i+2), res[3].Get("onu_rx_power").String()) - f.SetCellValue("{worksheet}", "BD"+strconv.Itoa(i+2), res[4].Get("onu_rx_power").String()) + if len(res) > 0 { + f.SetCellValue("{worksheet}", "AZ"+strconv.Itoa(i+2), res[0].Get("onu_rx_power").String()) + } + if len(res) > 1 { + f.SetCellValue("{worksheet}", "BA"+strconv.Itoa(i+2), res[1].Get("onu_rx_power").String()) + } + if len(res) > 2 { + f.SetCellValue("{worksheet}", "BB"+strconv.Itoa(i+2), res[2].Get("onu_rx_power").String()) + } + if len(res) > 3 { + f.SetCellValue("{worksheet}", "BC"+strconv.Itoa(i+2), res[3].Get("onu_rx_power").String()) + } + if len(res) > 4 { + f.SetCellValue("{worksheet}", "BD"+strconv.Itoa(i+2), res[4].Get("onu_rx_power").String()) + } } } - if err := f.SaveAs("/Users/leo/Documents/竣工与调度光衰单 (79).xlsx"); err != nil { + if err := f.SaveAs("/Users/leo/Documents/竣工与调度光衰单 (21).xlsx"); err != nil { fmt.Println(err) } logkit.Info("生成结束...") diff --git a/config.json b/config.json index 353f2fd..4aefcd7 100644 --- a/config.json +++ b/config.json @@ -3,9 +3,12 @@ "dir": "/Users/leo/go/src/leo/project/cu-helper" }, "eng": { - "step": "YSQR", - "pro": "XQXJ", - "sid": "d6bacfb8-4d1f-45aa-ae29-56ecc43dc9af" + "sid": "a18e5e46-8097-4bb9-90c1-725de26ed0c6", + "pro": "", + "projLX": "CNA25AC0000277.3301", + "projKR": "CMA26CE0000006.3301", + "projXQ": "", + "projLY": "" }, "wms": { "token": "D6228DF68B10DC7B9FD89F30948785EA" diff --git a/cus-eng-con-sys/config/config_constant.go b/cus-eng-con-sys/config/config_constant.go index 97536a3..7ba725d 100644 --- a/cus-eng-con-sys/config/config_constant.go +++ b/cus-eng-con-sys/config/config_constant.go @@ -15,4 +15,7 @@ const ( ProcessYSJF = "YSJFProcess" ) +const ( + EngProcess = "eng.pro" +) const UrlPrefix = "http://10.202.2.108:8086" diff --git a/cus-eng-con-sys/model/pdm_push_process.go b/cus-eng-con-sys/model/pdm_push_process.go index 80c063d..513d05a 100644 --- a/cus-eng-con-sys/model/pdm_push_process.go +++ b/cus-eng-con-sys/model/pdm_push_process.go @@ -45,7 +45,7 @@ func NewPDMPushProcess(processInsId, taskId, taskTitle string) *PDMPushProcess { pdmPushProcess.PdmProjReceiverId = "3083564" pdmPushProcess.BuildModel = "ZJ" pdmPushProcess.SupervisorProviderId = "309320681" - pdmPushProcess.SupervisorReceiverId = "3098707" + pdmPushProcess.SupervisorReceiverId = "3102931" pdmPushProcess.Ranstr = cryptokit.RandomStr(true, 10, 32) pdmPushProcess.Timestamp = cryptokit.GetTimeStamp() return pdmPushProcess diff --git a/cus-eng-con-sys/model/start_act_process.go b/cus-eng-con-sys/model/start_act_process.go index 572801e..43e1f6d 100644 --- a/cus-eng-con-sys/model/start_act_process.go +++ b/cus-eng-con-sys/model/start_act_process.go @@ -44,7 +44,7 @@ func NewStartActProcess(proInsId, taskId string) *StartActProcess { startActProcess.ProcessInstanceId = proInsId startActProcess.TaskId = taskId startActProcess.TaskDefinitionKey = "GCSG" - startActProcess.Assignee = "3105305" //可修改,张子杰 //todo 零星不一样 + startActProcess.Assignee = "3104398" //可修改,张子杰 //todo 零星不一样 startActProcess.Comment = "请施工" startActProcess.HandleType = "1" startActProcess.Withdraw = "1" diff --git a/cus-eng-con-sys/model/task_todo.go b/cus-eng-con-sys/model/task_todo.go new file mode 100644 index 0000000..d637bb4 --- /dev/null +++ b/cus-eng-con-sys/model/task_todo.go @@ -0,0 +1,75 @@ +package model + +import ( + "cu-helper/cus-eng-con-sys/cryptokit" + "reflect" +) + +/* +/zjgd/frm/workflow/taskToDo.action +*/ + +/* +用途 +1、获取待办任务 +*/ + +type TaskTodo struct { + Start string `map:"start"` + Length string `map:"length"` + Title string `map:"title"` + LinkName string `map:"linkName"` + CreateTimeStart string `map:"createTimeStart"` + CreateTimeEnd string `map:"createTimeEnd"` + DbStartFlag string `map:"dbStartFlag"` + Ranstr string `map:"ranstr"` + Timestamp string `map:"timestamp"` +} + +func NewTaskTodo(process string) *TaskTodo { + taskTodo := new(TaskTodo) + taskTodo.Start = "1" + taskTodo.Length = "9999" + taskTodo.Title = "" + taskTodo.LinkName = process + taskTodo.CreateTimeStart = "" + taskTodo.CreateTimeEnd = "" + taskTodo.DbStartFlag = "" + taskTodo.Ranstr = cryptokit.RandomStr(true, 10, 32) + taskTodo.Timestamp = cryptokit.GetTimeStamp() + return taskTodo +} + +// GenReqParam 返回加密后的请求参数 +func (th *TaskTodo) GenReqParam() map[string]string { + th.encrypt() + return th.structToMap() +} + +func (th *TaskTodo) structToMap() map[string]string { + result := make(map[string]string) + t := reflect.TypeOf(*th) + v := reflect.ValueOf(*th) + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + value := v.Field(i) + // Use the tag value as the key in the map, if it exists; otherwise, use the field name. + tag := field.Tag.Get("map") + if tag == "" { + tag = field.Name + } + + result[tag] = value.String() + } + return result +} + +func (th *TaskTodo) encrypt() { + v := reflect.ValueOf(th).Elem() + for i := 0; i < v.NumField(); i++ { + field := v.Field(i) + if field.CanSet() { + field.SetString(cryptokit.Encrypt(field.String())) + } + } +} diff --git a/cus-eng-con-sys/model/update_act_info_org_staff.go b/cus-eng-con-sys/model/update_act_info_org_staff.go index 3b83a20..15fd4ad 100644 --- a/cus-eng-con-sys/model/update_act_info_org_staff.go +++ b/cus-eng-con-sys/model/update_act_info_org_staff.go @@ -23,8 +23,8 @@ type UpdateActInfoOrgAndStaff struct { func NewUpdateActInfoOrgAndStaff(actId string) *UpdateActInfoOrgAndStaff { updateActInfoOrgAndStaff := new(UpdateActInfoOrgAndStaff) - updateActInfoOrgAndStaff.ActStartOrgId = "3105305" //todo 张子杰 零星需改 - updateActInfoOrgAndStaff.ActOrgCode = "309320240" //todo 张子杰 零星需改 + updateActInfoOrgAndStaff.ActStartOrgId = "3104398" //todo 鱼饼 零星需改 + updateActInfoOrgAndStaff.ActOrgCode = "1538688" //todo 余秉 零星需改 updateActInfoOrgAndStaff.ActId = actId updateActInfoOrgAndStaff.Ranstr = cryptokit.RandomStr(true, 10, 32) updateActInfoOrgAndStaff.Timestamp = cryptokit.GetTimeStamp() diff --git a/cus-eng-con-sys/model/update_pdm_production.go b/cus-eng-con-sys/model/update_pdm_production.go index d03d6f4..6dca3ec 100644 --- a/cus-eng-con-sys/model/update_pdm_production.go +++ b/cus-eng-con-sys/model/update_pdm_production.go @@ -3,8 +3,9 @@ package model import ( "cu-helper/cus-eng-con-sys/cryptokit" "cu-helper/cus-eng-con-sys/util" - "github.com/mizuki1412/go-core-kit/service/logkit" "reflect" + + "github.com/mizuki1412/go-core-kit/service/logkit" ) /* @@ -51,7 +52,7 @@ func NewUpdatePdmProduction(touzi, remandId, html, taskTitle string) *UpdatePdmP updatePdmProduction.ResourceType = "undefined" updatePdmProduction.IsNewNational = "0" updatePdmProduction.SupervisorProviderId = "309320681" //监理(可修改) - updatePdmProduction.SupervisorReceiverId = "3098707" //监理(可修改) + updatePdmProduction.SupervisorReceiverId = "3102931" //监理(可修改) updatePdmProduction.Ranstr = cryptokit.RandomStr(true, 10, 32) updatePdmProduction.Timestamp = cryptokit.GetTimeStamp() logkit.Info(taskTitle + " 投资:" + remandTouzi + "元") diff --git a/erp-mat/common/excelkit.go b/erp-mat/common/excelkit.go index ce10d45..1364876 100644 --- a/erp-mat/common/excelkit.go +++ b/erp-mat/common/excelkit.go @@ -2,16 +2,17 @@ package common import ( "fmt" + "os" + "path/filepath" + "strings" + "time" + "github.com/mizuki1412/go-core-kit/class/exception" "github.com/mizuki1412/go-core-kit/library/mathkit" "github.com/mizuki1412/go-core-kit/service/configkit" "github.com/mizuki1412/go-core-kit/service/logkit" "github.com/spf13/cast" "github.com/xuri/excelize/v2" - "os" - "path/filepath" - "strings" - "time" ) type summary struct { @@ -52,7 +53,7 @@ func GenExcelFile() { } } // Save the file - if err := f.SaveAs("/Users/leo/Documents/ERP材料核对/材料汇总(" + time.Now().Format("1月2日") + ").xlsx"); err != nil { + if err := f.SaveAs("/Users/leo/Desktop/归档/ERP材料核对/材料汇总(" + time.Now().Format("1月2日") + ").xlsx"); err != nil { panic(exception.New(err.Error())) } logkit.Info("生成结束...") diff --git a/erp-mat/common/types.go b/erp-mat/common/types.go index 72970a4..88b1d18 100644 --- a/erp-mat/common/types.go +++ b/erp-mat/common/types.go @@ -6,7 +6,7 @@ import "github.com/mizuki1412/go-core-kit/class/exception" func getMatType(matName string) string { switch matName { - case "光缆_GYTA-4B1.3": + case "光缆_GYTA-4B1.3", "光缆_GYXTS-4B1.3": return "C" case "光缆_GYTA-4B1.3(m)": return "C~" @@ -14,7 +14,7 @@ func getMatType(matName string) string { return "D" case "光缆_GYTA-6B1.3(m)": return "D~" - case "光缆_GYTA-12B1.3", "光缆_GYTS - 12B1.3": + case "光缆_GYTA-12B1.3", "光缆_GYTS - 12B1.3", "光缆_GYXTS-12B1.3": return "E" case "光缆_GYTA-12B1.3(m)": return "E~" @@ -36,20 +36,22 @@ func getMatType(matName string) string { return "O" case "光分路器_盒式封装(报价包括SC连接器插头,以1.5m长的G.657A2(B6a2)、d2.0mm尾纤为基础) 1×16", "光分路器_托盘式封装(报价包括光纤适配器,以1.5m长的G.657A2(B6a2)、d2.0mm尾纤,SC/UPC类型适配器及插头为基础) 1×16", "光分路器_盒式封装 1×16", "光分路器_托盘式封装 1×16": return "P" - case "光分路器_盒式封装(报价包括SC连接器插头,以1.5m长的G.657A2(B6a2)、d2.0mm尾纤为基础) 1×32", "光分路器_托盘式封装(报价包括光纤适配器,以1.5m长的G.657A2(B6a2)、d2.0mm尾纤,SC/UPC类型适配器及插头为基础) 1×32", "光分路器_PLC 盒式 1×32 FC/UPC d2.0 1.5m": + case "光分路器_盒式封装(报价包括SC连接器插头,以1.5m长的G.657A2(B6a2)、d2.0mm尾纤为基础) 1×32", "光分路器_托盘式封装(报价包括光纤适配器,以1.5m长的G.657A2(B6a2)、d2.0mm尾纤,SC/UPC类型适配器及插头为基础) 1×32", "光分路器_PLC 盒式 1×32 FC/UPC d2.0 1.5m", "光分路器_插片式封装(报价包括光纤适配器,以1.5m长的G.657A2(B6a2)、d2.0mm尾纤,SC/UPC类型适配器及插头为基础) 1×32": return "Q" case "光分路器_盒式封装(报价包括SC连接器插头,以1.5m长的G.657A2(B6a2)、d2.0mm尾纤为基础) 1×64", "光分路器_托盘式封装(报价包括光纤适配器,以1.5m长的G.657A2(B6a2)、d2.0mm尾纤,SC/UPC类型适配器及插头为基础) 1×64", "光分路器_盒式封装 1×64", "光分路器_托盘式封装 1×64": return "R" case "光缆交接箱满配箱型005:传统型-落地式-复合材料(SMC)箱体-144芯_1030×570×310(含底座)", "144芯传统光缆交接箱(SMC)_SC或FC型_含底座、14块12芯熔配一体化托盘组件(束状纤)、12个直熔单元": return "T" - case "光缆交接箱满配箱型006:传统型-落地式-复合材料(SMC)箱体-288芯_1550×760×370(含底座)", "288芯传统光缆交接箱(SMC)_SC或FC型_含底座、28块12芯熔配一体化托盘组件(束状纤)、12个直熔单元": + case "光缆交接箱满配箱型006:传统型-落地式-复合材料(SMC)箱体-288芯_1550×760×370(含底座)", "288芯传统光缆交接箱(SMC)_SC或FC型_含底座、28块12芯熔配一体化托盘组件(束状纤)、12个直熔单元", "传统型光缆交接箱SMC箱体(288芯)_1200x760x370,含满配喉箍、内背装件、线环组件、跳纤存储单元等未单独列出的所有必配零部件": return "U" case "光缆交接箱满配箱型008:传统型-落地式-复合材料(SMC)箱体-576芯(双面)_1550×760×630(含底座)", "576芯双面传统光缆交接箱(SMC)_SC或FC型_含底座、56块12芯熔配一体化托盘组件(束状纤)、24个直熔单元": return "V" case "SMC非金属光缆分纤箱-16路壁挂/抱杆_385x295x110mm-2个1:8插片式安装位-满配", "SMC非金属光缆分纤箱-12芯壁挂/抱杆_ 345x235x100mm-1个1:8盒式安装位-满配", "室外型壁挂式光纤分线箱(镀锌板)_12芯": return "W" - case "室外型壁挂式光纤分线箱(镀锌板)_24芯": + case "室外型壁挂式光纤分线箱(镀锌板)_24芯", "SMC非金属光缆分纤箱-24芯壁挂/抱杆_ 385x295x110mm-2个1:8盒式安装位-满配": return "X" + case "盒式光纤分线箱_钣金550*400*130_熔接96芯,配线96芯,分光64路": + return "AA" case "光缆接头盒_双端 12芯 4孔 架空", "光缆接头盒_双端 12芯 4孔 管道": return "AE" case "光缆接头盒_双端 24芯 4孔 管道", "光缆接头盒_双端 24芯 4孔 架空": @@ -58,7 +60,7 @@ func getMatType(matName string) string { return "AG" case "光跳纤_SC/PC接头": return "AU" - case "基准光跳纤(1米,外护套3mm,不含接头)_G.652型": + case "基准光跳纤(1米,外护套3mm,不含接头)_G.652型", "基准光跳纤(1米,外护套2mm,不含接头)_G.652型": return "AV" case "光跳纤_FC/PC接头": return "AW" @@ -82,28 +84,38 @@ func getMatType(matName string) string { return "AX" case "光纤配线架_熔配一体化托盘12芯_公开市场", "综合配线架_熔配一体化托盘 12芯_公开市场": return "AY" - case "熔配一体化子框_48芯": + case "熔配一体化子框_48芯", "光纤配线架_48芯ODF配线架_带门,含12芯熔配一体化子框4盘,FC适配器,含尾纤": return "AZ" case "光纤配线架_2000×840×300mm(线路侧)配置-满配576芯_FC型,含8个72芯机框,48块12芯熔配一体化托盘组件(束状纤)", "光纤配线架_2200x600x300mm(线路侧)配置-满配504芯_FC型,含42块12芯熔配一体化托盘组件(束状纤)、3个存储单元": return "BA" - case "华为-扩容-MDU-GPON MDU-LAN设备B+光模块_OSG020201(含华为接入FTTx及铜线软件V2.00)", "华为-扩容-MDU-XG PON MDU-LAN设备N1光模块_OSX10GG201(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-10G EPON MDU-LAN设备PR30光模块_OSX10GE202(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-XG PON MDU-LAN设备N1光模块_OSX10GG201(含华为接入FTTx及铜线软件V2.00)": + case "华为-扩容-MDU-GPON MDU-LAN设备B+光模块_OSG020201(含华为接入FTTx及铜线软件V2.00)", "华为-扩容-MDU-XG PON MDU-LAN设备N1光模块_OSX10GG201(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-10G EPON MDU-LAN设备PR30光模块_OSX10GE202(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-XG PON MDU-LAN设备N1光模块_OSX10GG201(含华为接入FTTx及铜线软件V2.00)", "百兆光模块-_单纤单模,20KM,可支持数字诊断", "千兆单纤光模块_USFP-Gb/SS1x-D-R": return "BB" case "华为-扩容-MDU-XG PON MDU-LAN盒式设备(24端口GE)_MA5821-24*GE口(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-XG PON MDU-LAN盒式设备(24端口GE)_MA5821-24*GE口(含华为接入FTTx及铜线软件V2.00)": return "BC" case "华为-扩容-MDU-XG PON MDU-LAN盒式设备(24端口GE+24端口POTS)_MA5822-24*GE口+24*POTS口(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-XG PON MDU-LAN盒式设备(24端口GE+24端口POTS)_MA5822-24*GE口+24*POTS口(含华为接入FTTx及铜线软件V2.00)": return "BD" - case "扩容-MDU-10G PON MDU-LAN插卡设备POTS业务接口板(64路POTS)_MA5616-ASPB(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-10G PON MDU-LAN插卡设备系统软件_MA5616-H83SSYS01600(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-10G PON MDU-LAN插卡设备主机_MA5616(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-10G PON MDU-LAN插卡设备主控板(含单PON口,适用于XG PON)_MA5616-H833XP1A02(含华为接入FTTx及铜线软件V2.00)": + case "扩容-MDU-10G PON MDU-LAN插卡设备POTS业务接口板(64路POTS)_MA5616-ASPB(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-10G PON MDU-LAN插卡设备系统软件_MA5616-H83SSYS01600(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-10G PON MDU-LAN插卡设备主机_MA5616(含华为接入FTTx及铜线软件V2.00)", "扩容-MDU-10G PON MDU-LAN插卡设备主控板(含单PON口,适用于XG PON)_MA5616-H833XP1A02(含华为接入FTTx及铜线软件V2.00)", "华为_有线接入设备.PON光传输设备_GPON MDU-DSL插卡设备主控板(MA5616)_CCUDG": return "BE" case "华为-扩容-安装材料费_安装材料费(1%)", "安装材料费(以成交价为基准进行计算,仅在新建场景使用)_安装材料费(1%)": return "BF" case "华为-扩容-督导调测费_督导费(3%)", "督导调测费(以成交价为基准进行计算)_督导费(3%)": return "BG" - case "光纤收发器_EB200-SD1", "光纤收发器_EB200-SD1C", "光纤收发器_EB200-SS1": + case "华为_有线接入设备.PON光传输设备_E/GPON OLT设备上联光模块(GE/10km)(MA5680T/MA5683T)_OSG010001": return "BH" - case "金属光缆终端盒-12芯壁挂282*135*50mm_可装适配器12芯-满配", "光缆终端盒_12芯(含法兰盘/适配器型、金属)": + case "光纤收发器_EB200-SD1", "光纤收发器_EB200-SD1C", "光纤收发器_EB200-SS1", "千兆光纤收发器-_可网管,两个SFP接口,支持掉电告警, 端口自适应,不含光模块": return "BI" - case "数字通信电缆_超5类4对UTP电缆 HSYV5E 4*2*0.5": + case "单槽小机箱-_220V交流供电或-48V直流供电": return "BJ" + case "金属光缆终端盒-12芯壁挂282*135*50mm_可装适配器12芯-满配", "光缆终端盒_12芯(含法兰盘/适配器型、金属)", "塑料光缆终端盒-12芯壁挂300*150*54_可装适配器12芯-满配": + return "BK" + case "数字通信电缆_超5类4对UTP电缆 HSYV5E 4*2*0.5": + return "BL" + case "搬运费_普通": + return "BM" + case "100对110语音配线架模块_100对110语音配线架模块": + return "BN" + case "光纤适配器_FC/PC,SC/PC可选,用于免跳纤光交": + return "BO" default: panic(exception.New(matName + " 无该类型材料,请添加!!!")) return "" diff --git a/wms/common/excelkit.go b/wms/common/excelkit.go index 4304181..bcf5a0b 100644 --- a/wms/common/excelkit.go +++ b/wms/common/excelkit.go @@ -3,17 +3,17 @@ package common import ( "cu-helper/wms/service" "fmt" - "github.com/mizuki1412/go-core-kit/library/mathkit" + "path/filepath" + "strconv" + "time" + "github.com/mizuki1412/go-core-kit/service/configkit" "github.com/mizuki1412/go-core-kit/service/logkit" "github.com/spf13/cast" "github.com/xuri/excelize/v2" - "path/filepath" - "strconv" - "time" ) -func GenExcelFile(m1 map[string]*service.HighOptLossUnder, m2 map[string]*service.HighOptLossHistory) { +func GenExcelFile(m1 map[string]*service.HighOptLossUnder) { // Open the Excel file open := configkit.GetString("loss.open", "") if open == "" { @@ -45,28 +45,6 @@ func GenExcelFile(m1 map[string]*service.HighOptLossUnder, m2 map[string]*servic Bold: true, }, }) - styleRedFMT, err := f.NewStyle(&excelize.Style{ - Alignment: &excelize.Alignment{ - Horizontal: "center", - Vertical: "center", - }, - Border: []excelize.Border{ - {Type: "top", Style: 1, Color: "000000"}, - {Type: "bottom", Style: 1, Color: "000000"}, - {Type: "left", Style: 1, Color: "000000"}, - {Type: "right", Style: 1, Color: "000000"}, - }, - Fill: excelize.Fill{ - Type: "pattern", - Color: []string{"C00000"}, // RGB(192,0,0) - Pattern: 1, - }, - Font: &excelize.Font{ - Color: "FFFFFF", // 白色 - Bold: true, - }, - NumFmt: 10, // 或使用自定义格式代码:"0.00%" - }) styleYellow, err := f.NewStyle(&excelize.Style{ Alignment: &excelize.Alignment{ Horizontal: "center", @@ -107,27 +85,6 @@ func GenExcelFile(m1 map[string]*service.HighOptLossUnder, m2 map[string]*servic Bold: true, }, }) - styleGreenFMT, err := f.NewStyle(&excelize.Style{ - Alignment: &excelize.Alignment{ - Horizontal: "center", - Vertical: "center", - }, - Border: []excelize.Border{ - {Type: "top", Style: 1, Color: "000000"}, - {Type: "bottom", Style: 1, Color: "000000"}, - {Type: "left", Style: 1, Color: "000000"}, - {Type: "right", Style: 1, Color: "000000"}, - }, - Fill: excelize.Fill{ - Type: "pattern", - Color: []string{"92D050"}, // RGB(146,208,80) - Pattern: 1, - }, - Font: &excelize.Font{ - Bold: true, - }, - NumFmt: 10, // 或使用自定义格式代码:"0.00%" - }) // Cut and paste data from E4:E25 to C4:C25 //TODO @@ -176,17 +133,7 @@ func GenExcelFile(m1 map[string]*service.HighOptLossUnder, m2 map[string]*servic f.SetCellStyle("汇总", "G"+strconv.Itoa(i), "G"+strconv.Itoa(i), styleRed) } f.SetCellValue("汇总", "H"+strconv.Itoa(i), data.Book) - if data.Book == 0 { - f.SetCellStyle("汇总", "H"+strconv.Itoa(i), "H"+strconv.Itoa(i), styleRed) - } - if data.Book > 0 { - f.SetCellStyle("汇总", "H"+strconv.Itoa(i), "H"+strconv.Itoa(i), styleGreen) - } - if data.Book == 0 && data.UnderCount == 0 { - f.SetCellStyle("汇总", "H"+strconv.Itoa(i), "H"+strconv.Itoa(i), styleGreen) - } - f.SetCellValue("汇总", "I"+strconv.Itoa(i), data.CantCount) - f.SetCellValue("汇总", "J"+strconv.Itoa(i), data.ApplyCount) + f.SetCellValue("汇总", "I"+strconv.Itoa(i), data.ApplyCount) } else { f.SetCellValue("汇总", "E"+strconv.Itoa(i), 0) f.SetCellStyle("汇总", "E"+strconv.Itoa(i), "E"+strconv.Itoa(i), styleGreen) @@ -195,48 +142,7 @@ func GenExcelFile(m1 map[string]*service.HighOptLossUnder, m2 map[string]*servic f.SetCellValue("汇总", "G"+strconv.Itoa(i), 0) f.SetCellStyle("汇总", "G"+strconv.Itoa(i), "G"+strconv.Itoa(i), styleGreen) f.SetCellValue("汇总", "H"+strconv.Itoa(i), 0) - f.SetCellStyle("汇总", "H"+strconv.Itoa(i), "H"+strconv.Itoa(i), styleGreen) f.SetCellValue("汇总", "I"+strconv.Itoa(i), 0) - f.SetCellValue("汇总", "J"+strconv.Itoa(i), 0) - } - if data, ok := m2[key]; ok { - f.SetCellValue("汇总", "K"+strconv.Itoa(i), data.Count) - if data1, ok1 := m1[key]; ok1 { - //有归档+有在途 - f.SetCellValue("汇总", "L"+strconv.Itoa(i), data.Count+data1.Count) - v := mathkit.FloatRound(float64(data.Count)/(float64(data.Count)+float64(data1.Count)), 4) - f.SetCellValue("汇总", "M"+strconv.Itoa(i), v) - if v < 0.8 { - f.SetCellStyle("汇总", "M"+strconv.Itoa(i), "M"+strconv.Itoa(i), styleRedFMT) - } - if v >= 0.8 { - f.SetCellStyle("汇总", "M"+strconv.Itoa(i), "M"+strconv.Itoa(i), styleGreenFMT) - } - } else { - //有归档+无在途 - f.SetCellValue("汇总", "L"+strconv.Itoa(i), data.Count) - v := mathkit.FloatRound(float64(data.Count)/(float64(data.Count)), 4) - f.SetCellValue("汇总", "M"+strconv.Itoa(i), v) - if v < 0.8 { - f.SetCellStyle("汇总", "M"+strconv.Itoa(i), "M"+strconv.Itoa(i), styleRedFMT) - } - if v >= 0.8 { - f.SetCellStyle("汇总", "M"+strconv.Itoa(i), "M"+strconv.Itoa(i), styleGreenFMT) - } - } - } else { - f.SetCellValue("汇总", "K"+strconv.Itoa(i), 0) - if data1, ok1 := m1[key]; ok1 { - //无归档+有在途 - f.SetCellValue("汇总", "L"+strconv.Itoa(i), data1.Count) - f.SetCellValue("汇总", "M"+strconv.Itoa(i), 0) - f.SetCellStyle("汇总", "M"+strconv.Itoa(i), "M"+strconv.Itoa(i), styleRedFMT) - } else { - //无归档+无在途 - f.SetCellValue("汇总", "L"+strconv.Itoa(i), 0) - f.SetCellValue("汇总", "M"+strconv.Itoa(i), 1) - f.SetCellStyle("汇总", "M"+strconv.Itoa(i), "M"+strconv.Itoa(i), styleGreenFMT) - } } } @@ -267,8 +173,8 @@ func GenExcelFile(m1 map[string]*service.HighOptLossUnder, m2 map[string]*servic f.SetCellStyle("汇总", dCell, dCell, styleGreen) } } - // Sum columns C:H and place the results in row 26 - for col := 'C'; col <= 'L'; col++ { + // Sum columns C:I and place the results in row 26 + for col := 'C'; col <= 'I'; col++ { //TODO sumCell := string(col) + "26" //TODO @@ -277,7 +183,7 @@ func GenExcelFile(m1 map[string]*service.HighOptLossUnder, m2 map[string]*servic } // Recalculate the sum for each cell to ensure it appears without manual intervention - for col := 'C'; col <= 'L'; col++ { + for col := 'C'; col <= 'I'; col++ { //TODO sumCell := string(col) + "26" value, err := f.CalcCellValue("汇总", sumCell) @@ -287,11 +193,6 @@ func GenExcelFile(m1 map[string]*service.HighOptLossUnder, m2 map[string]*servic f.SetCellValue("汇总", sumCell, cast.ToInt(value)) } } - //TODO 3行 - done, _ := f.GetCellValue("汇总", "K26") - total, _ := f.GetCellValue("汇总", "L26") - f.SetCellValue("汇总", "M26", mathkit.FloatRound(cast.ToFloat64(done)/cast.ToFloat64(total), 4)) - //设置表头 content := fmt.Sprintf("西湖智家光衰通报:%s", time.Now().Format("1月2日")) f.SetCellValue("汇总", "A1", content) diff --git a/wms/model/get_high_opt_loss_history_list.go b/wms/model/get_high_opt_loss_history_list.go deleted file mode 100644 index a74f88a..0000000 --- a/wms/model/get_high_opt_loss_history_list.go +++ /dev/null @@ -1,61 +0,0 @@ -package model - -import ( - "reflect" - "time" -) - -/* -http://132.151.160.87:10010/wms-zj/gshuaiOrderQueryW/getOrderInfo.do -*/ - -/* -用途:获取光衰历史数据列表 -*/ - -type GetHighOptLossHistoryList struct { - Page string `map:"page"` - Rows string `map:"rows"` - OrgId string `map:"orgId"` - BusiType string `map:"busiType"` - QueryFlag string `map:"queryFlag"` - StartTime string `map:"startTime"` - EndTime string `map:"endTime"` - QueryType string `map:"queryType"` - WorkAction string `map:"workAction"` -} - -func NewGetHighOptLossHistoryList() *GetHighOptLossHistoryList { - getHighOptLossHistoryList := new(GetHighOptLossHistoryList) - getHighOptLossHistoryList.Page = "1" - getHighOptLossHistoryList.Rows = "10000" - getHighOptLossHistoryList.OrgId = "330106" - getHighOptLossHistoryList.BusiType = "11" - getHighOptLossHistoryList.QueryFlag = "2" - getHighOptLossHistoryList.StartTime = "2024-12-28 15:40:49" //TODO 以后每年要修改这个 - getHighOptLossHistoryList.EndTime = time.Now().Format("2006-01-02 15:04:05") - getHighOptLossHistoryList.QueryType = "-1" - getHighOptLossHistoryList.WorkAction = "0" - return getHighOptLossHistoryList -} - -func (th *GetHighOptLossHistoryList) GenReqParam() map[string]string { - return th.structToMap() -} - -func (th *GetHighOptLossHistoryList) structToMap() map[string]string { - result := make(map[string]string) - t := reflect.TypeOf(*th) - v := reflect.ValueOf(*th) - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - value := v.Field(i) - // Use the tag value as the key in the map, if it exists; otherwise, use the field name. - tag := field.Tag.Get("map") - if tag == "" { - tag = field.Name - } - result[tag] = value.String() - } - return result -} diff --git a/wms/model/get_high_opt_loss_under_list.go b/wms/model/get_high_opt_loss_under_list.go index 6ba2d20..826c3cd 100644 --- a/wms/model/get_high_opt_loss_under_list.go +++ b/wms/model/get_high_opt_loss_under_list.go @@ -2,7 +2,6 @@ package model import ( "reflect" - "time" ) /* @@ -14,30 +13,26 @@ http://132.151.160.87:10010/wms-zj/gshuaiOrderQueryW/getOrderInfo.do */ type GetHighOptLossUnderList struct { - Page string `map:"page"` - Rows string `map:"rows"` - OrgId string `map:"orgId"` - BusiType string `map:"busiType"` - QueryFlag string `map:"queryFlag"` - StartTime string `map:"startTime"` - EndTime string `map:"endTime"` - OrdStatus string `map:"ordStatus"` - QueryType string `map:"queryType"` - WorkAction string `map:"workAction"` + OrgId string `map:"orgId"` + BookFlag string `map:"bookFlag"` + OrderParam string `map:"orderparam"` + OrderDesc string `map:"orderDesc"` + ReceiveFlag string `map:"receiveFlag"` + Rows string `map:"rows"` + Page string `map:"page"` + QueryType string `map:"queryType"` } func NewGetHighOptLossUnderList() *GetHighOptLossUnderList { getHighOptLossUnderList := new(GetHighOptLossUnderList) - getHighOptLossUnderList.Page = "1" - getHighOptLossUnderList.Rows = "10000" getHighOptLossUnderList.OrgId = "330106" - getHighOptLossUnderList.BusiType = "11" - getHighOptLossUnderList.QueryFlag = "1" - getHighOptLossUnderList.StartTime = "2024-12-28 15:40:49" //TODO 以后每年要修改这个 - getHighOptLossUnderList.EndTime = time.Now().Format("2006-01-02 15:04:05") - getHighOptLossUnderList.OrdStatus = "0" + getHighOptLossUnderList.BookFlag = "-1" + getHighOptLossUnderList.OrderParam = "ACCEPT_TIME" + getHighOptLossUnderList.OrderDesc = "DESC" + getHighOptLossUnderList.ReceiveFlag = "0" + getHighOptLossUnderList.Rows = "10000" + getHighOptLossUnderList.Page = "1" getHighOptLossUnderList.QueryType = "-1" - getHighOptLossUnderList.WorkAction = "0" return getHighOptLossUnderList } diff --git a/wms/service/get_high_opt_loss_list.go b/wms/service/get_high_opt_loss_list.go index 35b0f19..6321318 100644 --- a/wms/service/get_high_opt_loss_list.go +++ b/wms/service/get_high_opt_loss_list.go @@ -2,10 +2,11 @@ package service import ( "cu-helper/wms/model" + "time" + "github.com/go-resty/resty/v2" "github.com/mizuki1412/go-core-kit/class/exception" "github.com/tidwall/gjson" - "time" ) //获取光衰数据列表 @@ -13,18 +14,13 @@ import ( // HighOptLossUnder 在途光衰单 type HighOptLossUnder struct { Count int //所有在途单 - UnderCount int //施工中在途单,包含不可处理 + UnderCount int //施工中在途单 ApplyCount int //人工回访在途单 - CantCount int //回单不可处理 DurationOverSeven int DurationOverFifteen int Book int } -type HighOptLossHistory struct { - Count int -} - // ReqGetHighOptLossUnderList 查询在途光衰单(包含施工中、人工回访、综合调度等全部未归档状态) func ReqGetHighOptLossUnderList() map[string]*HighOptLossUnder { h := model.NewHeader() @@ -33,7 +29,7 @@ func ReqGetHighOptLossUnderList() map[string]*HighOptLossUnder { form := f.GenReqParam() client := resty.New().SetRetryCount(5).SetRetryWaitTime(10 * time.Second) resp, err := client.R(). - SetHeaders(header).SetFormData(form).Post("http://132.151.160.87:10010/wms-zj/gshuaiOrderQueryW/getOrderInfo.do") + SetHeaders(header).SetFormData(form).Post("http://132.151.160.87:10010/wms-zj/gShuaiReply/gshuaiOrderReplyListAjax.do") if err != nil { panic(exception.New(err.Error())) } @@ -44,58 +40,22 @@ func ReqGetHighOptLossUnderList() map[string]*HighOptLossUnder { m[v.Get("DEAL_MAN").String()] = &HighOptLossUnder{} } m[v.Get("DEAL_MAN").String()].Count++ - if v.Get("STATUS").String() == "施工处理" { + if v.Get("STATUS_NAME").String() == "施工处理" { m[v.Get("DEAL_MAN").String()].UnderCount++ - if v.Get("REPLY_TYPE").String() == "不可处理" || v.Get("REPLY_TYPE").String() == "不可整治" { - m[v.Get("DEAL_MAN").String()].CantCount++ - m[v.Get("DEAL_MAN").String()].UnderCount-- - } duration := v.Get("TIMELONGS").Int() if duration >= 604800 { m[v.Get("DEAL_MAN").String()].DurationOverSeven++ - if v.Get("REPLY_TYPE").String() == "不可处理" || v.Get("REPLY_TYPE").String() == "不可整治" { - m[v.Get("DEAL_MAN").String()].DurationOverSeven-- - } } if duration >= 1296000 { m[v.Get("DEAL_MAN").String()].DurationOverFifteen++ - if v.Get("REPLY_TYPE").String() == "不可处理" || v.Get("REPLY_TYPE").String() == "不可整治" { - m[v.Get("DEAL_MAN").String()].DurationOverFifteen-- - } } if v.Get("BOOK_TIME").String() != "" { m[v.Get("DEAL_MAN").String()].Book++ - if v.Get("REPLY_TYPE").String() == "不可处理" || v.Get("REPLY_TYPE").String() == "不可整治" { - m[v.Get("DEAL_MAN").String()].Book-- - } } } - if v.Get("STATUS").String() == "人工回访" { + if v.Get("STATUS_NAME").String() == "人工回访" { m[v.Get("DEAL_MAN").String()].ApplyCount++ } } return m } - -// ReqGetHighOptLossHistoryList 查询历史光衰单 -func ReqGetHighOptLossHistoryList() map[string]*HighOptLossHistory { - h := model.NewHeader() - header := h.GenReqParam() - f := model.NewGetHighOptLossHistoryList() - form := f.GenReqParam() - client := resty.New().SetRetryCount(5).SetRetryWaitTime(10 * time.Second) - resp, err := client.R(). - SetHeaders(header).SetFormData(form).Post("http://132.151.160.87:10010/wms-zj/gshuaiOrderQueryW/getOrderInfo.do") - if err != nil { - panic(exception.New(err.Error())) - } - data := gjson.Get(resp.String(), "list").Array() - m := make(map[string]*HighOptLossHistory) - for _, v := range data { - if m[v.Get("DEAL_MAN").String()] == nil { - m[v.Get("DEAL_MAN").String()] = &HighOptLossHistory{} - } - m[v.Get("DEAL_MAN").String()].Count++ - } - return m -}