index.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880
  1. <template>
  2. <!-- 主页 -->
  3. <div class="homePage flex-col">
  4. <div class="homeBox">
  5. <s-header :name="sys ? sys.title : sysTitle" :noback="true" :isFixed="false"></s-header>
  6. <!-- 留言滚动条 -->
  7. <template v-if="noticeContent.title">
  8. <van-notice-bar @click="noticeClk" mode="link" :scrollable="true" color="rgba(64,77,116,1)" background="#fff"
  9. style="font-size: 0.375rem;" left-icon="volume-o" :text="noticeContent.title" />
  10. </template>
  11. <div class="intervalRow"></div>
  12. <div class="nameDeviceRow flex-col">
  13. <span class="txt3">{{ userName }}</span>
  14. <div class="l-flex-RC">
  15. <span class="info3" style="color: #4d6add;">{{ $t("home.totalEquipment") }} : {{ equipStatus.machineTotalNum
  16. }}</span>
  17. <div class="lineCon o-mlr-6"></div>
  18. <span class="word2" style="color: #07c160;">{{ $t("home.running") }} : {{ equipStatus.machineUseNum }}</span>
  19. </div>
  20. </div>
  21. <!-- 没有数据概览M14权限的人看不到数据概览和ECharts -->
  22. <!-- 数据概览 -->
  23. <!-- <div v-if="showDataDiv" class="titleBox flex-col">
  24. <div class="layer2 flex-row justify-between">
  25. <div class="section5 flex-col"></div>
  26. <div class="TextGroup2 flex-col">
  27. <span class="txt4">{{ $t("home.dataOverview") }}</span>
  28. </div>
  29. </div>
  30. </div> -->
  31. <!-- 时间选择 -->
  32. <dateSelectList v-if="showDataDiv" @update="update($event)"></dateSelectList>
  33. <!-- <typeSelectList v-if="showDataDiv" :isHome="true" @upselectdata="upselectdata($event)"></typeSelectList> -->
  34. <typeDownMenu v-if="showDataDiv" :isHome="true" @upselectdata="upselectdata($event)"></typeDownMenu>
  35. <!-- 订单数据 -->
  36. <div v-if="showDataDiv" class="o-plr-8 o-pt-10">
  37. <div class="salesData flex-col" @click="pushOrderCenter">
  38. <!-- <div class="block5 flex-col"> -->
  39. <div class="topTitle flex-row justify-end" v-if="isOrderData">
  40. <span class="txt10">{{ $t("home.orderData") }}</span>
  41. <div class="layer4 flex-col"></div>
  42. </div>
  43. <div class="salesDataBox flex-row">
  44. <div class="dataGroup flex-col">
  45. <div class="dataGroupBox l-flex-RC justify-center">
  46. <!-- 首页 - 订单数据 - 收入总额¥ -->
  47. <!-- <span class="word8">&yen;</span> -->
  48. <span class="currencySymbol o-pr-2">{{ currencySymbol }}</span>
  49. <span class="dataNum">{{ salesVolume.toFixed(2) }}</span>
  50. </div>
  51. <span class="dataText">{{ $t("home.totalIncome") }}</span>
  52. </div>
  53. <div class="dataGroup flex-col">
  54. <div class="dataGroupBox flex-col justify-between">
  55. <span class="dataNum">{{ salesNumber }}</span>
  56. <span class="dataText">{{ $t("home.productNum") }}</span>
  57. </div>
  58. </div>
  59. <div class="dataGroup flex-col">
  60. <div class="dataGroupBox flex-col justify-between">
  61. <span class="dataNum">{{ orderNumber }}</span>
  62. <span class="dataText">{{ $t("home.numberOfOrders") }}</span>
  63. </div>
  64. </div>
  65. </div>
  66. </div>
  67. <!-- </div> -->
  68. </div>
  69. <!-- 时间 -->
  70. <div v-if="showDataDiv" class="c-text-c" style="font-size: 18px; margin-top: 5px;">
  71. {{ Format_time(dateSelect.startDate, 'YYYY/MM/DD') }}-{{ Format_time(dateSelect.endDate, 'YYYY/MM/DD') }}
  72. </div>
  73. <!-- ECharts
  74. <template v-if="showDataDiv && !noData(salesVolume, salesNumber)">
  75. <div ref="chartBox" class="Chart1 flex-col"></div>
  76. </template>
  77. <template v-else>
  78. <kNoData v-if="showDataDiv"></kNoData>
  79. </template> -->
  80. <!-- <div> -->
  81. <div v-if="showDataDiv && !noData(salesVolume, salesNumber)">
  82. <div ref="chartBox" class="Chart1 flex-col"></div>
  83. </div>
  84. <kNoData v-else></kNoData>
  85. <!-- </div> -->
  86. <!-- 常用工具 -->
  87. <div v-if="user.type === 0">
  88. <div class="outer9 flex-col justify-center">
  89. <div class="main24 flex-col ">
  90. <div class="ImageText10 flex-col">
  91. <div class="wrap2 flex-row l-flex-RC">
  92. <div class="outer10 flex-col"></div>
  93. <div class="TextGroup13 flex-col">
  94. <span class="txt13">{{ $t("home.commonTools") }}</span>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <div class="outer11 flex-row">
  101. <div class="main25 flex-col" v-for="(item, index) in pushToolList" :key="index"
  102. @click="pushToolPage(item.value)">
  103. <img class="mod7 flex-col" :src="showLogo(item.value)" />
  104. <div class="TextGroup14 flex-col">
  105. <!-- <span class="info15" v-html="item.label"></span> -->
  106. <span class="info15">{{ $t(item.label) }}</span>
  107. </div>
  108. </div>
  109. </div>
  110. </div>
  111. <div v-if="showDataDiv && user.ifForeign === '1'">
  112. <!-- 机器销售额 -->
  113. <div class="outer9 flex-col justify-center">
  114. <div class="main24 flex-col">
  115. <div class="ImageText10 flex-col">
  116. <div class="wrap2 flex-row l-flex-RC">
  117. <div class="outer10 flex-col"></div>
  118. <div class="TextGroup13 flex-col">
  119. <span class="txt13">{{ $t("home.machineSales") }}</span>
  120. </div>
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. <!-- 各支付方式总额 -->
  126. <van-list offset="100" :immediate-check="false">
  127. <div v-for="item in combinedList" :key="item" class="o-ptb-10">
  128. <div>
  129. <van-cell-group inset class="machineSaleBox">
  130. <!-- 设备名称 -->
  131. <div class="contentWord kBordBott">{{ item.machineName }}
  132. </div>
  133. <!-- <van-row class="layer5" justify="space-between">
  134. <van-col span="12">总销售额: {{ item.totalSales }}</van-col>
  135. <van-col span="12">总现金: {{ item.totalCash }}</van-col>
  136. </van-row> -->
  137. <van-row class="layer5" justify="space-between">
  138. <!-- 硬币 -->
  139. <!-- <van-col span="8">{{ $t("home.coins") }}: {{ item.coins }}</van-col> -->
  140. <!-- 纸币 -->
  141. <!-- <van-col span="8">{{ $t("home.bills") }}: {{ item.bills }}</van-col> -->
  142. <!-- 硬币+纸币 -->
  143. <van-col span="12">{{ $t("home.coinsBills") }}: {{ item.coinsBills !== undefined ? item.coinsBills :
  144. '0'
  145. }}</van-col>
  146. <!-- 信用卡 -->
  147. <van-col span="12">{{ $t("home.creditCard") }}: {{ item.creditCard !== undefined ? item.creditCard :
  148. '0'
  149. }}</van-col>
  150. <!-- 电子支付 -->
  151. <!-- <van-col span="8">{{ $t("home.electronicPayment") }}: {{ item.electronicPayment }}</van-col> -->
  152. <!-- 所有支付方式合计 -->
  153. <van-col span="12">{{ $t("home.allPayTypeTotal") }}: {{ calculateTotal(item) }}</van-col>
  154. </van-row>
  155. </van-cell-group>
  156. </div>
  157. </div>
  158. </van-list>
  159. </div>
  160. </div>
  161. <!-- 通知弹窗 -->
  162. <kDialog :dialogTitle="$t('home.notificationPop.notification')" :cancelBtnTxt="$t('home.notificationPop.nextTime')"
  163. :confirmBtnTxt="$t('home.notificationPop.roger')" ref="kDialogRef" @confirmclk="confirmClk">
  164. <template #content>
  165. <div class="o-w" style="max-height: 50vh; overflow-y: auto" v-html="noticeContent.note"></div>
  166. </template>
  167. </kDialog>
  168. <van-dialog v-model:show="showAlarm" :title="$t('home.alarmTitle')" @confirm="confirmAlarm">
  169. <div style="max-height: 30vh; overflow-y: auto;">
  170. <div v-for="(item, index) in alarmList" :key="index" style="padding: 2px 5px;">
  171. <van-cell
  172. :title="$t('home.alarmDevice') + (item.name ? item.name : item.clientId.slice(-6)) + $t('home.alarmContent') + item.alarmContent" />
  173. </div>
  174. </div>
  175. </van-dialog>
  176. <template v-if="isShowRobot">
  177. <van-floating-bubble v-model:offset="offset" axis="xy" :icon="robotIcon" magnetic="x"
  178. @offset-change="onOffsetChange" @click="onClickBot">
  179. </van-floating-bubble>
  180. <van-popup v-model:show="popupVisible" position="bottom" :style="{ height: '90%' }" round @click="onClose">
  181. <iframe :src="aiUrl" sandbox="allow-same-origin allow-scripts allow-popups allow-forms"
  182. style="width: 100%; height: 100%;"></iframe>
  183. </van-popup>
  184. </template>
  185. </div>
  186. </template>
  187. <script>
  188. // 导入无数据组件
  189. import kNoData from "../../components/commom/kNoData/index.vue";
  190. import kDialog from "../../components/commom/kDialog/index.vue";
  191. import { onMounted, ref, nextTick } from "vue";
  192. import sHeader from "../../components/SimpleHeader";
  193. import dateSelectList from "../../components/dateSelectList";
  194. // import typeSelectList from "../../components/typeSelectList";
  195. import typeDownMenu from "../../components/typeDownMenu";
  196. import { getLoginUser, $M_Menus, Format_time, styleUrl } from "../../common/js/utils";
  197. import { useRouter } from "vue-router";
  198. import {
  199. getStatistics,
  200. Api_getNotice,
  201. Api_postMachineNum,
  202. Api_getUpdateNotice,
  203. getIsAlarm,
  204. Api_getEquipmentPageStatistics,
  205. } from "../../service/home";
  206. import dateUtil from "../../utils/dateUtil";
  207. import { useI18n } from "vue-i18n";
  208. import { showFailToast, showToast } from "vant";
  209. import RobotIcon from '@/assets/home/robot.png';
  210. import { getLocal, setLocal, navigatorLanguage } from "@/common/js/utils";
  211. export default {
  212. name: "home",
  213. components: {
  214. sHeader,
  215. // navBar,
  216. dateSelectList,
  217. // typeSelectList,
  218. typeDownMenu,
  219. kDialog,
  220. kNoData,
  221. // [Popup.name]: Popup,
  222. },
  223. setup() {
  224. // 是否显示机器人
  225. const isShowRobot = ref(false);
  226. // 设备状况
  227. const equipStatus = ref({});
  228. // 获取设备情况
  229. const getMachineNum = () => {
  230. Api_postMachineNum({ adminId: user.id }).then((res) => {
  231. equipStatus.value = res.data.data || {};
  232. });
  233. };
  234. const noticeContent = ref({});
  235. // 获取公告
  236. const getNotice = () => {
  237. Api_getNotice({ adminId: user.id }).then((res) => {
  238. noticeContent.value = res.data.data || {};
  239. });
  240. };
  241. const { t } = useI18n();
  242. // 通知弹窗
  243. const kDialogRef = ref(null);
  244. // 点击通知栏
  245. const noticeClk = () => {
  246. kDialogRef.value.openDialog();
  247. };
  248. // 点击右侧按钮
  249. const confirmClk = () => {
  250. Api_getUpdateNotice({
  251. adminId: user.id,
  252. }).then((res) => {
  253. showToast(res.data.message);
  254. setTimeout(() => {
  255. getNotice();
  256. }, 500);
  257. });
  258. };
  259. const firstLogin = ref(true);
  260. const user = getLoginUser();
  261. const router = useRouter();
  262. const userName = ref(user.name);
  263. const sys = ref(null);
  264. const sysTitle = ref(''); // 页头标题
  265. const pic1 = ref([
  266. { url: 'https://fastly.jsdelivr.net/npm/@vant/assets/apple-3.jpeg', isImage: true },
  267. // Uploader 根据文件后缀来判断是否为图片文件
  268. // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明
  269. ]);
  270. // 自定义货币符号
  271. const currencySymbol = ref("¥");
  272. if (user.currencySymbol) {
  273. currencySymbol.value = user.currencySymbol;
  274. } else {
  275. currencySymbol.value = "¥";
  276. }
  277. // 图表对象
  278. const chartBox = ref();
  279. let chartObj = null;
  280. // 跳转订单中心
  281. const pushOrderCenter = () => {
  282. router.push({ path: "/orderCenter" });
  283. };
  284. const dateSelect = ref({});
  285. const update = (uDate) => {
  286. dateSelect.value = uDate;
  287. getStatisticsFun();
  288. getMachineNameListFunc()
  289. };
  290. let typeSelectData = {};
  291. const upselectdata = (uSData) => {
  292. typeSelectData = uSData;
  293. getStatisticsFun();
  294. getMachineNameListFunc()
  295. };
  296. const salesVolume = ref(0);
  297. const salesNumber = ref(0);
  298. const orderNumber = ref(0);
  299. // 查询图表
  300. const getStatisticsFun = async () => {
  301. const params = {
  302. ...dateSelect.value,
  303. adminId: typeSelectData.adminId === null ? user.id : typeSelectData.adminId,
  304. ifForeign: typeSelectData.ifForeign === '' ? user.ifForeign : typeSelectData.ifForeign,
  305. payType: typeSelectData.payType,
  306. clientId: typeSelectData.clientId,
  307. username: typeSelectData.userName, // 商家
  308. companyType: typeSelectData.companyType, // 公司平台
  309. machineType: typeSelectData.machineType, // 设备类型
  310. equipmentId:
  311. typeSelectData.equipmentId === "" ? null : typeSelectData.equipmentId,
  312. };
  313. const { data } = await getStatistics(params);
  314. if (data.code && data.data) {
  315. salesVolume.value = 0;
  316. salesNumber.value = 0;
  317. orderNumber.value = 0;
  318. data.data.series[0].data.forEach((item) => {
  319. salesNumber.value = parseInt(salesNumber.value + item);
  320. });
  321. data.data.series[1].data.forEach((item) => {
  322. salesVolume.value = parseFloat(salesVolume.value) + parseFloat(item);
  323. });
  324. data.data.series[2].data.forEach((item) => {
  325. orderNumber.value = parseInt(orderNumber.value + item);
  326. });
  327. data.data.categories.forEach((item, index) => {
  328. if (item == "周1") {
  329. data.data.categories[index] = t("home.week.mon");
  330. }
  331. if (item == "周2") {
  332. data.data.categories[index] = t("home.week.tue");
  333. }
  334. if (item == "周3") {
  335. data.data.categories[index] = t("home.week.wed");
  336. }
  337. if (item == "周4") {
  338. data.data.categories[index] = t("home.week.thu");
  339. }
  340. if (item == "周5") {
  341. data.data.categories[index] = t("home.week.fri");
  342. }
  343. if (item == "周6") {
  344. data.data.categories[index] = t("home.week.sat");
  345. }
  346. if (item == "周日") {
  347. data.data.categories[index] = t("home.week.sun");
  348. }
  349. })
  350. // 解决eacharts与v-if的渲染问题
  351. await nextTick();
  352. if (chartBox.value) {
  353. chartObj = window.echarts.init(chartBox.value, null, {
  354. renderer: "canvas",
  355. useDirtyRect: false,
  356. });
  357. const option = {
  358. tooltip: {
  359. trigger: "axis",
  360. axisPointer: {
  361. type: "shadow",
  362. },
  363. },
  364. grid: {
  365. top: '10%',
  366. left: "3%",
  367. right: "4%",
  368. bottom: "10%",
  369. containLabel: true,
  370. height: 'auto',
  371. },
  372. legend: {
  373. bottom: 0,
  374. right: 10,
  375. itemWidth: 10,
  376. itemHeight: 10,
  377. icon: "rect",
  378. },
  379. // 固定屏幕显示多少个,其余的滑动
  380. dataZoom: [
  381. // {
  382. // type: 'slider',
  383. // xAxisIndex: 0,
  384. // filterMode: 'none',
  385. // // 开始的值
  386. // startValue: null,
  387. // // 结束的值
  388. // endValue: null,
  389. // // 锁定滑动的区域
  390. // // zoomLock:true,
  391. // },
  392. {
  393. type: "inside",
  394. xAxisIndex: 0,
  395. filterMode: "none",
  396. startValue: 0,
  397. endValue: 50,
  398. zoomLock: true,
  399. },
  400. ],
  401. xAxis: {
  402. type: "category",
  403. axisLabel: {
  404. rotate: 35,
  405. },
  406. data: data.data.categories,
  407. },
  408. yAxis: {
  409. type: "value",
  410. },
  411. series: [
  412. {
  413. ...data.data.series[0],
  414. type: "bar",
  415. itemStyle: { color: "#e59a6d" },
  416. name: t("home.productNum"),
  417. label: {
  418. show: true,
  419. position: "top",
  420. },
  421. },
  422. {
  423. ...data.data.series[1],
  424. type: "bar",
  425. itemStyle: { color: "#4d6add" },
  426. name: t("home.salesAmount"),
  427. label: {
  428. show: true,
  429. position: "top",
  430. },
  431. },
  432. ],
  433. };
  434. option.dataZoom[0]["startValue"] =
  435. data.data.categories[data.data.categories.length - 4];
  436. option.dataZoom[0]["endValue"] =
  437. data.data.categories[data.data.categories.length - 1];
  438. // option.dataZoom[0].start =
  439. // (data.data.categories.length - 5) * 10;
  440. // option.dataZoom[0].end =
  441. // (data.data.categories.length - 1) * 10;
  442. chartObj && chartObj.setOption(option);
  443. //图形宽度随屏幕宽度改变而改变
  444. window.onresize = chartObj.resize;
  445. }
  446. }
  447. };
  448. const pushToolList = ref([]);
  449. // 是否有报警
  450. const showAlarm = ref(false);
  451. const alarmList = ref([]);
  452. // 页面初始化
  453. onMounted(async () => {
  454. // 加载样式
  455. styleUrl('home');
  456. // 检测语言是否有缓存
  457. if (!getLocal("curLang")) {
  458. // 根据浏览器语言重新缓存到localstorage
  459. setLocal("curLang", navigatorLanguage());
  460. }
  461. if (localStorage.getItem("loginSys")) {
  462. const loginSysString = localStorage.getItem("loginSys");
  463. sys.value = JSON.parse(loginSysString);
  464. }
  465. firstLogin.value = localStorage.getItem('firstLogin');
  466. // 设置菜单权限
  467. menuSet();
  468. // 设置菜单权限, 只执行一次
  469. // once(menuSet);
  470. dateSelect.value = {
  471. chartType: "day",
  472. startDate: dateUtil.formateDate(
  473. new Date(new Date(new Date().getTime()).setHours(0, 0, 0, 0)),
  474. "yyyy-MM-dd hh:mm:ss"
  475. ),
  476. endDate: dateUtil.formateDate(
  477. new Date(new Date(new Date().getTime()).setHours(23, 59, 59, 59)),
  478. "yyyy-MM-dd hh:mm:ss"
  479. ),
  480. };
  481. typeSelectData = {
  482. userName: user.username,
  483. clientId: null,
  484. adminId: null,
  485. };
  486. getStatisticsFun();
  487. // 获取首页公告
  488. getNotice();
  489. // 获取设备情况
  490. getMachineNum();
  491. if (user.type > 1) {
  492. // 查询设备是否有报警
  493. const queryParams = {
  494. adminId: user.id,
  495. todayDate: dateUtil.formateDate(new Date(), "yyyy-MM-dd"), // 当天时间
  496. };
  497. const { data } = await getIsAlarm(queryParams);
  498. if (data.data != null) {
  499. if (firstLogin.value == 'true') {
  500. showAlarm.value = true;
  501. }
  502. alarmList.value = data.data;
  503. }
  504. }
  505. if (localStorage.getItem('curLang') == 'zh') { // 机器人仅在中文环境下使用
  506. isShowRobot.value = true;
  507. }
  508. getTitleFunc();
  509. if (user) {
  510. getMachineNameListFunc();
  511. }
  512. });
  513. const finished = ref(false);
  514. const loading = ref(true);
  515. // 设备销售数据
  516. const combinedList = ref([]); // 设备销额集合
  517. const calculateTotal = (item) => {
  518. let total = 0;
  519. // total += item.coins;
  520. // total += item.bills;
  521. // total += item.coinsBills;
  522. // total += item.creditCard;
  523. if (typeof item.coinsBills === 'number' && !isNaN(item.coinsBills)) {
  524. total += item.coinsBills;
  525. }
  526. if (typeof item.creditCard === 'number' && !isNaN(item.creditCard)) {
  527. total += item.creditCard;
  528. }
  529. // total += item.electronicPayment;
  530. return total;
  531. }
  532. const getMachineNameListFunc = async () => {
  533. combinedList.value = [];
  534. const searchParams = {
  535. adminId: user.id,
  536. ...dateSelect.value,
  537. }
  538. try {
  539. const { data } = await Api_getEquipmentPageStatistics(Object.assign({}, searchParams));
  540. if (data.code === "00000" && data.data) {
  541. for (let i = 0; i < data.data.categories.length; i++) {
  542. const machineNameVal = data.data.categories[i]; // 设备名称
  543. const coinsVal = data.data.series[0].data[i]; // 硬币销额
  544. const billsVal = data.data.series[1].data[i]; // 纸币销额
  545. const coinsBillsVal = data.data.series[2].data[i]; // 硬币+纸币销额
  546. const creditCardVal = data.data.series[3].data[i]; // 信用卡销额
  547. const electronicPaymentVal = data.data.series[4].data[i]; // 电子支付销额
  548. const machineSalesData = {
  549. // totalSales: totalSalesVal,
  550. // totalCash: totalCashVal,
  551. machineName: machineNameVal,
  552. coins: coinsVal,
  553. bills: billsVal,
  554. coinsBills: coinsBillsVal,
  555. creditCard: creditCardVal,
  556. electronicPayment: electronicPaymentVal
  557. }
  558. combinedList.value.push(machineSalesData);
  559. }
  560. } else {
  561. showFailToast(data.message);
  562. }
  563. } catch (error) {
  564. console.error("Error", error)
  565. }
  566. }
  567. const getTitleFunc = async () => {
  568. const currentDomain = window.location.href;
  569. // const currentDomain = window.location.hostname;
  570. switch (true) {
  571. // case currentDomain.includes('/shenze/'):
  572. // sysTitle.value = 'AETI GLOBAL';
  573. // break;
  574. case currentDomain.includes('/aeti/'):
  575. sysTitle.value = 'AETI GLOBAL';
  576. break;
  577. default:
  578. sysTitle.value = t('public.sysName');
  579. }
  580. }
  581. const confirmAlarm = () => {
  582. localStorage.setItem('firstLogin', false);
  583. }
  584. const menuList = [];
  585. const showDataDiv = ref(false);
  586. const isOrderData = ref(false);
  587. // 设置菜单权限
  588. const menuSet = () => {
  589. // 清空菜单列表
  590. menuList.length = 0;
  591. // 组合菜单权限
  592. user.menuCodeList.forEach((item) => {
  593. for (const key in $M_Menus) {
  594. // 设备管理M1,设备查看M2,订单数据M4,任务消息M6,销售排行M11,数据概览M14,订单退款M16,系统脱机M17 这些图标不用加载到底部菜单上
  595. if (
  596. item === key &&
  597. (
  598. item !== "M1" &&
  599. item !== "M2" && // M2本身就无logo
  600. item !== "M4" &&
  601. item !== "M6" &&
  602. item !== "M11" &&
  603. item !== "M14" &&
  604. item !== "M16" &&
  605. item !== "M17"
  606. )
  607. ) {
  608. menuList.push({
  609. label: $M_Menus[key],
  610. value: item
  611. });
  612. }
  613. }
  614. });
  615. // 赋值菜单
  616. pushToolList.value = menuList;
  617. // 查询是否有apk管理权限
  618. const isApkMan = user.menuCodeList.some((item) => {
  619. return item === "M19";
  620. });
  621. // 查询是否有账号权限
  622. const isAccount = user.menuCodeList.some((item) => {
  623. return item === "M8";
  624. });
  625. // 查询是否有订单数据权限
  626. isOrderData.value = user.menuCodeList.some((item) => {
  627. return item === "M4";
  628. })
  629. // 查询是否有订单导出权限
  630. // const isOrderExport = user.menuCodeList.some((item) => {
  631. // return item === "M9";
  632. // })
  633. // 查询是否有数据概览权限
  634. const isDataOverview = user.menuCodeList.some((item) => {
  635. return item === "M14";
  636. })
  637. // 如果没有apk管理
  638. if (!isApkMan) {
  639. // 如果是公司人,要把apk添加上去
  640. // if (user.type === 0 || user.type === 1) {
  641. // pushToolList.value.push({
  642. // label: t("home.apkMan"),
  643. // value: "M19"
  644. // });
  645. // }
  646. }
  647. if (user.type === 0) {
  648. pushToolList.value.push({
  649. label: t("role.mqtt"),
  650. value: "M21"
  651. });
  652. }
  653. // 如果没有账号权限
  654. if (!isAccount) {
  655. // 如果是公司人type=0,要把账号权限添加上去
  656. if (user.type === 0) {
  657. pushToolList.value.push({
  658. label: t("home.accountPermission"),
  659. value: "M8"
  660. });
  661. }
  662. }
  663. // 子商家以上级别,默认可以看到订单详情
  664. if (user.type === 0 || user.type === 2) {
  665. showDataDiv.value = true;
  666. } else {
  667. // 如果有数据概览权限 和 订单数据权限
  668. if (isDataOverview) {
  669. showDataDiv.value = true;
  670. }
  671. }
  672. };
  673. // 常用操作跳转页面
  674. const pushToolPage = (index) => {
  675. switch (index) {
  676. case "M1":
  677. router.push({ path: "/device" }); // 设备管理
  678. break;
  679. case "M3":
  680. router.push({ path: "/accountOperation" }); // 账户操作
  681. break;
  682. case "M4":
  683. router.push({ path: "/orderCenter" }); // 订单数据
  684. break;
  685. case "M5":
  686. router.push({ path: "/advertManage" }); // 广告管理
  687. break;
  688. case "M6":
  689. router.push({ path: "/taskMessage" });
  690. break;
  691. case "M7":
  692. router.push({ path: "/discountCode" });
  693. break;
  694. case "M8":
  695. router.push({ path: "/accountPer" });
  696. break;
  697. case "M9":
  698. router.push({ path: "/orderExport" });
  699. break;
  700. case "M10":
  701. router.push({ path: "/subLedgerManage" });
  702. break;
  703. case "M11":
  704. router.push({ path: "/robotranking" });
  705. break;
  706. case "M12":
  707. router.push({ path: "/joinpayMch" });
  708. break;
  709. case "M13":
  710. router.push({ path: "/shandeMch" });
  711. break;
  712. case "M15":
  713. router.push({ path: "/alarmHistory" }); // 报警历史
  714. break;
  715. case "M18":
  716. router.push({ path: "/labelMan" });
  717. break;
  718. case "M19":
  719. router.push({ path: "/apkManage" });
  720. break;
  721. case "M20":
  722. router.push({ path: "/merchantManage" });
  723. break;
  724. case "M21":
  725. router.push({ path: "/mqtt" });
  726. break;
  727. }
  728. };
  729. // 如果是空数据
  730. const noData = (volumes, nums) => {
  731. if (!volumes && !nums) {
  732. return true;
  733. }
  734. return false;
  735. };
  736. // 显示logo
  737. const showLogo = (url) => {
  738. return require(`../../assets/home/${url}.png`);
  739. };
  740. // const aiDialog = showDialog();
  741. const offset = ref({ x: Math.floor(window.innerWidth * 0.8), y: Math.floor(window.innerHeight * 0.75) });
  742. const popupVisible = ref(false);
  743. // const token = getLocal("token");
  744. // const openid = "f45sdFu2eXPtjeyzhUmcJ9wZiOSfPr";
  745. // const avatar = "用户头像";
  746. // 构建带有动态 token 和 openid 的 AI URL
  747. // const aiUrl = `https://chatbot.weixin.qq.com/webapp/auth/${token.value}?openid=${userName.value}&nickname=${userName.value}&avatar=${userName.value}&robotName=${"显示在页面顶部的title信息"}`;
  748. // const aiUrl = "https://chatbot.weixin.qq.com/webapp/f45sdFu2eXPtjeyzhUmcJ9wZiOSfPr?robotName=Ritchie"; // 微信对话-test
  749. // const aiUrl = "https://chatbot.aliyuncs.com/intl/index.htm?locale=zh-CN&from=0x0R41zuRE"; // 阿里云智能对话机器人
  750. const aiUrl = "https://chatbot.weixin.qq.com/webapp/c3thmydLGYWDugrgtfAj5I0Ng3sniv?robotName=Cotton%20Candy%20Robot"; // 阿里云智能对话机器人-ccbot
  751. // AI小助手
  752. const onClickBot = () => {
  753. popupVisible.value = true;
  754. }
  755. const onOffsetChange = (offset) => {
  756. offset.value = offset;
  757. }
  758. const onClose = () => {
  759. popupVisible.value = false;
  760. }
  761. // const onClickOverlay = () => {
  762. // popupVisible.value = false;
  763. // };
  764. // const onClickCloseIcon = () => {
  765. // popupVisible.value = false;
  766. // };
  767. return {
  768. user,
  769. userName,
  770. update,
  771. upselectdata,
  772. chartBox,
  773. pushOrderCenter,
  774. pushToolList,
  775. pushToolPage,
  776. salesVolume,
  777. salesNumber,
  778. orderNumber,
  779. sys,
  780. noticeClk,
  781. confirmClk,
  782. kDialogRef,
  783. noData,
  784. equipStatus,
  785. noticeContent,
  786. showLogo,
  787. dateSelect,
  788. Format_time,
  789. showDataDiv,
  790. currencySymbol,
  791. firstLogin,
  792. pic1,
  793. showAlarm,
  794. alarmList,
  795. confirmAlarm,
  796. onOffsetChange,
  797. robotIcon: RobotIcon,
  798. aiUrl,
  799. popupVisible,
  800. // onClickOverlay,
  801. // onClickCloseIcon,
  802. onClose,
  803. onClickBot,
  804. offset,
  805. isShowRobot,
  806. sysTitle,
  807. finished,
  808. loading,
  809. // machineName,
  810. // coins,
  811. // bills,
  812. // coinsBills,
  813. // creditCard,
  814. // electronicPayment,
  815. combinedList,
  816. isOrderData,
  817. calculateTotal
  818. };
  819. },
  820. };
  821. </script>
  822. <style lang="less" scoped>
  823. @import "../../common/style/common";
  824. </style>