transform.go 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239
  1. package service
  2. import (
  3. "fmt"
  4. "math"
  5. "strconv"
  6. "strings"
  7. "time"
  8. jsoniter "github.com/json-iterator/go"
  9. )
  10. func TransformType2(responseData string) (string, error) {
  11. // 解析入参
  12. type inputData struct {
  13. Data struct {
  14. Today float64 `json:"Today"`
  15. Change float64 `json:"Change"`
  16. DsToday float64 `json:"DsToday"`
  17. DsChange float64 `json:"DsChange"`
  18. Items []string `json:"Items"`
  19. } `json:"data"`
  20. }
  21. var input inputData
  22. if err := jsoniter.Unmarshal([]byte(responseData), &input); err != nil {
  23. return "", err
  24. }
  25. // 处理内层数据
  26. inner := struct {
  27. Today float64 `json:"today"`
  28. Change string `json:"change"`
  29. Items string `json:"items"`
  30. DsChange string `json:"dsChange"`
  31. DsToday float64 `json:"dsToday"`
  32. }{Today: input.Data.Today, DsToday: input.Data.DsToday}
  33. // 处理百分比逻辑
  34. switch {
  35. case input.Data.Change > 0:
  36. inner.Change = fmt.Sprintf("增加%.0f%%", input.Data.Change)
  37. case input.Data.Change == 0:
  38. inner.Change = "无变化"
  39. default:
  40. inner.Change = fmt.Sprintf("减少%.0f%%", -input.Data.Change)
  41. }
  42. switch {
  43. case input.Data.DsChange > 0:
  44. inner.DsChange = fmt.Sprintf("增加%.0f%%", input.Data.DsChange)
  45. case input.Data.DsChange == 0:
  46. inner.DsChange = "无变化"
  47. default:
  48. inner.DsChange = fmt.Sprintf("减少%.0f%%", -input.Data.DsChange)
  49. }
  50. // 拼接Items
  51. if len(input.Data.Items) > 0 {
  52. inner.Items = strings.Join(input.Data.Items, ",")
  53. }
  54. // 正确的外层包裹
  55. outer := struct {
  56. Data interface{} `json:"data"`
  57. }{Data: inner}
  58. resultJSON, err := jsoniter.Marshal(outer)
  59. return string(resultJSON), err
  60. }
  61. func TransformType4(arg1 string) (string, error) {
  62. // 定义入参结构体(匹配真实格式)
  63. type inputData struct {
  64. Data struct {
  65. FeedFlow float64 `json:"feed_flow"`
  66. WaterQuantity string `json:"water_quantity"`
  67. Level string `json:"level"`
  68. PlantFeedFlow float64 `json:"plant_feed_flow"`
  69. } `json:"data"`
  70. }
  71. var input inputData
  72. if err := jsoniter.Unmarshal([]byte(arg1), &input); err != nil {
  73. return "", err
  74. }
  75. // 处理内层数据
  76. inner := struct {
  77. FeedFlow float64 `json:"feed_flow"`
  78. WaterQuantity string `json:"water_quantity"`
  79. Level string `json:"level"`
  80. PlantFeedFlow float64 `json:"plant_feed_flow"`
  81. }{
  82. FeedFlow: input.Data.FeedFlow,
  83. WaterQuantity: input.Data.WaterQuantity,
  84. }
  85. // 处理level(字符串转数字+容错)
  86. levelNum, _ := strconv.Atoi(input.Data.Level)
  87. inner.Level = "一般"
  88. if levelNum != 0 {
  89. inner.Level = "已达标"
  90. }
  91. // 保留2位小数
  92. inner.PlantFeedFlow = math.Round(input.Data.PlantFeedFlow*100) / 100
  93. // 外层包裹data
  94. outer := struct {
  95. Data interface{} `json:"data"`
  96. }{Data: inner}
  97. resultJSON, err := jsoniter.Marshal(outer)
  98. return string(resultJSON), err
  99. }
  100. func TransformType5(arg1 string) (string, error) {
  101. // 定义入参结构体(仅保留核心data字段)
  102. type inputData struct {
  103. Data struct {
  104. Today float64 `json:"Today"`
  105. Change float64 `json:"Change"`
  106. Items []string `json:"Items"`
  107. } `json:"data"`
  108. }
  109. var input inputData
  110. if err := jsoniter.Unmarshal([]byte(arg1), &input); err != nil {
  111. return "", err
  112. }
  113. // 处理内层数据
  114. inner := struct {
  115. Today float64 `json:"today"`
  116. Change string `json:"change"`
  117. Items string `json:"items"`
  118. }{
  119. Today: math.Round(input.Data.Today*100) / 100,
  120. }
  121. // 处理Change
  122. switch {
  123. case input.Data.Change > 0:
  124. inner.Change = fmt.Sprintf("增加%.0f%%", input.Data.Change)
  125. case input.Data.Change == 0:
  126. inner.Change = "无变化"
  127. default:
  128. inner.Change = fmt.Sprintf("减少%.0f%%", math.Abs(input.Data.Change))
  129. }
  130. // 处理Items
  131. if len(input.Data.Items) > 0 {
  132. inner.Items = strings.Join(input.Data.Items, "")
  133. }
  134. // 外层包裹data
  135. outer := struct {
  136. Data interface{} `json:"data"`
  137. }{Data: inner}
  138. resultJSON, err := jsoniter.Marshal(outer)
  139. return string(resultJSON), err
  140. }
  141. func TransformType6(arg1 string) (string, error) {
  142. // 定义入参结构体(兼容code/msg,匹配真实入参格式)
  143. type inputData struct {
  144. Data struct {
  145. Uf string `json:"uf"`
  146. Ro string `json:"ro"`
  147. Pump string `json:"pump"`
  148. } `json:"data"`
  149. }
  150. // 解析入参JSON(使用jsoniter替代标准库)
  151. var input inputData
  152. if err := jsoniter.Unmarshal([]byte(arg1), &input); err != nil {
  153. return "", err
  154. }
  155. // 处理ufStatus逻辑(对齐Python:默认良好,值为"0"则一般)
  156. ufStatus := "良好"
  157. if strings.TrimSpace(input.Data.Uf) == "0" {
  158. ufStatus = "一般"
  159. }
  160. // 处理roStatus逻辑
  161. roStatus := "良好"
  162. if strings.TrimSpace(input.Data.Ro) == "0" {
  163. roStatus = "一般"
  164. }
  165. // 处理pumpStatus逻辑
  166. pumpStatus := "良好"
  167. if strings.TrimSpace(input.Data.Pump) == "0" {
  168. pumpStatus = "一般"
  169. }
  170. // 定义内层结果结构体
  171. inner := struct {
  172. Uf string `json:"uf"`
  173. Ro string `json:"ro"`
  174. Pump string `json:"pump"`
  175. }{
  176. Uf: ufStatus,
  177. Ro: roStatus,
  178. Pump: pumpStatus,
  179. }
  180. // 外层包裹data的结构体
  181. outer := struct {
  182. Data interface{} `json:"data"`
  183. }{
  184. Data: inner,
  185. }
  186. // 序列化为JSON字符串(使用jsoniter)
  187. resultJSON, err := jsoniter.Marshal(outer)
  188. if err != nil {
  189. return "", err
  190. }
  191. return string(resultJSON), nil
  192. }
  193. // ProcessDeviceTime 解析设备和创建时间数据,入参为JSON字符串,返回带data包裹的JSON字符串
  194. func TransformType8(arg1 string) (string, error) {
  195. // 定义入参结构体(匹配输入的code/msg/data格式)
  196. // type inputStruct struct {
  197. // Code int `json:"code"`
  198. // Msg string `json:"msg"`
  199. // Data struct {
  200. // Level string `json:"level"`
  201. // Msg string `json:"msg"`
  202. // } `json:"data"`
  203. // }
  204. //
  205. // // 用jsoniter解析输入JSON字符串
  206. // var input inputStruct
  207. // if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  208. // return "", err
  209. // }
  210. //
  211. // // 清理msg中的无效占位符(修复%!s(MISSING))
  212. // cleanMsg := strings.ReplaceAll(input.Data.Msg, "%!s(MISSING)", "")
  213. // // 去除末尾多余的、号
  214. // cleanMsg = strings.TrimSuffix(cleanMsg, "、")
  215. //
  216. // // 构造仅单层data包裹的输出结构
  217. // output := struct {
  218. // Data struct {
  219. // Level string `json:"level"`
  220. // Msg string `json:"msg"`
  221. // } `json:"data"`
  222. // }{}
  223. // output.Data.Level = input.Data.Level
  224. // output.Data.Msg = cleanMsg
  225. //
  226. // // 用jsoniter序列化为JSON字符串返回
  227. // result, err := jsoniter.MarshalToString(output)
  228. // if err != nil {
  229. // return "", err
  230. // }
  231. // return result, nil
  232. // 1. 解析输入JSON(data为数组结构)
  233. var input struct {
  234. Data []struct {
  235. MetricEnCode string `json:"metric_en_code"`
  236. MetricVal string `json:"metric_val"`
  237. MetricName string `json:"metric_name"`
  238. } `json:"data"`
  239. }
  240. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  241. return "", err
  242. }
  243. // 2. 初始化默认值(对齐Python)
  244. level := "良好"
  245. var msgBuilder strings.Builder // 高效拼接字符串,替代Python的+=
  246. // 3. 遍历data数组,复刻Python的分支逻辑
  247. for _, line := range input.Data {
  248. if line.MetricEnCode == "water_quality" {
  249. // 水质指标:判断值是否为"0",修改等级
  250. if line.MetricVal == "0" {
  251. level = "一般"
  252. }
  253. } else {
  254. // 其他指标:拼接"指标名是值、"
  255. if msgBuilder.Len() > 0 {
  256. msgBuilder.WriteString("、") // 用分隔符替代末尾rstrip,更高效
  257. }
  258. msgBuilder.WriteString(line.MetricName + "是" + line.MetricVal)
  259. }
  260. }
  261. // 4. 构造输出(单层data包裹)
  262. output := struct {
  263. Data struct {
  264. Level string `json:"level"`
  265. Msg string `json:"msg"`
  266. } `json:"data"`
  267. }{}
  268. output.Data.Level = level
  269. output.Data.Msg = msgBuilder.String() // 无需rstrip,天然无末尾多余分隔符
  270. // 5. 序列化为JSON字符串返回
  271. res, err := jsoniter.MarshalToString(output)
  272. return res, err
  273. }
  274. func TransformType15(arg1 string) (string, error) {
  275. // 定义入参结构体(匹配Python解析的data数组结构)
  276. type inputItem struct {
  277. MetricCode string `json:"metric_code"`
  278. TargetVal interface{} `json:"target_val"` // 兼容任意类型,后续转字符串
  279. MetricVal string `json:"metric_val"`
  280. MetricName string `json:"metric_name"`
  281. }
  282. type inputData struct {
  283. Data []inputItem `json:"data"`
  284. }
  285. // 解析输入JSON
  286. var input inputData
  287. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  288. return "", err
  289. }
  290. // 初始化默认值(对齐Python的初始值)
  291. flowTarget := "0"
  292. flowValue := "0"
  293. elecValue := "0"
  294. metricValue := "0"
  295. // 遍历数据处理逻辑(完全对齐Python)
  296. for _, item := range input.Data {
  297. if item.MetricCode == "plant_permeate_flow" {
  298. // 将target_val转为字符串(对齐Python的str())
  299. flowTarget, _ = jsoniter.MarshalToString(item.TargetVal)
  300. flowValue = item.MetricVal
  301. }
  302. if item.MetricName == "电耗" {
  303. elecValue = item.MetricVal
  304. }
  305. if item.MetricName == "药耗" {
  306. metricValue = item.MetricVal
  307. }
  308. }
  309. // 构造外层仅包data的输出结构
  310. output := struct {
  311. Data struct {
  312. FlowTarget string `json:"flow_target"`
  313. FlowValue string `json:"flow_value"`
  314. ElecValue string `json:"elec_value"`
  315. MetricValue string `json:"metric_value"`
  316. } `json:"data"`
  317. }{}
  318. output.Data.FlowTarget = flowTarget
  319. output.Data.FlowValue = flowValue
  320. output.Data.ElecValue = elecValue
  321. output.Data.MetricValue = metricValue
  322. // 序列化为JSON字符串返回
  323. result, err := jsoniter.MarshalToString(output)
  324. if err != nil {
  325. return "", err
  326. }
  327. return result, nil
  328. }
  329. func TransformType17(arg1 string) (string, error) {
  330. // 定义入参结构体(按需解析data中的字段)
  331. type inputData struct {
  332. Data struct {
  333. WorkOrderTotal int `json:"work_order_total"`
  334. CommandTotal int `json:"command_total"`
  335. } `json:"data"`
  336. }
  337. // 解析输入JSON字符串
  338. var input inputData
  339. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  340. return "", err
  341. }
  342. // 初始化默认值(对齐Python的0值)
  343. workOrderTotal := 0
  344. commandTotal := 0
  345. // 匹配Python的存在性判断逻辑
  346. if input.Data.WorkOrderTotal != 0 { // JSON解析后不存在则为0,符合Python逻辑
  347. workOrderTotal = input.Data.WorkOrderTotal
  348. }
  349. if input.Data.CommandTotal != 0 {
  350. commandTotal = input.Data.CommandTotal
  351. }
  352. // 构造外层仅包data的输出结构
  353. output := struct {
  354. Data struct {
  355. WorkOrderTotal int `json:"work_order_total"`
  356. CommandTotal int `json:"command_total"`
  357. } `json:"data"`
  358. }{}
  359. output.Data.WorkOrderTotal = workOrderTotal
  360. output.Data.CommandTotal = commandTotal
  361. // 序列化为JSON字符串返回
  362. result, err := jsoniter.MarshalToString(output)
  363. if err != nil {
  364. return "", err
  365. }
  366. return result, nil
  367. }
  368. func TransformType19(arg1 string) (string, error) {
  369. // 1. 解析输入JSON(匹配嵌套的data.pagination结构)
  370. var input struct {
  371. Data struct {
  372. Pagination struct {
  373. Total int `json:"total"`
  374. } `json:"pagination"`
  375. } `json:"data"`
  376. }
  377. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  378. return "", err
  379. }
  380. // 2. 提取total(不存在则为0,对齐Python的in判断)
  381. result := input.Data.Pagination.Total
  382. // 3. 生成统计文本(对齐Python的format逻辑)
  383. var detail string
  384. if result == 0 {
  385. detail = "暂无门禁设备"
  386. } else {
  387. detail = fmt.Sprintf("共%d个门禁设备", result)
  388. }
  389. // 4. 构造输出(单层data包裹)
  390. output := struct {
  391. Data struct {
  392. Result string `json:"result"`
  393. } `json:"data"`
  394. }{}
  395. output.Data.Result = detail
  396. // 5. 序列化为JSON字符串返回
  397. res, err := jsoniter.MarshalToString(output)
  398. return res, err
  399. }
  400. func TransformType21(arg1 string) (string, error) {
  401. // 定义入参结构体(匹配data数组结构)
  402. type inputItem struct {
  403. MetricEnCode string `json:"metric_en_code"`
  404. MetricVal string `json:"metric_val"`
  405. MetricName string `json:"metric_name"`
  406. }
  407. type inputData struct {
  408. Data []inputItem `json:"data"`
  409. }
  410. // 解析输入JSON字符串
  411. var input inputData
  412. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  413. return "", err
  414. }
  415. // 初始化默认值(对齐Python)
  416. level := "良好"
  417. var msgBuilder strings.Builder
  418. // 获取上海时区当前时间(对齐Python的ZoneInfo("Asia/Shanghai"))
  419. shanghaiLoc, _ := time.LoadLocation("Asia/Shanghai")
  420. now := time.Now().In(shanghaiLoc)
  421. // 格式化时间为"HH时MM分"(对齐Python的strftime("%H时%M分"))
  422. currTime := now.Format("15时04分")
  423. // 遍历数据处理逻辑(完全对齐Python)
  424. for _, line := range input.Data {
  425. if line.MetricEnCode == "water_quality" {
  426. if line.MetricVal == "0" {
  427. level = "一般"
  428. }
  429. } else {
  430. // 仅过滤"外供水PH"和"外供水电导率"
  431. if line.MetricName == "外供水PH" || line.MetricName == "外供水电导率" {
  432. if msgBuilder.Len() > 0 {
  433. msgBuilder.WriteString("、")
  434. }
  435. msgBuilder.WriteString(line.MetricName + "是" + line.MetricVal)
  436. }
  437. }
  438. }
  439. // 构造外层仅包data的输出结构
  440. output := struct {
  441. Data struct {
  442. Level string `json:"level"`
  443. Msg string `json:"msg"`
  444. Curr string `json:"curr"`
  445. } `json:"data"`
  446. }{}
  447. output.Data.Level = level
  448. output.Data.Msg = msgBuilder.String() // 无需rstrip,Builder拼接无末尾多余符号
  449. output.Data.Curr = currTime
  450. // 序列化为JSON字符串返回
  451. result, err := jsoniter.MarshalToString(output)
  452. if err != nil {
  453. return "", err
  454. }
  455. return result, nil
  456. }
  457. func TransformType22(arg1 string) (string, error) {
  458. // 1. 拆分双JSON字符串
  459. parts := strings.Split(arg1, "#@#@#@")
  460. if len(parts) != 2 {
  461. return "", fmt.Errorf("输入格式错误,需2个JSON片段")
  462. }
  463. // 2. 解析并处理第一个JSON(流量/状态逻辑)
  464. var first struct {
  465. Data struct {
  466. Dwa float64 `json:"dwa"`
  467. Fwa float64 `json:"fwa"`
  468. DwaStatus int `json:"dwa_status"`
  469. } `json:"data"`
  470. }
  471. if err := jsoniter.UnmarshalFromString(parts[0], &first); err != nil {
  472. return "", err
  473. }
  474. // 状态判断+数值格式化
  475. status := "均衡期"
  476. switch first.Data.DwaStatus {
  477. case 1:
  478. status = "高峰期"
  479. case 2:
  480. status = "均衡期"
  481. default:
  482. status = "低峰期"
  483. }
  484. dwaStr := fmt.Sprintf("%.2f立方米/小时", first.Data.Dwa)
  485. fwaStr := fmt.Sprintf("%.2f立方米/小时", first.Data.Fwa)
  486. // 3. 解析并处理第二个JSON(产水/时间逻辑)
  487. var second struct {
  488. Data struct {
  489. TodayFeed float64 `json:"today_feed"`
  490. TodayPermeate float64 `json:"today_permeate"`
  491. } `json:"data"`
  492. }
  493. if err := jsoniter.UnmarshalFromString(parts[1], &second); err != nil {
  494. return "", err
  495. }
  496. // 小数处理+时间格式化
  497. todayFeed := float64(int(second.Data.TodayFeed*100+0.5)) / 100
  498. todayPermeate := float64(int(second.Data.TodayPermeate*100+0.5)) / 100
  499. loc, _ := time.LoadLocation("Asia/Shanghai")
  500. curr := time.Now().In(loc).Format("15时04分")
  501. // 4. 合并结果并序列化(匿名结构体简化定义)
  502. output := struct {
  503. Data struct {
  504. Dwa string `json:"dwa"`
  505. Fwa string `json:"fwa"`
  506. Status string `json:"status"`
  507. TodayFeed float64 `json:"today_feed"`
  508. TodayPermeate float64 `json:"today_permeate"`
  509. Curr string `json:"curr"`
  510. } `json:"data"`
  511. }{}
  512. output.Data.Dwa = dwaStr
  513. output.Data.Fwa = fwaStr
  514. output.Data.Status = status
  515. output.Data.TodayFeed = todayFeed
  516. output.Data.TodayPermeate = todayPermeate
  517. output.Data.Curr = curr
  518. // 5. 生成最终JSON
  519. res, err := jsoniter.MarshalToString(output)
  520. return res, err
  521. }
  522. func TransformType23(arg1 string) (string, error) {
  523. // 1. 拆分双JSON字符串
  524. parts := strings.Split(arg1, "#@#@#@")
  525. if len(parts) != 2 {
  526. return "", fmt.Errorf("输入需包含2个JSON片段(#@#@#@分隔)")
  527. }
  528. // 2. 解析处理第一个JSON(电耗/产水/水电比逻辑)
  529. var first struct {
  530. Data struct {
  531. Electric float64 `json:"electric"`
  532. WaterOut float64 `json:"waterOut"`
  533. } `json:"data"`
  534. }
  535. if err := jsoniter.UnmarshalFromString(parts[0], &first); err != nil {
  536. return "", err
  537. }
  538. electric := first.Data.Electric
  539. waterOut := first.Data.WaterOut
  540. waterElec := 0.0
  541. if waterOut != 0 {
  542. waterElec = float64(int((electric/waterOut)*100+0.5)) / 100 // 保留2位小数
  543. }
  544. // 3. 解析处理第二个JSON(小时/指标/数值逻辑)
  545. var second struct {
  546. Data struct {
  547. Hour string `json:"hour"`
  548. Metric string `json:"metric"`
  549. Val float64 `json:"val"`
  550. } `json:"data"`
  551. }
  552. if err := jsoniter.UnmarshalFromString(parts[1], &second); err != nil {
  553. return "", err
  554. }
  555. // 4. 合并结果并序列化(匿名结构体极简定义)
  556. output := struct {
  557. Data struct {
  558. Electric float64 `json:"electric"`
  559. WaterElec float64 `json:"waterElec"`
  560. Hour string `json:"hour"`
  561. Metric string `json:"metric"`
  562. Val float64 `json:"val"`
  563. } `json:"data"`
  564. }{}
  565. output.Data.Electric = electric
  566. output.Data.WaterElec = waterElec
  567. output.Data.Hour = second.Data.Hour
  568. output.Data.Metric = second.Data.Metric
  569. output.Data.Val = second.Data.Val
  570. // 5. 生成最终JSON字符串
  571. res, err := jsoniter.MarshalToString(output)
  572. return res, err
  573. }
  574. func TransformType24(arg1 string) (string, error) {
  575. // 1. 拆分#@#@#@分隔的双JSON
  576. parts := strings.Split(arg1, "#@#@#@")
  577. if len(parts) != 2 {
  578. return "", fmt.Errorf("输入需包含2个JSON片段(#@#@#@分隔)")
  579. }
  580. // 2. 解析处理第一个JSON(药剂使用量拼接逻辑)
  581. var first struct {
  582. Data struct {
  583. List []struct {
  584. ChemicalAgents string `json:"chemical_agents"`
  585. Value float64 `json:"value"`
  586. } `json:"list"`
  587. } `json:"data"`
  588. }
  589. if err := jsoniter.UnmarshalFromString(parts[0], &first); err != nil {
  590. return "", err
  591. }
  592. // 拼接msg(用Builder避免冗余逗号,替代rstrip)
  593. var msgBuilder strings.Builder
  594. for _, line := range first.Data.List {
  595. if msgBuilder.Len() > 0 {
  596. msgBuilder.WriteString(",")
  597. }
  598. // 保留2位小数,对齐Python的round(line["value"],2)
  599. val := float64(int(line.Value*100+0.5)) / 100
  600. msgBuilder.WriteString(fmt.Sprintf("%s使用%.2f kg", line.ChemicalAgents, val))
  601. }
  602. // 3. 解析处理第二个JSON(今日值/变化率/Items拼接逻辑)
  603. var second struct {
  604. Data struct {
  605. Today float64 `json:"Today"`
  606. Change float64 `json:"Change"`
  607. Items []string `json:"Items"`
  608. } `json:"data"`
  609. }
  610. if err := jsoniter.UnmarshalFromString(parts[1], &second); err != nil {
  611. return "", err
  612. }
  613. // 处理今日值(保留2位小数)
  614. today := float64(int(second.Data.Today*100+0.5)) / 100
  615. // 处理变化率描述
  616. change := "无变化"
  617. if second.Data.Change > 0 {
  618. change = fmt.Sprintf("增加%d%%", second.Data.Change)
  619. } else if second.Data.Change < 0 {
  620. change = fmt.Sprintf("减少%d%%", int(math.Abs(second.Data.Change)))
  621. }
  622. // 处理Items拼接(对齐Python的"".join)
  623. items := strings.Join(second.Data.Items, "")
  624. // 4. 合并结果并序列化(匿名结构体极简定义)
  625. output := struct {
  626. Data struct {
  627. Msg string `json:"msg"`
  628. Today float64 `json:"today"`
  629. Change string `json:"change"`
  630. Items string `json:"items"`
  631. } `json:"data"`
  632. }{}
  633. output.Data.Msg = msgBuilder.String()
  634. output.Data.Today = today
  635. output.Data.Change = change
  636. output.Data.Items = items
  637. // 5. 生成最终JSON字符串
  638. res, err := jsoniter.MarshalToString(output)
  639. return res, err
  640. }
  641. func TransformType25(arg1 string, isEnglish int) (string, error) {
  642. // 1. 解析输入JSON(按需定义结构体,仅解析需要的字段)
  643. var input struct {
  644. Data struct {
  645. Uf string `json:"uf"`
  646. Ro string `json:"ro"`
  647. Pump string `json:"pump"`
  648. } `json:"data"`
  649. }
  650. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  651. return "", err
  652. }
  653. // 2. 状态判断(对齐Python的默认值+字段存在性判断)
  654. ufStatus := "良好"
  655. if input.Data.Uf == "0" {
  656. ufStatus = "一般"
  657. }
  658. roStatus := "良好"
  659. if input.Data.Ro == "0" {
  660. roStatus = "一般"
  661. }
  662. pumpStatus := "良好"
  663. if input.Data.Pump == "0" {
  664. pumpStatus = "一般"
  665. }
  666. // 3. 中英文切换(替代Python的内部函数)
  667. replaceStatus := func(status string) string {
  668. if isEnglish == 1 {
  669. status = strings.ReplaceAll(status, "一般", "Acceptable")
  670. status = strings.ReplaceAll(status, "良好", "Good")
  671. }
  672. return status
  673. }
  674. ufStatus = replaceStatus(ufStatus)
  675. roStatus = replaceStatus(roStatus)
  676. pumpStatus = replaceStatus(pumpStatus)
  677. // 4. 合并结果并序列化(单层data包裹)
  678. output := struct {
  679. Data struct {
  680. Uf string `json:"uf"`
  681. Ro string `json:"ro"`
  682. Pump string `json:"pump"`
  683. } `json:"data"`
  684. }{}
  685. output.Data.Uf = ufStatus
  686. output.Data.Ro = roStatus
  687. output.Data.Pump = pumpStatus
  688. // 5. 生成最终JSON字符串
  689. res, err := jsoniter.MarshalToString(output)
  690. return res, err
  691. }
  692. func TransformType28(arg1 string, isEnglish int) (string, error) {
  693. // 1. 定义中英文状态映射(对齐Python的status_mapping)
  694. statusMapping := map[string]string{
  695. "优秀": "Excellent",
  696. "良好": "Good",
  697. "较好": "Fair",
  698. "一般": "Average",
  699. "较差": "Poor",
  700. }
  701. // 2. 解析输入JSON(仅解析需要的字段)
  702. var input struct {
  703. Data struct {
  704. Score float64 `json:"score"` // 兼容数字类型(int/float)
  705. Grade string `json:"grade"`
  706. } `json:"data"`
  707. }
  708. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  709. return "", err
  710. }
  711. // 3. 初始化默认值+字段存在性判断(对齐Python)
  712. result := 80.0
  713. if input.Data.Score != 0 { // 不存在则为0,触发默认值逻辑
  714. result = input.Data.Score
  715. }
  716. status := "较好"
  717. if input.Data.Grade != "" { // 不存在则为空字符串,触发默认值逻辑
  718. status = input.Data.Grade
  719. }
  720. // 4. 中英文切换(对齐Python的映射判断逻辑)
  721. if isEnglish == 1 {
  722. if enStatus, ok := statusMapping[status]; ok {
  723. status = enStatus
  724. }
  725. }
  726. // 5. 构造输出(单层data包裹)
  727. output := struct {
  728. Data struct {
  729. Score float64 `json:"score"`
  730. Status string `json:"status"`
  731. } `json:"data"`
  732. }{}
  733. output.Data.Score = result
  734. output.Data.Status = status
  735. // 6. 序列化为JSON字符串返回
  736. res, err := jsoniter.MarshalToString(output)
  737. return res, err
  738. }
  739. func TransformType29(arg1 string) (string, error) {
  740. // 1. 拆分双JSON字符串
  741. parts := strings.Split(arg1, "#@#@#@")
  742. if len(parts) != 2 {
  743. return "", nil // 或返回错误:fmt.Errorf("输入需包含2个JSON片段(#@#@#@分隔)")
  744. }
  745. // 2. 通用解析函数(提取list最后一个value,保留2位小数)
  746. parseListValue := func(jsonStr string) float64 {
  747. var input struct {
  748. Data struct {
  749. List []struct {
  750. Value float64 `json:"value"`
  751. } `json:"list"`
  752. } `json:"data"`
  753. }
  754. _ = jsoniter.UnmarshalFromString(jsonStr, &input) // 忽略解析错误,默认返回0
  755. result := 0.0
  756. // 遍历list,取最后一个value(对齐Python逻辑)
  757. for _, row := range input.Data.List {
  758. result = row.Value
  759. }
  760. // 保留2位小数(对齐Python的round(result,2))
  761. return float64(int(result*100+0.5)) / 100
  762. }
  763. // 3. 解析两个JSON片段
  764. result := parseListValue(parts[0])
  765. result1 := parseListValue(parts[1])
  766. // 4. 构造输出(单层data包裹)
  767. output := struct {
  768. Data struct {
  769. Result float64 `json:"result"`
  770. Result1 float64 `json:"result_1"`
  771. } `json:"data"`
  772. }{}
  773. output.Data.Result = result
  774. output.Data.Result1 = result1
  775. // 5. 序列化为JSON字符串返回
  776. res, err := jsoniter.MarshalToString(output)
  777. return res, err
  778. }
  779. func TransformType30(arg1 string) (string, error) {
  780. // 1. 解析输入JSON(匹配Python的data结构)
  781. var input struct {
  782. Data struct {
  783. Pagination struct {
  784. Total int `json:"total"`
  785. } `json:"pagination"`
  786. List []struct {
  787. Status int `json:"status"`
  788. Reject int `json:"reject"`
  789. } `json:"list"`
  790. } `json:"data"`
  791. }
  792. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  793. return "", err
  794. }
  795. // 2. 初始化默认值(对齐Python)
  796. result := 0
  797. end, accept, unAccept, submit, reject := 0, 0, 0, 0, 0
  798. // 3. 提取total(对齐Python的in判断)
  799. if input.Data.Pagination.Total != 0 {
  800. result = input.Data.Pagination.Total
  801. }
  802. // 4. 遍历list统计工单状态(0未接单/1已提交/2已完成/3已拒绝/4已接单)
  803. for _, wOrder := range input.Data.List {
  804. switch wOrder.Status {
  805. case 2:
  806. end++
  807. case 0:
  808. unAccept++
  809. case 4:
  810. accept++
  811. case 1:
  812. submit++
  813. }
  814. // 处理reject=3的情况(已拒绝)
  815. if wOrder.Reject == 3 {
  816. reject++
  817. }
  818. }
  819. // 5. 拼接输出文本(用Builder避免冗余字符串拼接)
  820. var outTextBuilder strings.Builder
  821. if result == 0 {
  822. outTextBuilder.WriteString("今天未下发工单。")
  823. } else {
  824. outTextBuilder.WriteString(fmt.Sprintf("今天下发%d条工单,", result))
  825. }
  826. if accept != 0 {
  827. outTextBuilder.WriteString(fmt.Sprintf("%d条工单已接单,", accept))
  828. }
  829. if submit != 0 {
  830. outTextBuilder.WriteString(fmt.Sprintf("%d条工单已提交,", submit))
  831. }
  832. if end != 0 {
  833. outTextBuilder.WriteString(fmt.Sprintf("%d条工单已完成,", end))
  834. }
  835. if reject != 0 {
  836. outTextBuilder.WriteString(fmt.Sprintf("%d条工单已拒绝,", reject))
  837. }
  838. outTextBuilder.WriteString("详细的智能工单列表已为您打开,请在右边的画面中查看,谢谢!")
  839. outText := outTextBuilder.String()
  840. // 6. 构造输出(单层data包裹)
  841. output := struct {
  842. Data struct {
  843. Total int `json:"total"`
  844. End int `json:"end"`
  845. Runing int `json:"runing"`
  846. OutText string `json:"outText"`
  847. } `json:"data"`
  848. }{}
  849. output.Data.Total = result
  850. output.Data.End = end
  851. output.Data.Runing = result - end // 运行中=总数-已完成
  852. output.Data.OutText = outText
  853. // 7. 序列化为JSON字符串返回
  854. res, err := jsoniter.MarshalToString(output)
  855. return res, err
  856. }
  857. func TransformType33(arg1 string) (string, error) {
  858. // 1. 解析输入JSON(匹配data.list结构)
  859. var input struct {
  860. Data struct {
  861. List []struct {
  862. StartTime string `json:"StartTime"`
  863. } `json:"list"`
  864. } `json:"data"`
  865. }
  866. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  867. return "", err
  868. }
  869. for idx, plan := range input.Data.List {
  870. // 3. 截取前10位(对齐Python的result[:10])
  871. if len(plan.StartTime) >= 10 {
  872. input.Data.List[idx].StartTime = plan.StartTime[:10]
  873. }
  874. break // 取第一个元素后立即退出循环
  875. }
  876. // 5. 序列化为JSON字符串返回
  877. res, err := jsoniter.MarshalToString(input)
  878. return res, err
  879. }
  880. func TransformType35(arg1 string) (string, error) {
  881. // 1. 解析输入JSON(仅定义需要的字段)
  882. var input struct {
  883. Data struct {
  884. TotalCount int `json:"total_count"`
  885. } `json:"data"`
  886. }
  887. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  888. return "", err
  889. }
  890. // 2. 初始化默认值+字段存在性判断(对齐Python)
  891. result := 0
  892. if input.Data.TotalCount != 0 { // 不存在则为0,等价Python的in判断
  893. result = input.Data.TotalCount
  894. }
  895. // 3. 生成详情文本(对齐Python的format逻辑)
  896. var detail string
  897. if result == 0 {
  898. detail = "暂无照明设备"
  899. } else {
  900. detail = fmt.Sprintf("共%d个照明设备", result)
  901. }
  902. // 4. 构造输出(单层data包裹)
  903. output := struct {
  904. Data struct {
  905. Result string `json:"result"`
  906. } `json:"data"`
  907. }{}
  908. output.Data.Result = detail
  909. // 5. 序列化为JSON字符串返回
  910. res, err := jsoniter.MarshalToString(output)
  911. return res, err
  912. }
  913. func TransformType36(arg1 string) (string, error) {
  914. // 1. 解析输入JSON(仅定义核心字段)
  915. var input struct {
  916. Data struct {
  917. TotalCount int `json:"total_count"`
  918. } `json:"data"`
  919. }
  920. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  921. return "", err
  922. }
  923. // 2. 字段存在性判断(对齐Python的in逻辑)
  924. result := 0
  925. if input.Data.TotalCount != 0 { // 不存在则为0,等价Python的in判断
  926. result = input.Data.TotalCount
  927. }
  928. // 3. 生成统计文本(对齐Python的format逻辑)
  929. var detail string
  930. if result == 0 {
  931. detail = "暂无空调设备"
  932. } else {
  933. detail = fmt.Sprintf("共%d个空调设备", result)
  934. }
  935. // 4. 构造输出(单层data包裹)
  936. output := struct {
  937. Data struct {
  938. Result string `json:"result"`
  939. } `json:"data"`
  940. }{}
  941. output.Data.Result = detail
  942. // 5. 序列化为JSON字符串返回
  943. res, err := jsoniter.MarshalToString(output)
  944. return res, err
  945. }
  946. func TransformType38(arg1 string) (string, error) {
  947. // 1. 解析输入JSON(仅定义需要的字段)
  948. var input struct {
  949. Data struct {
  950. Remark string `json:"Remark"`
  951. } `json:"data"`
  952. }
  953. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  954. return "", err
  955. }
  956. // 2. 提取Remark(不存在则为空字符串,对齐Python逻辑)
  957. result := input.Data.Remark
  958. // 3. 构造输出(单层data包裹)
  959. output := struct {
  960. Data struct {
  961. Result string `json:"result"`
  962. } `json:"data"`
  963. }{}
  964. output.Data.Result = result
  965. // 4. 序列化为JSON字符串返回
  966. res, err := jsoniter.MarshalToString(output)
  967. return res, err
  968. }
  969. func TransformType39(arg1 string) (string, error) {
  970. // 1. 拆分双JSON字符串
  971. parts := strings.Split(arg1, "#@#@#@")
  972. if len(parts) != 2 {
  973. return "", nil // 容错:非2段返回空(或改为返回错误:fmt.Errorf("输入需包含2个JSON片段"))
  974. }
  975. // 2. 解析第一个JSON(主工艺,默认值:超滤+反渗透(UF+RO))
  976. var first struct {
  977. Data struct {
  978. MainProcess string `json:"MainProcess"`
  979. } `json:"data"`
  980. }
  981. _ = jsoniter.UnmarshalFromString(parts[0], &first) // 忽略解析错误,使用默认值
  982. result := "超滤+反渗透(UF+RO)"
  983. if first.Data.MainProcess != "" { // 字段存在则覆盖默认值
  984. result = first.Data.MainProcess
  985. }
  986. // 3. 解析第二个JSON(拼接list中所有desc)
  987. var second struct {
  988. Data struct {
  989. List []struct {
  990. Desc string `json:"desc"`
  991. } `json:"list"`
  992. } `json:"data"`
  993. }
  994. _ = jsoniter.UnmarshalFromString(parts[1], &second) // 忽略解析错误,返回空字符串
  995. var result1 strings.Builder
  996. for _, item := range second.Data.List {
  997. result1.WriteString(item.Desc) // 拼接所有desc
  998. }
  999. // 4. 构造输出(单层data包裹)
  1000. output := struct {
  1001. Data struct {
  1002. Result string `json:"result"`
  1003. Result1 string `json:"result_1"`
  1004. } `json:"data"`
  1005. }{}
  1006. output.Data.Result = result
  1007. output.Data.Result1 = result1.String()
  1008. // 5. 序列化为JSON字符串返回
  1009. res, err := jsoniter.MarshalToString(output)
  1010. return res, err
  1011. }
  1012. func TransformType42(arg1 string) (string, error) {
  1013. // 1. 解析输入JSON(仅定义核心字段)
  1014. var input struct {
  1015. Data struct {
  1016. OnAmount int `json:"on_amount"`
  1017. } `json:"data"`
  1018. }
  1019. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  1020. return "", err
  1021. }
  1022. // 2. 提取on_amount(不存在则为0,对齐Python逻辑)
  1023. num := input.Data.OnAmount
  1024. // 3. 构造输出(单层data包裹)
  1025. output := struct {
  1026. Data struct {
  1027. Num int `json:"num"`
  1028. } `json:"data"`
  1029. }{}
  1030. output.Data.Num = num
  1031. // 4. 序列化为JSON字符串返回
  1032. res, err := jsoniter.MarshalToString(output)
  1033. return res, err
  1034. }
  1035. func TransformType51(arg1 string) (string, error) {
  1036. // 1. 解析输入JSON(匹配嵌套的data.pagination结构)
  1037. var input struct {
  1038. Data struct {
  1039. Pagination struct {
  1040. Total int `json:"total"`
  1041. } `json:"pagination"`
  1042. } `json:"data"`
  1043. }
  1044. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  1045. return "", err
  1046. }
  1047. // 2. 提取total(不存在则为0,对齐Python的in判断逻辑)
  1048. result := input.Data.Pagination.Total
  1049. // 3. 构造输出(单层data包裹)
  1050. output := struct {
  1051. Data struct {
  1052. Result int `json:"result"`
  1053. } `json:"data"`
  1054. }{}
  1055. output.Data.Result = result
  1056. // 4. 序列化为JSON字符串返回
  1057. res, err := jsoniter.MarshalToString(output)
  1058. return res, err
  1059. }
  1060. func TransformType59(arg1 string, isEnglish int, rq string) (string, error) {
  1061. // 1. 解析输入JSON(匹配Python的data结构)
  1062. var input struct {
  1063. Data struct {
  1064. WaterLeakPoint []string `json:"water_leak_point"`
  1065. WorkOrderNum int `json:"work_order_num"`
  1066. Flag int `json:"flag"`
  1067. FeedFlow float64 `json:"feed_flow"`
  1068. PermeateFlow float64 `json:"permeate_flow"`
  1069. } `json:"data"`
  1070. }
  1071. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  1072. return "", err
  1073. }
  1074. // 2. 处理漏水点文本(中英文切换)
  1075. var waterLeakPoint string
  1076. if len(input.Data.WaterLeakPoint) > 0 {
  1077. points := strings.Join(input.Data.WaterLeakPoint, "、")
  1078. if isEnglish == 1 {
  1079. waterLeakPoint = fmt.Sprintf(", Water leakage occurred at %s", points)
  1080. } else {
  1081. waterLeakPoint = fmt.Sprintf(",%s发生漏水", points)
  1082. }
  1083. }
  1084. // 3. 处理工单数量文本(中英文切换)
  1085. var workOrderNum string
  1086. if input.Data.WorkOrderNum != 0 {
  1087. if isEnglish == 1 {
  1088. workOrderNum = fmt.Sprintf(", completed %d work orders", input.Data.WorkOrderNum)
  1089. } else {
  1090. workOrderNum = fmt.Sprintf(",完成%d个工单", input.Data.WorkOrderNum)
  1091. }
  1092. }
  1093. // 4. 保留2位小数(对齐Python的round)
  1094. feedFlow := float64(int(input.Data.FeedFlow*100+0.5)) / 100
  1095. permeateFlow := float64(int(input.Data.PermeateFlow*100+0.5)) / 100
  1096. // 5. 构造输出(单层data包裹)
  1097. output := struct {
  1098. Data struct {
  1099. Flag int `json:"flag"`
  1100. FeedFlow float64 `json:"feed_flow"`
  1101. PermeateFlow float64 `json:"permeate_flow"`
  1102. WaterLeakPoint string `json:"water_leak_point"`
  1103. WorkOrderNum string `json:"work_order_num"`
  1104. Result string `json:"result"`
  1105. } `json:"data"`
  1106. }{}
  1107. output.Data.Flag = input.Data.Flag
  1108. output.Data.FeedFlow = feedFlow
  1109. output.Data.PermeateFlow = permeateFlow
  1110. output.Data.WaterLeakPoint = waterLeakPoint
  1111. output.Data.WorkOrderNum = workOrderNum
  1112. layout := "2006-01-02"
  1113. t, _ := time.Parse(layout, rq)
  1114. oneDayBefore := t.AddDate(0, 0, -1).Format("2006-01-02")
  1115. output.Data.Result = oneDayBefore
  1116. // 6. 序列化为JSON字符串返回
  1117. res, err := jsoniter.MarshalToString(output)
  1118. return res, err
  1119. }