refactor: remove many deprecated cmd and package

main
Leo 6 days ago
parent f5df476cf4
commit 132e248237

@ -1,419 +0,0 @@
//go:build legacy_au_sim
// Deprecated: This file is no longer used.
// Retained temporarily for rollback.
// Planned removal: 2026-06-23.
package cmd
import (
"encoding/base64"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"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/service/logkit"
"github.com/spf13/cobra"
"github.com/tidwall/gjson"
"github.com/xuri/excelize/v2"
)
func init() {
rootCmd.AddCommand(auSimCmd)
}
var (
apiKey = "oEr6D60u6mmJRPlAHEIx8dWN"
secretKey = "r7fYVHExzsqlYO9P2kgdvs5N1WVJL8vB"
imageDir = "/Users/leo/Documents/au-ocr/image/"
ocrAPIURL = "http://127.0.0.1:5005/ocr"
outputExcelPath = "/Users/leo/Documents/au-ocr/excel/"
nameWhiteList = []string{"德宁", "鼎斌", "海波", "何晓璇", "胡鑫", "佳欣", "佳怡", "嘉乐", "建闽", "锦城", "景浩", "君豪", "凯彬", "兰青", "李想", "林艳", "刘美云", "裴雅妮", "任子健", "润宇", "隆蝶", "石明毅", "覃彩玉", "唐鑫", "唐宇豪", "童斌", "万兴凯", "王权", "吴宇峰", "武文迪", "夏晨阳", "项乐奇", "小锐", "小颖", "晓雪", "谢俊", "欣萍", "鑫杰", "徐宁", "许慧超", "雅妮", "杨传杰", "杨帅", "杨笑笑", "杨兴俊", "叶琪婷", "宇飞", "玉梅", "张钧帅", "张奕韬", "张玉", "张原硕", "章帅", "赵林冲", "郑佳欣", "朱菲玲", "子健", "邹思惠", "徐林焱", "周志乐", "林焱", "许慧超", "嘉辉", "楚俊", "军豪", "王皓", "丁磊", "吴喻飞", "秦俊杰", "俊杰", "刘继伟", "佳朴", "王浩", "游雨婷", "娅慧", "李浪", "奇乐", "张雨珈", "婧婧", "乞慧利", "郭婧婧", "王鑫", "兴凯"}
schoolWhiteList = []string{"财经", "工商", "工业", "杭电", "计量", "金融", "经济", "经贸", "科技", "理工", "美院", "万向", "长征", "浙音", "万象", "特殊教育", "外国语", "浙大紫金港", "师范", "杭职", "杭师大", "树人", "成院", "城院", "师大", "开放", "中美院", "美院", "同济", "杭科"}
amountWhiteList = []string{"200", "100", "未充值", "50"}
)
type ExtractedInfo struct {
Name string
School string
Phone string
Amount string
}
var auSimCmd = &cobra.Command{
Use: "au",
Short: "Batch processing operations of the autumn semester sim card",
Run: func(cmd *cobra.Command, args []string) {
initkit.BindFlags(cmd)
files, err := ioutil.ReadDir(imageDir)
if err != nil {
panic(exception.New(err.Error()))
}
tokenBaidu := getBaiduAccessToken()
results := []ExtractedInfo{}
for _, file := range files {
if file.IsDir() || !strings.HasSuffix(file.Name(), ".jpg") || strings.Contains(file.Name(), "thumb.jpg") || strings.Contains(file.Name(), "hd.jpg") {
continue
}
fullPath := filepath.Join(imageDir, file.Name())
base64Str, err := imageToBase64(fullPath)
if err != nil {
panic(exception.New("转base64失败:" + err.Error()))
}
//第一次调用本地的
ocrText := callOCR(base64Str)
logkit.Info("成功调用本地OCR")
if err != nil {
panic(exception.New("OCR请求失败:" + err.Error()))
}
info := extractInfoFromOCR(ocrText, "")
//只要返回结果中存在空值的,就再调用另外的接口
if info.Name == "" || info.Phone == "" || info.School == "" || info.Amount == "" {
ocrTextBaidu := callOCRBaidu(base64Str, tokenBaidu)
logkit.Info("¥成功调用百度OCR")
infoBaidu := extractInfoFromOCR(ocrTextBaidu, "")
//合并
if info.Name == "" {
info.Name = infoBaidu.Name
}
if info.Phone == "" {
info.Phone = infoBaidu.Phone
}
if info.School == "" {
info.School = infoBaidu.School
}
if info.Amount == "" {
info.Amount = infoBaidu.Amount
}
}
//号码里包含了充值的这些敏感数字,就把号码从combined删除了重新再提取一次 //TODO 本地ocr识别不到 baidu能识别到? 把infoBaidu变量移出去
if info.Phone != "" && (strings.Contains(info.Phone, "200") || strings.Contains(info.Phone, "100") || strings.Contains(info.Phone, "50")) {
infoRedo := extractInfoFromOCR(ocrText, info.Phone)
info.Amount = infoRedo.Amount
}
if info.Phone != "" && containsBroadband(ocrText) {
newName := "broadband/" + file.Name()
newPath := filepath.Join(imageDir, newName)
os.Rename(fullPath, newPath)
info.Name = info.Name + "+宽带"
logkit.Info(info.Phone + " √√√加宽带!√√√")
}
oldPath := fullPath
newName := ""
//条件放宽到识别出号码就算成功,剩下不成功的 打?手动
if info.Phone != "" {
logkit.Info("业务员:" + info.Name + " 学校:" + info.School + " 首充:" + info.Amount + " 号码:" + info.Phone + " 识别成功!")
newName = "success/" + fmt.Sprintf("%s%s.jpg", info.Name, info.Phone)
results = append(results, info)
} else {
logkit.Info("××× 业务员:" + info.Name + " 学校:" + info.School + " 首充:" + info.Amount + " 号码:" + info.Phone + " 识别失败!")
newName = "fail/" + file.Name() + ".error.jpg"
}
newPath := filepath.Join(imageDir, newName)
os.Rename(oldPath, newPath)
}
writeExcel(results, outputExcelPath+"/"+time.Now().Format("20060102150405")+".xlsx")
},
}
func containsBroadband(texts []string) bool {
for _, text := range texts {
if strings.Contains(text, "宽带") {
return true
}
}
return false
}
func imageToBase64(path string) (string, error) {
data, err := os.ReadFile(path)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(data), nil
}
func callOCR(b64 string) []string {
client := resty.New()
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody(map[string]string{
"image": b64,
}).
Post(ocrAPIURL)
if err != nil {
panic(exception.New(err.Error()))
}
bodyStr := string(resp.Body())
// 快速检查 resultcode 是否为 200
if resp.StatusCode() != 200 {
panic(exception.New(fmt.Errorf("OCR failed: %s", gjson.Get(bodyStr, "message").String()).Error()))
}
// 使用 GJSON 提取所有文本字段
var texts []string
textResults := gjson.Get(bodyStr, "results")
if !textResults.Exists() || !textResults.IsArray() {
panic(exception.New(fmt.Errorf("no OCR results found").Error()))
}
textResults.ForEach(func(_, value gjson.Result) bool {
text := value.Get("text").String()
if text != "" {
texts = append(texts, text)
}
return true
})
return texts
}
func extractInfoFromOCR(texts []string, delPhone string) ExtractedInfo {
combined := strings.Join(texts, "")
if delPhone != "" {
combined = strings.Replace(combined, delPhone, "", -1)
}
info := ExtractedInfo{}
// 提取手机号
re := regexp.MustCompile(`(?:XH[^\x00-\xff]|H势|势|XH).*?(\d{11})`)
match := re.FindStringSubmatch(combined)
if len(match) >= 2 {
info.Phone = match[1]
}
// 提取业务员姓名
for _, name := range nameWhiteList {
if strings.Contains(combined, name) {
info.Name = name
context := getContext(combined, name, 30)
logkit.Info("【上下文 " + context + "】")
// 从上下文中查找学校
for _, school := range schoolWhiteList {
if strings.Contains(context, school) {
info.School = school
break
}
}
// 从上下文中查找金额
for _, amount := range amountWhiteList {
if strings.Contains(context, amount) {
info.Amount = amount
break
}
}
break
}
}
//如果到这一步业务员的名字还没找到,那么就放弃提取业务员名字上下文去找学校,改成直接全文去找学校,然后从学校获取上下文找首充
if info.Name == "" {
for _, school := range schoolWhiteList {
if strings.Contains(combined, school) {
info.School = school
context := getContext(combined, school, 30)
// 从上下文中查找金额
for _, amount := range amountWhiteList {
if strings.Contains(context, amount) {
info.Amount = amount
break
}
}
break
}
}
}
//如果到这一步业务员名字找到了,业务员上下文没有学校,那么还是直接全文去找学校
if info.Name != "" && info.School == "" {
for _, school := range schoolWhiteList {
if strings.Contains(combined, school) {
info.School = school
//如果到这里首充还是空白的,试着在学校上下文找首充
if info.Amount == "" {
context := getContext(combined, school, 30)
// 从上下文中查找金额
for _, amount := range amountWhiteList {
if strings.Contains(context, amount) {
info.Amount = amount
break
}
}
}
break
}
}
}
//如果到这一步充值金额还没找到那么可以以关键字去寻找充值金额适用于充值100充值200充值50这类关键词
if info.Amount == "" {
re2 := regexp.MustCompile(`充值[:]?\s*(100|200|50)\b`)
match2 := re2.FindStringSubmatch(combined)
if len(match2) >= 2 {
info.Amount = match2[1]
}
}
//到这里要判断一下是不是压根没充值还是没找到再去全文正则匹配纯100、200、50
if info.Amount == "" {
if strings.Contains(combined, "未充值") {
info.Amount = "未充值"
}
}
//如果到这一步充值金额还没找到再通过正则去找纯100、200、50
/*
"100", // 匹配
"200", // 匹配
"50", // 匹配
"1003", // 不匹配
"5004", // 不匹配
"2004", // 不匹配
"充值200", // 匹配
"充值2004", // 不匹配
"abc100xyz", // 匹配
*/
if info.Amount == "" {
re3 := regexp.MustCompile(`100|200|50`)
allMatches := re3.FindAllStringIndex(combined, -1)
for _, loc := range allMatches {
start, end := loc[0], loc[1]
beforeOK := start == 0 || (combined[start-1] < '0' || combined[start-1] > '9')
afterOK := end == len(combined) || (combined[end] < '0' || combined[end] > '9')
if beforeOK && afterOK {
info.Amount = combined[start:end]
break
}
}
}
return info
}
func getContext(text, keyword string, length int) string {
index := strings.Index(text, keyword)
if index == -1 {
return ""
}
start := index - length
if start < 0 {
start = 0
}
end := index + len(keyword) + length
if end > len(text) {
end = len(text)
}
return text[start:end]
}
func writeExcel(data []ExtractedInfo, filename string) {
f := excelize.NewFile()
sheet := "Sheet1"
f.SetSheetRow(sheet, "A1", &[]string{"学校", "业务员姓名", "手机号码", "充值金额"})
for i, d := range data {
if d.School == "万象" {
d.School = "万向"
}
if d.School == "外国语" {
d.School = "浙外"
}
if d.School == "浙大紫金港" {
d.School = "浙大"
}
if d.School == "师范" {
d.School = "杭师"
}
if d.School == "师大" {
d.School = "杭师"
}
if d.School == "杭师大" {
d.School = "杭师"
}
if d.School == "成院" {
d.School = "城院"
}
if d.School == "中美院" {
d.School = "美院"
}
if d.Amount == "未充值" {
d.Amount = "0"
}
if d.Amount == "" {
d.Amount = "?"
}
if d.Name == "" {
d.Name = "?"
}
if d.School == "" {
d.School = "?"
}
row := []string{d.School, d.Name, d.Phone, d.Amount}
cell, _ := excelize.CoordinatesToCellName(1, i+2)
f.SetSheetRow(sheet, cell, &row)
}
f.SaveAs(filename)
}
func getBaiduAccessToken() string {
client := resty.New()
url := "https://aip.baidubce.com/oauth/2.0/token"
data := map[string]string{
"grant_type": "client_credentials",
"client_id": apiKey,
"client_secret": secretKey,
}
resp, err := client.R().
SetHeader("Content-Type", "application/x-www-form-urlencoded").
SetFormData(data).
Post(url)
if err != nil {
panic(exception.New("获取AccessToken失败:" + err.Error()))
}
accessToken := gjson.Get(resp.String(), "access_token").String()
return accessToken
}
func callOCRBaidu(b64, token string) []string {
url := "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?access_token=" + token
// 构造表单数据
payload := map[string]string{
"image": b64,
"multidirectional_recognize": "true",
}
client := resty.New()
resp, err := client.R().
SetHeader("Content-Type", "application/x-www-form-urlencoded").
SetHeader("Accept", "application/json").
SetFormData(payload).
Post(url)
if err != nil {
panic(exception.New("请求百度OCR出错:" + err.Error()))
}
// 使用 gjson 解析结果
result := resp.String()
var texts []string
textResults := gjson.Get(result, "words_result")
if !textResults.Exists() || !textResults.IsArray() {
panic(exception.New(fmt.Errorf("no OCR results found").Error()))
}
textResults.ForEach(func(_, value gjson.Result) bool {
text := value.Get("words").String()
if text != "" {
texts = append(texts, text)
}
return true
})
return texts
}

