Prechádzať zdrojové kódy

Merge branch 'master' of http://www.sysuimars.cn:3000/feiniao/feiniao-pc-vue

shuhao 1 mesiac pred
rodič
commit
139d5c8706

+ 12 - 0
src/api/modules/deep_seek.js

@@ -0,0 +1,12 @@
+const config = require("../config")
+
+module.exports = {
+    ask: {
+        url: config.base_dev_url + "bbs_my/ask",
+        type: "post",
+    },
+    res: {
+        url: config.base_dev_url + "bbs_my/res",
+        type: "get",
+    }
+}

BIN
src/assets/images/warningHome/chat/track.png


BIN
src/assets/images/warningHome/chat/trackpng.png


+ 33 - 53
src/views/warningHome/components/chat_components/chat.json

@@ -1,55 +1,5 @@
 [
     {
-        "name": "气象风险",
-        "header": "嗯,要回答这个问题,用户可能想问荔枝受到气象的影响,首先需要调取一下用户当前位置的过去30天与未来7天预报的气象数据,需要注意的是,山坡的阴面和阳面温差可能比较大,然后通过海拔、坡度和坡向等地形因子进行降尺度分析,得出当前的温度,同样我们可以得出土壤水分和太阳辐射强度的信息,这样我们就可以调取荔枝生长风险模型,输入得到的气象精细化因子,然后计算这里荔枝的风险,还需要注意,调取应该是这个地区的荔枝物候期,是处于花蕾抽出期,然后开始计算这个物候期的风险,最后得出来每个风险的概率,输出给用户当前最关键的风险,并且说明一下这个气象风险是什么含义,对荔枝有什么影响。",
-        "content": "依据空天地一体化气象预警系统计算,您的果园物候期应处于 花蕾抽出期,果园坡度约为 14.14度 ,属于 阳坡 ,当日最高温度为 23° ,最低气温为 13° ,近三日有 2mm 降雨,尤其需要注意 叶芽冲梢,当前属于 叶芽冲梢 二级风险,风险概率为 67%,暖湿天气会促使荔枝抽发新梢或形成花带叶,影响花芽的 正常分化 ,进而导致 分化停滞或受阻 ,导致坐果率下降。"
-    },
-    {
-        "name": "荔枝农事",
-        "header": "用户问最近需要做什么荔枝农事,当前时间为2月13日,立春刚过,属于早春阶段,根据各监测点的农情结果反馈,当前各产区的荔枝普遍处于花穗期(83.2%),部分早熟品种处于开花期。因此,当前荔枝的管理重点在于培育健壮花穗,提高花穗质量,为后续开花坐果打好基础。",
-        "content": "在过去两周内,经历和多次寒潮和升温的交替过程,天气变化情况较大,且该时间段处于花穗抽出关键阶段,因此抽出的花穗中,有较高的花带叶风险。天气的升温幅度较大,最大的温度浮动在5天内超过10度,使得叶芽抽出影响花穗的质量,导致目前大部分处于花穗期的荔枝花带叶情况较为严重,需要尽快进行杀除小叶的农事,提高花穗质量。<br/>杀除小叶需精准执行农事,对于花带叶情况较轻或未出现花带叶的果树,不可轻易喷药,以免影响花穗发育。对于花带叶比例超过10%的树体,可采用乙氧氟草醚3000倍喷施处理,喷施不可过多,只需喷施到叶芽轻微滴水即可。若采用无人机喷施,则可采用乙氧氟草醚300倍喷撒。对于执行了农事的区域,需在7天后及时复核效果,若花带叶情况未明显改善,需进一步执行农事,或人工摘除小叶,密集观察。"
-    },
-    {
-        "name": "推荐专家",
-        "header": "用户想找值得信赖的荔枝专家。我需要看看搜索结果和飞鸟智慧大脑信息库里的专家名字和相关机构。首先,在飞鸟智慧大脑的种植专家联盟里进行寻找,用户寻找的是荔枝种植专家,检索荔枝品类的种植专家,其次,用户提到了有经验的,有经验的可能代表着有多年种植经验的专家,因此在飞鸟智慧大脑中找到有较长时间种植经验的韦帮稳、冼继东等专家推荐给用户。网页3提到了陈厚彬,是国家荔枝龙眼产业技术体系首席专家,华南农业大学的教授。还有胡桂兵,也是华南农业大学的园艺学院院长,国家荔枝良种重大科研联合攻关的首席专家。这两个人应该很重要,多次被不同的网页提到。 所以,整理下来,主要专家有韦帮稳、冼继东、陈厚彬、胡桂兵等专家。",
-        "content": "根据搜索结果,以下几位在荔枝研究领域具有丰富经验和权威性的专家值得信赖,他们在荔枝品种选育、栽培技术、产业管理等方面有突出贡献。"
-    },
-    {
-        "name": "什么问题",
-        "header": "近期指的是离当前时间较近的一段时期,进一步为用户查询飞鸟管家动态中的资讯,发现荔枝果农们关心如下问题:最近,荔枝果农们关注的主要问题有几个。首先,天气变化对荔枝的影响越来越明显,尤其是暖冬、倒春寒和干旱等极端天气,这些因素会影响开花和结果,导致产量波动,比如2024年全国荔枝产量大幅下降了近46%。此外,荔枝的“大小年”现象也让果农头疼,每年丰产后,往往下一年减产,收入不稳定,给他们带来压力。为了解决这个问题,果农们需要加强管理,尤其是在“大年”时进行疏花疏果,避免过度消耗,确保产量更稳定。还有就是由于气候影响,市场供应减少,荔枝价格上涨,果农得更加关注市场动态,合理安排采收和销售。与此同时,荔枝的保鲜难度很大,很多果农都在关注新的保鲜技术,比如超低温“冻眠”技术,这可以大大延长荔枝的保鲜期,减少损耗。最后,花期管理也是一个重要问题,果农们在关心如何及时催肥、如何防治病虫害,以及一些细节上的操作,比如如何分辨花带叶,如何保花等等。这些问题是目前果农们讨论的重点。",
-        "content": "近期,荔枝果农们主要关注以下问题:<br/>1.气候变化对产量的影响 <br/>近年来,异常天气频发,如暖冬、倒春寒、干旱和持续降雨等,严重影响荔枝的开花和结果,导致产量大幅下降。<br/>2.“大小年”现象 <br/>荔枝树存在明显的“大小年”周期,即一年丰产,次年可能减产。这种现象给果农的收益带来不稳定性,影响其种植积极性。<br/>3.市场供需与价格波动<br/> 由于气候导致的减产,市场供应减少,荔枝价格上涨。例如,2024年早熟品种“妃子笑”价格较上年同期上涨了3.64元/公斤。<br/>4.保鲜与储运技术<br/> 荔枝易腐坏,保鲜难度大。为延长销售期,减少损耗,新的保鲜技术如超低温“冻眠”锁鲜技术正在推广,使荔枝保鲜期延长至一年。<br/>5.花期管理技术 <br/>如何在花期及时催化追肥,如何在花期防治病虫害,压低病虫基数,如何分辨花带叶,如何杀小叶保花,红黄叶是否要杀,以上是荔枝果农近期关注的花期管理基数问题。"
-    },
-    {
-        "name": "分析",
-        "header": "嗯,用户让我分析一张荔枝花穗期的照片,我检测到约20%的花带叶,这在荔枝栽培中不算少见,但可能与管理不当有关。过多氮肥或不合适的温度可能导致冲梢,影响开花结果,进而影响产量。因此,这20%的花带叶可能反映了果园的管理问题,需要进一步分析。管理措施上,花芽分化需要低温,如果冬季温度不足,可能导致花芽分化不良。水分和肥料管理也很关键,过多水分和氮肥会促进枝叶生长,而适当的磷钾肥有助于花芽分化。此外,花穗期容易遭受病虫害侵袭,虽然照片中未提到,但建议检查病虫害情况。最后,我建议用户进行更多观察,确认具体情况,因为仅凭一张照片描述可能有局限性。",
-        "content": "1.花穗发育阶段判断 <br/>花穗中20%新叶,存在冲梢风险,温度回升过快或氮肥过量可能影响花穗发育,增加落花落果风险。<br/>2.果园问题分析 <br/>环境因素:温度波动和光照不足可能影响花芽分化和花穗发育。 管理因素:过多氮肥、水分过多、磷钾不足及修剪不及时可能导致冲梢。<br/>3.产量影响 <br/>轻度冲梢(20%)若及时干预影响小,否则可能导致坐果率下降。<br/>4.管理建议 <br/>营养管理:人工摘叶,喷施乙烯利控梢。 水肥管理:控氮增钾,保持适度干旱。 环境调控:疏剪枝条,监测天气避免冲梢。<br/>5.后续注意事项<br/> 病虫害防控:使用氯氰菊酯或生物农药防治害虫。 保花保果:补充钙、镁肥,喷施赤霉素提高坐果率。"
-    },
-    {
-        "name": "小管家",
-        "index":"0",
-        "header": "您好,飞鸟智慧种植大脑是您的私人管家,请告诉我您的作物类别,并授权我读取您的位置,飞鸟感知脑自动读取大数据,推理脑将评估您的作物种植风险,决策脑将自动生成智能处方。",
-        "content": ""
-    },
-    {
-        "name": "品种",
-        "index":"1",
-        "header": "请选择您种植的荔枝品种",
-        "content": ""
-    },
-    {
-        "name": "物候期",
-        "index":"2",
-        "header": "请选择您种植的品种物候期",
-        "content": ""
-    },
-    {
-        "name": "农场",
-        "link":true,
-        "index":"3",
-        "header": "飞鸟感知脑提示,请问您是否需要飞鸟私人管家持续守护您的农场,请添加您的农场",
-        "content": ""
-    },
-    {
         "name": "感知风险",
         "header": "1、飞息鸟感知脑正在感知当前地区环境信息<br/>(1)正在读取基础地形信息,用户当下",
         "content": "您的果园气象风险预警报告如下<br/>(空天地气象预警系统测算)<br>一、物候与地理信息<br/>(1)当前物候期:花蕾"
@@ -70,8 +20,38 @@
         "content": "根据您的要求生态荔枝种植,考虑了您所在区域和品种,为您寻找了最优秀的荔枝种植管家,可以邀请他来托管指导您的农场:"
     },
     {
-        "name": "种植面积",
-        "header": "以下是2024年广东省各市水稻种植面积",
-        "content": ""
+        "name": "2024年广东省各市的稻谷播种面积?",
+        "header": "正在调取广东历史统计农业数据,目前2024年的农业统计数据尚未完全入库(通常会在次年6月后发布),调取了《2024年广东统计年鉴》中的数据,这些数据实际反映的是2023年的情况",
+        "content": "根据现有公开数据,2024年广东省各市稻谷播种面积的具体分市数据尚未发布。当前可查的2024年农业统计信息集中于全省层面,主要包含以下内容:全省稻谷播种面积:2024年广东省稻谷播种面积为2752.6万亩,同比增长0.4%,占全年粮食播种面积的82.1%。2024年广东省各市水稻播种数据需等待《2025年广东统计年鉴》发布(通常次年6月后),或关注广东省统计局后续公开的细分报告。"
+    },
+    {
+        "name": "当前高州的作物分布",
+        "header": "1、飞鸟感知脑正在感知<br/>(1)要获取作物分布,首先需要调取当下遥感与无人机监测数据,以及历史气象数据,以及历史遥感无人机观测样本。<br/>(2)正在调取sentinel时序多光谱遥感数据。<br/>(3)正在调取近期地面低空飞巡观测监测数据。<br/>(4)正在调用“时空-作物“信息嵌入大气校正算法,减少遥感影像大气差异。<br/>(5)正在调用空天地一体作物物种生育期联合识别算法,结合遥感数据、历史气象数据以及实时观测的表型定量指标,联合预测地区物种物候期。<br/>2、飞鸟推理脑正在推理<br/>(1)正在分析感知数据结果,要分析作物分布,可以进一步推测分布物候期变化,需调取多源数据融合的生育期预测框架。<br/>(2)正在调取作物生育期的时序预测模型,需要通过历史数据分析种植因子。<br/>(3)正在读取近20年的气象数据和遥感数据,分析历史气象农情信息推断物候变化。<br/>(4)正在调取非线性概率回归方法,推测当前区域的作物生育期变化状态。<br/>(5)输入精细化气象参量,推理脑正在分析结果,将上述信息进行总结整理推送。",
+        "content": "一、作物分布特征<br/>高州市的耕地作物以水稻、番薯、蔬菜为主,呈现规模化与机械化特点:其中水稻是核心作物,2025年高州市目标实现水稻耕种收综合机械化水平85%以上,且通过“公司+农户”模式扩大种植面积,例如石鼓镇已形成机械化育秧、插秧和收割的全链条生产。番薯和蔬菜也在种植结构中占重要地位,历史数据显示番薯产量持续稳定,蔬菜种植面积覆盖多镇。<br/>园地作物以荔枝、龙眼等热带水果为主,兼具经济与地域特色:荔枝种植标准化程度高,部分果园已实现机械剪枝与喷药作业,且通过现代农业产业园建设推动品种升级。龙眼作为传统经济作物,与荔枝形成互补,分散分布于丘陵地带。<br/>"
+    },
+    {
+        "name": "当前区域荔枝有什么生长风险?",
+        "header": "1、飞鸟感知脑正在感知<br/>(1)正在读取当前区域基础地形信息,需要当前区域的温光湿环境信息。<br/>(2)正在调取NASA的SMAP卫星的L波段微波辐射计数据,读取土壤水分信息。<br/>(3)正在调取Landsat卫星的OLI传感器和TIRS传感器数据,读取地表温度信息<br/>(4)正在调取Terra和Aqua卫星上的MODIS中分辨率成像光谱仪数据,基于辐射传输模型计算地表太阳辐射信息。<br/>(5)正在调取过去30天与未来14天预报的气象数据。<br/>(6)基于时空气象降尺度技术,开始气象因子降尺度感知计算<br/>2、飞鸟推理脑正在推理<br/>(1)正在分析当前区域的作物信息,和地块环境基础信息。<br/>(2)需要通过历史数据分析种植风险,正在读取近20年的气象数据和遥感数据<br/>(3)正在读取低空飞巡物候信息感知数据,当前区域大部分农户处于花穗伸长期。<br/>(4)正在调取专家20年作物风险胁迫定量反演模型,当前时期易发生爆花风险。<br/>(5)输入精细化气象参量,推理脑正在分析结果,结果表明未来一周内爆花风险概率将上升达52%,需要提醒农户及时控花。<br/>(6)最后将上述信息进行总结整理,推送给农户。",
+        "content": "当前区域位于广东省湛江市廉江市<br/>一、荔枝当前物候期<br/>廉江属热带季风气候,冬季温暖,荔枝花期通常为2-4月,当前为2025年2月中旬,廉江荔枝应处于花芽分化末期至开花初期。<br/>二、气象数据分析<br/>1. 过去30天天气<br/>气温:廉江市冬季气温波动较大,平均气温15-23℃,最低温降至8-10℃,最高温可达25-28℃(晴暖天气)。昼夜温差10-15℃,可能对荔枝花芽分化造成压力。<br/>降水:总降水量偏少,以零星小雨为主(累计约20-40mm),部分区域出现阶段性干旱。1月底至2月初受冷空气影响,伴随短暂阴雨。<br/>其他:北风或东北风为主,风力3-4级,湿度50-70%。<br/>2.未来14天预测(2025年2月16日-3月2日)<br/>未来14天的气温将逐渐升高,降水量相对较少。<br/>三、风险分析<br/>过去30天气温波动较大,但整体温度较高,叠加未来14天温度整体升高,存在干旱风险,极易造成荔枝花芽分化过旺,引发爆花现象。"
+    },
+    {
+        "name": "当前区域哪些有荔枝地块有病虫害",
+        "header": "1、飞鸟推理脑正在推理<br/>(1)感知数据已获获取,正在分析当前区域荔枝作物信息,基础地形信息,需要当前区域的温光湿环境信息。<br/>(2)需要通过历史数据分析病虫风险,正在读取近20年的气象数据和遥感数据<br/>(3)正在读取低空飞巡病虫害信息感知数据。<br/>(4)还需要进一步分析作物的病虫风险以及发展趋势<br/>(5)正在逐地块并行读取附近3km低空飞巡物候信息感知数据,正在调取专家作物病虫风险扩散预报模型。<br/>(6)输入精细化气象参量,推理脑正在分析结果,结果表明未来一周内病虫风险概率将上升达71%,需要提醒农户及时防治。<br/>(7)最后将上述信息进行总结整理,推送给农户。",
+        "content": "根据近期对荔枝病虫害的监测和预报,预计未来一周内,荔枝部分地块的病虫害风险概率将上升至71%。主要病害包括霜疫霉病和炭疽病,主要虫害包括荔枝蒂蛀虫、荔枝蝽等。 为有效防控,建议加强田间巡查,及时发现并处理病虫害,合理使用农药,并结合物理和生物防治措施,确保荔枝的健康生长。"
+    },
+    {
+        "name": "现在哪些地方有农情需求",
+        "header": "1、飞鸟感知脑正在感知<br/>(1)历史服务数据调取,正在读取当前的农情服务记录,包括已接单和未接单的需求。<br/>(2)实时数据获取,正在调取当前区域的作物生长状态、气象数据、土壤条件等信息。<br/>(3)用户反馈分析,正在分析农户的反馈和需求,融合农户主动申报数据,卫星遥感数据,识别当前最迫切的农情问题。<br/>2、飞鸟推理脑正在推理<br/>(1)需求类型识别,基于历史数据和实时信息,识别出当前主要的农情需求类型,如病虫害防治、灌溉需求、施肥建议等。<br/>(2)风险预测,正在使用机器学习模型预测未来一周内可能出现的农情风险,如爆花风险、病虫害爆发等。<br/>(3)需求区域定位:根据风险预测结果,定位出未来可能需求较高的区域,调用时空图卷积网络,以地块为节点构建农业风险传播图谱,预测需求扩散路径。<br/>(4)服务能力评估:评估当前的服务能力,Voronoi图空间分割动态划分服务优先级区域,结合路网数据计算最优路径,确定哪些需求可以立即响应,哪些需要进一步资源调配。",
+        "content": "当前区域大部分地方无农情需求,少数地方有需求未接单或有需求已接单。但随着未来一段时间的气温逐步上升,生长风险和病虫害风险概率增加,有需求但未接单的地方会急剧上升,将近半数。"
+    },
+    {
+        "name": "哪些地方有植保机",
+        "header": "1、飞鸟感知脑正在感知<br/>(1)植保机资源搜索,正在搜索范围内的植保机资源。<br/>(2)农情需求整合,正在调取当前区域的农情需求数据,包括病虫害风险、作物生长阶段、农户申报问题等。<br/>(3)环境数据获取,正在读取区域内的地形特征、气象环境(如风速、温度、湿度)以及作物物候信息,为航线规划提供基础数据支持。<br/>2、飞鸟决策脑正在决策<br/>(1)需求匹配与优先级划分,基于农情需求和无人机作业能力,动态划分任务优先级。高优先级区域(如病虫害高发区)优先调度。<br/>(2)航线规划算法调用,采用智能化算法(如强化学习、遗传算法)进行最优航线规划,结合地形、气象和作物生长状态,确保航线高效且适应实际环境。<br/>(3)任务分配与路径优化,通过算法优化,减少无人机飞行的重复路径和空载时间,最大限度降低能耗与飞行成本。",
+        "content": "调度植保机数据,结合农情需求和无人机飞力,自动绘制最佳农服航线,飞鸟决策脑已搜索附近10KM范围内的植保机资源,共有15台无人机可供服务,并规划了最优植保路线:以雷州半岛中心田块为起点,分3条作业线路向外辐射,每条线路覆盖约1667亩,确保2-3天内高效完成5000亩田块的打药任务,最大限度减少损失。在总控平台,可以看到,哪些农户有风险,有没有与农资对接,农资有没有服务,服务质量怎么样的过程。"
+    },
+    {
+        "name": "花期统防统治报表,有没有与农资对接",
+        "header": "1、飞鸟感知脑正在感知<br/>(1)农资服务数据调取,正在读取系统信息化农资服务数据,包括覆盖范围、完成进度、系统打分、农户评价和成效。<br/>(2)实时作业监控,正在调取当前花期统防统治的实时作业数据,包括无人机打药覆盖率、作业效率等。<br/>(3)农户反馈整合,正在融合农户主动申报数据、卫星遥感数据和实地巡检数据,评估农资服务的实际效果。",
+        "content": "(多少家农资参与,完成进度,系统打分,农户的评价,成效)"
     }
 ]

