transform.go 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169
  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 TransformType35(arg1 string) (string, error) {
  813. // 1. 解析输入JSON(仅定义需要的字段)
  814. var input struct {
  815. Data struct {
  816. TotalCount int `json:"total_count"`
  817. } `json:"data"`
  818. }
  819. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  820. return "", err
  821. }
  822. // 2. 初始化默认值+字段存在性判断(对齐Python)
  823. result := 0
  824. if input.Data.TotalCount != 0 { // 不存在则为0,等价Python的in判断
  825. result = input.Data.TotalCount
  826. }
  827. // 3. 生成详情文本(对齐Python的format逻辑)
  828. var detail string
  829. if result == 0 {
  830. detail = "暂无照明设备"
  831. } else {
  832. detail = fmt.Sprintf("共%d个照明设备", result)
  833. }
  834. // 4. 构造输出(单层data包裹)
  835. output := struct {
  836. Data struct {
  837. Result string `json:"result"`
  838. } `json:"data"`
  839. }{}
  840. output.Data.Result = detail
  841. // 5. 序列化为JSON字符串返回
  842. res, err := jsoniter.MarshalToString(output)
  843. return res, err
  844. }
  845. func TransformType36(arg1 string) (string, error) {
  846. // 1. 解析输入JSON(仅定义核心字段)
  847. var input struct {
  848. Data struct {
  849. TotalCount int `json:"total_count"`
  850. } `json:"data"`
  851. }
  852. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  853. return "", err
  854. }
  855. // 2. 字段存在性判断(对齐Python的in逻辑)
  856. result := 0
  857. if input.Data.TotalCount != 0 { // 不存在则为0,等价Python的in判断
  858. result = input.Data.TotalCount
  859. }
  860. // 3. 生成统计文本(对齐Python的format逻辑)
  861. var detail string
  862. if result == 0 {
  863. detail = "暂无空调设备"
  864. } else {
  865. detail = fmt.Sprintf("共%d个空调设备", result)
  866. }
  867. // 4. 构造输出(单层data包裹)
  868. output := struct {
  869. Data struct {
  870. Result string `json:"result"`
  871. } `json:"data"`
  872. }{}
  873. output.Data.Result = detail
  874. // 5. 序列化为JSON字符串返回
  875. res, err := jsoniter.MarshalToString(output)
  876. return res, err
  877. }
  878. func TransformType38(arg1 string) (string, error) {
  879. // 1. 解析输入JSON(仅定义需要的字段)
  880. var input struct {
  881. Data struct {
  882. Remark string `json:"Remark"`
  883. } `json:"data"`
  884. }
  885. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  886. return "", err
  887. }
  888. // 2. 提取Remark(不存在则为空字符串,对齐Python逻辑)
  889. result := input.Data.Remark
  890. // 3. 构造输出(单层data包裹)
  891. output := struct {
  892. Data struct {
  893. Result string `json:"result"`
  894. } `json:"data"`
  895. }{}
  896. output.Data.Result = result
  897. // 4. 序列化为JSON字符串返回
  898. res, err := jsoniter.MarshalToString(output)
  899. return res, err
  900. }
  901. func TransformType39(arg1 string) (string, error) {
  902. // 1. 拆分双JSON字符串
  903. parts := strings.Split(arg1, "#@#@#@")
  904. if len(parts) != 2 {
  905. return "", nil // 容错:非2段返回空(或改为返回错误:fmt.Errorf("输入需包含2个JSON片段"))
  906. }
  907. // 2. 解析第一个JSON(主工艺,默认值:超滤+反渗透(UF+RO))
  908. var first struct {
  909. Data struct {
  910. MainProcess string `json:"MainProcess"`
  911. } `json:"data"`
  912. }
  913. _ = jsoniter.UnmarshalFromString(parts[0], &first) // 忽略解析错误,使用默认值
  914. result := "超滤+反渗透(UF+RO)"
  915. if first.Data.MainProcess != "" { // 字段存在则覆盖默认值
  916. result = first.Data.MainProcess
  917. }
  918. // 3. 解析第二个JSON(拼接list中所有desc)
  919. var second struct {
  920. Data struct {
  921. List []struct {
  922. Desc string `json:"desc"`
  923. } `json:"list"`
  924. } `json:"data"`
  925. }
  926. _ = jsoniter.UnmarshalFromString(parts[1], &second) // 忽略解析错误,返回空字符串
  927. var result1 strings.Builder
  928. for _, item := range second.Data.List {
  929. result1.WriteString(item.Desc) // 拼接所有desc
  930. }
  931. // 4. 构造输出(单层data包裹)
  932. output := struct {
  933. Data struct {
  934. Result string `json:"result"`
  935. Result1 string `json:"result_1"`
  936. } `json:"data"`
  937. }{}
  938. output.Data.Result = result
  939. output.Data.Result1 = result1.String()
  940. // 5. 序列化为JSON字符串返回
  941. res, err := jsoniter.MarshalToString(output)
  942. return res, err
  943. }
  944. func TransformType42(arg1 string) (string, error) {
  945. // 1. 解析输入JSON(仅定义核心字段)
  946. var input struct {
  947. Data struct {
  948. OnAmount int `json:"on_amount"`
  949. } `json:"data"`
  950. }
  951. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  952. return "", err
  953. }
  954. // 2. 提取on_amount(不存在则为0,对齐Python逻辑)
  955. num := input.Data.OnAmount
  956. // 3. 构造输出(单层data包裹)
  957. output := struct {
  958. Data struct {
  959. Num int `json:"num"`
  960. } `json:"data"`
  961. }{}
  962. output.Data.Num = num
  963. // 4. 序列化为JSON字符串返回
  964. res, err := jsoniter.MarshalToString(output)
  965. return res, err
  966. }
  967. func TransformType51(arg1 string) (string, error) {
  968. // 1. 解析输入JSON(匹配嵌套的data.pagination结构)
  969. var input struct {
  970. Data struct {
  971. Pagination struct {
  972. Total int `json:"total"`
  973. } `json:"pagination"`
  974. } `json:"data"`
  975. }
  976. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  977. return "", err
  978. }
  979. // 2. 提取total(不存在则为0,对齐Python的in判断逻辑)
  980. result := input.Data.Pagination.Total
  981. // 3. 构造输出(单层data包裹)
  982. output := struct {
  983. Data struct {
  984. Result int `json:"result"`
  985. } `json:"data"`
  986. }{}
  987. output.Data.Result = result
  988. // 4. 序列化为JSON字符串返回
  989. res, err := jsoniter.MarshalToString(output)
  990. return res, err
  991. }
  992. func TransformType59(arg1 string, isEnglish int, rq string) (string, error) {
  993. // 1. 解析输入JSON(匹配Python的data结构)
  994. var input struct {
  995. Data struct {
  996. WaterLeakPoint []string `json:"water_leak_point"`
  997. WorkOrderNum int `json:"work_order_num"`
  998. Flag int `json:"flag"`
  999. FeedFlow float64 `json:"feed_flow"`
  1000. PermeateFlow float64 `json:"permeate_flow"`
  1001. } `json:"data"`
  1002. }
  1003. if err := jsoniter.UnmarshalFromString(arg1, &input); err != nil {
  1004. return "", err
  1005. }
  1006. // 2. 处理漏水点文本(中英文切换)
  1007. var waterLeakPoint string
  1008. if len(input.Data.WaterLeakPoint) > 0 {
  1009. points := strings.Join(input.Data.WaterLeakPoint, "、")
  1010. if isEnglish == 1 {
  1011. waterLeakPoint = fmt.Sprintf(", Water leakage occurred at %s", points)
  1012. } else {
  1013. waterLeakPoint = fmt.Sprintf(",%s发生漏水", points)
  1014. }
  1015. }
  1016. // 3. 处理工单数量文本(中英文切换)
  1017. var workOrderNum string
  1018. if input.Data.WorkOrderNum != 0 {
  1019. if isEnglish == 1 {
  1020. workOrderNum = fmt.Sprintf(", completed %d work orders", input.Data.WorkOrderNum)
  1021. } else {
  1022. workOrderNum = fmt.Sprintf(",完成%d个工单", input.Data.WorkOrderNum)
  1023. }
  1024. }
  1025. // 4. 保留2位小数(对齐Python的round)
  1026. feedFlow := float64(int(input.Data.FeedFlow*100+0.5)) / 100
  1027. permeateFlow := float64(int(input.Data.PermeateFlow*100+0.5)) / 100
  1028. // 5. 构造输出(单层data包裹)
  1029. output := struct {
  1030. Data struct {
  1031. Flag int `json:"flag"`
  1032. FeedFlow float64 `json:"feed_flow"`
  1033. PermeateFlow float64 `json:"permeate_flow"`
  1034. WaterLeakPoint string `json:"water_leak_point"`
  1035. WorkOrderNum string `json:"work_order_num"`
  1036. Result string `json:"result"`
  1037. } `json:"data"`
  1038. }{}
  1039. output.Data.Flag = input.Data.Flag
  1040. output.Data.FeedFlow = feedFlow
  1041. output.Data.PermeateFlow = permeateFlow
  1042. output.Data.WaterLeakPoint = waterLeakPoint
  1043. output.Data.WorkOrderNum = workOrderNum
  1044. layout := "2006-01-02 15:04:05"
  1045. t, _ := time.Parse(layout, rq)
  1046. oneDayBefore := t.AddDate(0, 0, -1).Format("2006-01-02")
  1047. output.Data.Result = oneDayBefore
  1048. // 6. 序列化为JSON字符串返回
  1049. res, err := jsoniter.MarshalToString(output)
  1050. return res, err
  1051. }