@ -1,150 +0,0 @@
//go:build legacy_dfb
// Deprecated: This file is no longer used.
// Retained temporarily for rollback.
// Planned removal: 2026-06-23.
package cmd
import (
"cu-helper/internal/deprecated/wms/cryptokit"
model2 "cu-helper/internal/deprecated/wms/model"
"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/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"
"golang.org/x/net/html"
)
func init() {
rootCmd.AddCommand(dfbCmd)
defFlagsDfb(dfbCmd)
}
var dfbCmd = &cobra.Command{
Use: "dfb",
Short: "Batch processing operations of the difficult fiber box",
Run: func(cmd *cobra.Command, args []string) {
initkit.BindFlags(cmd)
handleDfb()
},
}
func defFlagsDfb(cmd *cobra.Command) {
cmd.Flags().String("wms.token", "", "*Specify the token of WMS-ZJ(装维调度系统)")
cmd.Flags().String("path", "", "*Specify the file of excel")
}
var dfbClient = resty.New().SetRetryCount(5).SetRetryWaitTime(10 * time.Second)
func handleDfb() {
// Open the Excel file
excelPath := configkit.GetString("path", "")
if excelPath == "" {
panic(exception.New("EXCEL文件不存在或路径错误"))
}
f, err := excelize.OpenFile(excelPath)
if err != nil {
panic(exception.New(err.Error()))
}
rows, err := f.GetRows("Sheet1")
if err != nil {
panic(exception.New(err.Error()))
}
h := model2.NewHeader()
header := h.GenReqParam()
for rowIndex, row := range rows {
if rowIndex <= 1 {
continue
}
_ = commonkit.RecoverFuncWrapper(func() {
no := row[8] //宽带编号 I列
fo := model2.NewGetOrderQueryList(no)
form := fo.GenReqParam()
logkit.Info("***开始请求*** " + no)
resp, err := dfbClient.R().
SetHeaders(header).SetFormData(form).Post("http://132.151.160.87:10010/wms-zj/monitor/orderQueryListAjax.do")
if err != nil {
panic(exception.New(err.Error()))
}
if resp.StatusCode() != 200 {
panic(exception.New(resp.Status()))
}
totalNumber := gjson.Get(resp.String(), "pageObj.total").Int()
if totalNumber == 0 {
logkit.Error(no + " 该条记录不存在!")
return
}
list := gjson.Get(resp.String(), "list").Array()
if list[totalNumber-1].Get("ORDER_TYPE_NAME").String() == "改用户资料" {
totalNumber--
}
if totalNumber == 0 {
logkit.Error(no + " 该条记录不存在!")
return
}
addId := list[totalNumber-1].Get("SEVEN_ADDR_ID").String()
addName := list[totalNumber-1].Get("SEVEN_ADDR").String()
woId := cryptokit.Encrypt(list[totalNumber-1].Get("WO_ID").String())
shardingId := list[totalNumber-1].Get("SHARDING_ID").String()
resp, err = dfbClient.R().
SetHeaders(header).SetQueryParams(map[string]string{
"woIde": woId,
"hisFlag": "2",
"shardingId": shardingId,
}).Get("http://132.151.160.87:10010/wms-zj/common/installOrderDetailInfoQuery.do")
qrCode, gqpName := extractGQPInfo(resp.String())
f.SetCellValue("Sheet1", "C"+cast.ToString(rowIndex+1), addId)
f.SetCellValue("Sheet1", "D"+cast.ToString(rowIndex+1), addName)
f.SetCellValue("Sheet1", "E"+cast.ToString(rowIndex+1), qrCode)
f.SetCellValue("Sheet1", "F"+cast.ToString(rowIndex+1), gqpName)
})
}
// Save the file
if err = f.SaveAs(excelPath); err != nil {
panic(exception.New(err.Error()))
}
logkit.Info("生成结束...")
}
// extractGQPInfo 解析 HTML 并提取光分线盒二维码和光分线盒名称
func extractGQPInfo(htmlStr string) (qrCode, gqpName string) {
doc, err := html.Parse(strings.NewReader(htmlStr))
if err != nil {
panic(exception.New(err.Error()))
}
var extractData func(*html.Node, string) string
extractData = func(n *html.Node, key string) string {
if n.Type == html.ElementNode && n.Data == "td" {
// 检查当前节点的文本内容是否匹配 key
if n.FirstChild != nil && n.FirstChild.Type == html.TextNode && strings.TrimSpace(n.FirstChild.Data) == key {
// 获取同一行的第三个 <td> 里的 title 属性
if nextTd := n.NextSibling.NextSibling; nextTd != nil {
for _, attr := range nextTd.Attr {
if attr.Key == "title" {
return attr.Val
}
}
}
}
}
// 递归遍历所有子节点
for c := n.FirstChild; c != nil; c = c.NextSibling {
if val := extractData(c, key); val != "" {
return val
}
}
return ""
}
qrCode = extractData(doc, "光分线盒二维码")
gqpName = extractData(doc, "光分线盒名称")
return
}