+ 110 - 46
src/views/warningHome/components/chat_components/index.vue

@@ -6,22 +6,32 @@
                 <div v-for="(msg, index) in messages" :key="index" class="message" :class="msg.type">
                     <div v-if="msg.type === 'user'" class="bubble">{{ msg.text }}</div>
                     <div v-if="msg.type === 'system'" class="bubble answer">
-                        <div class="think" v-if="!msg.text.name">
+                        <div class="think">
                             思考中<el-icon><ArrowDown /></el-icon>
                         </div>
-                        <div class="header" v-html="msg.text.header"></div>
-                        <div class="divider"></div>
+                        <div class="header" v-html="msg.text.header" :class="{'main-text': !msg.text.content}"></div>
+                        <div class="divider" v-if="msg.text.content"></div>
                         <div class="content" v-html="msg.text.content"></div>
-                        <div class="table-wrap" v-if="msg.text.name === '种面积'">
+                        <div class="table-wrap" v-if="msg.text.name === '2024年广东省各市的稻谷播种面积' && msg.loadEnd">
                             <el-table :data="tableData" border style="width: 100%">
                                 <el-table-column prop="city" label="市" width="100" />
-                                <el-table-column prop="area" label="2024年稻种面积" width="320">
+                                <el-table-column prop="area" label="2024年稻谷播种面积">
                                     <template #default="scope">
                                         {{ scope.row.area  }}亩
                                     </template>
                                 </el-table-column>
                             </el-table>
                         </div>
