From ba20ac1416f65513aef4d9ba1b729f1d40d8985d Mon Sep 17 00:00:00 2001 From: stream Date: Fri, 22 Aug 2025 17:02:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A7=A6=E6=8E=A7=E4=BA=A4=E4=BA=92?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E3=80=81=E8=A7=A6=E6=8E=A7=E4=BA=A4=E4=BA=92?= =?UTF-8?q?=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: 分支节点在循环体内部的问题解决 --- .../web/controller/test/TeTestController.java | 4 +- .../main/resources/icon/xiaomi/su7/下一曲.png | Bin 0 -> 2123 bytes .../main/resources/icon/xiaomi/su7/充放电.png | Bin 0 -> 4830 bytes .../main/resources/icon/xiaomi/su7/地图.png | Bin 0 -> 3803 bytes .../resources/icon/xiaomi/su7/导航去公司.png | Bin 0 -> 1685 bytes .../resources/icon/xiaomi/su7/导航回家.png | Bin 0 -> 1580 bytes .../main/resources/icon/xiaomi/su7/座椅.png | Bin 0 -> 2198 bytes .../resources/icon/xiaomi/su7/座椅通风.png | Bin 0 -> 4245 bytes .../resources/icon/xiaomi/su7/打开空调.png | Bin 0 -> 6377 bytes .../resources/icon/xiaomi/su7/播放音乐.png | Bin 0 -> 2208 bytes .../main/resources/icon/xiaomi/su7/显示.png | Bin 0 -> 3049 bytes .../main/resources/icon/xiaomi/su7/灯光.png | Bin 0 -> 3117 bytes .../main/resources/icon/xiaomi/su7/空调.png | Bin 0 -> 2659 bytes .../resources/icon/xiaomi/su7/空调首页.png | Bin 0 -> 5915 bytes .../main/resources/icon/xiaomi/su7/设置.png | Bin 0 -> 3432 bytes .../resources/icon/xiaomi/su7/车辆控制.png | Bin 0 -> 3651 bytes .../resources/icon/xiaomi/su7/辅助驾驶.png | Bin 0 -> 3640 bytes .../resources/icon/xiaomi/su7/运动模式.png | Bin 0 -> 5120 bytes .../main/resources/icon/xiaomi/su7/连接.png | Bin 0 -> 2520 bytes .../main/resources/icon/xiaomi/su7/门窗锁.png | Bin 0 -> 3439 bytes .../main/resources/icon/xiaomi/su7/首页.png | Bin 0 -> 1898 bytes .../resources/icon/xiaomi/su7/驾驶偏好.png | Bin 0 -> 3501 bytes cmvr-iot-api/cmvr-iot-llm/pom.xml | 5 + .../com/cmvr/llm/service/LLMTouchService.java | 4 +- .../llm/service/impl/LLMTouchServiceImpl.java | 161 ++++++++++++++++-- .../com/cmvr/system/domain/vo}/CarIcon.java | 2 +- .../com/cmvr/system/domain/vo}/CarUi.java | 2 +- .../system}/service/CarPathFinderService.java | 4 +- .../impl/CarPathFinderServiceImpl.java | 30 ++-- .../cmvr/system}/util/CarPathFinderUtil.java | 6 +- .../java/com/cmvr/test/enums/ActionEnum.java | 4 +- .../com/cmvr/test/enums/NodeTypeEnum.java | 3 +- .../com/cmvr/test/flow/builder/FlowGraph.java | 25 +++ .../test/flow/builder/FlowModelBuilder.java | 4 + .../dispatcher/FlowLoopNodeHandler.java | 8 +- .../dispatcher/FlowStopLoopNodeHandler.java | 21 +++ .../dispatcher/FlowSubEndNodeHandler.java | 18 ++ .../flow/runtime/engine/FlowItemExecutor.java | 4 +- .../runtime/engine/FlowTaskScheduler.java | 2 +- .../edge/EdgeCameraOperateService.java | 9 +- .../operator/llm/LLMTouchOperateService.java | 21 +-- 41 files changed, 274 insertions(+), 63 deletions(-) create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/下一曲.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/充放电.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/地图.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/导航去公司.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/导航回家.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/座椅.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/座椅通风.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/打开空调.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/播放音乐.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/显示.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/灯光.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/空调.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/空调首页.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/设置.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/车辆控制.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/辅助驾驶.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/运动模式.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/连接.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/门窗锁.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/首页.png create mode 100644 cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/驾驶偏好.png rename {cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/model => cmvr-iot-system/src/main/java/com/cmvr/system/domain/vo}/CarIcon.java (97%) rename {cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/model => cmvr-iot-system/src/main/java/com/cmvr/system/domain/vo}/CarUi.java (96%) rename {cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm => cmvr-iot-system/src/main/java/com/cmvr/system}/service/CarPathFinderService.java (91%) rename {cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm => cmvr-iot-system/src/main/java/com/cmvr/system}/service/impl/CarPathFinderServiceImpl.java (55%) rename {cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm => cmvr-iot-system/src/main/java/com/cmvr/system}/util/CarPathFinderUtil.java (96%) create mode 100644 cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowStopLoopNodeHandler.java create mode 100644 cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowSubEndNodeHandler.java diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeTestController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeTestController.java index 87e6946..f60dfe6 100644 --- a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeTestController.java +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeTestController.java @@ -3,8 +3,8 @@ package com.cmvr.web.controller.test; import com.cmvr.common.core.controller.BaseController; import com.cmvr.common.core.domain.AjaxResult; -import com.cmvr.llm.model.CarIcon; -import com.cmvr.llm.service.CarPathFinderService; +import com.cmvr.system.domain.vo.CarIcon; +import com.cmvr.system.service.CarPathFinderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/下一曲.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/下一曲.png new file mode 100644 index 0000000000000000000000000000000000000000..538645c13dd50c3d118367dedbf1ad82cabe392b GIT binary patch literal 2123 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 literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/地图.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/地图.png new file mode 100644 index 0000000000000000000000000000000000000000..6f05ef87ad977b812a4bd3573e7d675d5c11842a GIT binary patch literal 3803 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 M@$~3`d(US62Q78zj{pDw literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/导航去公司.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/导航去公司.png new file mode 100644 index 0000000000000000000000000000000000000000..9ecb817b346ccc975204c96684285f1f9b582f79 GIT binary patch literal 1685 zcmbu3_gB*g6ve+G6NCa`2+9i6fQkgfB+LX5f(3zKP{9$|LorAkNoA^~V3}bGSY}iZ z0YTzch=k=pmI+ZIavZdY!KTQNq-lHFf1vmM@XkH=y?Z{2SBe=x%YP?nCjbHg07yB2 zVjA#Ly8oxYO8#Gi@>}r;&_)0_zzqyC2UN5{U~Q0s3z#T5Au3=c>AwPlR3NGV0t#1y zDRUPsKeTzw}RY$Z>v}JR+iN;R&LRbw6lHpp6tcQnN z*76LH^@YC_hY(Pn$YM~3nas>s74B6x1u3U9C;T~IroLUY|0J^d3CKtym`xKw9To#{ zA_Ls4nYHWA{rMb*=_i?ZYIb?10+`?OLGxW$LD9;)06KrxJydMTt$cMg;*_D(Jv}0J zoBZI^WhyG+Gv8V+sfaNV5Ub-h^Skd{pd3wu)$T|BS~gy*+e93M`nJ1$xx#klZFEhX zjqm<_BaLTpqAWx}>B+73v+}usoqW4#3-!r9Ps?~x17nf#K6-aWB0ua@bCOu2G}Sm6 zKm4vzs&@cqeTm`QPmul%3mQ#kZijx{!v4XKj zjZINDIW`&RO`Sc43M{W0mpR(U->+Qc3zlEmd|ByvR+VxBRG~gNSL!4uTl`$z6BKAh zje6NrzsFby=1uM>&!bTos06!rd-^5cMuvDh7A^SMjyGX(vD>@jS+d^*jn$l&xUu-E zkhuruv4)Y+JnyxP2lFr0)av!dvmBbS9NGu4dt47>qt`6X+X+Gedl;N2tH~;0_@`3)c2NtxJ=L2WA&FJ3nD>@E` z)u^2wFK**aN_E(;;aA%q2a_j1hZ!+Xw=E&EV{y0|*3nig;>Z2yz#x)n6Xf-Mx}}gV zP8z#+ZK$dWk4g3z8o5{VG$uVZCEDrI==ex~Jciy3!9-llFUVw|qctFx(8HXT^V;JR zJCh}E1sY7hSp64w&5!or__cN(CWX%&oeOg6tV%;~od_ChS1l*>_j!Axo@^UD+IT;* z_d#NQ)^|Uex;opvxdXtN_#od+MaYbzI@oy{T>_J6Q7N+P{5oM)a$f47u(b(eXNy_2xxzM)>kTLP2l)DZ@3}7b zq}pzP>lo}1BeX`nI>*I#n-x8pCv;{S4Da1Q(y^&@^5I*}WhdIMoHUkWPZ>zl4n_EQ zq>C<3L;G1`cUSo)LX-x5X;y?n>zfJFFB@cMTSy8DzGAyaIZf!wCo!uX196Q8EEX$o ze&;nKPmQfer*84&n)IFmK2`=F#rGn literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/导航回家.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/导航回家.png new file mode 100644 index 0000000000000000000000000000000000000000..25f19b29f56b651615d36788eb1804d773200d4e GIT binary patch literal 1580 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 Wo_xfwg@*{P>8nu1Rjn5Or@sKuPQuRs literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/座椅通风.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/座椅通风.png new file mode 100644 index 0000000000000000000000000000000000000000..58fdb7d6ea885c640c28901b3d43acb702aeeb87 GIT binary patch literal 4245 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 literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/打开空调.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/打开空调.png new file mode 100644 index 0000000000000000000000000000000000000000..45491241f581284987d8e0b465cc4153e48b3109 GIT binary patch literal 6377 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 literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/播放音乐.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/播放音乐.png new file mode 100644 index 0000000000000000000000000000000000000000..ab624752f834821a6102e59ac26f689b4e3cbcf3 GIT binary patch literal 2208 zcmbu3c{tRI9>#yO7(=!hOi2#L%wQ~6N-@*XSYnK9V+(b%WErv)6Ot@pGLwu!T5Mx! zP-DB6NRFix;xfoqvR24iQX$v5&vWl{|3B~dukZ7|@8@}UM|LLxDTE2DcUtzSe`#h4n0@~mo|TICc7 z_PX*Q01SrwKN$=KLH4TfJyRP2?2%wlA))^UKwty_QAQp%vh!Glrd9O|NneUvgP~QZ zt=!!)Kx_{LMnDk2NkCAp{9#V}&Ep*_R7FBkAg{%(7F16zHmbsj}k7vUxd|nr)kU%>4`lZdLrR9ly zgRGW9Q0Np62fBIp7lT_H|LB4DS5EtofAj~MOA#;l*>&zu2C`eTu7Bu-{(>NZ3-C>2 zW38&s*EoAzAKA%Vy^WkcuJA-IMdzf%+7ec4F6okeO8-Peq?l9XJ1eZ#N9T~?KW?3+ zZyYV(GLgv=l>dBr(5HyYIS|umcgnfGM zI*7vHSS2zJlpCXA+K3SWdjDulQwr>pkJzM7kIgC1>g$$3>!OBy4UFM%Q9Omov8@z! zNY6&*$v%sRBx13cOK8{g3!j12MFe@FXBlZ*BWUkP6ifD z?;`vd>#GKQ0vDkeFoYwS&mb=tdcH{W9Jn}pa$?Ppw3Dignsf04dU_?#t^e3YMh!Eb7nn82M>Khr3D6={Z=;a-Y6_0$u$1511*ptRLexCz=k+vDeCVtsL5Ykw@a4?rDXQ1C0a99vw=1k1Sgqv{fa zLxYoq`d8snwt_l#%{#gz`fH$?x`$&V^~NLYk^MOXj^{(q*XY%2ZG{nLj`#Fj?LSGM z$O@cHRIe{xT>e=%UiPreBAA%c6kCbPl;P>;*1h$c85SYxx#K5P*LXLbRV6Aj1)Rn3 z%rCA?LfJ4icI6WN-7=O=-_S;7QN}d~N`tfn@~+g-+@P3?`vZOnfBU!;W8ZNby87k2 z#O%|`4MW*KgL$85xWshl=m18syMC{XQf6Q5unzi0&~w3db1-An&goP<)Iy%Zk@2#MJ3Q~D zONoz903F)iZd&s1w7*yvUjRUH@~1O8l}cV2jwEkMbfl zCbegf$KQS$t7MVzosx+?boub?($JjWqa_6|_}pmot*tXvKgMpG$Ecd+X_(Z#Z|F+a zhBV;iTQP~|Sh{cydsb71x61qaSudwBcYH^)!Fj=A9ijS)_Ut}e3<*ED)e`pw8GT&P zS?Z@blfDaBPso`|BuQ{AW1u1Qxfc29tkkoP9TE7Irl5;QtlwE_^(6XB zhYctVcoEo)LqXpPn{3$+QlC=%@AINpXaQ*3FgO$w&#B4CZuP@r5QJj)4;Enem-;Dz zQ%up&Gh5BC1*`=(79LPjKi6e;N=Zpo{bCv%=k$^3;A`{ZdssRCs*jW?79^PIr@BcJ7-d~<{j&;Hv?BiVql@KFp1^~TFsYp(%4+JAI|a?3FUWxh zYvYt2&x_L%mHR}xkeLDCE3*dRqwjy*T=;Gi#+H`)WS~m&IkJ(b_OUt57aJld+NVZ2 z1z;T5ZK*6@*?TNU2cBVEgGsA8-jXTD@f3-Nf}!cA#r_DduY&XY_1_%YXV2K^x z;*Jlu>&9~jywGL~7q0n4i$5?jrowEP|GXwK0ZKAqCvPS%q-Z{=j)SeYHgE5y2MF!V&BK=VwsX?kSDU8Ylk7fEdXao}2> z8@Xl8h%ND4WWIZAq>6?~_D3fmh7OA$C}> d@uy@l3#D}@^WOWHXJ3nF%pPAGKBBlg`fnzuo{Ing literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/显示.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/显示.png new file mode 100644 index 0000000000000000000000000000000000000000..95452858fc794277e5c80a70c4e6a4b871878ba6 GIT binary patch literal 3049 zcmbtV`9IVP7yizo8M1E~OU5z@*~M5c2FaFTFc?y}WXT%F62%ZVS+Zoggv{8o6ebxO zl#3$!l4b0XrLGW_?bUtX_b<5Td_L!V&gVJL^PJz#@rUC%fYa2-#0UU^004B7!0{Ad za5DY7_$Bi16i(R3Z2%V>Py%uxAaMZ91%hyajyr&}000JqA;0eZe?Y)c&?zQ3GmPZ~ z*X9I3U?va~6b?NFhWuIqoir%ZDK0S>w-Uw*?h^QrM_f6k_<8#vGp~d`AHQq*{AN%r zuI}{-TL=XFlKzMHKlu|cCg>^n38=&cfKI$1a1ey)zaZ%3E-@ttx78*OCJ-vF>=N_v z`QTS3>v`9p;wSCLlK?B^*9wFS&;<^etEGZ}c4a%$6$@U6l^5=H%F(b@Dy4bhm)!D& zZ%77!G^_-RwcZVae3(r$FEUUPlc{8bnFVz;x7Xs|(pYR1 zKWIh|;n0um7g-pA1PT@O1_8Sk)@vX3qDuM|W4MhR@p4?Kawo+f(xt`tFvOLP=Kk#~ za>YC9BiaRt;G5ZFv1aEs>6UtEIoxfeD^D-mZ|zW|NG_4N!_q-I9_TeHK1M&CkL9yp zJSM|2=24lfEh56rEXU*!Z+XK*&}9@QC5;5l3-lT!E=()$y%cUD44Egcc(!V`k5sY% zsvzeb_K@$X4QFHeT6qsku4tJ|D9XURo7DuQE-^;ps;(FC^C;qYbpuQoFtnu6hp9S_ z?$Qb=%d+>wyt9-`RuvNl*pP?oh|ZP0xU@$Qjc;uOn+q}l`vz`*#2sk7@Y(u!hnAF1 z)!kYH_L0|D#$b@#&S*l8l^2qSPKwC~s*Zurg5M|E`<0m|FUB+%Oa17akqGv-V6!qo zvKHWq!edoaa1R3}vz4zM5t@CIvVzE!?ldM>)AB`TllGlsAT2krw2RFqOHxEp?EBT? zqI4un#_Y4?fUd0W+Day4!Kc-J`432pc*siO4(p{j3R(k#5DvPmE&YxzB7XBgE)r&&pXs>Vd{=Yg`e$aa((w zx-l?=*6uyK`2wTeP%pEP*43lYs0Ekv$OmARVG+%B{%4vTVy9r3B_yeMb}6#tUWm}d z#1pV1z$zLbYTqaH>2?N3EL>CM=rRp`!|GK*UJ(1y-^3wRt*sU6&2`u6fEgl6bEJ`s zz^?dQG$}!y>tE*0^_X&MgBDxJ%~|T9am1HpN_0(S~^SbvoR5H-0YH{P`nSkhp z@Yl-2%Nlv-rJo=Y|jC zNBu8S4Lxe>eeP!kP1UX2$~C>ybm9*B+qhV+(pb8kzBb`M_;EW+llM%9kb|#b!JM)x zVligifX`Ev#-y2SZrkklb}C&(`N0*XD;}oK`Ac=8zVi2$DX6$QgmR3_-Xo-0$Zx`wVKW;s@~CkIPdES0zMVHN);j zYTRV*kBphwd9^P7guhn3aME3VRrT#@qtQw8jl;nJysxHSX=uPiot;v!H6s{n&Am?r z-;bc^^N%kJv*>3g&z*7`d8hc)Q6%fLH*~kBMx@y8_lm?4+ud8{h2SEP059Rng>)hde6{j z?U8!ESL0>)M(CSf#e9@0eoY@p)vK2Bf1$=ksCyw&zu!6CLYAENbN)1CDo|>U_mg>3 zc_bTbp`5VB61D3wy|Y1Sb#IVdLLpOT*T5zB72)rdmE^2Sh<;B#F)eD;$rY*_=2S-` zlBQqQ5Uy09ewgh}KBZMM97ff#E^obEZE_VC9QAFe`D*ES@|-ZSt3F~~mGBqg550|W zzYU#fT!x%u?T~*@#Ipm^suzcng1R}mM<)16OFa06$79bMTJHopZiAa{PTR=TbndHt za8#KbUAJyj*vEQ0Vy0R~b*?5U7ZZHB% zlT^1)@11hTt=4-iA)ePF&P>xiLl6neqTUT}*u?S8ri64(sj{)tSf5Oa243YXhwo>$ zfJl3QiER8=7t)xoM#(D~PI46|IR=j0u4$7XJ|-RmeNFw^!Q&4uB6&!K#4(|oQ(>t- zT`=@;?fyHJvrU<5!sd4|iLWA_lAt22<$mmC^Sh*g5M7Q23wU7SkY2aX;pK=gqa5i_ z!ym^0ix8>edsNZ12=>iqo_i%RUw^`HXjJp0`<#{7d2G}?!9t%~ix%}%hgom#UwSEq zu0Cwt)iuW1YfZGbY2R79+$V9jnz?Ny4c--D`y^p!d-0t-Ixg)p`zBmC{L`J;U^_=I z$drV$!{1-Ha$F%-*aQue1o$f#YtB74O|Kd*m9C%nvtG^%%qLseG0ue(`5ByUHORp~8D)j7KG{foyir&B9gDln|zjp6BH>GFFP8vnG8EY$tdk5dm zB!3Djxl4f*BRc6{wrBaGz~Pi@0y!>4w`j|G>u*-K6Z$@poav;o7;u~jZz|71bYS9J zGpF?1{nH0U#>N`VAKw#h8;SpJoP@2_H9RmVn(6y15ULW!FtbP8GK$W;9h!(vDYWzPPVo~(| zYq9hJ|N8N{+6DzyZ({v(!dG@uq!u5o*2P)+=U=v)XLSvrTveOu`;MDulw>$-q&g1f zVim&}!>gw+M8b|PFNqCcc-43O+weEyA`UXM_AfKGxCD?7%oCBZP+3k46mH0g0rL)a se2+5390L=_fdA3;SSYHopYbi}{M_y6SUA$6=W*eVbUTz&ruKN^KMnjw?EnA( literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/灯光.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/灯光.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d4bf3b60853fc9d81383df2ff9519c31ba0ca1 GIT binary patch literal 3117 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 literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/空调.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/空调.png new file mode 100644 index 0000000000000000000000000000000000000000..78492de93f73564274c2966ce4b41ba6dd11eca3 GIT binary patch literal 2659 zcmbu3c{J1uAI5((W9(U`rp3iyqhxaD{5sW3;5&(e!0CaG`J_|5E z`2L;#f&4qdL3{r#Aj%8q0B8tE9srAiAfllCc0d{cz#!;9bN?qUJ`fnf!wcm;uysWM z5Cj4Nb3q`7{*yWIxS-rTfGCXju$%^NfY1A}JTd8rn5LE)${e3fs&1J)dQdzD0>BUe z@_$?i7Xal3fqD53Ts2Vubim}{0{=Gw0*e9=ISno|9PF@nQuf+9RQ_>w%fJy7p13~> z2p+`1q7YHQ1YpsNc0sa9Cb!B)O-z=JewhlWhXMI;aFz5H=)7pl8TT50)rxMJ#Xjfh_&I|@ZqfX zU=6>uV{k%yq?u!xyV_$yVog?EYGN_TOoc17c<*I$@)27i9|n&}#+UFZnnHplP1Hi> z_!V-zicAA^LPz%mqm7v*yGt{U$RZn$j(TH=&OwwUMy-<_bbKQ->mzqU~jTlCC_8g^tyjUg%3K!v0p1s~{gj zJ>!gbar3oS+6M|8aV;)aX4e&aeybYgWXL8Fr$s!Uz3`R$5BX3b0 zapv#`bm(KGf*&TB=I+#qNmRjo()GDNpRDoFAy)6Zx5uKE=DbJztR)mqI4m;8@lZ+6 zv0uf*d8^Baf&sk#d5I10nSxg|7bREZEL8c`{l0b%bX;k|-9N4Mz-7{K9|$)()ROac z%rn}qX7!?PRh?HStyI~a(U_^}jmyO6^T|;(r`I)skzE%v-T9bI~B#<#M%{= zQ|~Wz?p{_JHA`(HLw;T=zOLx4kR0e^bK67YD;3Oq_P}d*YH6{vxY1~bJK`!jdQLFb zBb`YPM%(m%?OrH^=O1;~3c?FiJJmf=X&t<8^IkcHQu`~fp?jly-0y9D41zv#Sk7+Y z!`3Tx+vmRL?;`Jl(;@^uGCDY}HDBsi{fP70)%v1~LeD7PvqGc&gNzz7XMEwhx<~4O zQIzy|?d4`WS_liX)TBaf#TQmD2q2rdpJMAuoC32)&N>%=nCk5&a~A|wD}ItXb^I3J zl=24;u?+XMh|rr?l&(eDQ2bEu-<`X;4;01R!y}6y!E-So^roHmwG7S+?u&%^-}yi< z`kY;99y4976vw!(@J3R*mVsWJ#5kuJ{aZ9YoG&lO(ee_+?UCM$^>L97(HgA>Z8q1MH zrpeqGo0hxqU(cH(KIeOaUm;(6-XZI%#XcKjx*{5GPE-67 zQ|9l+^kFXvy+%&-p=ga`Wu6L3gY`9Bu}7Ju7NzbSfr>RbY)ZPVt~`~%tDLwHZw=+a z+pMh+Uvl(^X#S*<*3zw#uHn2*|J}-z3ROr%J}k=pqHn6IcLU4jhwaYL$>QF282>`^4!1xu?rlxh3=W6`Oo-tE$kJi8!lIEGx*O@te^LN#AA96OIX& z{@4u;nZ~iRKWe?^ADW4ue3IypmNxl3?Oi?Lvdr{r(q-<}LV(C`=yWtW^)cGf z4~}udIE)?-qt2Eh_)!IQY9^Ail*zpjezPE@lDb;8`3y@-uf?0xXHV0@LlJ3fUp|oQ zS9_G66Hru4*`U9MZFq$k?(Dpj9VoS-M2y}k@|PfDmSWW~m^(QavB%(X8Fm0q(Tq+^ z_T34UaGmQZ9xX3_5s51krQT}sCUh0ZS3XeLG^kWjCDaF5R^0GH_s_Y`tsfGfw;!>gbTz=rl{md|_HM4!cywk) zbtJOQDG$nhZk*s8m?M7K*&=Wuv-LLhUVxALmmE4m95w<6NwWr!`ZQvg^|obamlHaV z&a!#(DM$>?MMwJM6O6~s@zeBjSTcfLKMTBUGN8H0m(p8o-|w-S6wOq{SHj236u@c4 zNRSB)C37s@abj2@B}Nu;YM#iIOQcg#`kptB?P*P3Nx?o>U3Ib>yx zFBc_#H*p|H>d1#YHDhNr+4_Aw!93514VoGhF5RtT{|p!?1Eq6gg?^o!v1WbYu3RqK MvCNdrKCwUYHwfmcF#rGn literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/空调首页.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/空调首页.png new file mode 100644 index 0000000000000000000000000000000000000000..f7763ce1941ac0653b88be5fe249852773caa8fb GIT binary patch literal 5915 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 literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/设置.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/设置.png new file mode 100644 index 0000000000000000000000000000000000000000..77a97c2f2dbb3e13b7df05375c774bcd2241b09f GIT binary patch literal 3432 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 Q^))7qofxmKMx~Aa2ZbL%PXGV_ literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/车辆控制.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/车辆控制.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0c8d6c59388f7c1c7a9983a8d68d311a655c68 GIT binary patch literal 3651 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 L2p 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 KF43^liGKs2zoTLR literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/运动模式.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/运动模式.png new file mode 100644 index 0000000000000000000000000000000000000000..0b504d6bef92195afe0c1eb270b9fa80546c1584 GIT binary patch literal 5120 zcmbtWjLrVvure|Pe`kU8g13-TR zRMa$dw2X}Z7J>fSwCn-^9X*E(!i0g-PS7K{8p0)u4#~eJq|q_V2o;voHnR`Ki-^i= znLZp_-20d2?=fho|4#9LG}M1l89?-mbijXT*a6Vr2sJf59W ivE`dpc9ax=Rla) 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 literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/连接.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/连接.png new file mode 100644 index 0000000000000000000000000000000000000000..7d3f813841ba4791722269d1e8587a6dcbc1f628 GIT binary patch literal 2520 zcmbu3c{tRI8pnTQX3R+22!)U>OpPKm_T6O9ps^$sj&)=t*|$?!%1$GNW3ExMWGh5T zhb%)fCX6vzhG+(t!N`{Doaf%>x&NQ<``7z?-|y%B?v3tE0!J;)EzAKB2mnC)1MD#X zll|?V=`YAXBkZU5J^%`#mAxzv})^5C9B?^YOz#0{gbk zQ2+!6^MRrK5U{}CM<6~h1j>&9U_vsg$BgW65a7aU3AOFAStZLN^2VZa7fi4riFJc3 z`(g2Y>^}Pc*uZ`m1cmQ=D8yf2FbD>Q{`WCxzZ6(T6=GyxDqhJ+T#70YBC_I;Dlv zXRVFU1l!}1w?p9<;R184?HPmUwU5cl-P}3W08b-_`OCSBXmccINVioZDp*e>Z8>9! z^JllTNts4LN{<+NdEjx)h-2ozH=^HfNt+rlx!dzGh=bKhUv||$72{0iV+%aZPFX*E zmNsxkL{V;_#hDB_8WG!7_KZ4swRPVQrCLBdTOa-Cj8@#3C~L`hu|1!h+3Kmgqtmv% zy0eBAMn|T<*DpweWUE`|GXf5jC$BmV z8B3&!DSl(fBOcHk5(A?aPjHm4sR-11M23uwJdVJ9^{@dVrDxhYLIWdaKJ_F$$ zF*t?ko5u_PQVYNR=%7#ag^7|o_eIHfuP(T%i>;5853zd^2k<+ZMUR;;dT!mz3k!_5 zC1mENdpobdoCuwBBiO`wK2GgjoX|mvGm@3^n51Dc!kV~0EcaYu>$MReo7j05w4v&o=aJY1jQO6!pAnQLh^P8rJU{)ze z(3@Q0+;TshP?N;$C-~f#-3rZ~E#CCysU9baN|!LNAjMl@>uYSYhDE4Na=)_gK+BW;ti*ohc-YmXEb+(8Uwg)*Xhc>vWqsq!1{^%i$NChMD-8bqyEnO}- zq#ef|Eq&0N>WB@WX}k!1$cj|#VfaY|-1k+$b@x(#k;GJR9;d=Pu0k9T1%OZomg+b4L{0`NrE45ISAsyV#;z%D@v$wF-T3=OsUY+Vwp!KuR%k6svYkl{2Wj5OU zLQ%vp#QmnBE{qtw2fQh{25V4+L6zH=(4T{&>n?E0N7_-D{C4r1Y*EbGCc%gD+~bgs z3(X;ZrGgk+5^(-IC7BcKjgf zgBeTOj-d!c(8n0}c`qsO=zRc2O zmY6=6iqzxJWwoElZ5Bj7H7LO4-4>VM_-*WyIkhZXTt~Ai)=lJ$|I<*%zzrl}P}J$S$GKv%vTZFf`SVdLnvG&e%j1t^yikT@?P-Kw z@m>CIGHH0M|3}WPv8*SmjMDMpetkA}m=ztO_%ixI)Xjwy)3mdMEP}9<;kyttGn~Mi+^z(cA+f7kK$(>u-?~yaluJpv%5)aTrqP zGuCIAB!P~9OJoo_V-?U7(=cV1DWsgowZ0{PB#wzsV}I)dt6!W6UEcTzrZ5_MLGutAO3>66=ECBGxi!xINH z&OMPL+XWVTMrr<8p%Zbr@kp>cQ&CjjavV3?VfEuqNBQ$nG6Nr`9-g}qWi*DdLdu{@ ziD={cAd-fPuJhoWU0Atl@E)`--I6UzH+kcg;Zyz#-cgxYQ zw(xBo@u;QA7vJ~bZl$46UQ&v&MGv)MJ8ctN4Qg8%cFk1kaH(}AcOAVoZ?=P(T@!b8 zl@(h``Vte`E6^?3WnhCsA#}=cE7HU-ety2m3Tskro@K|Ei-|NpzksUlbxE9C7F+uj g;>*_VgL*3UD|@Yhtu5_QL#5I@ru3P{=l1CT0U3sJ1poj5 literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/门窗锁.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/门窗锁.png new file mode 100644 index 0000000000000000000000000000000000000000..004e3fdd15506afee0f205ff73694c5254391da5 GIT binary patch literal 3439 zcmbu6c{J4j8ppq5rVM3IMTW^zvSn=9r7R&P%h*-O9vN$qFe)Tt3t6*e-`BB|Wvq#@ zWQ=7fOpLPcxqkQDbI-Yd-}mRQ=kt1=*XKFsbMpOU4q(>S(9!@vAOHZJ9^hmOxO-at zfB8r9{~1oFPuc($D1ZP$!606Mh6My>0iARLu+u#u;D6TrZ@`c>D8Gt|FnQ;PB{y3mX`G@0?MY!t8a}Cz912kSFkwL zE6x9^PfN&|v(Qs0!UBN6|AdD2KM$Wavw*K6AgrpVN;ck#m_HJC3~Yik+fRtVdGNm} z3!nlVzU|+|`twZC?h-WhI#jr45x+-6awQ~ZY3q9Y|8hFOJ8Vga{j>m$Hl32C9KV(Bf;K_DvwCu2*Ezs&U>dPf446II#CB zusgY;pC?^~F&TvgWWVYmat9VZ?!f$>%&`VYV$=S}dk-_80A9x``njb_o}>jH@~zZGDXag&Y0kwiW!c2_6_&d&dVB>Fc_})CY8bhL|QP9%X4IesGXm!Onh7mfy8J zZ1_uy!NwS{0lyOXhZimu9W$U(O8cSF*oU%mHRszs+dfcf$vb3YuwvO}d|Nm2pG zM~0O3{pFEJ($UaLwweiHm**zwmqe*iFt@|v&q$qU1U28iDJ+1i>ioqXuo6>%Rx5hr z_-jo-x2Z*8ue}e-bE$oWVV5}n`ny)j7g;01Q?wI#T9wEhZ;(VF%7vey<&q1G0)VhjwZI(AWX( zl161MLs&43Yr@=7j-O?1ptAga%>HSpd$h*6Bm8o0EaP+NSNcW?u*`Y$-Exum+M6ss z+V?)At!zoYE!_A3(j|ZPmntq<*iEjQ>aCbjLN|w5wzijIkWdno;oM`ArT_P%N0a_H z!@2B-Jdk&FLAYolWZTuMz4WrK zaN>14b8tERYsGsJoE3L3Z!F*q2IC*vbOp8N?_nRtMRC#MJi8=~+!~u{<&hVT!UamY zJ&KJI>_KLUH@-WJP~UHFM@~`mK$yQ%RhQPDeX#u9s(5GJ3YXT&&1H(Ke^P5e{Cy$D z;^|H)&+ypz6m|Q0uk@us{L2Pneg>9zL;K~sH%17J77N@Wr*z}Hrl;h=x6mDYxU-%R zHN?bAa!n{8r0RE~FluQq-8n)4C7`#QTQAxY|3$6lgA3UaN z3f`R3KKb=gPPB`*eNZ5=BRlK=@i>#ATrp|iTI*MKS^4qPnYW2VnqT*a^ zK6%yP4_&l~3pgxn(LHVuqY=_|0L}7itbe=$bIBc(f>5RTsd4O5rE$~0cIjm5!@_RU#T$@1d`GcIe*{sr&+X4AL*zx z^IJ5uL!&JlLwCkXJK8T~`LEtPWZ56R>>1;ztf(Z)%H9@b?f2Grt6sOJjku^nJb{{)wDx&+&hn8DK{7jMi zrFm-x)&s$KXxeDWDQU?Y6vF%8&}LA6p+_0_SLFjapXO{?ZgndufHF%Dek3*zx&Qns z=6w(s_^D99o9#vI@T{w^u=EI@p;%E^2cM1V%60( zl5nh<2tRQmR+*8eUiuR zmye<5Wppzzp|}J+uHjD`403kOYwB@*Z9Kn3=Tww|vwF|OgR)Zq(6^Zfp6}zgdz1oO z8k7fGit$SYeq%n=ZJt^_w%cn=LC{d z9VRkpFoJxL$pTi~=;eQNSE0&#yu^0SmrmyIdhYCaNsMiX=L18-VPc^Wt8-%jmfo}} z{|u(fOln8xN+H{zQsJzQ6xQrVOlpG6XpE2tHZSuxC6~II3Me>~E1v+byx)%I4>R}^ z#0{Z+Ws~q z1&_J#j#0W!*5E}s$bo-hv_haICsq$JG5z`884t};rD?>U6JRY)D1Z@=19PW3t50Bs6%{K(WITW;bJf|;!}_Ba4|3L=V9o|0ZgNRffa6TEaJnB2cRG_froiEL7C%^c1)$V`0BBN%#!ryMZYW^2^yUq1n^ z@16j9u_^WYQ3Q=hmTPH4{kxnyNMso`TO%x`m$H3aJ$V?FxaQ?JeCgBb3DCbYE-&R6 LHhfB3PbU8bGxb9?a1K z02mAcb8$g$$qJzDrM=T{%&o(pQFG?8B`WU}rbq z)PE4o@4#2@BN)@SoHD~wVftS*sx_4idq@4h)e@CZw4|Spg-&g(&lg{;Q8rbOu7{Os z?tGQ_g>ZGcFKT5mdr?~>rzhH7&0oSBEtU}NdX|5i)+1AHRpW#(pUVt;+#+#1F9_YC zueYB$KmULsDkXZ?Dt_+zxwFDFO~v@pyCQ5s^<;su#D`|yLNyX(yK>MoGF&xux0x7N z=(i*-Xz@$wP3yROsA3dPU!;K6YBqDtBuLU>#OGRBMuKEFH@RQsufGPnOC8vuP^V?D zWkVO*;FSpP%bdHjh4x#XH0 zU0AR%*!a&VdSEyYrQ6;elPMA$*W+dxcS(ENP#AZMbetXv7VuWqTcpN+vbT8!KG%W9HiD z%t#}m%JF)JR1_F=7-k#Qo+>I%!itHd`)<4lsmpR`JAX6n=~LCyZj~qAPEV-2GCVeT z7;};OqAt4}z;mBY06jUe9P7a->X`H=73OS#$ixV}U*HJ3-0_BMQ1Nk%Do1f%ukItr z9HQ!ja?$5;!iq`4R5Z%c0sG14VqzhmU77Y+K=X`dmwiGOYnHKCA-}z~wX-!DMPTR5 z6@0lMGSpS`mDzcn>J;WI7YA)T8~)Z=B6dK8(%qg8^(Jjgnxg2${`@=jfleTX)Ihgw z(&eYR&n;JxDHo-r9A)gFCUVK|S#Xav`&+YjLTFIDvgzp68#EOGGcrG7=H5$5-CMmK zRsTZnl@i2u{l0tR*3(k7HWLmP=hmdg@R5g4*_XTG?BDju)RQ}LCHXG6^D)I$GvEtX z^%qB23B>Q7dPT}UmiP4CZEx(5Z!Ubcs`JW4W0a_nm@WsYKQknc4xM6xR8p0!36o+3 zHrt|@r!&#k_0<<{scfCOLNQbbYNSBCiFL^Y|1qVYtiwCD0zX-8MUrDOu+W4mT2wj(v#sWT|oqO1ErtOA05lMD^gjm zYLsoReg>6~9amonrG@LnC!`e&VdfJp)=afbe3QXmF={Dgv8NR>QCo;B+hd!e7{7k{ zSVD`$z0CQeZ)R&zsjs)j-P0Qx?e=LFOFrI=5XZ@zqt3UcRof8|g@MbOwKAq~YQ0~J z+v3Q(Pb{FId_3N-u2Gb+@D7WPi{f8R4}w`kq-&L_m6{MYH~CxtAKFl)98*IZtRq z5XRd>KHuD#Pv)cJt5Ybx(tB3qLf^%6Th<^JCvXGOBe*aQ5H>YGWZ&cW9l;e1}z^0@|hG4IxD99b}WNBbr)MTTprujizpj zU`Q0A@91~u3j&riT?)?f@%^8iaYN{)=s-PJzv1w_DPBA_Ujc7Oi65dEzhL313pNpZ zdg(c=AO>t?Ipo`CWJI$8)ZqBbowf729SldQ=HMgD;Gcnak`PY(knw57hb2NpeE{}D lmjld;KKg@xoIag>E_cYleP*>Q{RMEuiUTxpc|~$Q{te;*E6)G` literal 0 HcmV?d00001 diff --git a/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/驾驶偏好.png b/cmvr-iot-admin/src/main/resources/icon/xiaomi/su7/驾驶偏好.png new file mode 100644 index 0000000000000000000000000000000000000000..14638e7dac0847a16c1a1f0122ae09bae6153ee1 GIT binary patch literal 3501 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 literal 0 HcmV?d00001 diff --git a/cmvr-iot-api/cmvr-iot-llm/pom.xml b/cmvr-iot-api/cmvr-iot-llm/pom.xml index ed2a52d..67871a4 100644 --- a/cmvr-iot-api/cmvr-iot-llm/pom.xml +++ b/cmvr-iot-api/cmvr-iot-llm/pom.xml @@ -19,6 +19,11 @@ cmvr-iot-common + + com.cmvr + cmvr-iot-system + + com.volcengine volc-sdk-java diff --git a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/LLMTouchService.java b/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/LLMTouchService.java index 033f64f..f318a7b 100644 --- a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/LLMTouchService.java +++ b/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/LLMTouchService.java @@ -1,5 +1,7 @@ package com.cmvr.llm.service; +import com.alibaba.fastjson2.JSONObject; + import java.io.File; public interface LLMTouchService { @@ -14,5 +16,5 @@ public interface LLMTouchService { */ public String getCoordinates(String iconImage, String iconDesc, String inputImage); - public String touchCoordinates(File image,String targetUi,String manufacturer, String vehType); + public JSONObject touchCoordinates(File image, String targetUi, String manufacturer, String vehType); } diff --git a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/impl/LLMTouchServiceImpl.java b/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/impl/LLMTouchServiceImpl.java index 1e66d5a..4002c1e 100644 --- a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/impl/LLMTouchServiceImpl.java +++ b/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/impl/LLMTouchServiceImpl.java @@ -1,13 +1,15 @@ package com.cmvr.llm.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.cmvr.common.exception.GlobalException; import com.cmvr.common.utils.http.CallAPIUtil; import com.cmvr.llm.config.APIProperties; -import com.cmvr.llm.model.CarIcon; -import com.cmvr.llm.service.CarPathFinderService; import com.cmvr.llm.service.LLMTouchService; +import com.cmvr.system.domain.vo.CarIcon; +import com.cmvr.system.service.CarPathFinderService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -25,7 +27,9 @@ public class LLMTouchServiceImpl implements LLMTouchService { @Override public String bgeVl(File image) { - return CallAPIUtil.doPostFile(apiProperties.getBgeVl(), null, "image", image, null); + String response = CallAPIUtil.doPostFile(apiProperties.getBgeVl(), null, "image", image, null); + JSONObject result = JSON.parseObject(response); + return result.getString("uiName"); } @Override @@ -56,24 +60,151 @@ public class LLMTouchServiceImpl implements LLMTouchService { } @Override - public String touchCoordinates(File image,String targetUi, String manufacturer, String vehType) { + public JSONObject touchCoordinates(File image, String targetUi, String manufacturer, String vehType) { + JSONObject result = new JSONObject(); + result.put("isFinish", false); + + // 当前界面识别 String currentUi = bgeVl(image); - if (currentUi != null && currentUi.equals(targetUi)) { - return null; + if (StrUtil.isEmpty(currentUi)) { + throw new GlobalException("未获取到当前位置"); } + if (currentUi.equals("设置驾驶偏好")) { + currentUi = "驾驶偏好"; + } + + // 已在目标界面:直接返回完成 + if (StrUtil.equals(currentUi, targetUi)) { + result.put("isFinish", true); + result.put("coordinates", ""); + return result; + } + + // 计算从当前到目标的路径 List path = carPathFinderService.findPath(manufacturer, vehType, currentUi, targetUi); - String nextUi; - for (int i = 0; i < path.size(); i++) { - CarIcon carIcon = path.get(i); - if (carIcon.getIconName().equals(currentUi)) { - nextUi = path.get(i + 1).getIconName(); - } + if (CollUtil.isEmpty(path)) { + throw new GlobalException(StrUtil.format("未找到从 [{}] 到 [{}] 的路径", currentUi, targetUi)); } -// getCoordinates() - return ""; + + // 下一步就是 path.get(0) + CarIcon nextStepIcon = path.get(0); + + // 分别上传当前截图和图标图片获得可访问 URL + String imageUrl; + String iconImageUrl; + String iconName = nextStepIcon.getIconName(); + try { + // 上传截图 +// byte[] imageBytes = FileUtil.readBytes(image); +// imageUrl = LargeModelFileUploadUtil.uploadFile(imageBytes); +// +// // 拼接图标路径,例如 icons/honda/sedan/空调控制.png +// String iconPath = StrUtil.format("icon/{}/{}/{}.png", manufacturer, vehType, iconName); +// +// // 从 resources 加载图标文件 +// InputStream iconStream = this.getClass().getClassLoader().getResourceAsStream(iconPath); +// if (iconStream == null) { +// throw new GlobalException("未找到图标资源文件:" + iconPath); +// } +// +// // 上传图标 +// byte[] iconBytes = IoUtil.readBytes(iconStream); +// iconImageUrl = LargeModelFileUploadUtil.uploadFile(iconBytes); + imageUrl = "https://aiagentplatform.cmft.com/api/proxy/down?Action=Download&Version=2022-01-01&Path=upload/full/5d/a3/07244360c69636d5c146e5470d8d5ddf12ceed2643ffd892b7b7a5c4aaeb&IsAnonymous=true"; + iconImageUrl = + iconName.equals("驾驶偏好") ? + "https://aiagentplatform.cmft.com/api/proxy/down?Action=Download&Version=2022-01-01&Path=upload/full/a4/1b/6a7319709844c0f483a1d7adcfdbbff478ff5e34bed9ecff5d8fd407f3ac&IsAnonymous=true" + : "https://aiagentplatform.cmft.com/api/proxy/down?Action=Download&Version=2022-01-01&Path=upload%2Ffull%2Ff1%2Fb9%2F8fb5f96f0299ccef60511eb8f7cfdcec890e563bc8e00854e63484086953&IsAnonymous=true"; + } catch (Exception e) { + throw new GlobalException("上传图标或截图失败:" + e.getMessage()); + } + + // 获取下一步点击坐标 + String coordinates; + try { + coordinates = getCoordinates(iconImageUrl, nextStepIcon.getIconDesc(), imageUrl); + } catch (Exception e) { + throw new GlobalException("获取点击坐标失败:" + e.getMessage()); + } + + // 7) 返回 + result.put("isFinish", false); + result.put("coordinates", coordinates); + + return result; } private String queryResultByRunId(String processId) { - return ""; + Map headers = new HashMap<>(); + headers.put("Apikey", "d1ebtc5u6s5pkko77dkg"); + + Map body = new HashMap<>(); + body.put("AppKey", "d1ebtc5u6s5pkko77dkg"); + body.put("AppID", "d1ebtabnjkflk4gmhikg"); + body.put("RunID", processId); + body.put("UserID", "18888888888"); + + + String responseBody; + JSONObject endNode; + int failCount = 0; + int maxFail = 40; + + while (true) { + responseBody = CallAPIUtil.doPostJson(apiProperties.getQueryResultUrl(), headers, body); + JSONObject jsonObject = JSON.parseObject(responseBody); + + String status = jsonObject.getString("status"); + if ("success".equals(status)) { + JSONObject nodes = jsonObject.getJSONObject("nodes"); + if (nodes == null) { + throw new GlobalException("响应中 nodes 为空:" + responseBody); + } + + endNode = findEndNode(nodes); + if (endNode != null) { + break; + } else { + throw new GlobalException("未找到 nodeType=end 的节点:" + nodes); + } + } else if ("failed".equals(status)) { + // 如果失败 + throw new GlobalException(responseBody); + } else { + // 处理其他状态码 + failCount++; + if (failCount > maxFail) { + throw new GlobalException("达到最大重试次数,API状态仍未成功:" + status); + } + } + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new GlobalException("轮询被中断"); + } + } + + // 解析 output 内容并清洗 + JSONObject output = endNode.getJSONObject("output"); + String res = output.getString("content"); + if (StrUtil.isEmpty(res)) { + throw new GlobalException("未找到坐标内容"); + } + return res; + } + + /** + * 从 nodes 中提取 nodeType=end 的节点 + */ + private JSONObject findEndNode(JSONObject nodes) { + for (Map.Entry entry : nodes.entrySet()) { + JSONObject node = (JSONObject) entry.getValue(); + if ("end".equalsIgnoreCase(node.getString("nodeType"))) { + return node; + } + } + return null; } } diff --git a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/model/CarIcon.java b/cmvr-iot-system/src/main/java/com/cmvr/system/domain/vo/CarIcon.java similarity index 97% rename from cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/model/CarIcon.java rename to cmvr-iot-system/src/main/java/com/cmvr/system/domain/vo/CarIcon.java index d224e83..5d0690f 100644 --- a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/model/CarIcon.java +++ b/cmvr-iot-system/src/main/java/com/cmvr/system/domain/vo/CarIcon.java @@ -1,4 +1,4 @@ -package com.cmvr.llm.model; +package com.cmvr.system.domain.vo; import lombok.Data; diff --git a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/model/CarUi.java b/cmvr-iot-system/src/main/java/com/cmvr/system/domain/vo/CarUi.java similarity index 96% rename from cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/model/CarUi.java rename to cmvr-iot-system/src/main/java/com/cmvr/system/domain/vo/CarUi.java index 74206cf..e1564ea 100644 --- a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/model/CarUi.java +++ b/cmvr-iot-system/src/main/java/com/cmvr/system/domain/vo/CarUi.java @@ -1,4 +1,4 @@ -package com.cmvr.llm.model; +package com.cmvr.system.domain.vo; import lombok.Data; diff --git a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/CarPathFinderService.java b/cmvr-iot-system/src/main/java/com/cmvr/system/service/CarPathFinderService.java similarity index 91% rename from cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/CarPathFinderService.java rename to cmvr-iot-system/src/main/java/com/cmvr/system/service/CarPathFinderService.java index 935d937..8ff689f 100644 --- a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/CarPathFinderService.java +++ b/cmvr-iot-system/src/main/java/com/cmvr/system/service/CarPathFinderService.java @@ -1,7 +1,7 @@ -package com.cmvr.llm.service; +package com.cmvr.system.service; import com.alibaba.fastjson2.JSONArray; -import com.cmvr.llm.model.CarIcon; +import com.cmvr.system.domain.vo.CarIcon; import java.util.List; diff --git a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/impl/CarPathFinderServiceImpl.java b/cmvr-iot-system/src/main/java/com/cmvr/system/service/impl/CarPathFinderServiceImpl.java similarity index 55% rename from cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/impl/CarPathFinderServiceImpl.java rename to cmvr-iot-system/src/main/java/com/cmvr/system/service/impl/CarPathFinderServiceImpl.java index 1e16d4e..0ed1272 100644 --- a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/service/impl/CarPathFinderServiceImpl.java +++ b/cmvr-iot-system/src/main/java/com/cmvr/system/service/impl/CarPathFinderServiceImpl.java @@ -1,14 +1,16 @@ -package com.cmvr.llm.service.impl; +package com.cmvr.system.service.impl; +import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; -import com.alibaba.fastjson2.JSONObject; -import com.cmvr.common.core.redis.RedisCache; -import com.cmvr.llm.model.CarIcon; -import com.cmvr.llm.model.CarUi; -import com.cmvr.llm.service.CarPathFinderService; -import com.cmvr.llm.util.CarPathFinderUtil; +import com.cmvr.common.exception.GlobalException; +import com.cmvr.system.domain.SysVehOperConfig; +import com.cmvr.system.domain.vo.CarIcon; +import com.cmvr.system.domain.vo.CarUi; +import com.cmvr.system.service.CarPathFinderService; +import com.cmvr.system.service.ISysVehOperConfigService; +import com.cmvr.system.util.CarPathFinderUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -23,20 +25,22 @@ import java.util.Map; @RequiredArgsConstructor public class CarPathFinderServiceImpl implements CarPathFinderService { - private final RedisCache redisCache; + private final ISysVehOperConfigService vehOperConfigService; /** - * 从 Redis 获取 JSON 配置,查找路径 + * 获取 JSON 配置,查找路径 */ @Override public List findPath(String manufacturer, String vehType, String startUi, String targetFeature) { - String redisKey = StrUtil.format("{}:{}:{}", "veh_oper_config", manufacturer, vehType); - String configStr = redisCache.getCacheObject(redisKey); + SysVehOperConfig sysVehOperConfig = vehOperConfigService.selectSysVehOperConfig(manufacturer, vehType); + if (ObjUtil.isEmpty(sysVehOperConfig)) { + throw new GlobalException("未找到对应的车机配置"); + } + String configStr = sysVehOperConfig.getJsonData(); if (StrUtil.isEmpty(configStr)) { return null; } - JSONObject configObj = JSON.parseObject(configStr); - JSONArray jsonData = configObj.getJSONArray("jsonData"); + JSONArray jsonData = JSON.parseArray(configStr); return findPath(jsonData, startUi, targetFeature); } diff --git a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/util/CarPathFinderUtil.java b/cmvr-iot-system/src/main/java/com/cmvr/system/util/CarPathFinderUtil.java similarity index 96% rename from cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/util/CarPathFinderUtil.java rename to cmvr-iot-system/src/main/java/com/cmvr/system/util/CarPathFinderUtil.java index f50041d..f00d439 100644 --- a/cmvr-iot-api/cmvr-iot-llm/src/main/java/com/cmvr/llm/util/CarPathFinderUtil.java +++ b/cmvr-iot-system/src/main/java/com/cmvr/system/util/CarPathFinderUtil.java @@ -1,9 +1,9 @@ -package com.cmvr.llm.util; +package com.cmvr.system.util; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; -import com.cmvr.llm.model.CarIcon; -import com.cmvr.llm.model.CarUi; +import com.cmvr.system.domain.vo.CarIcon; +import com.cmvr.system.domain.vo.CarUi; import java.util.ArrayList; import java.util.HashMap; diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java b/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java index ec15b5f..3edec86 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java @@ -19,9 +19,9 @@ public enum ActionEnum { SUB_START("NONE", "SUB_START", "循环开始(子流程开始)"), END("NONE", "END", "结束"), START_LOOP("NONE", "START_LOOP", "开始循环"), - STOP_LOOP("NONE", "START_LOOP", "结束循环"), + STOP_LOOP("NONE", "STOP_LOOP", "结束循环"), BRANCH("NONE", "BRANCH", "分支"), - SUB_END("NONE", "SUB_STOP", "子流程结束"), + SUB_END("NONE", "SUB_END", "子流程结束"), SLEEP("NONE", "SLEEP", "延迟节点"), // 系统行为 diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/enums/NodeTypeEnum.java b/cmvr-iot-test/src/main/java/com/cmvr/test/enums/NodeTypeEnum.java index d6a71ff..5d550b8 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/enums/NodeTypeEnum.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/enums/NodeTypeEnum.java @@ -15,9 +15,10 @@ public enum NodeTypeEnum { FUNCTION("function"), BRANCH("branch"), LOOP("loop"), + STOP_LOOP("stopLoop"), END("end"), SLEEP("sleep"), -// SUB_END("sub_end"), + SUB_END("subEnd"), ; private final String code; diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowGraph.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowGraph.java index d2276c6..ce4dfa3 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowGraph.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowGraph.java @@ -45,6 +45,8 @@ public class FlowGraph { */ private List startInputParamsDefs = new ArrayList<>(); + // 是否跳出循环 + private volatile boolean stopLoop = false; /** * 是否为子图 @@ -92,6 +94,22 @@ public class FlowGraph { } } + /** + * 查找子图起始节点(SUB_START 类型) + */ + public FlowNodeWrapper findSubStartNodeId() { + lock.readLock().lock(); + try { + return nodeMap.values().stream() + .filter(n -> n.getNodeType() == NodeTypeEnum.SUB_START) +// .map(FlowNodeWrapper::getNodeId) + .findFirst() + .orElseThrow(() -> new RuntimeException("未找到开始节点")); + } finally { + lock.readLock().unlock(); + } + } + /** * 获取子图中起始节点(入度为0) */ @@ -268,4 +286,11 @@ public class FlowGraph { lock.readLock().unlock(); } } + + /** + * 是否跳出循环(用于 STOP_LOOP 控制节点) + */ + public boolean isBreakLoop() { + return stopLoop; + } } diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowModelBuilder.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowModelBuilder.java index 688cd65..669b84e 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowModelBuilder.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowModelBuilder.java @@ -286,10 +286,14 @@ public class FlowModelBuilder { return NodeTypeEnum.SUB_START; case "end": return NodeTypeEnum.END; + case "subend": + return NodeTypeEnum.SUB_END; case "branch": return NodeTypeEnum.BRANCH; case "loop": return NodeTypeEnum.LOOP; + case "stoploop": + return NodeTypeEnum.STOP_LOOP; case "sleep": return NodeTypeEnum.SLEEP; default: diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowLoopNodeHandler.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowLoopNodeHandler.java index 21c5ccd..5bb9fcf 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowLoopNodeHandler.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowLoopNodeHandler.java @@ -22,6 +22,7 @@ public class FlowLoopNodeHandler implements FlowNodeTypeHandler { @Override public TaskNodeExecuteResult handle(TaskNodeExecuteMessage message) { + String instId = message.getInstId(); FlowGraph graph = message.getGraph(); // 当前从第几次循环开始 int loopNum = message.getLoopNum() < 0 ? 1 : message.getLoopNum(); @@ -40,8 +41,13 @@ public class FlowLoopNodeHandler implements FlowNodeTypeHandler { // 循环执行子图 for (int i = loopNum; i <= loopCount; i++) { + // 如果子图设置了跳出标志,则结束循环 + if (subGraph.isBreakLoop()) { + log.info("检测到子图设置跳出标志,提前结束循环:instId={}, nodeId={}", instId, nodeId); + break; + } CountDownLatch latch = new CountDownLatch(1); - String instId = message.getInstId(); + taskThreadRegistry.registerLatch(instId, nodeId, latch); FlowItemExecutor flowItemExecutor = SpringUtils.getBean(FlowItemExecutor.class); flowItemExecutor.executeSubGraph(subGraph, message, latch::countDown, i); diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowStopLoopNodeHandler.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowStopLoopNodeHandler.java new file mode 100644 index 0000000..a0fedfc --- /dev/null +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowStopLoopNodeHandler.java @@ -0,0 +1,21 @@ +package com.cmvr.test.flow.runtime.dispatcher; + +import com.cmvr.test.flow.runtime.message.TaskNodeExecuteMessage; +import com.cmvr.test.flow.runtime.message.TaskNodeExecuteResult; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component("STOP_LOOP") +@RequiredArgsConstructor +public class FlowStopLoopNodeHandler implements FlowNodeTypeHandler { + + @Override + public TaskNodeExecuteResult handle(TaskNodeExecuteMessage message) { + message.getGraph().setStopLoop(true); + log.info("STOP_LOOP 节点执行,设置跳出标志:instId={}, nodeId={}", message.getInstId(), message.getNodeId()); + + return TaskNodeExecuteResult.success(); + } +} diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowSubEndNodeHandler.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowSubEndNodeHandler.java new file mode 100644 index 0000000..c0ccd2b --- /dev/null +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowSubEndNodeHandler.java @@ -0,0 +1,18 @@ +package com.cmvr.test.flow.runtime.dispatcher; + +import com.cmvr.test.flow.runtime.message.TaskNodeExecuteMessage; +import com.cmvr.test.flow.runtime.message.TaskNodeExecuteResult; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component("SUB_END") +@RequiredArgsConstructor +public class FlowSubEndNodeHandler implements FlowNodeTypeHandler { + + @Override + public TaskNodeExecuteResult handle(TaskNodeExecuteMessage message) { + return TaskNodeExecuteResult.success(message.getInputParams()); + } +} diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/engine/FlowItemExecutor.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/engine/FlowItemExecutor.java index 9c4427d..2fd4838 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/engine/FlowItemExecutor.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/engine/FlowItemExecutor.java @@ -76,7 +76,7 @@ public class FlowItemExecutor { List startInputDefs = subGraph.getStartInputParamsDefs(); // 子图的 start 节点 - FlowNodeWrapper subStartNode = subGraph.getInDegreeZeroNode(); + FlowNodeWrapper subStartNode = subGraph.findSubStartNodeId(); String subStartNodeId = subStartNode.getNodeId(); NodeExecutor executor = node -> executeNode( @@ -131,7 +131,7 @@ public class FlowItemExecutor { } // END 节点 or 子图结束 - if (node.getNodeType() == NodeTypeEnum.END || graph.isSubGraphEndNode(nodeId)) { + if (node.getNodeType() == NodeTypeEnum.END || node.getNodeType() == NodeTypeEnum.SUB_END) { try { onFinished.run(); } catch (Exception e) { diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/engine/FlowTaskScheduler.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/engine/FlowTaskScheduler.java index 60daadf..32fe23c 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/engine/FlowTaskScheduler.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/engine/FlowTaskScheduler.java @@ -58,7 +58,7 @@ public class FlowTaskScheduler { int loopIteration) { String instId = context.getInstId(); - FlowNodeWrapper startNode = graph.getInDegreeZeroNode(); + FlowNodeWrapper startNode = graph.findSubStartNodeId(); List nextNodes = graph.getNextNodes(startNode.getNodeId()); if (nextNodes.isEmpty()) { diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/edge/EdgeCameraOperateService.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/edge/EdgeCameraOperateService.java index 2c67670..4e7539e 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/edge/EdgeCameraOperateService.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/edge/EdgeCameraOperateService.java @@ -55,8 +55,15 @@ public class EdgeCameraOperateService implements EdgeOperateService { } case CAMERA_GETRGBIMAGE: { + String imageUrl; // String imageUrl = StrUtil.format("id为 [{}] 的相机拍照了", deviceId); - String imageUrl = "http://10.148.20.35:9000/cmvr-iot/FILE/20250820/1755670270208.jpg"; + if (message.getLoopNum() <= 1) { + // 车辆控制调节 + imageUrl = "http://192.168.1.100:9000/cmvr-iot/FILE/20250821/1755761816340.jpg"; + } else { + // 驾驶偏好 + imageUrl = "http://192.168.1.100:9000/cmvr-iot/FILE/20250822/1755849654731.jpg"; + } // String imageUrl = edgeCameraService.getRGBImage(terminalId, deviceId); JSONArray imageUrls = new JSONArray(); diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMTouchOperateService.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMTouchOperateService.java index ffcb4c4..e1c6019 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMTouchOperateService.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMTouchOperateService.java @@ -6,8 +6,6 @@ import com.alibaba.fastjson2.JSONObject; import com.cmvr.common.config.properties.MinioProperties; import com.cmvr.common.core.minio.MinioService; import com.cmvr.common.exception.GlobalException; -import com.cmvr.llm.model.CarIcon; -import com.cmvr.llm.service.CarPathFinderService; import com.cmvr.llm.service.LLMTouchService; import com.cmvr.test.enums.ActionEnum; import com.cmvr.test.flow.builder.FlowNodeWrapper; @@ -19,7 +17,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.io.File; -import java.util.List; @Slf4j @Service @@ -29,7 +26,6 @@ public class LLMTouchOperateService implements LLMOperateService { private final TaskInstHolder taskInstHolder; private final MinioService minioService; private final MinioProperties minioProps; - private final CarPathFinderService carPathFinderService; private final LLMTouchService llmTouchService; @Override @@ -46,9 +42,9 @@ public class LLMTouchOperateService implements LLMOperateService { JSONObject output = new JSONObject(); switch (action) { case TOUCH_COORDINATES: { - // 必须获取前面的图片 和当前节点的指令 - String words = inputParams.getString("words"); String targetFeature = inputParams.getString("targetFeature"); + String manufacturer = inputParams.getString("manufacturer"); + String vehType = inputParams.getString("vehType"); // 图片节点的id FlowNodeWrapper imageNode = message.getGraph() .getNodeMap() @@ -65,8 +61,7 @@ public class LLMTouchOperateService implements LLMOperateService { String objectName = StrUtil.removePrefix(url, StrUtil.subBefore(url, prefix, true) + prefix); try { File image = minioService.getFile(bucketName, objectName); -// llmTouchService.touchCoordinates(); - output.put("coordinates", ""); + output = llmTouchService.touchCoordinates(image, targetFeature, manufacturer, vehType); } catch (Exception e) { throw new RuntimeException(e); } @@ -78,12 +73,4 @@ public class LLMTouchOperateService implements LLMOperateService { } return TaskNodeExecuteResult.success(output); } -} - -/** - * String uiName = llmTouchService.bgeVl(image); - * List path = carPathFinderService.findPath("厂商", "车型", uiName, targetFeature); - * - * String coordinates = llmTouchService.getCoordinates("", "", ""); - * - */ \ No newline at end of file +} \ No newline at end of file