@ -1,286 +0,0 @@
//go:build legacy_gco
// Deprecated: This file is no longer used.
// Retained temporarily for rollback.
// Planned removal: 2026-06-23.
package cmd
import (
"fmt"
"regexp"
"strconv"
"strings"
"time"
"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"
)
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])
}

@ -1,36 +0,0 @@
//go:build legacy_loss
// Deprecated: This file is no longer used.
// Retained temporarily for rollback.
// Planned removal: 2026-06-23.
package cmd
import (
"cu-helper/internal/deprecated/wms/common"
"cu-helper/internal/deprecated/wms/service"
"github.com/mizuki1412/go-core-kit/init/initkit"
"github.com/mizuki1412/go-core-kit/service/logkit"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(highOpticalLossCmd)
defFlagsLoss(highOpticalLossCmd)
}
var highOpticalLossCmd = &cobra.Command{
Use: "loss",
Short: "Generate a High Optical Loss Report",
Run: func(cmd *cobra.Command, args []string) {
initkit.BindFlags(cmd)
m1 := service.ReqGetHighOptLossUnderList()
logkit.Info("拿到光衰数据,开始生成...")
common.GenExcelFile(m1)
},
}
func defFlagsLoss(cmd *cobra.Command) {
cmd.Flags().String("wms.token", "", "*Specify the token of WMS-ZJ(装维调度系统)")
cmd.Flags().String("loss.open", "", "*Specify the file of excel to open")
}