+                        <div class="table-wrap" v-if="msg.text.name === '花期统防统治报表,有没有与农资对接' && msg.loadEnd">
+                            <el-table :data="tableData2" border style="width: 100%">
+                                <el-table-column prop="name" label="企业名称" />
+                                <el-table-column prop="area" label="覆盖范围" show-overflow-tooltip />
+                                <el-table-column prop="step" label="完成进度" show-overflow-tooltip />
+                                <el-table-column prop="rate" label="系统/信用评分" show-overflow-tooltip />
+                                <el-table-column prop="farmRate" label="农户评价" show-overflow-tooltip />
+                                <el-table-column prop="result" label="成效" show-overflow-tooltip />
+                            </el-table>
+                        </div>
                     </div>
                     <div v-if="msg.type === 'real'" class="bubble answer">
                         <div class="think" v-if="!msg.text.name">
@@ -30,16 +40,6 @@
                         <div class="header" v-html="deepSeekAsk.markdownToHtml(msg.text.header)"></div>
                         <div class="divider"></div>
                         <div class="content" v-html="deepSeekAsk.markdownToHtml(msg.text.content)"></div>
-                        <div class="table-wrap" v-if="msg.text.name === '种植面积'">
-                            <el-table :data="tableData" border style="width: 100%">
-                                <el-table-column prop="city" label="市" width="100" />
-                                <el-table-column prop="area" label="2024年水稻种植面积" width="320">
-                                    <template #default="scope">
-                                        {{ scope.row.area  }}亩
-                                    </template>
-                                </el-table-column>
-                            </el-table>
-                        </div>
                     </div>
 
                     <div v-if="msg.type === 'auto'" class="system auto">
