QueryFormSimple.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <template>
  2. <div>
  3. <el-form :model="queryForm" label-width="auto" :inline="true" ref="formRef">
  4. <div class="select-group">
  5. <el-form-item label="类型:" prop="issueTypeList">
  6. <el-cascader
  7. v-model="issueTypeValue"
  8. :options="props.aiOptions"
  9. :props="issueMainTypeProp"
  10. clearable
  11. collapse-tags
  12. :show-all-levels="false"
  13. @change="handleIssueMainTypeChange"
  14. />
  15. </el-form-item>
  16. <el-form-item label="地点:" prop="workspaceId">
  17. <el-cascader
  18. v-model="workLocation"
  19. :options="props.locationOptions"
  20. :props="locationProp"
  21. clearable
  22. collapse-tags
  23. :show-all-levels="false"
  24. @change="handleCascaderChange"
  25. />
  26. </el-form-item>
  27. <el-form-item label="处理状态:" prop="issueState">
  28. <el-select v-model="tempState" clearable @change="handleIssueStateChange">
  29. <el-option
  30. v-for="item in issueStateOptionsZJC"
  31. :key="item.value"
  32. :label="item.label"
  33. :value="item.value"
  34. />
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="日期:">
  38. <el-date-picker
  39. v-model="dateRange"
  40. type="daterange"
  41. range-separator="~"
  42. start-placeholder="开始时间"
  43. end-placeholder="结束时间"
  44. clearable
  45. unlink-panels
  46. value-format="YYYY-MM-DD HH:mm:ss"
  47. :default-time="defaultTime"
  48. @change="handleDateChange"
  49. />
  50. </el-form-item>
  51. </div>
  52. <div class="btn-group">
  53. <el-form-item>
  54. <el-button class="search-btn" type="primary" @click="handleSearch">查询</el-button>
  55. <el-button class="reset-btn" @click="handleReset">重置</el-button>
  56. </el-form-item>
  57. </div>
  58. </el-form>
  59. </div>
  60. </template>
  61. <script setup lang="ts">
  62. import type { FormInstance } from 'element-plus';
  63. import { reactive, ref } from 'vue';
  64. import { issueStateOptionsZJC } from './constant.question';
  65. import { TableQueryForm } from '@/api/datamanagement/alert-default';
  66. const props = defineProps({
  67. aiOptions: Array<any>,
  68. locationOptions: Array<any>,
  69. });
  70. const emits = defineEmits(['onSearch', 'onReset']);
  71. const formRef = ref<FormInstance>();
  72. const queryForm = reactive<TableQueryForm>({
  73. pageNumber: 1,
  74. pageSize: 10,
  75. queryParam: {},
  76. });
  77. const issueTypeValue = ref([]);
  78. const issueMainTypeProp = { multiple: true, expandTrigger: 'hover' as const };
  79. const workLocation = ref([]); // 级联选择器,为二维数组(提取workspaceId)
  80. const locationProp = { multiple: true, expandTrigger: 'hover' as const }; // 级联选择器(打开多选)
  81. const tempState = ref(''); // 状态,字符串转number[]
  82. const dateRange = ref([]); // 时间段,拆分成startTime/endTime
  83. const defaultTime = ref<[Date, Date]>([
  84. new Date(2000, 1, 1, 0, 0, 0),
  85. new Date(2000, 2, 1, 23, 59, 59),
  86. ]);
  87. const handleSearch = () => {
  88. emits('onSearch', queryForm);
  89. };
  90. const handleReset = () => {
  91. issueTypeValue.value = [];
  92. workLocation.value = [];
  93. tempState.value = '';
  94. dateRange.value = [];
  95. Reflect.deleteProperty(queryForm.queryParam, 'startTime');
  96. Reflect.deleteProperty(queryForm.queryParam, 'endTime');
  97. Reflect.deleteProperty(queryForm.queryParam, 'issueMainTypeList');
  98. Reflect.deleteProperty(queryForm.queryParam, 'issueTypeList');
  99. formRef.value?.resetFields();
  100. emits('onReset', queryForm);
  101. };
  102. const handleIssueMainTypeChange = () => {
  103. if (issueTypeValue.value.length !== 0) {
  104. const arrMain = [];
  105. const arrSub = [];
  106. issueTypeValue.value.forEach((item) => {
  107. arrMain.push(item[0]);
  108. arrSub.push(item[1]);
  109. });
  110. queryForm.queryParam.issueMainTypeList = [...new Set(arrMain)];
  111. queryForm.queryParam.issueTypeList = arrSub;
  112. } else {
  113. Reflect.deleteProperty(queryForm.queryParam, 'issueMainTypeList');
  114. Reflect.deleteProperty(queryForm.queryParam, 'issueTypeList');
  115. }
  116. };
  117. const handleCascaderChange = () => {
  118. if (workLocation.value.length !== 0) {
  119. const arr = [];
  120. workLocation.value.forEach((item) => {
  121. arr.push(item[1]);
  122. });
  123. queryForm.queryParam.workspaceId = arr;
  124. } else {
  125. Reflect.deleteProperty(queryForm.queryParam, 'workspaceId');
  126. }
  127. };
  128. const handleIssueStateChange = () => {
  129. if (tempState.value) queryForm.queryParam.issueState = JSON.parse(tempState.value);
  130. else Reflect.deleteProperty(queryForm.queryParam, 'issueState');
  131. };
  132. const handleDateChange = () => {
  133. if (dateRange.value != null) {
  134. queryForm.queryParam.startTime = dateRange.value[0];
  135. queryForm.queryParam.endTime = dateRange.value[1];
  136. } else {
  137. Reflect.deleteProperty(queryForm.queryParam, 'startTime');
  138. Reflect.deleteProperty(queryForm.queryParam, 'endTime');
  139. }
  140. };
  141. </script>
  142. <style scoped lang="less">
  143. .el-form {
  144. display: flex;
  145. justify-content: space-between;
  146. }
  147. :deep(.el-form-item__label) {
  148. padding: 0;
  149. }
  150. .select-group {
  151. flex: 1;
  152. }
  153. .btn-group {
  154. .search-btn {
  155. width: 65px;
  156. height: 32px;
  157. background: #1890ff;
  158. border-radius: 2px;
  159. }
  160. .reset-btn {
  161. width: 65px;
  162. height: 32px;
  163. border-radius: 2px;
  164. border: 1px solid #1890ff;
  165. color: #1890ff;
  166. }
  167. }
  168. .el-select {
  169. --el-select-width: 215px;
  170. }
  171. </style>