@ -1,113 +0,0 @@
//go:build legacy_law
// Deprecated: This file is no longer used.
// Retained temporarily for rollback.
// Planned removal: 2026-06-23.
package cmd
import (
"net/url"
"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/service/configkit"
"github.com/mizuki1412/go-core-kit/service/logkit"
"github.com/spf13/cast"
"github.com/spf13/cobra"
"github.com/tidwall/gjson"
)
//法治在沃
func init() {
rootCmd.AddCommand(lawCmd)
defFlagsLaw(lawCmd)
}
var lawCmd = &cobra.Command{
Use: "law",
Short: "Batch processing operations of the law platform",
Run: func(cmd *cobra.Command, args []string) {
initkit.BindFlags(cmd)
handleLaw()
},
}
func defFlagsLaw(cmd *cobra.Command) {
cmd.Flags().String("cookie", "", "*Specify the cookie")
}
var lawClient = resty.New().SetRetryCount(5).SetRetryWaitTime(10 * time.Second)
func handleLaw() {
resp, err := lawClient.R().
SetHeaders(map[string]string{
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": cast.ToString(configkit.Get("cookie", "")),
}).SetFormData(map[string]string{
"pid": "0",
}).Post("http://lawplatform.unicom.local/law/tpubTreeMenu/getMenuByRole.do")
if err != nil || resp.IsError() || gjson.Get(resp.String(), "ok").Bool() != true {
panic(exception.New("获取菜单失败"))
}
data := gjson.Get(resp.String(), "data.menuList").Array()
for _, v := range data {
for _, vv := range gjson.Get(v.String(), "chirlds").Array() {
for _, vvv := range gjson.Get(vv.String(), "chirlds").Array() {
rawURL := gjson.Get(vvv.String(), "tpubTreeMenuUrl").String()
resp, err = lawClient.R().
SetHeaders(map[string]string{
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": cast.ToString(configkit.Get("cookie", "")),
}).SetFormData(map[string]string{
"page": "1",
"pageSize": "1000",
}).Post(getUrl(rawURL))
if err != nil || resp.IsError() || resp.StatusCode() != 200 {
panic(exception.New("获取文章列表失败"))
}
articleData := gjson.Get(resp.String(), "data").Array()
for _, a := range articleData {
infoId := gjson.Get(a.String(), "infoId").String()
creatorTime := gjson.Get(a.String(), "creatorTime").String()
//TODO 以后每年修改这个
if !strings.Contains(creatorTime, "2024") {
logkit.Info("非2024文章跳过...")
continue
}
resp, err = lawClient.R().
SetHeaders(map[string]string{
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": cast.ToString(configkit.Get("cookie", "")),
}).SetFormData(map[string]string{
"infoId": infoId,
}).Post("http://lawplatform.unicom.local/law/tpfLike/toLike.do")
if err != nil || resp.IsError() || resp.StatusCode() != 200 {
panic(exception.New("点赞失败"))
} else {
time.Sleep(1 * time.Second)
logkit.Info("点赞成功~")
}
}
}
}
}
}
func getUrl(rawURL string) string {
// 解析 URL
u, err := url.Parse(rawURL)
if err != nil {
panic(exception.New("解析URL失败"))
}
// 提取查询参数
queryParams := u.Query()
// 获取 pftype 的值
pfType := queryParams.Get("pftype")
uri := "http://lawplatform.unicom.local/law/tpfInfoQuery/findPfInfoList.do?pftype=" + pfType + "&pfsortLevel=3&cache_id=" + cast.ToString(time.Now().UnixMilli())
return uri
}