@@ -50,15 +50,9 @@
                                 <div class="ask-list">
                                     <li
                                         class="ask-item cursor-pointer"
-                                        @click="askText('2024年广东省各市的稻种面积')"
+                                        @click="askText('2024年广东省各市的稻谷播种面积')"
                                     >
-                                    2024年广东省各市的水稻种植面积
-                                    </li>
-                                    <li
-                                        class="ask-item cursor-pointer"
-                                        @click="askText('2024年广东省各市的水稻种植面积排行')"
-                                    >
-                                    2024年广东省各市的水稻种植面积排行
+                                    2024年广东省各市的稻谷播种面积?
                                     </li>
                                 </div>
                             </div>
@@ -132,27 +126,84 @@ const messages = ref([]);
 const isProcessing = ref(false); // 控制是否在处理消息
 
 const tableData = ref([
-    { city: '广州市', area: 10000 },
-    { city: '佛山市', area: 900 },
-    { city: '惠州市', area: 856 },
-    { city: '茂名市', area: 789 },
+    { city: '广州', area: 360091 },
+    { city: '深圳', area: 14726 },
+    { city: '珠海', area: 66670 },
+    { city: '汕头', area: 690567 },
+    { city: '佛山', area: 104095 },
+    { city: '韶关', area: 1534904 },
+    { city: '河源', area: 1836469 },
+    { city: '梅州', area: 2428360 },
+    { city: '惠州', area: 1275493 },
+    { city: '汕尾', area: 1033786 },
+    { city: '东莞', area: 24106 },
+    { city: '中山', area: 37709 },
+    { city: '江门', area: 2523802 },
+    { city: '阳江', area: 1604316 },
+    { city: '湛江', area: 3357751 },
+    { city: '茂名', area: 3151002 },
+    { city: '肇庆', area: 2521029 },
+    { city: '清远', area: 1832838 },
+    { city: '潮州', area: 481617 },
+    { city: '揭阳', area: 1217258 },
+    { city: '云浮', area: 1317616 },
+])
+
+const tableData2 = ref([
+    {name: "天合股份", area: "广东省及周边省份,100家配送中心", step: "2024年上半年服务243.71万亩,带动增收1.11亿元;2025年目标完成率约24%", rate: "未明确评分", farmRate: "服务超6万户,节本增收显著", result: "绿色农资全覆盖,建立“耕、种、管、收”全程服务体系"},
+    {name: "大炎农业", area: "广东省及周边", step: "承担17.84万亩水稻、6.17万亩蔬菜物化补贴;带动654户农户销售226.1吨", rate: "绿色补贴覆盖率100%", farmRate: "合作社带动增收,农户组织化程度提高", result: "助农销售1.3亿元,建立稳定增收渠道"},
+    {name: "美荔公司", area: "广东省及周边", step: "完成30万亩次测土配方施肥目标", rate: "A级信用评定", farmRate: "守信经营,服务标准化受认可", result: "保障农资质量安全,推动化肥减量增效,覆盖本地10家A级企业"},
 ])
 
 const steps = [
-    { type: "auto", text: { header: "您好,飞鸟智慧种植大脑是您的私人管家" } },
+    { type: "auto", text: { header: "您好,飞鸟智慧种植大脑是您的私人管家" }, loadEnd: false },
+    {
+        type: "ask",
+        text: {
+            askHeader: "当前高州的作物分布",
+            askContent: ["当前高州的作物分布",],
+        },
+        loadEnd: false
+    },
     {
         type: "ask",
         text: {
-            askHeader: "猜您想问",
-            askContent: ["2024年广东省各市的水稻种植面积", "2024年广东省各市的水稻种植面积变化"],
+            askHeader: "当前区域荔枝有什么生长风险?",
+            askContent: ["当前区域荔枝有什么生长风险?"],
         },
+        loadEnd: false
     },
     {
         type: "ask",
         text: {
-            askHeader: "猜您想问",
-            askContent: ["荔枝出现花带叶怎么办?", "荔枝抽梢具体做什么农事呢?"],
+            askHeader: "当前区域哪些有荔枝地块有病虫害",
+            askContent: ["当前区域哪些有荔枝地块有病虫害"],
         },
+        loadEnd: false
+    },
+    {
+        type: "ask",
+        text: {
+            askHeader: "现在哪些地方有农情需求",
+            askContent: ["现在哪些地方有农情需求"],
+        },
+        loadEnd: false
+    },
+    {
+        type: "ask",
+        text: {
+            askHeader: "哪些地方有植保机",
+            askContent: ["哪些地方有植保机"],
+        },
+        loadEnd: false
+    },
+    {
+        type: "ask",
+        text: {
+            askHeader: "花期统防统治报表,有没有与农资对接",
+            askContent: ["花期统防统治报表,有没有与农资对接"],
+        },
+        loadEnd: false
     },
 ];
 
