index.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. <template>
  2. <div class="log">
  3. <PageMain class="vh100">
  4. <div class='btn-box'>
  5. <el-button type="primary" plain class='query-btn'
  6. @click='dialogShow'>{{ selectedKeys.length ? `已选${selectedKeys.length}项` : '筛选条件' }}</el-button>
  7. <div class='query-btn'>
  8. <DowButton @endAnim='downloadFile'></DowButton>
  9. </div>
  10. </div>
  11. <QueryForm :option="listOption" @query='query' @delSelect='delSelect' ref='queryFormRef'></QueryForm>
  12. <div class='flex content-box'>
  13. <!-- tree -->
  14. <div class='content-l'>
  15. <Tree ref='treeRef' @nodeId='nodeId'></Tree>
  16. </div>
  17. <div class='flex-1 content-r'>
  18. <!-- 表格 -->
  19. <ComplexTable :tableData="tableData" :showSelect='false' :columns="listOption.columns" :showIndex="false"
  20. :columnwidth="120" :pageInfo="pageInfo" @getList="getList" :showOperation='false'>
  21. <template v-slot:search="scope">
  22. <Sort :scope="scope.slotData" :globalSortKey="globalSortKey" :globalSortOrder="globalSortOrder"
  23. @update:sort="handleSortUpdate"></Sort>
  24. </template>
  25. <template #customSlot="{ bodyCell: { scope, column } }">
  26. <template v-if="column.prop == 'quoteOrderNum'">
  27. {{ scope.row.quoteOrderNum }} 笔
  28. </template>
  29. <template v-if="column.prop == 'quoteCountNum'">
  30. {{ scope.row.quoteCountNum }} 次
  31. </template>
  32. <template v-if="column.prop == 'dsyOrderNum'">
  33. {{ scope.row.dsyOrderNum }} 笔
  34. </template>
  35. <template v-if="column.prop == 'dszOrderNum'">
  36. {{ scope.row.dszOrderNum }} 笔
  37. </template>
  38. <template v-if="column.prop == 'jszOrderNum'">
  39. {{ scope.row.jszOrderNum }} 笔
  40. </template>
  41. <template v-if="column.prop == 'jsyOrderNum'">
  42. {{ scope.row.jsyOrderNum }} 笔
  43. </template>
  44. </template>
  45. </ComplexTable>
  46. </div>
  47. </div>
  48. <FilterDialog :show='isShow' @close='isShow = false' @sure='filterSure' ref='filterDialogRef'
  49. @selectedKeys='selected' routerKey='routerKey'>
  50. </FilterDialog>
  51. </PageMain>
  52. </div>
  53. </template>
  54. <script setup lang="ts">
  55. import { useRouter } from "vue-router";
  56. import api from "@/api";
  57. import QueryForm from "../../components/queryForm.vue";
  58. import FilterDialog from "../../components/filterDialog.vue";
  59. import DowButton from "../../components/button.vue";
  60. import Sort from "../../components/sort.vue";
  61. import useUserStore from "@/store/modules/message";
  62. import PageInfo from "@/api/types/agreementTypes";
  63. import Tree from "../../components/tree.vue";
  64. import { ElMessage } from "element-plus";
  65. const router = useRouter();
  66. const userStore = useUserStore();
  67. const isShow = ref(false);
  68. const isSort = ref();
  69. const pageInfo = ref({
  70. pageNum: 1,
  71. pageSize: 10,
  72. sizes: [10, 20, 30, 40, 50],
  73. total: 0,
  74. });
  75. const listOption = reactive({
  76. rowKey: "quotationId",
  77. //查询
  78. queryFormFields: [],
  79. // 表格列
  80. columns: [
  81. {
  82. prop: "licenseNo",
  83. label: "车牌号",
  84. width: "100",
  85. },
  86. {
  87. prop: "engineNo",
  88. label: "发动机号",
  89. width: "120",
  90. },
  91. {
  92. prop: "vinNo",
  93. label: "车架号",
  94. width: "180",
  95. },
  96. {
  97. prop: "brandName",
  98. label: "品牌型号",
  99. width: "180",
  100. },
  101. {
  102. prop: "quoteOrderNum",
  103. label: "报价订单",
  104. width: "180",
  105. align: "right",
  106. sortable: true,
  107. component: "customSlot",
  108. },
  109. {
  110. prop: "quoteCountNum",
  111. label: "报价次数",
  112. width: "180",
  113. align: "right",
  114. sortable: true,
  115. component: "customSlot",
  116. },
  117. {
  118. prop: "minPremium",
  119. label: "最低保费",
  120. width: "180",
  121. align: "right",
  122. sortable: true,
  123. },
  124. {
  125. prop: "maxPremium",
  126. label: "最高保费",
  127. width: "180",
  128. align: "right",
  129. sortable: true,
  130. },
  131. {
  132. prop: "dealCompanyName",
  133. label: "成交保险公司",
  134. width: "300",
  135. },
  136. {
  137. prop: "dealPremium",
  138. label: "成交保费",
  139. width: "180",
  140. align: "right",
  141. sortable: true,
  142. },
  143. ],
  144. });
  145. const selectedKeys = ref([]);
  146. const selected = function (val) {
  147. selectedKeys.value = val;
  148. };
  149. //查询数据
  150. const phone = JSON.parse(localStorage.getItem("userInfo")).username;
  151. //获取默认选择数据
  152. const queryFormRes = ref();
  153. const routerKey = ref("quotationOrderData");
  154. const defaultList = ref();
  155. const pageHiddenList = ref([]); //页面不显示的数据
  156. const initDefaultList = async () => {
  157. const { data } = await api.manageApi.getSearchDefaultList({
  158. routerKey: routerKey.value,
  159. userId: phone,
  160. });
  161. listOption.queryFormFields = data.filter((e) => e.showFlag);
  162. pageHiddenList.value = data.filter((e) => !e.showFlag);
  163. defaultList.value = data.map((e) => e.id);
  164. selectedKeys.value = defaultList.value;
  165. queryFormRes.value = queryFormRef.value?.initDefaultSaveForm();
  166. queryList();
  167. };
  168. //删除
  169. const filterDialogRef = ref();
  170. const delSelect = (id) => {
  171. listOption.queryFormFields = listOption.queryFormFields.filter(
  172. (item) => item.id != id
  173. );
  174. filterDialogRef.value.initList(
  175. [...listOption.queryFormFields, ...pageHiddenList.value],
  176. defaultList.value
  177. );
  178. };
  179. //打开dialogShow
  180. const dialogShow = function () {
  181. isShow.value = true;
  182. filterDialogRef.value.initList(
  183. [...listOption.queryFormFields, ...pageHiddenList.value],
  184. defaultList.value
  185. );
  186. };
  187. //确定
  188. const queryFormRef = ref();
  189. const filterSure = (item, index) => {
  190. isShow.value = false;
  191. const secondGroupIds = item.list.map((item) => item.id);
  192. const oldList = listOption.queryFormFields.filter((item) =>
  193. secondGroupIds.includes(item.id)
  194. );
  195. const firstGroupIds = listOption.queryFormFields.map((item) => item.id);
  196. let newList = item.list.filter((item) => !firstGroupIds.includes(item.id));
  197. //过滤掉默认不显示的数据
  198. const hiddenList = new Set(pageHiddenList.value.map((item) => item.id));
  199. const filterList = newList.filter((item) => !hiddenList.has(item.id));
  200. listOption.queryFormFields = [...oldList, ...filterList];
  201. queryFormRef.value?.initDefaultSaveForm();
  202. selectedKeys.value = item.list.filter((item) => item.id);
  203. };
  204. const globalSortKey = ref("");
  205. const globalSortOrder = ref<"asc" | "desc">("asc");
  206. // 处理子组件传递的排序更新
  207. const handleSortUpdate = (sortInfo: {
  208. key: string;
  209. order: string;
  210. name: string;
  211. }) => {
  212. globalSortKey.value = sortInfo.key;
  213. globalSortOrder.value = sortInfo.order;
  214. queryList();
  215. };
  216. //查询
  217. const query = (item) => {
  218. queryFormRes.value = item;
  219. queryList();
  220. };
  221. //数据查询
  222. const tableData = ref([]);
  223. const queryList = async () => {
  224. let query = { ...queryFormRes.value };
  225. const { data } = await api.manageApi.quotationOrderDataPageList({
  226. pageNo: pageInfo.value.pageNum,
  227. pageSize: pageInfo.value.pageSize,
  228. routerKey: routerKey.value,
  229. userId: phone,
  230. orderType: globalSortKey.value
  231. ? globalSortKey.value + " " + globalSortOrder.value
  232. : "",
  233. ...query,
  234. orgIds: query.orgIds.filter(v => v),
  235. createTimeBegin: query.recordTime[0] ?? '',
  236. createTimeEnd: query.recordTime[1] ?? '',
  237. });
  238. tableData.value = data.records;
  239. pageInfo.value.pageNum = data.current;
  240. pageInfo.value.pageSize = data.size;
  241. pageInfo.value.total = data.total;
  242. };
  243. //分页事件
  244. function getList(item: PageInfo) {
  245. pageInfo.value.pageNum = item.pageNum;
  246. pageInfo.value.pageSize = item.pageSize;
  247. queryList();
  248. }
  249. //导出
  250. const downloadFile = async () => {
  251. let query = { ...queryFormRes.value };
  252. const { data, msg } = await api.manageApi.quotationOrderDataToTask({
  253. pageNo: pageInfo.value.pageNum,
  254. pageSize: pageInfo.value.pageSize,
  255. routerKey: routerKey.value,
  256. userId: phone,
  257. orderType: globalSortKey.value
  258. ? globalSortKey.value + " " + globalSortOrder.value
  259. : "",
  260. ...query,
  261. orgIds: query.orgIds.filter(v => v),
  262. createTimeBegin: query.recordTime[0] ?? '',
  263. createTimeEnd: query.recordTime[1] ?? '',
  264. });
  265. ElMessage({
  266. message: msg,
  267. type: "success",
  268. });
  269. userStore.count++;
  270. };
  271. //tabClick
  272. const treeRef = ref();
  273. const tabIndex = ref(0);
  274. const tabClick = (item, index) => {
  275. tabIndex.value = index;
  276. treeRef.value?.getTree(item.api);
  277. };
  278. const nodeId = (id) => {
  279. queryFormRes.value.orgIds = [id];
  280. queryList();
  281. };
  282. onMounted(() => {
  283. initDefaultList();
  284. treeRef.value?.getTree(api.manageApi.getUserManageListByUserId);
  285. });
  286. </script>
  287. <style scoped lang="scss">
  288. .log {
  289. .query-btn {
  290. margin-left: 20px;
  291. }
  292. .btn-box {
  293. padding-bottom: 15px;
  294. margin-bottom: 24px;
  295. border-bottom: 1px solid #eeeeee;
  296. display: flex;
  297. justify-content: flex-end;
  298. }
  299. .content-box {
  300. justify-content: space-between;
  301. .content-l {
  302. width: 298px;
  303. display: flex;
  304. margin: 20px 16px 20px 0;
  305. .item {
  306. width: 50%;
  307. height: 36px;
  308. line-height: 36px;
  309. background: #f7f7f7;
  310. font-size: 16px;
  311. text-align: center;
  312. border-radius: 2px;
  313. }
  314. .active {
  315. background: #0083ff;
  316. color: #fff;
  317. }
  318. }
  319. .content-r {
  320. width: 0;
  321. }
  322. }
  323. }
  324. :deep(.caret-wrapper) {
  325. display: none !important;
  326. }
  327. </style>