@ -1,17 +1,7 @@
package cmd
import (
"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"
)
func init() {
@ -25,138 +15,3 @@ var testCmd = &cobra.Command{
},
}
func extractColumnsLoss() {
// 打开 Excel 文件
f, err := excelize.OpenFile("/Users/leo/Documents/竣工与调度光衰单 (21).xlsx")
if err != nil {
log.Fatal(err)
}
// 获取表格的所有行
rows, err := f.GetRows("{worksheet}") // 假设表格在"{worksheet}"中
if err != nil {
log.Fatal(err)
}
// 创建一个二维数组来存储提取的数据
var data []string
// 遍历每一行,提取 A, C, BH 列的数据
for i, row := range rows {
// 跳过表头
if i == 0 {
continue
}
// 获取 AO 列的数据
if len(row) > 40 {
data = append(data, row[40]) // AC列
}
}
for i, row := range data {
resp, err := lawClient.R().
SetHeaders(map[string]string{
"Authorization": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxNTY1NzE3NTEyNCIsInVzZXJJZCI6IjE2NjUiLCJuYW1lIjoi6K646ZyW5Y2TIiwiZXhwIjoxNzYxOTE2NTAwLCJuYmYiOjE3NjE4OTg1MDB9.DBqqShxxp5dwLrKYzuKFneRnqQub5V5ocbwFSAa5DvmHww3iWWAHLRD9bPkoE20CSDqcVjOj2MjkttaT3EarYqVhPxTdXtS0rddWTZaRDiMkO5GOFRvdlb-404h2YCUtxoubM0033v9jBKF_VgjMphUo_w8VjizqzcouucBlNtE",
"Content-type": "application/json;charset=UTF-8",
"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,
"limit": "10",
"page": 1,
"startTime": cast.ToString(time.Now().AddDate(0, 0, -4).Format("2006-01-02")),
"userName": "许霖卓",
}).Post("http://10.20.219.85:9527/api/view/onuCon/queryOnuInfoList")
if err != nil || resp.IsError() || resp.StatusCode() != 200 {
fmt.Println(err)
} else {
res := gjson.Get(resp.String(), "data.rows").Array()
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/竣工与调度光衰单 (21).xlsx"); err != nil {
fmt.Println(err)
}
logkit.Info("生成结束...")
}
func extractColumns() {
// 打开 Excel 文件
f, err := excelize.OpenFile("/Users/leo/Documents/副本电子围栏---林斌1.16.xlsx")
if err != nil {
log.Fatal(err)
}
// 获取表格的所有行
rows, err := f.GetRows("李强") // 假设表格在"Sheet1"中
if err != nil {
log.Fatal(err)
}
// 创建一个二维数组来存储提取的数据
var data [][]string
// 遍历每一行,提取 A, C, BH 列的数据
for i, row := range rows {
// 跳过表头
if i == 0 {
continue
}
// 获取 A, C, BH 列的数据
var rowData []string
if len(row) > 0 {
rowData = append(rowData, row[0]) // A列
}
if len(row) > 2 {
rowData = append(rowData, row[2]) // C列
}
if len(row) > 28 {
rowData = append(rowData, row[28]) // AC列
}
// 将这一行数据添加到二维数组中
if len(rowData) > 0 {
data = append(data, rowData)
}
}
// 输出提取的数据
for _, row := range data {
fmt.Println(row)
resp, err := lawClient.R().
SetHeaders(map[string]string{
"Authorization": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxNTY1NzE3NjI2OSIsInVzZXJJZCI6IjEwMTUiLCJuYW1lIjoi6a2P5beN5beNIiwiZXhwIjoxNzM3MDI1MDc1LCJuYmYiOjE3MzcwMDcwNzV9.TG-Bk0CbwzavOl1RKszTDVYrBEZUoyY8EhXAS_Q8HRkJj_CyzPj_SfAc2sJnejarxh4hfVK0FkIU6GiVPMm67OhKUQCN1FnBWspXNFihIdnsaS9WDB4o_BCI16gV5dUxEQ3TjL3Ok4vMBnzk0rPdQJmU-3DphCmo7f_AS6BM46s",
"Content-type": "application/json;charset=UTF-8",
"Cookie": "Admin-Token=eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxNTY1NzE3NjI2OSIsInVzZXJJZCI6IjEwMTUiLCJuYW1lIjoi6a2P5beN5beNIiwiZXhwIjoxNzM3MDI1MDc1LCJuYmYiOjE3MzcwMDcwNzV9.TG-Bk0CbwzavOl1RKszTDVYrBEZUoyY8EhXAS_Q8HRkJj_CyzPj_SfAc2sJnejarxh4hfVK0FkIU6GiVPMm67OhKUQCN1FnBWspXNFihIdnsaS9WDB4o_BCI16gV5dUxEQ3TjL3Ok4vMBnzk0rPdQJmU-3DphCmo7f_AS6BM46s; sysName=%E9%AD%8F%E5%B7%8D%E5%B7%8D",
}).SetBody(map[string]interface{}{
"dzwlCode": row[2],
"dzwlId": cast.ToInt64(row[0]),
"remarks": "其他",
"sevenAddrId": row[1],
"userId": "15657176269",
"zprName": "林斌",
"zprPhone": "15657178035",
}).Post("http://10.20.219.85:9527/api/resourceView/dzwl/updDzwlZpr")
if err != nil || resp.IsError() || resp.StatusCode() != 200 {
fmt.Println(err)
panic(exception.New("失败" + row[1]))
} else {
fmt.Println("ok" + row[1] + resp.String())
}
}
}

@ -1,206 +0,0 @@
package common
import (
"cu-helper/internal/deprecated/wms/service"
"fmt"
"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"
)
func GenExcelFile(m1 map[string]*service.HighOptLossUnder) {
// Open the Excel file
open := configkit.GetString("loss.open", "")
if open == "" {
open = "/Users/leo/Documents/光衰通报/光衰/2025/光衰通报(11月5日).xlsx"
}
f, err := excelize.OpenFile(open)
if err != nil {
fmt.Println(err)
return
}
styleRed, 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,
},
})
styleYellow, 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{"FFC000"}, // RGB(255,192,0)
Pattern: 1,
},
Font: &excelize.Font{
Bold: true,
},
})
styleGreen, 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,
},
})
// Cut and paste data from E4:E25 to C4:C25
//TODO
for i := 4; i <= 25; i++ {
eCell := "E" + strconv.Itoa(i)
cCell := "C" + strconv.Itoa(i)
value, _ := f.GetCellValue("汇总", eCell)
f.SetCellValue("汇总", cCell, cast.ToInt(value))
f.SetCellValue("汇总", eCell, "")
}
// Populate E4:L25 with data from the map
//TODO
for i := 4; i <= 25; i++ {
bCell := "B" + strconv.Itoa(i)
key, _ := f.GetCellValue("汇总", bCell)
if data, ok := m1[key]; ok {
f.SetCellValue("汇总", "E"+strconv.Itoa(i), data.UnderCount)
if data.UnderCount == 0 {
f.SetCellStyle("汇总", "E"+strconv.Itoa(i), "E"+strconv.Itoa(i), styleGreen)
}
if data.UnderCount > 0 && data.UnderCount <= 5 {
f.SetCellStyle("汇总", "E"+strconv.Itoa(i), "E"+strconv.Itoa(i), styleYellow)
}
if data.UnderCount > 5 {
f.SetCellStyle("汇总", "E"+strconv.Itoa(i), "E"+strconv.Itoa(i), styleRed)
}
f.SetCellValue("汇总", "F"+strconv.Itoa(i), data.DurationOverSeven)
if data.DurationOverSeven == 0 {
f.SetCellStyle("汇总", "F"+strconv.Itoa(i), "F"+strconv.Itoa(i), styleGreen)
}
if data.DurationOverSeven > 0 && data.DurationOverSeven <= 5 {
f.SetCellStyle("汇总", "F"+strconv.Itoa(i), "F"+strconv.Itoa(i), styleYellow)
}
if data.DurationOverSeven > 5 {
f.SetCellStyle("汇总", "F"+strconv.Itoa(i), "F"+strconv.Itoa(i), styleRed)
}
f.SetCellValue("汇总", "G"+strconv.Itoa(i), data.DurationOverFifteen)
if data.DurationOverFifteen == 0 {
f.SetCellStyle("汇总", "G"+strconv.Itoa(i), "G"+strconv.Itoa(i), styleGreen)
}
if data.DurationOverFifteen > 0 && data.DurationOverFifteen <= 5 {
f.SetCellStyle("汇总", "G"+strconv.Itoa(i), "G"+strconv.Itoa(i), styleYellow)
}
if data.DurationOverFifteen > 5 {
f.SetCellStyle("汇总", "G"+strconv.Itoa(i), "G"+strconv.Itoa(i), styleRed)
}
f.SetCellValue("汇总", "H"+strconv.Itoa(i), data.Book)
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)
f.SetCellValue("汇总", "F"+strconv.Itoa(i), 0)
f.SetCellStyle("汇总", "F"+strconv.Itoa(i), "F"+strconv.Itoa(i), styleGreen)
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.SetCellValue("汇总", "I"+strconv.Itoa(i), 0)
}
}
// Calculate D4:D25 as C-E
//TODO
for i := 4; i <= 25; i++ {
cCell := "C" + strconv.Itoa(i)
eCell := "E" + strconv.Itoa(i)
dCell := "D" + strconv.Itoa(i)
cValue, _ := f.GetCellValue("汇总", cCell)
eValue, _ := f.GetCellValue("汇总", eCell)
cInt, _ := strconv.Atoi(cValue)
eInt, _ := strconv.Atoi(eValue)
f.SetCellValue("汇总", dCell, cInt-eInt)
if cInt-eInt == 0 {
//本周压降为0但是当前遗留量为0
if eInt == 0 {
f.SetCellStyle("汇总", dCell, dCell, styleGreen)
} else {
//当前有遗留但是没压降量
f.SetCellStyle("汇总", dCell, dCell, styleYellow)
}
}
if cInt-eInt < 0 {
f.SetCellStyle("汇总", dCell, dCell, styleRed)
}
if cInt-eInt > 0 {
f.SetCellStyle("汇总", dCell, dCell, styleGreen)
}
}
// Sum columns C:I and place the results in row 26
for col := 'C'; col <= 'I'; col++ {
//TODO
sumCell := string(col) + "26"
//TODO
sumFormula := fmt.Sprintf("SUM(%s4:%s25)", string(col), string(col))
f.SetCellFormula("汇总", sumCell, sumFormula)
}
// Recalculate the sum for each cell to ensure it appears without manual intervention
for col := 'C'; col <= 'I'; col++ {
//TODO
sumCell := string(col) + "26"
value, err := f.CalcCellValue("汇总", sumCell)
if err != nil {
fmt.Println(err)
} else {
f.SetCellValue("汇总", sumCell, cast.ToInt(value))
}
}
//设置表头
content := fmt.Sprintf("西湖智家光衰通报:%s", time.Now().Format("1月2日"))
f.SetCellValue("汇总", "A1", content)
// Save the file
save := filepath.Dir(open) + "/光衰通报(" + time.Now().Format("1月2日") + ").xlsx"
if err := f.SaveAs(save); err != nil {
fmt.Println(err)
}
logkit.Info("生成结束...")
}

