diff --git a/aiMap.zip b/aiMap.zip new file mode 100644 index 0000000..d0336ee Binary files /dev/null and b/aiMap.zip differ diff --git a/eslint.config.js b/eslint.config.js index aaa7db0..efe1b00 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,7 +2,7 @@ * @Author: cclu 1106109051@qq.com * @Date: 2024-11-18 11:54:00 * @LastEditors: cclu 1106109051@qq.com - * @LastEditTime: 2024-11-18 11:54:18 + * @LastEditTime: 2024-11-26 16:56:07 * @FilePath: \aiRobot\eslint.config.js * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -21,5 +21,13 @@ module.exports = { }, rules: { // 自定义规则 + "no-nested-ternary": 1, + "no-use-before-define": 1, + "no-param-reassign": 0, + "no-plusplus": 0, + "eqeqeq": 0, + "no-useless-escape": 0, + "prefer-destructuring": 0, + "no-lonely-if": 0 }, }; \ No newline at end of file diff --git a/src/assets/ai/businessTrade.png b/src/assets/ai/businessTrade.png new file mode 100644 index 0000000..b72d1b9 Binary files /dev/null and b/src/assets/ai/businessTrade.png differ diff --git a/src/assets/ai/clearIcon.png b/src/assets/ai/clearIcon.png new file mode 100644 index 0000000..28400a6 Binary files /dev/null and b/src/assets/ai/clearIcon.png differ diff --git a/src/assets/ai/comeForm.png b/src/assets/ai/comeForm.png new file mode 100644 index 0000000..a51e315 Binary files /dev/null and b/src/assets/ai/comeForm.png differ diff --git a/src/assets/ai/deleteIcon.png b/src/assets/ai/deleteIcon.png new file mode 100644 index 0000000..058558c Binary files /dev/null and b/src/assets/ai/deleteIcon.png differ diff --git a/src/assets/ai/earlyWarning.png b/src/assets/ai/earlyWarning.png new file mode 100644 index 0000000..a34e074 Binary files /dev/null and b/src/assets/ai/earlyWarning.png differ diff --git a/src/assets/ai/filterIcon.png b/src/assets/ai/filterIcon.png new file mode 100644 index 0000000..a1518e6 Binary files /dev/null and b/src/assets/ai/filterIcon.png differ diff --git a/src/assets/ai/heat.png b/src/assets/ai/heat.png new file mode 100644 index 0000000..e196d9e Binary files /dev/null and b/src/assets/ai/heat.png differ diff --git a/src/assets/ai/retract.png b/src/assets/ai/retract.png new file mode 100644 index 0000000..5c7b1d3 Binary files /dev/null and b/src/assets/ai/retract.png differ diff --git a/src/assets/ai/selectBusinessTrade.png b/src/assets/ai/selectBusinessTrade.png new file mode 100644 index 0000000..8e30322 Binary files /dev/null and b/src/assets/ai/selectBusinessTrade.png differ diff --git a/src/assets/ai/selectComeForm.png b/src/assets/ai/selectComeForm.png new file mode 100644 index 0000000..7dd33a1 Binary files /dev/null and b/src/assets/ai/selectComeForm.png differ diff --git a/src/assets/ai/selectDeleteIcon.png b/src/assets/ai/selectDeleteIcon.png new file mode 100644 index 0000000..be4bc7b Binary files /dev/null and b/src/assets/ai/selectDeleteIcon.png differ diff --git a/src/assets/ai/selectEarlyWarning.png b/src/assets/ai/selectEarlyWarning.png new file mode 100644 index 0000000..3a1eb7c Binary files /dev/null and b/src/assets/ai/selectEarlyWarning.png differ diff --git a/src/assets/ai/selectHeat.png b/src/assets/ai/selectHeat.png new file mode 100644 index 0000000..4967e8e Binary files /dev/null and b/src/assets/ai/selectHeat.png differ diff --git a/src/assets/ai/selectTraffic.png b/src/assets/ai/selectTraffic.png new file mode 100644 index 0000000..57e2ebb Binary files /dev/null and b/src/assets/ai/selectTraffic.png differ diff --git a/src/assets/ai/selectWeather.png b/src/assets/ai/selectWeather.png new file mode 100644 index 0000000..c54896d Binary files /dev/null and b/src/assets/ai/selectWeather.png differ diff --git a/src/assets/ai/stopIcon.png b/src/assets/ai/stopIcon.png new file mode 100644 index 0000000..26529a1 Binary files /dev/null and b/src/assets/ai/stopIcon.png differ diff --git a/src/assets/ai/traffic.png b/src/assets/ai/traffic.png new file mode 100644 index 0000000..ade5db7 Binary files /dev/null and b/src/assets/ai/traffic.png differ diff --git a/src/assets/ai/weather.png b/src/assets/ai/weather.png new file mode 100644 index 0000000..516f1f2 Binary files /dev/null and b/src/assets/ai/weather.png differ diff --git a/src/components/map/component/RobotDialogueBox.less b/src/components/map/component/RobotDialogueBox.less index 2acd105..43b3e36 100644 --- a/src/components/map/component/RobotDialogueBox.less +++ b/src/components/map/component/RobotDialogueBox.less @@ -66,12 +66,54 @@ padding: 8px 12px; .firstClickTab{ width: 100%; + display: flex; + align-items: center; + flex-wrap: wrap; .clickItem{ + display: inline-block; margin-right: 8px; cursor: pointer; - color: rgb(24, 144, 255); + color: #1890ff; text-decoration: none; } + .selctClickItem{ + box-sizing: border-box; + padding: 4px 6px; + background-color: #1890ff; + color: #fff; + border-radius: 8px; + + } + .clearClick{ + width: 15px; + height: 15px; + cursor: pointer; + margin-left: 12px; + } + } + + .style1{ + color: #6590f5!important; + font-weight: bold; + } + .style2{ + color: #FE7628!important; + font-weight: bold; + } + .style3{ + color: #98aac9!important; + font-weight: bold; + } + .operateBox{ + width: 100%; + display: flex; + align-items: center; + flex-wrap: wrap; + .operateItem{ + display: block; + width: 160px; + cursor: pointer; + } } .el-loading-mask{ diff --git a/src/components/map/component/RobotDialogueBox.vue b/src/components/map/component/RobotDialogueBox.vue index 5625a44..bf8aa97 100644 --- a/src/components/map/component/RobotDialogueBox.vue +++ b/src/components/map/component/RobotDialogueBox.vue @@ -9,12 +9,16 @@ import { } from "../../../options/serveice"; import request from "../../../request/requestConfig"; import { + getFieldGetFieEnumList, handleGetANALYSISRULEDetail, handleGetANALYSISRULEList, + handleGetMonthINCAnalysis, handleSynchroSENTENCE, handleTranslateSentence, } from "../service"; import "./RobotDialogueBox.less"; +// @ts-ignore +import detailText from "./detailText"; // 判断是否已经展开了对话框 const showDialogBox = ref(false); @@ -29,18 +33,44 @@ const isNewDialogLoading = ref(false); // 这一次对话框出现之后问问题的id const thisQuestionId = ref(); // 第一个对话框出现的tab -const clickTabList: any = [{ label: "基础信息", value: 1 }]; +const clickTabList: any = [ + { label: "基础信息", value: 1 }, + { label: "经营数据", value: 2 }, +]; // 当前选中的查询tab const selectTab = ref(0); +// 当前打印的内容 +const printWord = ref(); +// 当前是否在打印 +const isPrinting = ref(false); +// 预警类型的枚举对象 +const descObjRef = ref(); +const descListRef = ref(); onMounted(() => { // 默认在初始显示的 + + // 请求枚举 + handleGetFieldEnum(); }); // 展开机器人的方法 第一次要执行默认打招呼语 如果已经有了对话记录 就只是展开 -const handleGetShowDailogBox = () => { +const handleGetShowDailogBox = async () => { if (dialogueList && dialogueList.length > 0) { - showDialogBox.value = true; + await nextTick(() => { + showDialogBox.value = true; + }); + + console.log("dialogueList", dialogueList); + // 给每个带有isVHtml 的对话框 赋值上对应的VHtml + const allBoxes = document.querySelectorAll(".dialogueTextBox-text"); + console.log("allBoxes", allBoxes); + + dialogueList.forEach((item: any, index: number) => { + if (item.isVHtml) { + allBoxes[index].innerHTML = item.VHtml; + } + }); } else { isNewDialogLoading.value = true; let obj: any = { @@ -60,7 +90,32 @@ const handleGetShowDailogBox = () => { } }; // 关闭对话框 -const handleCloseDialogbox = () => { +const handleCloseDialogbox = async () => { + console.log("dialogueList", dialogueList); + + const allBoxes = document.querySelectorAll(".dialogueTextBox-text"); + + // 等待 nextTick 确保 DOM 更新 + await nextTick(() => { + if (allBoxes && allBoxes.length > 0) { + const lastBox = allBoxes[allBoxes.length - 1]; + + // 获取最后一个对话框的对象 + let obj: any = dialogueList[dialogueList.length - 1]; + obj.isOver = true; // 标记为结束 + isPrinting.value = false; // 停止打印 + + // 确保 obj.VHtml 存在并赋值 + if (obj.VHtml) { + lastBox.innerHTML = obj.VHtml; + console.log("lastBox", lastBox); + } else { + console.warn("VHtml is empty or undefined", obj); + } + } + }); + + // 关闭对话框 showDialogBox.value = false; }; // 添加对话内容的方法 @@ -139,63 +194,82 @@ const handleSetRowKeyTable = (list: any) => { const handleConfigRequest = async ( url: any, params: any, + detail: any, config: any, - answer: any + answer?: any ) => { - // url 请求地址 params 参数 config 配置输出结果的格式 answer 拿到回答问题的数据 + // url 请求地址 params 参数 detail 配置项详情 config 配置输出结果的格式 answer 拿到回答问题的数据 let data: any; if (config.acceptVerbs === "get") { data = await request.get(url, params); } else { data = await request.post(url, params); } + console.log("dssadasconfig", config); + console.log("detail", detail); + console.log("data22321", data); - if (config.responseFormat === "nestingList") { - data = handleSetRowKeyTable(wrapTreeNode(data.Result_Data.List)); + // 系统默认 + if (detail.RULE_SOURCE === 1000) { + // object 输出 data.Result_Data + if (config.responseFormat === "object") { + return data.Result_Data; + } else if (config.responseFormat === "List") { + return data.Result_Data.List; + } } else { - data = handleSetRowKeyTable(data.Result_Data.List); - } - console.log("data", data); + // 用户自定义 + if (config.responseFormat === "nestingList") { + data = handleSetRowKeyTable(wrapTreeNode(data.Result_Data.List)); + } else if (config.responseFormat === "object") { + return data.Result_Data; + } else { + data = handleSetRowKeyTable(data.Result_Data.List); + } - let newRes: any; - // 根据输出结果的的配置 去处理接口返回的结果 - // 先判断是单个服务区 还是多个服务区 - if (answer?.ServerpartId && answer?.ServerpartId.indexOf(",") === -1) { - console.log("sdasda", answer?.ServerpartId.indexOf(",") === -1); - - // 单个服务区 那么要去掉合计和片区层 只展示服务区层即以下 - if (config?.serverpart) { + // 如果接口返回的数据 子集不是用children命令的 那么就得转一下 把那个命令的 变成 children + if (config?.shopList) { if (data && data.length > 0) { - data.forEach((item: any, index: number) => { - if (config?.serverpart === 1) { - newRes = [item]; + data.forEach((item: any) => { + if (item[config?.shopList] && item[config?.shopList].length > 0) { + item.children = item[config?.shopList]; + item[config?.shopList] = null; } else { if (item.children && item.children.length > 0) { - item.children.forEach((subItem: any, subIndex: number) => { - if (config?.serverpart === 2) { - newRes = [subItem]; + item.children.forEach((subItem: any) => { + if ( + subItem[config?.shopList] && + subItem[config?.shopList].length > 0 + ) { + subItem.children = subItem[config?.shopList]; + subItem[config?.shopList] = null; } else { if (subItem.children && subItem.children.length > 0) { - subItem.children.forEach( - (thirdItem: any, thirdIndex: number) => { - if (config?.serverpart === 3) { - newRes = [thirdItem]; - } else { - if ( - thirdItem.children && - thirdItem.children.length > 0 - ) { - thirdItem.children.forEach( - (fourthItem: any, fourthIndex: number) => { - if (config?.serverpart === 4) { - newRes = [fourthItem]; - } - } - ); - } + subItem.children.forEach((thirdItem: any) => { + if ( + thirdItem[config?.shopList] && + thirdItem[config?.shopList].length > 0 + ) { + thirdItem.children = thirdItem[config?.shopList]; + thirdItem[config?.shopList] = null; + } else { + if ( + thirdItem.children && + thirdItem.children.length > 0 + ) { + thirdItem.children.forEach((fourthItem: any) => { + if ( + fourthItem[config?.shopList] && + fourthItem[config?.shopList].length > 0 + ) { + fourthItem.children = + fourthItem[config?.shopList]; + fourthItem[config?.shopList] = null; + } + }); } } - ); + }); } } }); @@ -204,83 +278,128 @@ const handleConfigRequest = async ( }); } } - } else { - // 多个服务区就不做处理了 - newRes = data; - } + let newRes: any; + // 根据输出结果的的配置 去处理接口返回的结果 + // 先判断是单个服务区 还是多个服务区 - console.log("newRes", newRes); - // 如果接口返回的数据 子集不是用children命令的 那么就得转一下 把那个命令的 变成 children - if (config?.shopList) { - if (newRes && newRes.length > 0) { - newRes.forEach((item: any) => { - if (item[config?.shopList] && item[config?.shopList].length > 0) { - item.children = item[config?.shopList]; - } else { + if (answer?.ServerpartId && answer?.ServerpartId.indexOf(",") === -1) { + console.log("config3232", config); + // 单个服务区 那么要去掉合计和片区层 只展示服务区层即以下 + if (config?.serverpart) { + if (data && data.length > 0) { + data.forEach((item: any, index: number) => { + if (config?.serverpart === 1) { + newRes = [item]; + } else { + if (item.children && item.children.length > 0) { + item.children.forEach((subItem: any, subIndex: number) => { + if (config?.serverpart === 2) { + newRes = [subItem]; + } else { + if (subItem.children && subItem.children.length > 0) { + subItem.children.forEach( + (thirdItem: any, thirdIndex: number) => { + if (config?.serverpart === 3) { + newRes = [thirdItem]; + } else { + if ( + thirdItem.children && + thirdItem.children.length > 0 + ) { + thirdItem.children.forEach( + (fourthItem: any, fourthIndex: number) => { + if (config?.serverpart === 4) { + newRes = [fourthItem]; + } + } + ); + } + } + } + ); + } + } + }); + } + } + }); + } + } else { + // 不需要处理服务区的 就输出原本的格式 + newRes = data; + } + } else { + // 多个服务区就不做处理了 + newRes = data; + } + console.log("newRes", newRes); + + // 判断一下showLevel 只显示哪一层 + console.log("dasdas", config); + + let finalRes: any = []; + + if (config.showLevel) { + if (newRes && newRes.length > 0) { + newRes.forEach((item: any) => { + if (config.showLevel === 1) { + finalRes.push(item); + } if (item.children && item.children.length > 0) { item.children.forEach((subItem: any) => { - if ( - subItem[config?.shopList] && - subItem[config?.shopList].length > 0 - ) { - subItem.children = subItem[config?.shopList]; - } else { - if (subItem.children && subItem.children.length > 0) { - subItem.children.forEach((thirdItem: any) => { - if ( - thirdItem[config?.shopList] && - thirdItem[config?.shopList].length > 0 - ) { - thirdItem.children = thirdItem[config?.shopList]; - } else { - if (thirdItem.children && thirdItem.children.length > 0) { - thirdItem.children.forEach((fourthItem: any) => { - if ( - fourthItem[config?.shopList] && - fourthItem[config?.shopList].length > 0 - ) { - fourthItem.children = fourthItem[config?.shopList]; - } - }); + if (config.showLevel === 2) { + finalRes.push(subItem); + } + if (subItem.children && subItem.children.length > 0) { + subItem.children.forEach((thirdItem: any) => { + if (config.showLevel === 3) { + finalRes.push(thirdItem); + } + if (thirdItem.children && thirdItem.children.length > 0) { + thirdItem.children.forEach((fourthItem: any) => { + if (config.showLevel === 4) { + finalRes.push(fourthItem); } - } - }); - } + }); + } + }); } }); } - } - }); + }); + } + } else { + finalRes = newRes; } - } - return newRes; + return finalRes; + } }; -// 去解析配置项 输出结果 -const handleAnalyzeConfig = async (configDetail: any, answer: any) => { - // configDetail 配置内容 answer 回答问题接口返回的内容 - - let newReq: any = JSON.parse(configDetail?.PARAM_TEMPLATE || ""); // 入参 - let newRESPONSE_CONFIG: any = JSON.parse(configDetail?.RESPONSE_CONFIG || ""); // 出参 - let newPARSING_RULES: any = JSON.parse(configDetail?.PARSING_RULES || ""); // 对应的规则 - let OUTPUT_FORMAT: any = JSON.parse(configDetail?.OUTPUT_FORMAT || ""); // 输出格式 +// 封装一下 拿到入参的方法 +const handleGetReq = (configDetail: any, answer?: any) => { + let req: any = {}; + let newReq: any = configDetail?.PARAM_TEMPLATE + ? JSON.parse(configDetail?.PARAM_TEMPLATE) + : ""; // 入参 + let newPARSING_RULES: any = configDetail?.PARSING_RULES + ? JSON.parse(configDetail?.PARSING_RULES) + : ""; // 对应的规则 console.log("newReq", newReq); - console.log("newRESPONSE_CONFIG", newRESPONSE_CONFIG); console.log("newPARSING_RULES", newPARSING_RULES); - console.log("OUTPUT_FORMAT", OUTPUT_FORMAT); - // 配置请求的参数 - let req: any = {}; if (newReq) { for (let key in newReq) { let realKey: any = newPARSING_RULES[key]; if (realKey) { let currentUser: any = { ProvinceCode: "340000", + pushProvinceCode: "340000", }; - // formatType 0:数值 1:字段 2:取缓存 3:取年份 name 就是去resData里面去字段 value 非1 的时候会有值 4: 取选中的服务区 + // formatType 0:数值 1:字段 2:取缓存 3:取年份 4: 取月份 5:取日期 6:取当年 7:取前一年 8: 取当年的月份 9:取当前的首月 10: 取选中的服务区里面的值 + // fieldName 就是去resData里面去字段 value formatType为0的时候直接取值 haveDefault 判断是否有默认值 如果是true即使answer中无值 也能取到默认值 一般用在日期时间上 + // 当formatType为7的时候 取判断 value 1:取前一年 2:取前一个月 3:取前一天 if (realKey.formatType === 1) { req[key] = answer[realKey.fieldName]; } else if (realKey.formatType === 0) { @@ -290,31 +409,139 @@ const handleAnalyzeConfig = async (configDetail: any, answer: any) => { } else if (realKey.formatType === 3) { req[key] = answer[realKey.fieldName] ? moment(answer[realKey.fieldName]).format("YYYY") + : realKey.haveDefault + ? moment().format("YYYY") : ""; - }else if(realKey.formatType === 4){ - req[key] = props.currentServerPartDetail[realKey.fieldName]; + } else if (realKey.formatType === 4) { + req[key] = answer[realKey.fieldName] + ? moment(answer[realKey.fieldName]).format("YYYYMM") + : realKey.haveDefault + ? moment().format("YYYYMM") + : ""; + } else if (realKey.formatType === 5) { + req[key] = answer[realKey.fieldName] + ? moment(answer[realKey.fieldName]).format("YYYY-MM-DD") + : realKey.haveDefault + ? moment().format("YYYY-MM-DD") + : ""; + } else if (realKey.formatType === 6) { + req[key] = moment().format("YYYY"); + } else if (realKey.formatType === 7) { + req[key] = + realKey.value === 1 + ? moment().subtract(1, "year").format("YYYY") + : realKey.value === 2 + ? moment().subtract(1, "m").format("YYYYMM") + : realKey.value === 3 + ? moment().subtract(1, "d").format("YYYY-MM-DD") + : ""; + } else if (realKey.formatType === 8) { + req[key] = moment().format("MM"); + } else if (realKey.formatType === 9) { + req[key] = moment().startOf("year").format("yyyyMM"); + } else if (realKey.formatType === 10) { + req[key] = props.currentServerPartDetail?.[realKey.fieldName] ?? ""; } } } } - console.log("req", req); - // 配置请求 - // 接口返回的结果 - let result: any; + + return req; +}; + +// 去解析配置项 输出结果 +const handleAnalyzeConfig = async (configDetail: any, answer: any) => { + // configDetail 配置内容 answer 回答问题接口返回的内容 + + let newReq: any = configDetail?.PARAM_TEMPLATE + ? JSON.parse(configDetail?.PARAM_TEMPLATE) + : ""; // 入参 + let OUTPUT_FORMAT: any = configDetail?.OUTPUT_FORMAT + ? JSON.parse(configDetail?.OUTPUT_FORMAT) + : ""; // 输出格式 + let newRESPONSE_CONFIG: any = + OUTPUT_FORMAT?.responseType === "text" + ? configDetail?.RESPONSE_CONFIG + : configDetail?.RESPONSE_CONFIG + ? JSON.parse(configDetail?.RESPONSE_CONFIG) + : ""; // 出参 + let newPARSING_RULES: any = configDetail?.PARSING_RULES + ? JSON.parse(configDetail?.PARSING_RULES) + : ""; // 对应的规则 + + console.log("newReq", newReq); + console.log("newRESPONSE_CONFIG", newRESPONSE_CONFIG); + console.log("newPARSING_RULES", newPARSING_RULES); + console.log("OUTPUT_FORMAT", OUTPUT_FORMAT); + console.log("configDetail", configDetail); + + // 配置请求的参数 + let req: any = handleGetReq(configDetail, answer); + console.log("req2", req); + + // 给post的请求 的参数 需要包一层的包一层 if (OUTPUT_FORMAT) { - result = await handleConfigRequest( - configDetail?.API_ENDPOINT, - req, - OUTPUT_FORMAT, - answer - ); + if (OUTPUT_FORMAT.paramsFormat === "searchModel") { + let newReq: any = { + SearchParameter: { + ...req, + }, + }; + req = newReq; + } + } + + // 判断是不是有了全部数据 如果有参数是未填写的且可以取默认数据 + // 判断req里面全空值 + let haveALLNull: boolean = true; + for (let key in req) { + if (req[key]) { + haveALLNull = false; + } + } + + // 配置请求 + // 接口返回的结果 + let result: any; + if (haveALLNull) { + result = configDetail?.ANALYSISRULE_DESC ?? ""; + } else { + if (OUTPUT_FORMAT) { + result = await handleConfigRequest( + configDetail?.API_ENDPOINT, + req, + configDetail, + OUTPUT_FORMAT, + answer + ); + } } // 根据输出结果的配置 去修改实际值 console.log("dsadsadasf", result); - const newResult: any = handleChangeTableList(result, newRESPONSE_CONFIG); - console.log("newResult", newResult); + console.log("OUTPUT_FORMAT", OUTPUT_FORMAT); + let newResult: any; + // 判断responseType 格式是否为 text 一般都为json + if (OUTPUT_FORMAT.responseType === "text") { + newResult = newRESPONSE_CONFIG + .replace(/"/g, "'") + .replace(/\{\{(.*?)\}\}/g, (_: any, key: any) => { + try { + return eval(key.trim()); + } catch { + return ""; + } + }); + } else { + if (OUTPUT_FORMAT.responseFormat === "object") { + newResult = result; + } else { + newResult = handleChangeTableList(result, newRESPONSE_CONFIG); + } + } + + console.log("newResult", newResult); return newResult; }; // 去循环处理一个数组里面的数据 是否符合配置项的要求 @@ -323,7 +550,6 @@ const handleChangeTableList = (list: any, config: any) => { let res: any = []; list.forEach((item: any) => { let obj: any = handleChangeListItem(item); - console.log("321312", obj); obj = handleChangeObj(obj, config); res.push(obj); }); @@ -360,7 +586,7 @@ const handleChangeObj = (obj: any, config: any) => { if (obj) { let newObj: any = JSON.parse(JSON.stringify(obj)); for (let key in config) { - if (newObj[key]) { + if (newObj[key] || key === "Name") { let configObj: any = config[key]; for (let samllKey in configObj) { // 判断是不是要以万元为单位 @@ -378,12 +604,23 @@ const handleChangeObj = (obj: any, config: any) => { } // 判断是不是金额 金额的话 要加上千分号 if (configObj["isMoney"] && samllKey === "isMoney") { - console.log("newObj[key]2", newObj[key]); newObj[key] = typeof newObj[key] === "number" ? formatNumber(newObj[key]) : formatNumber(parseThousandSeparatedNumber(newObj[key])); } + // 判断这个字段 是不是像片区 服务区 门店 这样的 多个字段显示同一列的 如果是 就改值 只有prop(key)为Name的时候 才会有这个 + if (configObj["multipleNames"]) { + // 单列多名称的优先级 priority越前面的优先级越低 + let priority: any = configObj["multipleNames"].split(","); + if (priority && priority.length > 0) { + priority.forEach((item: any) => { + if (newObj[item]) { + newObj[key] = newObj[item]; + } + }); + } + } } } } @@ -465,6 +702,8 @@ const handleChangeShow = (obj: any, addObj?: any) => { for (let key in obj) { let newObj: any = obj[key]; + // descObjRef + columnsList.push({ width: newObj.width, label: newObj.label, @@ -474,6 +713,7 @@ const handleChangeShow = (obj: any, addObj?: any) => { isSlot: newObj.isSlot, isMoney: newObj.isMoney, isRate: newObj.isRate, + showDic: newObj.showDic, }); } return columnsList; @@ -494,39 +734,162 @@ const renderCell = (row: any, column: any) => { return `${value}`; }; -// 配置对话框表格的样式 -const handleConfigItemTable = (tableData: any, configObj: any, answer: any) => { - // 配置列表的显示列 - if (configObj) { - let resObj: any = JSON.parse(configObj.RESPONSE_CONFIG); - console.log("resObj", resObj); - console.log("answer", answer); - let columns: any = []; - if (resObj) { - columns = handleChangeShow(resObj); - console.log("columns", columns); +// 如果请求接口的结果是对象中的某个参数 且这个对象可能是多级的 最后输出最终字段 只能取一个字段 +const handleGetResFieldRes = (obj: any, config: any) => { + let str: string = ""; + for (let key in config) { + if (config[key] && obj[key]) { + str = handleGetResFieldRes(obj[key], config[key]); + } else if (obj[key] && !config[key]) { + str = obj[key]; } + } + return str; +}; + +// 配置对话框表格的样式 +const handleConfigItemTable = async ( + tableData: any, + configObj: any, + answer: any +) => { + let str: string = ""; + + if (typeof tableData === "string") { + str = tableData.toString(); + } else if (typeof tableData === "object" && tableData !== null) { + // 输出结果的对象 + let resultObj: any = configObj?.RESPONSE_CONFIG + ? JSON.parse(configObj.RESPONSE_CONFIG) + : ""; + if (resultObj) { + str = handleGetResFieldRes(tableData, resultObj); + } + } else { let obj: any = JSON.parse( JSON.stringify(dialogueList[dialogueList.length - 1]) ); - dialogueList[dialogueList.length - 1] = { - ...obj, - haveTable: true, - tableData: tableData, - columns: columns, - text: `${answer?.RevenueAnalysis}:${ - answer?.StartDate ? answer?.StartDate : "" - }${answer?.EndDate ? "-" + answer?.EndDate : ""}`, - }; - isNewDialogLoading.value = false; + str = obj.text; } + + isNewDialogLoading.value = false; + let obj: any = JSON.parse( + JSON.stringify(dialogueList[dialogueList.length - 1]) + ); + if (str) { + obj.VHtml = str; + } + + dialogueList[dialogueList.length - 1] = { + ...obj, + isVHtml: true, + }; + await nextTick(); + + // 文字通过打字机效果实现 + const allBoxes = document.querySelectorAll(".dialogueTextBox-text"); + const lastBox = allBoxes[allBoxes.length - 1]; + if (lastBox) { + const lastContent = str; + isPrinting.value = true; + await handlePrintWord(lastBox, lastContent); + } + + // 判断是否需要出现表格 + if (configObj.ENABLE_TABLE === 1) { + // 如果有表格的话 配置列表的显示列 + if (configObj) { + let resObj: any = JSON.parse(configObj.RESPONSE_CONFIG); + let columns: any = []; + if (resObj) { + columns = handleChangeShow(resObj); + console.log("columns", columns); + } + let obj: any = JSON.parse( + JSON.stringify(dialogueList[dialogueList.length - 1]) + ); + console.log("configObjconfigObjconfigObjconfigObj", configObj); + // 显示的时间设置 + let timeStr: string = ""; + if (configObj.OUTPUT_FORMAT) { + let OUTPUT_FORMAT = JSON.parse(configObj.OUTPUT_FORMAT); + console.log("OUTPUT_FORMAT", OUTPUT_FORMAT); + if ( + (OUTPUT_FORMAT.DateFormat || OUTPUT_FORMAT.DateFormat === 0) && + (OUTPUT_FORMAT.DateType || OUTPUT_FORMAT.DateType === 0) + ) { + let time = ""; + if (OUTPUT_FORMAT.DateType === 0) { + let startTime: string = answer?.StartDate; + let endTime: string = answer?.EndDate; + if (OUTPUT_FORMAT.DateFormat === 0) { + startTime = moment(startTime).format("YYYY/MM/DD"); + endTime = moment(endTime).format("YYYY/MM/DD"); + } else if (OUTPUT_FORMAT.DateFormat === 1) { + startTime = moment(startTime).format("YYYY/MM"); + endTime = moment(endTime).format("YYYY/MM"); + } else if (OUTPUT_FORMAT.DateFormat === 1) { + startTime = moment(startTime).format("YYYY"); + endTime = moment(endTime).format("YYYY"); + } + time = `${startTime}-${endTime}`; + } else if (OUTPUT_FORMAT.DateType === 1) { + let startTime: string = answer?.StartDate; + if (OUTPUT_FORMAT.DateFormat === 0) { + startTime = moment(startTime).format("YYYY/MM/DD"); + } else if (OUTPUT_FORMAT.DateFormat === 1) { + startTime = moment(startTime).format("YYYY/MM"); + } else if (OUTPUT_FORMAT.DateFormat === 1) { + startTime = moment(startTime).format("YYYY"); + } + time = `${startTime}`; + } else if (OUTPUT_FORMAT.DateType === 2) { + let endTime: string = answer?.EndDate; + if (OUTPUT_FORMAT.DateFormat === 0) { + endTime = moment(endTime).format("YYYY/MM/DD"); + } else if (OUTPUT_FORMAT.DateFormat === 1) { + endTime = moment(endTime).format("YYYY/MM"); + } else if (OUTPUT_FORMAT.DateFormat === 1) { + endTime = moment(endTime).format("YYYY"); + } + time = `${endTime}`; + } + timeStr = time; + } else { + timeStr = `${answer?.StartDate ? answer?.StartDate : ""}${ + answer?.EndDate ? "-" + answer?.EndDate : "" + }`; + } + } + + dialogueList[dialogueList.length - 1] = { + ...obj, + haveTable: true, + tableData: tableData, + columns: columns, + text: `为您查找${timeStr || ""}相关数据:`, + }; + isNewDialogLoading.value = false; + } + } + // else { + // // 不需要出现表格时 直接给最新对话框的text赋值就好 + // let obj: any = JSON.parse( + // JSON.stringify(dialogueList[dialogueList.length - 1]) + // ); + // dialogueList[dialogueList.length - 1] = { + // ...obj, + // text: `${tableData}`, + // }; + // isNewDialogLoading.value = false; + // } + handleScrollToBottom(); }; // 将滚动条滚动到底部 一般触发时间为打字机效果 和 提问的时候 const handleScrollToBottom = () => { const div: any = document.getElementById("dialogContent"); - console.log("div", div); setTimeout(() => { nextTick(() => { if (div) { @@ -549,36 +912,82 @@ const handleAnswerQuestions = async () => { console.log("data", data); let searchRes: string = ""; - // 如果单独搜索服务区 会出现ServerpartInfoList返参 根据返参 来标出点位 - if (data?.ServerpartInfoList && data?.ServerpartInfoList.length > 0) { + + if (data.ServerpartId) { + // 全部服务区圆点变灰色 emit("handleEnterySearch"); - emit("handleLightServerpart", data?.ServerpartInfoList); - let obj: any = JSON.parse( - JSON.stringify(dialogueList[dialogueList.length - 1]) - ); - let str: string = ``; - data?.ServerpartInfoList.forEach((item: any) => { - if (str) { - str += `、${item.SERVERPART_NAME}`; + // 查询到的服务区 变为亮黄色 + emit("handleLightServerpart", data.ServerpartId); + if (data?.ServerpartInfoList && data?.ServerpartInfoList.length > 0) { + if (data?.AnalysisRuleId) { } else { - str = `${item.SERVERPART_NAME}`; + let obj: any = JSON.parse( + JSON.stringify(dialogueList[dialogueList.length - 1]) + ); + let str: string = ``; + data?.ServerpartInfoList.forEach((item: any) => { + if (str) { + str += `、${item.SERVERPART_NAME}`; + } else { + str = `${item.SERVERPART_NAME}`; + } + }); + dialogueList[dialogueList.length - 1] = { + ...obj, + text: data?.RevenueAnalysis.split("{")[0] || "", + // `已标注${str}的地图位置` + }; + isNewDialogLoading.value = false; } - }); - dialogueList[dialogueList.length - 1] = { - ...obj, - text: data?.RevenueAnalysis || "", - // `已标注${str}的地图位置` - }; - isNewDialogLoading.value = false; - } else if (data?.RevenueAnalysis) { - //再判断这次查询是否有文字结果返回 如果有的话 再进行判断 是要根据语义 调用接口 还是 直接输出这段文字 + } + if (data?.RevenueAnalysis) { + //再判断这次查询是否有文字结果返回 如果有的话 再进行判断 是要根据语义 调用接口 还是 直接输出这段文字 + if (data?.AnalysisRuleId) { + // 去拿到这个id的配置明细 + // 添加判断 可能会有多个id 单个id的时候 直接调用详情接口拿到数据 多个id去请求列表接口 拿到优先级高的 直接给configDetail赋值 + let configDetail: any; + const configList: any = await handleGetANALYSISRULEList({ + searchParameter: { + ANALYSISRULE_IDS: data?.AnalysisRuleId, + current: 1, + pageSize: 10, + }, + sortstr: "RULE_PRIORITY asc", + PageIndex: 1, + pagesize: 999999, + }); + console.log("configList", configList); + // 请求列表的时候 已经根据优先级排序 第一个就是优先级最高的 直接取值就可以 + if (configList && configList.length > 0) { + configDetail = configList[0]; + } + + // const configDetail = await handleGetANALYSISRULEDetail({ + // ANALYSISRULEId: data?.AnalysisRuleId, + // }); + console.log("configDetail", configDetail); + // 如果拿到值就根据配置去调用接口 拿到数据 输出数据 + if (configDetail) { + const tableData = await handleAnalyzeConfig(configDetail, data); + console.log("tableData2", tableData); + // 如果拿到值了 就去配这个对话框显示表格的样式 + if (tableData) { + await handleConfigItemTable(tableData, configDetail, data); + } + } + } else { + handleLastUpdate("为您查找相关数据"); + } + } + } else { + // 直接搜基础信息 因为没有服务区的输出 即使有配置id也不会去请求 这里判断一下 如果有配置id 还是按照配置id去调用 if (data?.AnalysisRuleId) { // 去拿到这个id的配置明细 // 添加判断 可能会有多个id 单个id的时候 直接调用详情接口拿到数据 多个id去请求列表接口 拿到优先级高的 直接给configDetail赋值 let configDetail: any; const configList: any = await handleGetANALYSISRULEList({ searchParameter: { - ANALYSISRULE_ID: data?.AnalysisRuleId, + ANALYSISRULE_IDS: data?.AnalysisRuleId, current: 1, pageSize: 10, }, @@ -591,27 +1000,88 @@ const handleAnswerQuestions = async () => { if (configList && configList.length > 0) { configDetail = configList[0]; } - - // const configDetail = await handleGetANALYSISRULEDetail({ - // ANALYSISRULEId: data?.AnalysisRuleId, - // }); console.log("configDetail", configDetail); // 如果拿到值就根据配置去调用接口 拿到数据 输出数据 if (configDetail) { const tableData = await handleAnalyzeConfig(configDetail, data); - console.log("tableData", tableData); - // 如果拿到值了 就去配这个对话框显示表格的样式 - if (tableData && tableData.length > 0) { - handleConfigItemTable(tableData, configDetail, data); + console.log("tableData3", tableData); + // 如果拿到值了 就去配这个对话框显示 表格或者打字机样式 + if (tableData) { + await handleConfigItemTable(tableData, configDetail, data); } } } else { - handleLastUpdate(data?.RevenueAnalysis); + handleLastUpdate("小驿还无法理解,请换个说法,我会不停努力学习的!"); + searchRes = "查询失败"; } - } else { - handleLastUpdate("小驿还无法理解,请换个说法,我会不停努力学习的!"); - searchRes = "查询失败"; } + + // 如果单独搜索服务区 会出现ServerpartInfoList返参 根据返参 来标出点位 + // if (data?.ServerpartInfoList && data?.ServerpartInfoList.length > 0) { + // // 全部服务区圆点变灰色 + // emit("handleEnterySearch"); + // // 查询到的服务区 变为亮黄色 + // emit("handleLightServerpart", data?.ServerpartInfoList); + // let obj: any = JSON.parse( + // JSON.stringify(dialogueList[dialogueList.length - 1]) + // ); + // let str: string = ``; + // data?.ServerpartInfoList.forEach((item: any) => { + // if (str) { + // str += `、${item.SERVERPART_NAME}`; + // } else { + // str = `${item.SERVERPART_NAME}`; + // } + // }); + // dialogueList[dialogueList.length - 1] = { + // ...obj, + // text: data?.RevenueAnalysis || "", + // // `已标注${str}的地图位置` + // }; + // isNewDialogLoading.value = false; + // } else if (data?.RevenueAnalysis) { + // //再判断这次查询是否有文字结果返回 如果有的话 再进行判断 是要根据语义 调用接口 还是 直接输出这段文字 + // if (data?.AnalysisRuleId) { + // // 去拿到这个id的配置明细 + // // 添加判断 可能会有多个id 单个id的时候 直接调用详情接口拿到数据 多个id去请求列表接口 拿到优先级高的 直接给configDetail赋值 + // let configDetail: any; + // const configList: any = await handleGetANALYSISRULEList({ + // searchParameter: { + // ANALYSISRULE_IDS: data?.AnalysisRuleId, + // current: 1, + // pageSize: 10, + // }, + // sortstr: "RULE_PRIORITY asc", + // PageIndex: 1, + // pagesize: 999999, + // }); + // console.log("configList", configList); + // // 请求列表的时候 已经根据优先级排序 第一个就是优先级最高的 直接取值就可以 + // if (configList && configList.length > 0) { + // configDetail = configList[0]; + // } + + // // const configDetail = await handleGetANALYSISRULEDetail({ + // // ANALYSISRULEId: data?.AnalysisRuleId, + // // }); + // console.log("configDetail", configDetail); + // // 如果拿到值就根据配置去调用接口 拿到数据 输出数据 + // if (configDetail) { + // const tableData = await handleAnalyzeConfig(configDetail, data); + // console.log("tableData", tableData); + // // 如果拿到值了 就去配这个对话框显示表格的样式 + // if (tableData && tableData.length > 0) { + // handleConfigItemTable(tableData, configDetail, data); + // } + // } + // } else { + // handleLastUpdate(data?.RevenueAnalysis); + // } + // } else { + // handleLastUpdate("小驿还无法理解,请换个说法,我会不停努力学习的!"); + // searchRes = "查询失败"; + // } + // 问完去调日志接口记录 且在没有对话框id的时候 存一个对话框id const logData: any = await handleSynchroSENTENCE({ DIALOG_CODE: thisQuestionId.value, @@ -624,9 +1094,9 @@ const handleAnswerQuestions = async () => { : 1, OPERATE_DATE: moment().format("YYYY-MM-DD HH:mm:ss"), STAFF_NAME: "新项目", + ANALYSISRULE_ID: data?.AnalysisRuleId, // STAFF_ID }); - console.log("logData", logData); if (thisQuestionId.value) { } else { thisQuestionId.value = logData?.DIALOG_CODE; @@ -646,25 +1116,32 @@ const handleSubmit = async () => { // 点击标签调用的方法 const handleClickTab = async (value: number) => { selectTab.value = value; + if (value === 0) return; + console.log("handleClickTab", props.currentServerPartDetail); let searchObj: any = { 1: `${props.currentServerPartDetail?.SERVERPART_NAME || ""}基础信息`, + 2: `${props.currentServerPartDetail?.SERVERPART_NAME || ""}经营数据`, }; // 先添加对话内容 handleAddDialogList(searchObj[value]); - // 拿到配置列表 拿到这个内容的配置内容 - const configDetail: any = await handleGetConfigList(searchObj[value]); - if (value === 1) { - handleServerpartBasicInfo(configDetail); - } + searchText.value = searchObj[value]; + handleAnswerQuestions(); + + // // 拿到配置列表 拿到这个内容的配置内容 + // const configDetail: any = await handleGetConfigList(searchObj[value]); + // if (value === 1) { + // handleServerpartBasicInfo(configDetail); + + // } }; // 调用配置列表 根据现在点击的这一项类型 来查出对应的配置详情id const handleGetConfigList = async (str: string) => { const data = await handleGetANALYSISRULEList({ searchParameter: { - ANALYSISRULE_ID: "", + ANALYSISRULE_IDS: "", current: 1, pageSize: 10, }, @@ -675,7 +1152,7 @@ const handleGetConfigList = async (str: string) => { let detailObj: number = 0; if (data && data.length > 0) { data.forEach((item: any) => { - if (str.indexOf(item.TRIGGER_WORDS) !== -1 && item.RULE_SOURCE === 1000) { + if (str.indexOf(item.TRIGGER_WORDS) !== -1) { detailObj = item; } }); @@ -685,46 +1162,132 @@ const handleGetConfigList = async (str: string) => { return detailObj; }; +// 判断入参中是否含有空值 +const handleHaveNullValue = (obj: any) => { + let res: boolean = false; + for (let key in obj) { + if (obj[key]) { + } else { + res = true; + } + } + return res; +}; + // 输出服务区基础数据的方法 const handleServerpartBasicInfo = async (config: any) => { console.log("config", config); + // 取入参 + const req: any = handleGetReq(config, null); + console.log("req", req); + // 判断入参里面是否有空值 如果有空值 就直接输出安徽驿达的基础信息 + let haveNull: boolean = handleHaveNullValue(req); + // 调用接口 取数据 + let data: any; + if (!haveNull) { + // 输出格式 + let OUTPUT_FORMAT: any = config?.OUTPUT_FORMAT + ? JSON.parse(config?.OUTPUT_FORMAT) + : ""; - let newReq: any = config.PARAM_TEMPLATE - ? JSON.parse(config.PARAM_TEMPLATE) - : ""; // 入参 - let newRESPONSE_CONFIG: any = config.RESPONSE_CONFIG - ? JSON.parse(config.RESPONSE_CONFIG) - : ""; // 出参 - let newPARSING_RULES: any = config.PARSING_RULES - ? JSON.parse(config.PARSING_RULES) - : ""; // 对应的规则 - let OUTPUT_FORMAT: any = config.OUTPUT_FORMAT - ? JSON.parse(config.OUTPUT_FORMAT) - : ""; // 输出格式 - - console.log("newReq", newReq); - console.log("newRESPONSE_CONFIG", newRESPONSE_CONFIG); - console.log("newPARSING_RULES", newPARSING_RULES); - console.log("OUTPUT_FORMAT", OUTPUT_FORMAT); - // 拿入参 - let req: any = {} - if(newPARSING_RULES){ - + if (OUTPUT_FORMAT) { + data = await handleConfigRequest( + config?.API_ENDPOINT, + req, + config, + OUTPUT_FORMAT, + null + ); + } + } else { + data = { + ServerpartInfo: { + SERVERPART_INFO: detailText.YDdesc ?? "", + }, + }; } + console.log("data213", data); + if (data) { + isNewDialogLoading.value = false; + let obj: any = JSON.parse( + JSON.stringify(dialogueList[dialogueList.length - 1]) + ); + dialogueList[dialogueList.length - 1] = { + ...obj, + isVHtml: true, + VHtml: data.ServerpartInfo.SERVERPART_INFO || "", + }; + await nextTick(); + const allBoxes = document.querySelectorAll(".dialogueTextBox-text"); + const lastBox = allBoxes[allBoxes.length - 1]; + if (lastBox) { + const lastContent = data.ServerpartInfo.SERVERPART_INFO || ""; + isPrinting.value = true; + await handlePrintWord(lastBox, lastContent); + let obj: any = JSON.parse( + JSON.stringify(dialogueList[dialogueList.length - 1]) + ); + dialogueList[dialogueList.length - 1] = { + ...obj, + isOver: true, + }; + } + } +}; + +// 给最新的对话添加打字机效果 +const handlePrintWord = async (element: any, htmlContent: any, speed = 20) => { + // printWord; + return new Promise((resolve) => { + let i = 0; + const tempDiv = document.createElement("div"); + tempDiv.innerHTML = htmlContent; + printWord.value = htmlContent; + const typeCharacter = () => { + if (i < tempDiv.innerHTML.length && isPrinting.value) { + const char = tempDiv.innerHTML.charAt(i); + if (char === "<") { + const tagEnd = tempDiv.innerHTML.indexOf(">", i); + const tagContent = tempDiv.innerHTML.slice(i, tagEnd + 1); + element.innerHTML += tagContent; + i = tagEnd + 1; + } else { + element.innerHTML += char === "\n" ? "
" : char; + i++; + } + setTimeout(typeCharacter, speed); + // 滚动到最底部 + handleScrollToBottom(); + } else { + isPrinting.value = false; + resolve(); // 打字完成后,Promise 进入 resolved 状态 + } + }; + typeCharacter(); + }); +}; + +// 打字机延迟函数 +const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); +// 停止打印机事件 +const handleStopPrint = () => { + isPrinting.value = false; }; // 传入的数据 const props = defineProps<{ currentServerPartDetail: any; + allServerPartIdList: any; }>(); // 传入的方法 const emit = defineEmits<{ (e: "handleLightServerpart", infoList: any): void; // 高亮查到的图层 (e: "handleEnterySearch"): void; // 全部服务区圆点置灰 + (e: "handleWarningMap", warningData: any): void; // 全部服务区圆点置灰 }>(); // 监听当前选择的服务区 @@ -753,6 +1316,180 @@ const handleFormatter = ( JSON.stringify(row), // 显示列的 label ]); }; + +// 拿枚举数据 +const handleGetFieldEnum = async () => { + // 预警类型 + const waringList = await getFieldGetFieEnumList({ + FieldexPlain_Field: "WARNING_TYPE", + }); + if (waringList && waringList.length > 0) { + const list: any = []; + const obj: any = {}; + const descList: any = []; + const descObj: any = {}; + waringList.forEach((item: any) => { + list.push({ label: item.FieldEnum_Name, value: item.FieldEnum_Value }); + obj[item.FieldEnum_Value] = item.FieldEnum_Name; + descList.push({ + label: item.FieldEnum_Desc, + value: item.FieldEnum_Value, + }); + descObj[item.FieldEnum_Value] = item.FieldEnum_Desc; + }); + + descObjRef.value = obj; + descListRef.value = list; + console.log("descObjRef.value", descObjRef.value); + } +}; + +// 经营业态的方法 +const handleGetBusinessTrade = async () => { + showDialogBox.value = true; + handleAddDialogList( + `${props.currentServerPartDetail?.SERVERPART_NAME || ""}经营业态` + ); + setTimeout(() => { + handleLastUpdate(""); + }, 1000); +}; + +// 预警类型的方法 +const handleSetWarningData = async () => { + showDialogBox.value = true; + handleAddDialogList( + `${props.currentServerPartDetail?.SERVERPART_NAME || ""}预警类型` + ); + setTimeout(() => { + nextTick(() => { + dialogueList[dialogueList.length - 1].isOver = true; + dialogueList[dialogueList.length - 1].text = + "请您选择具体想要查询的预警类型:"; + dialogueList[dialogueList.length - 1].isWarningSelect = true; + isNewDialogLoading.value = false; + }); + }, 1000); +}; + +// 选择的具体预警类型 +const handleSelectWarning = async (value: number) => { + handleAddDialogList( + `${props.currentServerPartDetail?.SERVERPART_NAME || ""}${ + descObjRef.value[Number(value)] + }` + ); + console.log("value", value); + console.log("props?.currentServerPartDetail", props?.currentServerPartDetail); + const req: any = { + WarningType: value, + ShowNormal: true, + ServerpartId: props?.currentServerPartDetail + ? props?.currentServerPartDetail.SERVERPART_ID + : props?.allServerPartIdList.toString(), + }; + const warningData = await handleGetMonthINCAnalysis(req); + console.log("warningData", warningData); + let result: string = ""; + if (props?.currentServerPartDetail) { + if (warningData && warningData.length > 0) { + let obj: any = {}; + let str: string = ""; + let objShopName: any = {}; + warningData.forEach((item: any) => { + if (obj[item.WARNING_TYPE] && obj[item.WARNING_TYPE].length > 0) { + let old: any = obj[item.WARNING_TYPE]; + old.push(item); + obj[item.WARNING_TYPE] = old; + } else { + let res: any = []; + res.push(item); + obj[item.WARNING_TYPE] = res; + } + + if ( + objShopName[item.WARNING_TYPE] && + objShopName[item.WARNING_TYPE].length > 0 + ) { + let old: any = objShopName[item.WARNING_TYPE]; + old += `,${item.SERVERPARTSHOP_NAME}`; + objShopName[item.WARNING_TYPE] = old; + } else { + let old: any = objShopName[item.WARNING_TYPE]; + old = `${item.SERVERPARTSHOP_NAME}`; + objShopName[item.WARNING_TYPE] = old; + } + }); + console.log("obj", obj); + console.log("objShopName", objShopName); + if (obj) { + for (let key in obj) { + let itemStr: string = ` + ${descObjRef.value[key]}:${objShopName[key]},共${obj[key].length}条;`; + str += itemStr; + } + } + result = `${props?.currentServerPartDetail.SERVERPART_NAME}预警类型,存在:${str} + 的情况,您可以鼠标移动到具体服务区查看情况。`; + } + } else { + let serverpartId: any = []; + if (warningData && warningData.length > 0) { + warningData.forEach((item: any) => { + if (serverpartId.indexOf(item.SERVERPART_ID) === -1) { + serverpartId.push(item.SERVERPART_ID); + } + }); + } + result = `${descObjRef.value[Number(value)]},共有${ + serverpartId.length || 0 + } 对服务区,存在${warningData.length || 0}条${ + descObjRef.value[Number(value)] + } 的情况,您可以鼠标移动到具体服务区查看情况。`; + } + console.log("result", result); + if (result) { + isNewDialogLoading.value = false; + let obj: any = JSON.parse( + JSON.stringify(dialogueList[dialogueList.length - 1]) + ); + dialogueList[dialogueList.length - 1] = { + ...obj, + isVHtml: true, + VHtml: result || "", + }; + + await nextTick(); + + const allBoxes = document.querySelectorAll(".dialogueTextBox-text"); + const lastBox = allBoxes[allBoxes.length - 1]; + if (lastBox) { + const lastContent = result || ""; + isPrinting.value = true; + await handlePrintWord(lastBox, lastContent); + let obj: any = JSON.parse( + JSON.stringify(dialogueList[dialogueList.length - 1]) + ); + dialogueList[dialogueList.length - 1] = { + ...obj, + isOver: true, + }; + } + } + emit("handleEnterySearch"); + emit("handleWarningMap", warningData); +}; + +defineExpose({ + handleGetBusinessTrade: () => { + handleGetBusinessTrade(); + }, + handleSetWarningData: () => { + handleSetWarningData(); + }, + descObjRef, + descListRef, +}); + +