transform.go 32 KB

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