@ -1,34 +0,0 @@
package cryptokit
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"github.com/mizuki1412/go-core-kit/class/exception"
)
// Encrypt 实现 AES-CBC 加密(返回 Base64 编码结果)
func Encrypt(plainText string) string {
key := "1234567890123456"
iv := "1234567890123456"
block, err := aes.NewCipher([]byte(key))
if err != nil {
panic(exception.New(err.Error()))
}
// PKCS7 填充
paddedText := pkcs7Padding([]byte(plainText), block.BlockSize())
// CBC 模式加密
blockMode := cipher.NewCBCEncrypter(block, []byte(iv))
ciphertext := make([]byte, len(paddedText))
blockMode.CryptBlocks(ciphertext, paddedText)
// Base64 编码
return base64.StdEncoding.EncodeToString(ciphertext)
}
func pkcs7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}

@ -1,58 +0,0 @@
package model
import (
"reflect"
)
/*
http://132.151.160.87:10010/wms-zj/gshuaiOrderQueryW/getOrderInfo.do
*/
/*
访
*/
type GetHighOptLossUnderList struct {
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.OrgId = "330106"
getHighOptLossUnderList.BookFlag = "-1"
getHighOptLossUnderList.OrderParam = "ACCEPT_TIME"
getHighOptLossUnderList.OrderDesc = "DESC"
getHighOptLossUnderList.ReceiveFlag = "0"
getHighOptLossUnderList.Rows = "10000"
getHighOptLossUnderList.Page = "1"
getHighOptLossUnderList.QueryType = "-1"
return getHighOptLossUnderList
}
func (th *GetHighOptLossUnderList) GenReqParam() map[string]string {
return th.structToMap()
}
func (th *GetHighOptLossUnderList) 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
}

