update: all

main
Leo 9 hours ago
parent 9db8871787
commit df44c079a5

@ -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")
}

@ -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)
}

@ -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])
}

@ -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)
},
}

@ -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())
})
}
}

@ -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
}

@ -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("保存文件失败..."))
}
}

@ -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("生成结束...")

@ -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"

@ -15,4 +15,7 @@ const (
ProcessYSJF = "YSJFProcess"
)
const (
EngProcess = "eng.pro"
)
const UrlPrefix = "http://10.202.2.108:8086"

@ -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

@ -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"

@ -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()))
}
}
}

@ -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()

@ -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 + "元")

@ -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("生成结束...")

@ -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.657A2B6a2、d2.0mm尾纤为基础) 1×16", "光分路器_托盘式封装(报价包括光纤适配器以1.5m长的G.657A2B6a2、d2.0mm尾纤SC/UPC类型适配器及插头为基础) 1×16", "光分路器_盒式封装 1×16", "光分路器_托盘式封装 1×16":
return "P"
case "光分路器_盒式封装(报价包括SC连接器插头以1.5m长的G.657A2B6a2、d2.0mm尾纤为基础) 1×32", "光分路器_托盘式封装(报价包括光纤适配器以1.5m长的G.657A2B6a2、d2.0mm尾纤SC/UPC类型适配器及插头为基础) 1×32", "光分路器_PLC 盒式 1×32 FC/UPC d2.0 1.5m":
case "光分路器_盒式封装(报价包括SC连接器插头以1.5m长的G.657A2B6a2、d2.0mm尾纤为基础) 1×32", "光分路器_托盘式封装(报价包括光纤适配器以1.5m长的G.657A2B6a2、d2.0mm尾纤SC/UPC类型适配器及插头为基础) 1×32", "光分路器_PLC 盒式 1×32 FC/UPC d2.0 1.5m", "光分路器_插片式封装(报价包括光纤适配器以1.5m长的G.657A2B6a2、d2.0mm尾纤SC/UPC类型适配器及插头为基础) 1×32":
return "Q"
case "光分路器_盒式封装(报价包括SC连接器插头以1.5m长的G.657A2B6a2、d2.0mm尾纤为基础) 1×64", "光分路器_托盘式封装(报价包括光纤适配器以1.5m长的G.657A2B6a2、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/PCSC/PC可选用于免跳纤光交":
return "BO"
default:
panic(exception.New(matName + " 无该类型材料,请添加!!!"))
return ""

@ -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)

@ -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
}

@ -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
}

@ -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
}

Loading…
Cancel
Save