robotRanking.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913
  1. <template>
  2. <div class="robotRanking flex-col" v-if="showRobotRankingDiv">
  3. <div class="box1 flex-col">
  4. <s-header :name="$t('robotRanking.machineSalesRanking')" :noback="true" :isFixed="false"></s-header>
  5. <div class="box3 flex-col">
  6. <div class="main1 flex-col">
  7. <div class="mod1 flex-col">
  8. <div class="section1 flex-row justify-between">
  9. <div class="ImageText1 flex-col">
  10. <div class="group4 flex-row justify-between">
  11. <div class="layer3 flex-col"></div>
  12. <span class="word3 flex-col">
  13. {{ $t("robotRanking.machineSalesRanking") }}
  14. </span>
  15. </div>
  16. </div>
  17. <div class="flex-col">
  18. <div @click="noticeClk" class="main5 flex-row justify-between">
  19. <img class="label2" src="@/assets/device/searchIcon.png" />
  20. </div>
  21. </div>
  22. </div>
  23. </div>
  24. <img class="img1" referrerpolicy="no-referrer" src="../assets/line.png" />
  25. <!-- 日销售排行 -->
  26. <div class="l-f l-flex-e o-plr-15">
  27. <span class="robotLabelName l-in c-text-13" style="color: #404d74">{{ $t("robotRanking.dailySalesRanking")
  28. }}:</span>
  29. <kTabs @tabclk="(e) => tabclk(e, 'day')" :tabList="tabDayList"></kTabs>
  30. </div>
  31. <div v-if="!totalNoData('day')" ref="dayChartBox" class="mod3 flex-col"></div>
  32. <kNoData v-else></kNoData>
  33. <div class="groove"></div>
  34. <!-- 周销售排行 -->
  35. <div class="l-f l-flex-e o-plr-15">
  36. <span class="robotLabelName l-in o-mr-6 c-text-13" style="color: #404d74">{{
  37. $t("robotRanking.salesRankingThisWeek") }}:</span>
  38. <kTabs @tabclk="(e) => tabclk(e, 'week')" :tabList="tabWeekList"></kTabs>
  39. </div>
  40. <div v-if="!totalNoData('week')" ref="weekChartBox" class="mod5 flex-col"></div>
  41. <kNoData v-else></kNoData>
  42. <div class="groove"></div>
  43. <!-- 月销售排行 -->
  44. <div class="l-f l-flex-e o-plr-15">
  45. <span class="robotLabelName l-in o-mr-6 c-text-13" style="color: #404d74">{{
  46. $t("robotRanking.salesRankingThisMonth") }}:</span>
  47. <kTabs @tabclk="(e) => tabclk(e, 'month')" :tabList="tabMonthList"></kTabs>
  48. </div>
  49. <div v-if="!totalNoData('month')" ref="monthChartBox" class="mod9 flex-col"></div>
  50. <kNoData v-else></kNoData>
  51. <div class="groove"></div>
  52. <!-- 年销售排行 -->
  53. <div class="l-f l-flex-e o-plr-15">
  54. <span class="robotLabelName l-in o-mr-6 c-text-13" style="color: #404d74">{{
  55. $t("robotRanking.salesRankingThisYear") }}:</span>
  56. <kTabs @tabclk="(e) => tabclk(e, 'year')" :tabList="tabYearList"></kTabs>
  57. </div>
  58. <div v-if="!totalNoData('year')" ref="yearChartBox" class="mod11 flex-col"></div>
  59. <kNoData v-else></kNoData>
  60. <div class="groove"></div>
  61. </div>
  62. </div>
  63. </div>
  64. <!-- 筛选弹窗 -->
  65. <kDialog :dialogTitle="$t('subLedgerManage.search.title')" :confirmBtnTxt="$t('subLedgerManage.search.screen')"
  66. ref="kDialogRef" @confirmclk="confirmClk">
  67. <template #content>
  68. <div class="cust_vantBorder">
  69. <!-- <van-field @click-input="busiInpClk" readonly clearable v-model="searchForm.businessName"
  70. :placeholder="$t('subLedgerManage.search.busiPlaceholder')" :label="$t('subLedgerManage.search.business')">
  71. <template #right-icon>
  72. <div class="l-flex-RC">
  73. <van-icon v-if="searchForm.businessName" @click="searchForm.businessName = ''" class="o-mr-6"
  74. name="clear" />
  75. <van-icon @click="busiInpClk" name="arrow-down" />
  76. </div>
  77. </template>
  78. </van-field> -->
  79. <van-field @click-input="changeTypeInpClk" readonly clearable v-model="searchForm.changeTypeName"
  80. :placeholder="$t('robotRanking.changeTypePlace')" :label="$t('robotRanking.changeType')">
  81. <template #right-icon>
  82. <div class="l-flex-RC">
  83. <van-icon v-if="searchForm.changeTypeName" @click="
  84. searchForm.changeTypeName = '';
  85. searchForm.changeType = '';
  86. " class="o-mr-6" name="clear" />
  87. <van-icon @click="changeTypeInpClk" name="arrow-down" />
  88. </div>
  89. </template>
  90. </van-field>
  91. <van-field @click-input="machineTypeInpClk" readonly clearable v-model="searchForm.machineTypeName"
  92. :placeholder="$t('robotRanking.machineTypePlace')" :label="$t('robotRanking.machineType')">
  93. <template #right-icon>
  94. <div class="l-flex-RC">
  95. <van-icon v-if="searchForm.machineTypeName" @click="
  96. searchForm.machineTypeName = '';
  97. searchForm.machineType = '';
  98. " class="o-mr-6" name="clear" />
  99. <van-icon @click="machineTypeInpClk" name="arrow-down" />
  100. </div>
  101. </template>
  102. </van-field>
  103. <van-field v-if="isAdmin()" @click-input="companyTypeInpClk" readonly clearable
  104. v-model="searchForm.companyTypeName" :placeholder="$t('robotRanking.companyTypePlaceholder')"
  105. :label="$t('robotRanking.companyTypeLabel')">
  106. <template #right-icon>
  107. <div class="l-flex-RC">
  108. <van-icon v-if="searchForm.companyTypeName" @click="
  109. searchForm.companyTypeName = '';
  110. searchForm.companyType = '';
  111. " class="o-mr-6" name="clear" />
  112. <van-icon @click="companyTypeInpClk" name="arrow-down" />
  113. </div>
  114. </template>
  115. </van-field>
  116. </div>
  117. </template>
  118. </kDialog>
  119. <!-- 商家选择框 -->
  120. <van-popup v-model:show="busiPopShow" position="bottom">
  121. <van-picker :title="$t('subLedgerManage.search.busiPlaceholder')" :columns="busiPopList"
  122. :columns-field-names="busiPopFieldName" @confirm="busiPopConfirm" @cancel="busiPopShow = false" />
  123. </van-popup>
  124. <!-- 统计方式弹窗 -->
  125. <van-popup v-model:show="changeTypeShow" position="bottom">
  126. <van-picker :default-index="chgTypeDefaIdx" :title="$t('robotRanking.changeTypePlace')" :columns="changeTypePopList"
  127. :columns-field-names="yearPopFieldName" @confirm="changeTypePopConfirm" @cancel="changeTypeShow = false" />
  128. </van-popup>
  129. <!-- 设备类型弹窗 -->
  130. <van-popup v-model:show="machineTypeShow" position="bottom">
  131. <van-picker :default-index="maTypeDefaIdx" :title="$t('robotRanking.machineTypePlace')"
  132. :columns="machineTypePopList" :columns-field-names="yearPopFieldName" @confirm="machineTypePopConfirm"
  133. @cancel="machineTypeShow = false" />
  134. </van-popup>
  135. <!-- 公司平台弹窗 -->
  136. <van-popup v-model:show="companyTypeShow" position="bottom">
  137. <van-picker :default-index="maTypeDefaIdx" :title="$t('robotRanking.companyTypePlaceholder')"
  138. :columns="companyTypePopList" :columns-field-names="yearPopFieldName" @confirm="companyTypePopConfirm"
  139. @cancel="companyTypeShow = false" />
  140. </van-popup>
  141. <!-- 日的日期选择弹窗 -->
  142. <van-calendar @confirm="calendarDayConfirm" v-model:show="dayShow" color="#4d6add" :min-date="minDate"
  143. :show-confirm="false" />
  144. <!-- 周的日期选择弹窗 -->
  145. <van-calendar @confirm="(e) => {
  146. calendarWeekOrMonConfirm(e, 1);
  147. }
  148. " v-model:show="weekShow" :allow-same-day="true" color="#4d6add" :min-date="minDate" type="range" />
  149. <!-- 月的日期选择弹窗 -->
  150. <van-calendar @confirm="(e) => {
  151. calendarWeekOrMonConfirm(e, 2);
  152. }
  153. " v-model:show="monthShow" :allow-same-day="true" color="#4d6add" :min-date="minDate" type="range" />
  154. <!-- 年的日期选择弹窗 -->
  155. <van-popup v-model:show="yearShow" position="bottom">
  156. <van-picker :title="$t('robotRanking.yearPopTitle')" :columns="yearPopList" :columns-field-names="yearPopFieldName"
  157. @confirm="yearPopConfirm" @cancel="yearShow = false" />
  158. </van-popup>
  159. <!-- <nav-bar></nav-bar> -->
  160. </div>
  161. <div v-else class="noPermission" style="justify-content: center;">
  162. <div class="box1 flex-col" style="text-align: center;">
  163. <s-header :name="$t('robotRanking.machineSalesRanking')" :noback="true" :isFixed="false"></s-header>
  164. <view>
  165. <br />
  166. </view>
  167. <view>{{ $t('robotRanking.noPermission') }}</view>
  168. </div>
  169. </div>
  170. </template>
  171. <script>
  172. // 导入无数据组件
  173. import kNoData from "../components/commom/kNoData/index.vue";
  174. import { onMounted, ref, reactive, computed, nextTick } from "vue";
  175. import sHeader from "../components/SimpleHeader";
  176. // import navBar from "../components/NavBar";
  177. import { getRankingList } from "../service/robotRanking";
  178. import { getLoginUser, styleUrl } from "../common/js/utils";
  179. import kTabs from "../components/commom/kTabs/index.vue";
  180. import kDialog from "../components/commom/kDialog/index.vue";
  181. import moment from "moment";
  182. import { showToast } from "vant";
  183. import { useI18n } from "vue-i18n";
  184. export default {
  185. setup() {
  186. // 引入语言
  187. const { t } = useI18n();
  188. // 日周月年的数据
  189. const totalObj = reactive({
  190. dayData: {},
  191. weekData: {},
  192. monthData: {},
  193. yearData: {},
  194. });
  195. // 日周月年图表没有数据
  196. const totalNoData = computed(() => (idx) => {
  197. let dataObj;
  198. switch (idx) {
  199. case "day":
  200. dataObj = totalObj.dayData;
  201. break;
  202. case "week":
  203. dataObj = totalObj.weekData;
  204. break;
  205. case "month":
  206. dataObj = totalObj.monthData;
  207. break;
  208. case "year":
  209. dataObj = totalObj.yearData;
  210. break;
  211. }
  212. if (!dataObj || dataObj?.categories?.length === 0) {
  213. return true;
  214. }
  215. return false;
  216. });
  217. // 统计方式弹窗
  218. const changeTypeInpClk = () => {
  219. changeTypeShow.value = true;
  220. };
  221. // 是否管理员
  222. const isAdmin = () => { return (user && user.type === 0); }
  223. // 公司平台弹窗
  224. const companyTypeInpClk = () => {
  225. companyTypeShow.value = true;
  226. };
  227. // 设备类型弹窗
  228. const machineTypeInpClk = () => {
  229. machineTypeShow.value = true;
  230. };
  231. const changeTypeShow = ref(false);
  232. const machineTypeShow = ref(false);
  233. const companyTypeShow = ref(false);
  234. // 默认选中
  235. const chgTypeDefaIdx = ref(1);
  236. const maTypeDefaIdx = ref("");
  237. const changeTypePopList = [
  238. {
  239. name: t("robotRanking.patternStatistics"),
  240. id: 1,
  241. },
  242. {
  243. name: t("robotRanking.salesStatistics"),
  244. id: 0,
  245. },
  246. ];
  247. const machineTypePopList = [
  248. {
  249. name: t("robotRanking.whole"),
  250. id: "",
  251. },
  252. {
  253. name: t("robotRanking.MG"),
  254. id: "0",
  255. },
  256. {
  257. name: t("robotRanking.POP"),
  258. id: "1",
  259. },
  260. ];
  261. const companyTypePopList = [
  262. {
  263. name: t("robotRanking.whole"),
  264. id: "",
  265. },
  266. {
  267. name: t("robotRanking.sz"),
  268. id: "0",
  269. },
  270. {
  271. name: t("robotRanking.sc"),
  272. id: "1",
  273. },
  274. ];
  275. const changeTypePopConfirm = ({ selectedOptions }) => {
  276. searchForm.changeType = selectedOptions[0].id;
  277. searchForm.changeTypeName = selectedOptions[0].name;
  278. changeTypeShow.value = false;
  279. };
  280. const machineTypePopConfirm = ({ selectedOptions }) => {
  281. searchForm.machineType = selectedOptions[0].id;
  282. searchForm.machineTypeName = selectedOptions[0].name;
  283. machineTypeShow.value = false;
  284. };
  285. const companyTypePopConfirm = ({ selectedOptions }) => {
  286. searchForm.companyType = selectedOptions[0].id;
  287. searchForm.companyTypeName = selectedOptions[0].name;
  288. companyTypeShow.value = false;
  289. };
  290. // 年的日期选择弹窗
  291. // 点击确定
  292. const yearPopConfirm = ({ selectedOptions }) => {
  293. const year = selectedOptions[0].id;
  294. const startDate =
  295. moment().year(year).startOf("year").format("YYYY-MM-DD") + " 00:00:00";
  296. const endDate =
  297. moment().year(year).endOf("year").format("YYYY-MM-DD") + " 23:59:59";
  298. console.log("startDate", startDate);
  299. console.log("endDate", endDate);
  300. getEquipRankList("year", startDate, endDate);
  301. yearShow.value = false;
  302. };
  303. // 获取当前年前4年后1年
  304. let yearPopList = [];
  305. for (let i = 0; i < 4; i++) {
  306. const year = moment().subtract(i, "years").format("YYYY");
  307. yearPopList.push({
  308. name: year,
  309. id: year,
  310. });
  311. }
  312. const yearPopFieldName = reactive({
  313. text: "name",
  314. value: "id",
  315. });
  316. const yearShow = ref(false);
  317. const currentDate = ref(new Date());
  318. const yearFormatter = (type, val) => {
  319. if (type === "year") {
  320. return val;
  321. }
  322. return val;
  323. };
  324. // 周和月的日期选择弹窗
  325. const weekShow = ref(false);
  326. const monthShow = ref(false);
  327. const calendarWeekOrMonConfirm = (e, idx) => {
  328. const startDate = e[0];
  329. const endDate = e[1];
  330. let weekOrMont = "month";
  331. // 如果是周计算开始和结束日期相差多少天,因为周不能超过7天
  332. if (idx === 1) {
  333. weekOrMont = "week";
  334. const differDays = moment(endDate).diff(moment(startDate), "days");
  335. if (differDays >= 7) {
  336. showToast(t("robotRanking.seleWeekDateRangeNotSeveDays"));
  337. return;
  338. }
  339. }
  340. const startTime = moment(e[0]).format("YYYY-MM-DD") + " 00:00:00";
  341. const endTime = moment(e[1]).format("YYYY-MM-DD") + " 23:59:59";
  342. getEquipRankList(weekOrMont, startTime, endTime);
  343. if (idx === 1) {
  344. weekShow.value = false;
  345. } else {
  346. monthShow.value = false;
  347. }
  348. };
  349. // 日的日期选择弹窗
  350. // 日历选择触发
  351. const calendarDayConfirm = (e) => {
  352. const startDate = moment(e).format("YYYY-MM-DD") + " 00:00:00";
  353. const endDate = moment(e).format("YYYY-MM-DD") + " 23:59:59";
  354. getEquipRankList("day", startDate, endDate);
  355. dayShow.value = false;
  356. };
  357. // 最小日期选择
  358. const minDate = new Date(2018, 1, 1);
  359. const dayShow = ref(false);
  360. // 日,周,月,年的tab栏数据
  361. const tabDayList = ref([
  362. {
  363. name: t("robotRanking.today"),
  364. icon: "",
  365. id: 1,
  366. },
  367. {
  368. name: t("robotRanking.yesterday"),
  369. icon: "",
  370. id: 2,
  371. },
  372. {
  373. name: t("robotRanking.other"),
  374. icon: "arrow-down",
  375. id: 3,
  376. },
  377. ]);
  378. const tabWeekList = ref([
  379. {
  380. name: t("robotRanking.thisWeek"),
  381. icon: "",
  382. id: 1,
  383. },
  384. {
  385. name: t("robotRanking.lastWeek"),
  386. icon: "",
  387. id: 2,
  388. },
  389. {
  390. name: t("robotRanking.other"),
  391. icon: "arrow-down",
  392. id: 3,
  393. },
  394. ]);
  395. const tabMonthList = ref([
  396. {
  397. name: t("robotRanking.thisMonth"),
  398. icon: "",
  399. id: 1,
  400. },
  401. {
  402. name: t("robotRanking.lastMonth"),
  403. icon: "",
  404. id: 2,
  405. },
  406. {
  407. name: t("robotRanking.other"),
  408. icon: "arrow-down",
  409. id: 3,
  410. },
  411. ]);
  412. const tabYearList = ref([
  413. {
  414. name: t("robotRanking.thisYear"),
  415. icon: "",
  416. id: 1,
  417. },
  418. {
  419. name: t("robotRanking.lastYear"),
  420. icon: "",
  421. id: 2,
  422. },
  423. {
  424. name: t("robotRanking.other"),
  425. icon: "arrow-down",
  426. id: 3,
  427. },
  428. ]);
  429. // 默认进来的时间
  430. const defaultTime = reactive({
  431. // 今日
  432. todayStart: moment().format("YYYY-MM-DD") + " 00:00:00",
  433. todayEnd: moment().format("YYYY-MM-DD") + " 23:59:59",
  434. // 昨日
  435. colastdayStart:
  436. moment()
  437. .day(moment().day() - 1)
  438. .format("YYYY-MM-DD") + " 00:00:00",
  439. colastdayEnd:
  440. moment()
  441. .day(moment().day() - 1)
  442. .format("YYYY-MM-DD") + " 23:59:59",
  443. // 这周
  444. weekStart: moment().weekday(1).format("YYYY-MM-DD") + " 00:00:00",
  445. weekEnd: moment().weekday(7).format("YYYY-MM-DD") + " 23:59:59",
  446. // 上周
  447. lastWeekStart: moment().week(moment().week() - 1).startOf('week').add(1, 'days').format("YYYY-MM-DD") + " 00:00:00",
  448. // moment()
  449. // .week(moment().week() - 1)
  450. // .startOf("week")
  451. // .format("YYYY-MM-DD") + " 00:00:00",
  452. lastWeekEnd: moment().week(moment().week() - 1).endOf('week').add(1, 'days').format("YYYY-MM-DD") + " 23:59:59",
  453. // moment()
  454. // .week(moment().week() - 1)
  455. // .endOf("week")
  456. // .format("YYYY-MM-DD") + " 23:59:59",
  457. // 这个月
  458. monthStart: moment().startOf("month").format("YYYY-MM-DD") + " 00:00:00",
  459. monthEnd: moment().endOf("month").format("YYYY-MM-DD") + " 23:59:59",
  460. // 上个月
  461. lastmonthStart:
  462. moment()
  463. .month(moment().month() - 1)
  464. .startOf("month")
  465. .format("YYYY-MM-DD") + " 00:00:00",
  466. lastmonthEnd:
  467. moment()
  468. .month(moment().month() - 1)
  469. .endOf("month")
  470. .format("YYYY-MM-DD") + " 23:59:59",
  471. // 今年
  472. yearStart: moment().startOf("year").format("YYYY-MM-DD") + " 00:00:00",
  473. yearEnd: moment().endOf("year").format("YYYY-MM-DD") + " 23:59:59",
  474. // 上年
  475. lastYearStart:
  476. moment()
  477. .year(moment().year() - 1)
  478. .startOf("year")
  479. .format("YYYY-MM-DD") + " 00:00:00",
  480. lastYearEnd:
  481. moment()
  482. .year(moment().year() - 1)
  483. .endOf("year")
  484. .format("YYYY-MM-DD") + " 23:59:59",
  485. });
  486. // 点击tab
  487. const tabclk = (e, type) => {
  488. let startDate = "";
  489. let endDate = "";
  490. switch (type) {
  491. case "day":
  492. switch (e.name) {
  493. case 0:
  494. startDate = defaultTime.todayStart;
  495. endDate = defaultTime.todayEnd;
  496. break;
  497. case 1:
  498. startDate = defaultTime.colastdayStart;
  499. endDate = defaultTime.colastdayEnd;
  500. break;
  501. case 2:
  502. // 打开日历弹窗
  503. dayShow.value = true;
  504. break;
  505. }
  506. break;
  507. case "week":
  508. switch (e.name) {
  509. case 0:
  510. startDate = defaultTime.weekStart;
  511. endDate = defaultTime.weekEnd;
  512. break;
  513. case 1:
  514. startDate = defaultTime.lastWeekStart;
  515. endDate = defaultTime.lastWeekEnd;
  516. break;
  517. case 2:
  518. // 打开周的日期选择弹窗
  519. weekShow.value = true;
  520. break;
  521. }
  522. break;
  523. case "month":
  524. switch (e.name) {
  525. case 0:
  526. startDate = defaultTime.monthStart;
  527. endDate = defaultTime.monthEnd;
  528. break;
  529. case 1:
  530. startDate = defaultTime.lastmonthStart;
  531. endDate = defaultTime.lastmonthEnd;
  532. break;
  533. case 2:
  534. // 打开月的日期选择弹窗
  535. monthShow.value = true;
  536. break;
  537. }
  538. break;
  539. case "year":
  540. switch (e.name) {
  541. case 0:
  542. startDate = defaultTime.yearStart;
  543. endDate = defaultTime.yearEnd;
  544. break;
  545. case 1:
  546. startDate = defaultTime.lastYearStart;
  547. endDate = defaultTime.lastYearEnd;
  548. break;
  549. case 2:
  550. // 打开年的日期弹窗
  551. yearShow.value = true;
  552. break;
  553. }
  554. break;
  555. }
  556. // 如果是点击其他,不用请求
  557. if (e.name !== 2) {
  558. // 获取日、周、月、年的排行数据
  559. getEquipRankList(type, startDate, endDate);
  560. }
  561. };
  562. const changeType = ref(0);
  563. const companyType = ref(""); // 公司平台
  564. const machineType = ref(""); // 设备类型
  565. let chartObj = {
  566. day: null,
  567. week: null,
  568. month: null,
  569. year: null,
  570. };
  571. // 获取日、周、月、年的排行数据
  572. const getEquipRankList = (chartType, startDate, endDate) => {
  573. let param = {
  574. adminId: user.id,
  575. ifForeign: user.ifForeign,
  576. changeType: changeType.value, //必填,默认为一0:销售额统计,1:花型统计
  577. companyType: companyType.value,
  578. machineType: machineType.value,
  579. chartType,
  580. startDate,
  581. endDate,
  582. };
  583. getRankingList(param).then(async (res) => {
  584. const { data } = res;
  585. switch (chartType) {
  586. case "day":
  587. totalObj.dayData = data.data;
  588. // console.log("日返回值", data);
  589. break;
  590. case "week":
  591. totalObj.weekData = data.data;
  592. // console.log("周返回值", data);
  593. break;
  594. case "month":
  595. totalObj.monthData = data.data;
  596. // console.log("月返回值", data);
  597. break;
  598. case "year":
  599. totalObj.yearData = data.data;
  600. // console.log("年返回值", data);
  601. break;
  602. }
  603. // 有数据返回则处理
  604. if (data.code && data.data) {
  605. // echarts的配置
  606. const chartOption = {
  607. tooltip: {
  608. trigger: "axis",
  609. axisPointer: {
  610. type: "shadow",
  611. },
  612. borderWidth: 1,
  613. textStyle:{
  614. fontSize : 12
  615. }
  616. },
  617. // 固定屏幕显示多少个,其余的滑动
  618. dataZoom: [
  619. // {
  620. // type: 'slider',
  621. // xAxisIndex: 0,
  622. // filterMode: 'none',
  623. // // 开始的值
  624. // startValue: null,
  625. // // 结束的值
  626. // endValue: null,
  627. // // 锁定滑动的区域
  628. // // zoomLock:true,
  629. // },
  630. {
  631. type: "inside",
  632. xAxisIndex: 0,
  633. filterMode: "none",
  634. startValue: null,
  635. endValue: null,
  636. zoomLock: true,
  637. },
  638. ],
  639. grid: {
  640. left: "5%",
  641. right: "5%",
  642. bottom: "10%",
  643. containLabel: true,
  644. },
  645. legend: {
  646. bottom: 0,
  647. right: 10,
  648. itemWidth: 10,
  649. itemHeight: 10,
  650. icon: "rect",
  651. },
  652. yAxis: { type: "value" },
  653. xAxis: {
  654. type: "category",
  655. axisLabel: {
  656. rotate: 20,
  657. },
  658. data: [],
  659. },
  660. series: [],
  661. };
  662. await nextTick();
  663. let chartBox;
  664. switch (chartType) {
  665. case "day":
  666. chartBox = dayChartBox.value;
  667. break;
  668. case "week":
  669. chartBox = weekChartBox.value;
  670. break;
  671. case "month":
  672. chartBox = monthChartBox.value;
  673. break;
  674. case "year":
  675. chartBox = yearChartBox.value;
  676. break;
  677. }
  678. if (chartBox) {
  679. const dayChartOption = Object.assign({}, chartOption);
  680. dayChartOption.xAxis.data = data.data.categories;
  681. dayChartOption.series = [
  682. {
  683. ...data.data.series[0],
  684. type: "bar",
  685. itemStyle: { color: "#e59a6d" },
  686. name: t("home.productNum"),
  687. label: {
  688. show: true,
  689. position: "top",
  690. },
  691. },
  692. {
  693. ...data.data.series[1],
  694. type: "bar",
  695. itemStyle: { color: "#4d6add" },
  696. name: t("home.salesAmount"),
  697. label: {
  698. show: true,
  699. position: "top",
  700. },
  701. },
  702. ];
  703. dayChartOption.dataZoom[0]["startValue"] =
  704. data.data.categories[0];
  705. dayChartOption.dataZoom[0]["endValue"] =
  706. data.data.categories[3];
  707. // 解决resize不起作用,配合onMounted里的方法使用
  708. switch (chartType) {
  709. case "day":
  710. chartObj.day = window.echarts.init(chartBox, null, {
  711. renderer: "canvas",
  712. useDirtyRect: false,
  713. });
  714. chartObj.day && chartObj.day.setOption(dayChartOption);
  715. break;
  716. case "week":
  717. chartObj.week = window.echarts.init(chartBox, null, {
  718. renderer: "canvas",
  719. useDirtyRect: false,
  720. });
  721. chartObj.week && chartObj.week.setOption(dayChartOption);
  722. break;
  723. case "month":
  724. chartObj.month = window.echarts.init(chartBox, null, {
  725. renderer: "canvas",
  726. useDirtyRect: false,
  727. });
  728. chartObj.month && chartObj.month.setOption(dayChartOption);
  729. break;
  730. case "year":
  731. chartObj.year = window.echarts.init(chartBox, null, {
  732. renderer: "canvas",
  733. useDirtyRect: false,
  734. });
  735. chartObj.year && chartObj.year.setOption(dayChartOption);
  736. break;
  737. }
  738. }
  739. }
  740. });
  741. };
  742. const user = getLoginUser();
  743. // 默认能看到机器排行
  744. const showRobotRankingDiv = ref(true);
  745. const isM11Included = user.menuCodeList.some((item) => item === "M11");
  746. // 日、周、月、年的图表
  747. const dayChartBox = ref();
  748. const weekChartBox = ref();
  749. const monthChartBox = ref();
  750. const yearChartBox = ref();
  751. // 初始化页面获取列表
  752. onMounted(async () => {
  753. // 加载样式
  754. styleUrl('robotRanking');
  755. // 默认筛选选中
  756. searchForm.changeTypeName = t("robotRanking.salesStatistics");
  757. searchForm.changeType = 0;
  758. searchForm.companyTypeName = t("robotRanking.whole");
  759. searchForm.machineTypeName = t("robotRanking.whole");
  760. // 查询是否有订单数据权限
  761. // const isOrderData = user.menuCodeList.some((item) => {
  762. // return item === "M4";
  763. // })
  764. // 子商家type=3和公司人员type=1,默认看不到
  765. if ((user.type > 2 || user.type === 1) && !isM11Included) {
  766. showRobotRankingDiv.value = false;
  767. }
  768. // 如果是type为admin或者商家或者是有订单数据权限M4的子商家才可以查看
  769. // if (user.type === 0 || user.type === 2 || isOrderData) {
  770. // init();
  771. // }
  772. if (user.type === 0 || user.type === 2 || isM11Included) {
  773. init();
  774. }
  775. window.addEventListener("resize", () => {
  776. chartObj.day && chartObj.day.resize();
  777. chartObj.week && chartObj.week.resize();
  778. chartObj.month && chartObj.month.resize();
  779. chartObj.year && chartObj.year.resize();
  780. });
  781. });
  782. // 刚进页面获取
  783. const init = () => {
  784. // 获取日的排行数据
  785. getEquipRankList("day", defaultTime.todayStart, defaultTime.todayEnd);
  786. // 获取周的排行数据
  787. getEquipRankList("week", defaultTime.weekStart, defaultTime.weekEnd);
  788. // 获取月的排行数据
  789. getEquipRankList("month", defaultTime.monthStart, defaultTime.monthEnd);
  790. // 获取年的排行数据
  791. getEquipRankList("year", defaultTime.yearStart, defaultTime.yearEnd);
  792. };
  793. const searchForm = reactive({
  794. businessName: "",
  795. changeTypeName: "",
  796. changeType: "",
  797. machineTypeName: "",
  798. machineType: "",
  799. companyTypeName: "",
  800. companyType: ""
  801. });
  802. const kDialogRef = ref(null);
  803. const busiPopShow = ref(false);
  804. const busiPopList = reactive([
  805. {
  806. name: "商户1",
  807. id: "1",
  808. },
  809. {
  810. name: "商户2",
  811. id: "2",
  812. },
  813. ]);
  814. const busiPopFieldName = reactive({
  815. text: "name",
  816. value: "id",
  817. });
  818. // 点击筛选
  819. const noticeClk = () => {
  820. kDialogRef.value.openDialog();
  821. };
  822. // 点击右侧按钮
  823. const confirmClk = () => {
  824. if (searchForm.changeType === "") {
  825. changeType.value = 1;
  826. } else {
  827. changeType.value = searchForm.changeType;
  828. }
  829. companyType.value = searchForm.companyType;
  830. machineType.value = searchForm.machineType;
  831. init();
  832. };
  833. // 筛选弹窗
  834. // 点击商家输入框
  835. const busiInpClk = () => {
  836. // console.log(111111111);
  837. busiPopShow.value = true;
  838. };
  839. const busiPopConfirm = (e) => {
  840. // console.log("e的值是", e);
  841. busiPopShow.value = false;
  842. searchForm.businessName = e.name;
  843. };
  844. const busiPopCancel = () => {
  845. busiPopShow.value = false;
  846. };
  847. return {
  848. dayChartBox,
  849. weekChartBox,
  850. monthChartBox,
  851. yearChartBox,
  852. tabclk,
  853. tabDayList,
  854. tabWeekList,
  855. tabMonthList,
  856. tabYearList,
  857. noticeClk,
  858. kDialogRef,
  859. busiInpClk,
  860. busiPopShow,
  861. busiPopConfirm,
  862. busiPopList,
  863. busiPopFieldName,
  864. busiPopCancel,
  865. confirmClk,
  866. searchForm,
  867. dayShow,
  868. minDate,
  869. calendarDayConfirm,
  870. weekShow,
  871. monthShow,
  872. calendarWeekOrMonConfirm,
  873. yearFormatter,
  874. currentDate,
  875. yearShow,
  876. yearPopList,
  877. yearPopConfirm,
  878. yearPopFieldName,
  879. changeTypeShow,
  880. changeTypePopList,
  881. changeTypePopConfirm,
  882. changeTypeInpClk,
  883. companyTypeInpClk,
  884. companyTypePopConfirm,
  885. companyTypePopList,
  886. companyTypeShow,
  887. machineTypeInpClk,
  888. machineTypePopConfirm,
  889. machineTypePopList,
  890. machineTypeShow,
  891. totalNoData,
  892. maTypeDefaIdx,
  893. chgTypeDefaIdx,
  894. isAdmin,
  895. showRobotRankingDiv,
  896. };
  897. },
  898. components: { sHeader, kTabs, kDialog, kNoData },
  899. };
  900. </script>
  901. <style lang="less" scoped>
  902. @import "../styles/robotRanking/index";
  903. </style>