@ -1,66 +0,0 @@
package model
import "reflect"
/*
http://132.151.160.87:10010/wms-zj/monitor/orderQueryListAjax.do
*/
/*
*/
type GetOrderQueryList struct {
Page string `map:"page"`
Rows string `map:"rows"`
OrgId string `map:"orgId"`
BusiNo string `map:"busiNo"`
BusiType string `map:"busiType"`
QueryFlag string `map:"queryFlag"`
OrdStatus string `map:"ordStatus"`
ParallelFlag string `map:"parallelFlag"`
QueryType string `map:"queryType"`
QueryValue string `map:"queryValue"`
ProdClass string `map:"prodClass"`
DelFlag string `map:"delFlag"`
IsCurrentArchive string `map:"isCurrentArchive"` //非当日报竣=2 当日报竣=1
}
func NewGetOrderQueryList(no string) *GetOrderQueryList {
return &GetOrderQueryList{
Page: "1",
Rows: "10",
OrgId: "330106", //西湖=330106 萧山=330109
BusiNo: no,
BusiType: "1",
QueryFlag: "2",
OrdStatus: "0",
ParallelFlag: "0",
QueryType: "0",
QueryValue: no,
ProdClass: "-1",
DelFlag: "-1",
IsCurrentArchive: "2",
}
}
func (th *GetOrderQueryList) GenReqParam() map[string]string {
return th.structToMap()
}
func (th *GetOrderQueryList) 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
}