@@ -164,8 +215,8 @@ const triggerNextStep = () => {
             steps[stepIndex.value].type,
             steps[stepIndex.value].text,
             () => {
-                console.log("stepIndex.value === 76574", stepIndex.value);
                 isProcessing.value = false;
+                // steps[stepIndex.value].loadEnd = true
             }
         );
         stepIndex.value++;
@@ -194,6 +245,10 @@ const loadState = () => {
 
 const toMapLayer = (name) => {
     eventBus.emit("chat:showMapLayer", name)
+    askText(name)
+    // addSystemReply('system', {header: name, content: '', name}, () => {
+    //     steps[stepIndex.value].loadEnd = true
+    // });
 }
 
 const askText = (val) => {
@@ -224,7 +279,8 @@ const sendMessage = () => {
     chat.map((item) => {
         if (userText.indexOf(item.name) !== -1) {
             addSystemReply('system', {header: item.header, content: item.content, name: item.name}, () => {
-                console.log("sendMessage eeeeee",);
+                // steps[stepIndex.value].loadEnd = true
+                messages.value[messages.value.length - 1].loadEnd = true
                 setTimeout(triggerNextStep, 2000);
             });
             isSearch = false;
@@ -261,9 +317,8 @@ const addSystemReply = (type = "system", textObject, callback) => {
     isProcessing.value = true
     let currentHeader = "";
     let currentContent = "";
-    console.log("stepIndex.value", type);
     if (type === "ask") {
-        messages.value.push({ text: { header: textObject.askHeader, content: textObject.askContent }, type });
+        messages.value.push({ text: { header: textObject.askHeader, content: textObject.askContent, }, type });
     } else {
         messages.value.push({ text: { header: currentHeader, content: currentContent, name: textObject.name }, type });
     }
@@ -288,16 +343,11 @@ const addSystemReply = (type = "system", textObject, callback) => {
                     contentIndex++;
                 } else {
                     clearInterval(contentInterval);
-                    console.log("ddddddddone", stepIndex.value);
-                    // if (stepIndex.value === 2 || stepIndex.value === 6) {
-
-                    //     nextTick(() => {
-                    //                     setTimeout(triggerNextStep, 1000);
-                    //                 });
-                    // }
+                    messages.value[messages.value.length - 1].loadEnd = true
+                    scrollToBottom();
                     callback && callback(); // 回复完成后解锁输入
                 }
-            }, 50);
+            }, 5);
         } else {
             callback && callback(); // 如果 content 为空,直接解锁输入
         }
@@ -371,6 +421,10 @@ onMounted(() => {
     // }, 200)
 });
 
+eventBus.on("chat:hideMapLayer", () => {
+    setTimeout(triggerNextStep, 2000);
+})
+
 // **滚动到底部**
 const scrollToBottom = () => {
     nextTick(() => {
@@ -428,6 +482,9 @@ const scrollToBottom = () => {
     }
 }
 .table-wrap {
+    padding-top: 12px;
+    width: 100%;
+    overflow: auto;
     ::v-deep {
         .el-table .el-table__header th.el-table__cell {
             background: #3B3B3B !important;
@@ -509,6 +566,8 @@ const scrollToBottom = () => {
 }
 .bubble {
     padding: 16px 12px;
+    box-sizing: border-box;
+    max-width: 100%;
     border-radius: 8px;
     // max-width: 60%;
     background: rgba(255, 212, 137, 0.1);
@@ -520,6 +579,9 @@ const scrollToBottom = () => {
         color: #999999;
         // padding-bottom: 8px;
     }
+    .main-text {
+        color: #ffffff;
+    }
     .content {
         color: #ffffff;
     }
@@ -537,7 +599,8 @@ const scrollToBottom = () => {
         width: 100%;
     }
 }
-.system .bubble {
+.system .bubble,
+.real .bubble {
     background: #2F2F2F;
     color: #fff;
     border-radius: 2px 16px 16px 16px;
@@ -591,7 +654,8 @@ const scrollToBottom = () => {
             }
         }
         .file-icon {
-            width: 16px;
+            // width: 16px;
+            height: 16px;
         }
         .send-icon {
             margin-left: 8px;

+ 58 - 0
src/views/warningHome/components/trackDialog.vue

@@ -0,0 +1,58 @@
+<template>
+    <div>
+        <el-dialog v-model="centerDialogVisible" width="800" align-center modal-class="track-dialog">
+            <template #header>
+                <div class="track-title">
+                    <img class="track-icon" src="@/assets/images/warningHome/chat/track.png" alt="" />
+                    植保轨迹
+                </div>
+            </template>
+            <div class="track">
+                <img class="track-img" src="@/assets/images/warningHome/chat/trackpng.png" alt="">
+            </div>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup>
+import eventBus from "@/api/eventBus";
+import { onMounted, ref } from "vue";
+
+const centerDialogVisible = ref(false);
+
+onMounted(() => {
+    // ai与地图交互
+    eventBus.on("chat:showMapLayer", handleMapLayer)
+})
+
+const handleMapLayer = (name) => {
+    console.log('handleMapLayerdialog', name);
+}
+</script>
+
+<style lang="scss" scoped>
+.track-title {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 20px;
+    .track-icon {
+        width: 24px;
+        margin-right: 4px;
+    }
+}
+.track-img {
+    width: 100%;
+}
+</style>
+
+<style lang="scss">
+.track-dialog {
+    .el-dialog {
+        background: #232323;
+        border: 1px solid #777777;
+        border-radius: 12px;
+        color: #fff;
+    }
+}
+</style>

+ 16 - 2
src/views/warningHome/index.vue

@@ -54,9 +54,12 @@
                 <chat></chat>
 
                 <!-- 地图图例 -->
-                <div class="map-legend" v-if="legendImg">
+                <div class="map-legend" v-if="legendImg && hideChatMapLayer">
                     <img :src="legendImg" />
                 </div>
+                <div class="map-legend chat-legend" v-if="!hideChatMapLayer">
+                    <StaticMapLegend></StaticMapLegend>
+                </div>
             </div>
             <div class="warning-search yes-events">
                 <img src="@/assets/images/warningHome/search-img.png" />
@@ -88,16 +91,19 @@
         </div>
         <div id="popup-content" class="info-content"></div>
     </div>
+    <track-dialog></track-dialog>
 </template>
 
 <script setup>
 import "./map/mockFarmLayer";
 import StaticMapLayers from "@/components/static_map_change/Layers.js"
+import StaticMapLegend from "@/components/static_map_change/legend.vue"
 import { onMounted, ref } from "vue";
 import fnHeader from "@/components/fnHeader.vue";
 import WarningMap from "./warningMap";
 import AlarmLayer from "./map/alarmLayer";
 import album from "./components/album.vue";
+import trackDialog from "./components/trackDialog.vue";
 import chat from "./components/chat_components/index.vue";
 import alarmList from "./components/alarmList.vue";
 import timeLine from "./components/timeLine.vue";
@@ -111,6 +117,7 @@ let store = useStore();
 
 let warningMap = new WarningMap();
 let alarmLayer = null;
+let staticMapLayers = null;
 const router = useRouter();
 
 const areaVal = ref(["3"]);
@@ -121,7 +128,7 @@ const warningLayers = ref({})
 onMounted(() => {
     warningMap.initMap(store.getters.userinfo.location, mapRef.value);
     alarmLayer = new AlarmLayer(warningMap.kmap);
-    // let staticMapLayers = new StaticMapLayers(warningMap.kmap);
+    staticMapLayers = new StaticMapLayers(warningMap.kmap);
     // setTimeout(() => {
     //   staticMapLayers.show("testpng")
     // },2000)
@@ -148,10 +155,14 @@ const hideChatMapLayer = ref(true)
 const handleMapLayer = (name) => {
     hideChatMapLayer.value = false
     console.log('name', name);
+    // staticMapLayers.show("干旱缺水")
+    staticMapLayers.show("爆花态势0")
 }
 
 const toggleChatMapLayer = () => {
     hideChatMapLayer.value = true
+    eventBus.emit("chat:hideMapLayer");
+    staticMapLayers.hideAll()
 }
 
 const destroyPopup = () => {
@@ -229,6 +240,9 @@ const toggleBox = (name) => {
                     opacity: 0.6;
                 }
             }
+            .chat-legend {
+                bottom: -12px;
+            }
         }
         .warning-search {
             position: absolute;