index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. <template>
  2. <!-- 订单分析 -->
  3. <div class="page flex-col">
  4. <s-header :name="$t('orderExport.orderAnalysis')" :noback="false"></s-header>
  5. <div class="Body flex-col">
  6. <div class="mod3 flex-col">
  7. <div class="group1 flex-col">
  8. <div class="titleBox flex-col">
  9. <div class="layer2 flex-row">
  10. <div class="section5 flex-col"></div>
  11. <div class="TextGroup2 flex-col">
  12. <span class="txt4">{{ $t("orderExport.dataOverview") }}</span>
  13. </div>
  14. </div>
  15. </div>
  16. <div class="dateSelectBox">
  17. <dateSelectList @update="update($event)"></dateSelectList>
  18. </div>
  19. <div class="l-f l-flex-e o-plr-15 o-pt-10">
  20. <span class="o-mr-6 c-text-13 c-text-color">{{ $t("orderExport.groupType") }}:</span>
  21. <kTabs @tabchg="tabChg" :tabList="tabList"></kTabs>
  22. </div>
  23. <div class="mod7 flex-col">
  24. <div class="box1 flex-col justify-between">
  25. <div class="group4 l-flex-between">
  26. <div class="ImageText2 l-flex-RC">
  27. <div class="mod8 l-flex-RC">
  28. <div class="group5 flex-col"></div>
  29. <div class="TextGroup2 flex-col">
  30. <span class="txt1 c-text-w6">{{
  31. $t("orderExport.orderDetails")
  32. }}</span>
  33. </div>
  34. </div>
  35. </div>
  36. <div class="l-flex-RC">
  37. <div class="c-text-13 l-flex-RC text5">
  38. <span @click="noticeClk" class="">{{
  39. $t("orderExport.clickFilter")
  40. }}</span>
  41. <div class="outer4 flex-col o-ml-6"></div>
  42. </div>
  43. <div @click="exportOrder()" class="c-text-13 l-flex-RC o-ml-20 c-text-color">
  44. <span class="">{{
  45. $t("orderExport.exportToExcel")
  46. }}</span>
  47. <div class="outer4 flex-col o-ml-6"></div>
  48. </div>
  49. </div>
  50. </div>
  51. <img class="img2" referrerpolicy="no-referrer"
  52. src="https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPng8947935ab81635fdedd8124b11e305eef66286421b69c84fef22233014a3fa9a" />
  53. </div>
  54. </div>
  55. <van-pull-refresh disabled v-model="refreshing" @refresh="onRefresh">
  56. <van-list v-model="loading" :finished="finished" :finished-text="$t('common.noMoreTxt')" @load="onLoad"
  57. :offset="300" :immediate-check="false">
  58. <div v-for="(item, index) in tableData" :key="index" class="orderItem">
  59. <div class="mod9 flex-row">
  60. <span class="info7">&yen;</span>
  61. <span class="info8">{{ item.priceTotal }}</span>
  62. <span class="word9">{{ $t("orderExport.totalSales") }}</span>
  63. </div>
  64. <div class="mod10 flex-row">
  65. <span class="txt3 o-mr-10">{{ item.username }}</span>
  66. <span class="txt4 c-text-line1">{{ item.name }},{{ item.phone }}</span>
  67. </div>
  68. <span class="info9">{{ item.address }}</span>
  69. <div class="mod11 flex-col">
  70. <span v-if="type == 2" class="txt5">{{ item.equipmentTotal }}{{ $t("orderExport.machines") }},{{
  71. $t("orderExport.superior")
  72. }}:{{ item.lastUsername }}</span>
  73. <div v-else class="txt5 l-flex-RC">
  74. <div>{{ item.equipmentType }}</div>
  75. <div class="lineCon o-mlr-6"></div>
  76. <div>{{ item.clientId }}</div>
  77. </div>
  78. </div>
  79. </div>
  80. </van-list>
  81. </van-pull-refresh>
  82. </div>
  83. </div>
  84. </div>
  85. <!-- 筛选弹窗 -->
  86. <kDialog :dialogTitle="$t('orderExport.searchPop.title')" :cancelBtnTxt="$t('orderExport.searchPop.clearFilter')"
  87. :confirmBtnTxt="$t('orderExport.searchPop.filter')" ref="kDialogRef" @confirmclk="confirmClk"
  88. :isCloseForCancel="false" @cancelclk="cancelClk">
  89. <template #content>
  90. <div class="cust_vantBorder">
  91. <van-field clearable v-model="searchForm.orderNo" :placeholder="$t('orderExport.searchPop.orderNoPlace')"
  92. :label="$t('orderExport.searchPop.orderNo')" />
  93. <van-field clearable v-model="searchForm.busiName" :placeholder="$t('orderExport.searchPop.busiNamePlace')"
  94. :label="$t('orderExport.searchPop.busiName')" />
  95. <van-field @click-input="changeTypeInpClk" readonly clearable v-model="searchForm.ifForeignName"
  96. :placeholder="$t('orderExport.searchPop.mainOverPlace')" :label="$t('orderExport.searchPop.mainOver')">
  97. <template #right-icon>
  98. <div class="l-flex-RC">
  99. <van-icon v-if="searchForm.ifForeignName" @click="
  100. searchForm.ifForeignName = '';
  101. searchForm.ifForeign = '';
  102. " class="o-mr-6" name="clear" />
  103. <van-icon @click="changeTypeInpClk" name="arrow-down" />
  104. </div>
  105. </template>
  106. </van-field>
  107. </div>
  108. </template>
  109. </kDialog>
  110. <!-- 大陆或海外弹窗 -->
  111. <van-popup v-model:show="changeTypeShow" position="bottom">
  112. <van-picker :title="$t('orderExport.searchPop.mainOverPlace')" :columns="changeTypePopList"
  113. :columns-field-names="changeTypePopFieldName" @confirm="changeTypePopConfirm" @cancel="changeTypeShow = false" />
  114. </van-popup>
  115. </div>
  116. </template>
  117. <script>
  118. import { getOrderList, Api_getOrderExport } from "@/service/orderExport";
  119. import { onMounted, reactive, toRefs, ref } from "vue";
  120. import sHeader from "@/components/SimpleHeader";
  121. import { getLoginUser, $M_ExportFile } from "@/common/js/utils";
  122. import dateSelectList from "@/components/dateSelectList";
  123. import dateUtil from "@/utils/dateUtil";
  124. import kTabs from "@/components/commom/kTabs/index.vue";
  125. import { useI18n } from "vue-i18n";
  126. import kDialog from "@/components/commom/kDialog/index.vue";
  127. import moment from 'moment';
  128. import { styleUrl } from "../../common/js/utils";
  129. export default {
  130. name: "orderExport",
  131. components: { sHeader, dateSelectList, kTabs, kDialog },
  132. setup() {
  133. // 分页
  134. const pageNo = ref(1);
  135. const pageSize = ref(20);
  136. let ruleData = reactive({
  137. tableData: [],
  138. });
  139. // 上拉刷新
  140. const loading = ref(true);
  141. const finished = ref(false);
  142. // 下拉刷新
  143. const refreshing = ref(false);
  144. // 初始化页面获取列表
  145. onMounted(() => {
  146. // 加载样式
  147. styleUrl('orderExport');
  148. const user = getLoginUser();
  149. // 今日
  150. searchParams.startDate = moment().format("YYYY-MM-DD") + " 00:00:00";
  151. searchParams.endDate = moment().format("YYYY-MM-DD") + " 23:59:59";
  152. if (user) {
  153. onRefresh();
  154. }
  155. });
  156. // 下拉刷新
  157. const onRefresh = (idx) => {
  158. ruleData.tableData = [];
  159. // 解决请求两次问题
  160. if (!idx) {
  161. finished.value = false;
  162. }
  163. loading.value = true;
  164. // 初始化分页
  165. pageNo.value = 1;
  166. pageSize.value = 20;
  167. getList();
  168. };
  169. // 上拉加载
  170. const onLoad = () => {
  171. pageNo.value++;
  172. getList();
  173. };
  174. // 获取列表数据
  175. const getList = () => {
  176. // 如果存在chartType去掉
  177. if (searchParams.chartType) {
  178. delete searchParams.chartType;
  179. }
  180. let param = {
  181. current: pageNo.value,
  182. size: pageSize.value,
  183. };
  184. getOrderList(Object.assign(param, searchParams)).then((res) => {
  185. const { data } = res.data;
  186. console.log('data的值是 >>>', data)
  187. if (data) {
  188. refreshing.value = false;
  189. ruleData.tableData.push(...data.records);
  190. // 加载状态结束
  191. loading.value = false;
  192. if (ruleData.tableData.length >= data.total) {
  193. finished.value = true;
  194. }
  195. }
  196. });
  197. };
  198. // 引入语言
  199. const { t } = useI18n();
  200. // 大陆或海外弹窗
  201. // 控制显示
  202. const changeTypeShow = ref(false);
  203. // 点击显示弹窗
  204. const changeTypeInpClk = () => {
  205. changeTypeShow.value = true;
  206. };
  207. // 弹窗选中的值
  208. const changeTypePopFieldName = reactive({
  209. text: "name",
  210. value: "id",
  211. });
  212. // 弹窗选项
  213. const changeTypePopList = [
  214. {
  215. name: t('orderExport.searchPop.mainland'),
  216. id: 1,
  217. },
  218. {
  219. name: t('orderExport.searchPop.overseas'),
  220. id: 0,
  221. },
  222. ];
  223. // 点击弹窗的确定按钮
  224. const changeTypePopConfirm = (e) => {
  225. console.log('e')
  226. searchForm.ifForeign = e.id;
  227. searchForm.ifForeignName = e.name;
  228. changeTypeShow.value = false;
  229. };
  230. // 点击导出按钮
  231. const exportOrder = async () => {
  232. const param = {
  233. current: pageNo.value,
  234. size: pageSize.value,
  235. };
  236. const { headers, data } = await Api_getOrderExport(Object.assign(param, searchParams));
  237. console.log('headers', headers)
  238. console.log('data', data)
  239. $M_ExportFile(data, headers);
  240. };
  241. // 筛选弹窗的元素
  242. const kDialogRef = ref(null);
  243. // 点击筛选
  244. const noticeClk = () => {
  245. kDialogRef.value.openDialog();
  246. };
  247. // 筛选弹窗
  248. const searchForm = reactive({
  249. orderNo: "",
  250. busiName: "",
  251. ifForeign: "0",
  252. ifForeignName: "大陆",
  253. });
  254. // 点击筛选条件的清空条件按钮
  255. const cancelClk = () => {
  256. searchForm.orderNo = '';
  257. searchForm.busiName = '';
  258. searchForm.ifForeign = '0';
  259. searchForm.ifForeignName = '大陆';
  260. };
  261. // 点击筛选条件的筛选按钮
  262. const confirmClk = () => {
  263. searchParams.clientId = searchForm.orderNo;
  264. searchParams.username = searchForm.busiName;
  265. searchParams.ifForeign = searchForm.ifForeign;
  266. getList();
  267. };
  268. // 商户设备tab栏
  269. const tabList = ref([
  270. {
  271. name: t("orderExport.merchant"),
  272. icon: "",
  273. id: 1,
  274. },
  275. {
  276. name: t("orderExport.equipment"),
  277. icon: "",
  278. id: 2,
  279. },
  280. ]);
  281. // 点击tab
  282. const tabChg = (e) => {
  283. if (e == 1) {
  284. searchParams.type = 1;
  285. } else {
  286. searchParams.type = 2;
  287. }
  288. getList();
  289. };
  290. let searchParams = reactive({
  291. type: "2", // 分组类型
  292. clientId: "", // 设备编号
  293. username: "",
  294. startDate: "",
  295. endDate: "",
  296. ifForeign: '0'
  297. });
  298. // 搜索点击
  299. const searchClick = () => {
  300. console.log("searchClick");
  301. };
  302. // 今日、明日、本周、本月、其他时间选择回调
  303. const update = (uDate) => {
  304. searchParams = Object.assign(searchParams, uDate);
  305. searchParams.startDate = dateUtil.formateDate(
  306. new Date(searchParams.startDate),
  307. "yyyy-MM-dd hh:mm:ss"
  308. );
  309. searchParams.endDate = dateUtil.formateDate(
  310. new Date(searchParams.endDate),
  311. "yyyy-MM-dd hh:mm:ss"
  312. );
  313. onRefresh(1);
  314. };
  315. return {
  316. ...toRefs(searchParams),
  317. searchClick,
  318. update,
  319. exportOrder,
  320. tabChg,
  321. tabList,
  322. confirmClk,
  323. searchForm,
  324. noticeClk,
  325. kDialogRef,
  326. cancelClk,
  327. changeTypePopList,
  328. changeTypePopConfirm,
  329. changeTypeShow,
  330. changeTypeInpClk,
  331. changeTypePopFieldName,
  332. pageNo,
  333. pageSize,
  334. loading,
  335. finished,
  336. refreshing,
  337. onRefresh,
  338. onLoad,
  339. getList,
  340. ...toRefs(ruleData),
  341. };
  342. },
  343. };
  344. </script>
  345. <style lang="less" scoped>
  346. @import "../../common/style/common.less";
  347. </style>