@ -1,43 +0,0 @@
package model
import (
"reflect"
"github.com/mizuki1412/go-core-kit/service/configkit"
)
// Header WMS-ZJ通用Header
type Header struct {
ContentType string `map:"Content-Type"`
Cookie string `map:"Cookie"`
UserAgent string `map:"User-Agent"`
}
func NewHeader() *Header {
header := new(Header)
header.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"
header.Cookie = "JSESSIONID=" + configkit.GetString("wms.token", "")
header.UserAgent = "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"
return header
}
func (th *Header) GenReqParam() map[string]string {
return th.structToMap()
}
func (th *Header) 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
}

@ -1,61 +0,0 @@
package service
import (
model2 "cu-helper/internal/deprecated/wms/model"
"time"
"github.com/go-resty/resty/v2"
"github.com/mizuki1412/go-core-kit/class/exception"
"github.com/tidwall/gjson"
)
//获取光衰数据列表
// HighOptLossUnder 在途光衰单
type HighOptLossUnder struct {
Count int //所有在途单
UnderCount int //施工中在途单
ApplyCount int //人工回访在途单
DurationOverSeven int
DurationOverFifteen int
Book int
}
// ReqGetHighOptLossUnderList 查询在途光衰单(包含施工中、人工回访、综合调度等全部未归档状态)
func ReqGetHighOptLossUnderList() map[string]*HighOptLossUnder {
h := model2.NewHeader()
header := h.GenReqParam()
f := model2.NewGetHighOptLossUnderList()
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/gShuaiReply/gshuaiOrderReplyListAjax.do")
if err != nil {
panic(exception.New(err.Error()))
}
data := gjson.Get(resp.String(), "list").Array()
m := make(map[string]*HighOptLossUnder)
for _, v := range data {
if m[v.Get("DEAL_MAN").String()] == nil {
m[v.Get("DEAL_MAN").String()] = &HighOptLossUnder{}
}
m[v.Get("DEAL_MAN").String()].Count++
if v.Get("STATUS_NAME").String() == "施工处理" {
m[v.Get("DEAL_MAN").String()].UnderCount++
duration := v.Get("TIMELONGS").Int()
if duration >= 604800 {
m[v.Get("DEAL_MAN").String()].DurationOverSeven++
}
if duration >= 1296000 {
m[v.Get("DEAL_MAN").String()].DurationOverFifteen++
}
if v.Get("BOOK_TIME").String() != "" {
m[v.Get("DEAL_MAN").String()].Book++
}
}
if v.Get("STATUS_NAME").String() == "人工回访" {
m[v.Get("DEAL_MAN").String()].ApplyCount++
}
}
return m
}
Loading…
Cancel
Save