QueryForm.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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="source">
  6. <el-select
  7. v-model="queryForm.source"
  8. placeholder="全部"
  9. clearable
  10. @change="handleSelectChange"
  11. >
  12. <el-option
  13. v-for="item in sourceOptions"
  14. :key="item.value"
  15. :label="item.label"
  16. :value="item.value"
  17. />
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="类型:" prop="issueType">
  21. <el-select
  22. v-model="queryForm.issueType"
  23. placeholder="全部"
  24. clearable
  25. :disabled="typeDisable"
  26. >
  27. <el-option v-for="item in options" :label="item.name" :value="item.id" />
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item label="地点:" prop="workspaceId">
  31. <el-cascader
  32. v-model="workLocation"
  33. :options="locationOptions"
  34. :props="location"
  35. clearable
  36. collapse-tags
  37. @change="handleCascaderChange"
  38. />
  39. </el-form-item>
  40. <el-form-item label="状态:" prop="issueState">
  41. <el-select v-model="tempState" clearable @change="handleIssueStateChange">
  42. <el-option
  43. v-for="item in issueStateOptions"
  44. :key="item.value"
  45. :label="item.label"
  46. :value="item.value"
  47. />
  48. </el-select>
  49. </el-form-item>
  50. <el-form-item label="日期:">
  51. <el-date-picker
  52. v-model="dateRange"
  53. type="daterange"
  54. range-separator="~"
  55. start-placeholder="开始时间"
  56. end-placeholder="结束时间"
  57. clearable
  58. unlink-panels
  59. value-format="YYYY-MM-DD HH:mm:ss.SSS"
  60. :default-time="defaultTime"
  61. @change="handleDateChange"
  62. />
  63. </el-form-item>
  64. </div>
  65. <div class="btn-group">
  66. <el-form-item>
  67. <el-button class="search-btn" type="primary" @click="handleSearch">查询</el-button>
  68. <el-button class="reset-btn" @click="handleReset">重置</el-button>
  69. </el-form-item>
  70. </div>
  71. </el-form>
  72. </div>
  73. </template>
  74. <script setup lang="ts">
  75. import type { FormInstance } from 'element-plus';
  76. import { reactive, ref } from 'vue';
  77. import { sourceOptions, issueStateOptions } from './constant.question';
  78. interface Props {
  79. // isShowTab: boolean // true展示数据,false默认数据
  80. aiOptions: Array<any>;
  81. manualOptions: Array<any>;
  82. locationOptions: Array<any>;
  83. }
  84. const props = defineProps<Props>();
  85. const emits = defineEmits(['onSearch', 'onReset']);
  86. interface QueryModel {
  87. pageNumber: number;
  88. pageSize: number;
  89. source?: number; // 来源
  90. issueType?: number; // 类型
  91. workspaceId?: number[]; // 地点=工位id
  92. issueState?: number[]; // 状态
  93. startTime?: string; // 开始时间(默认)
  94. endTime?: string; // 结束时间(默认)
  95. }
  96. const formRef = ref<FormInstance>();
  97. const queryForm = reactive<QueryModel>({
  98. pageNumber: 1,
  99. pageSize: 10,
  100. });
  101. interface OptionModel {
  102. id: number;
  103. name: string;
  104. }
  105. const options = ref<OptionModel[]>([]);
  106. const typeDisable = ref(true);
  107. const location = { multiple: true }; // 级联选择器(打开多选)
  108. const workLocation = ref([]); // 级联选择器,为二维数组(提取workspaceId)
  109. const tempState = ref(''); // 状态,字符串转number[]
  110. const dateRange = ref([]); // 时间段,拆分成startTime/endTime
  111. const defaultTime = ref<[Date, Date]>([
  112. new Date(2000, 1, 1, 0, 0, 0),
  113. new Date(2000, 2, 1, 23, 59, 59),
  114. ]);
  115. const handleSearch = () => {
  116. emits('onSearch', queryForm);
  117. };
  118. const handleReset = () => {
  119. typeDisable.value = true;
  120. workLocation.value = [];
  121. tempState.value = '';
  122. dateRange.value = [];
  123. Reflect.deleteProperty(queryForm, 'startTime');
  124. Reflect.deleteProperty(queryForm, 'endTime');
  125. formRef.value?.resetFields();
  126. emits('onReset', queryForm);
  127. };
  128. const handleSelectChange = () => {
  129. if (Number(queryForm.source) === 1) {
  130. typeDisable.value = false;
  131. options.value = props.aiOptions;
  132. } else if (Number(queryForm.source) === 2) {
  133. typeDisable.value = false;
  134. options.value = props.manualOptions;
  135. } else {
  136. typeDisable.value = true;
  137. options.value = [];
  138. queryForm.issueType = undefined;
  139. }
  140. };
  141. const handleCascaderChange = () => {
  142. const arr = [];
  143. workLocation.value.forEach((item) => {
  144. arr.push(item[1]);
  145. });
  146. queryForm.workspaceId = arr;
  147. };
  148. const handleIssueStateChange = () => {
  149. if (tempState.value) queryForm.issueState = JSON.parse(tempState.value);
  150. };
  151. const handleDateChange = () => {
  152. if (dateRange.value != null) {
  153. queryForm.startTime = dateRange.value[0];
  154. queryForm.endTime = dateRange.value[1];
  155. } else {
  156. Reflect.deleteProperty(queryForm, 'startTime');
  157. Reflect.deleteProperty(queryForm, 'endTime');
  158. }
  159. };
  160. </script>
  161. <style scoped lang="scss">
  162. .el-form {
  163. display: flex;
  164. justify-content: space-between;
  165. }
  166. :deep(.el-form--inline .el-form-item) {
  167. margin-right: 0;
  168. }
  169. :deep(.el-form-item__label) {
  170. padding: 0;
  171. }
  172. .select-group {
  173. flex: 1;
  174. }
  175. .btn-group {
  176. .search-btn {
  177. width: 65px;
  178. height: 32px;
  179. background: #1890ff;
  180. border-radius: 2px;
  181. }
  182. .reset-btn {
  183. width: 65px;
  184. height: 32px;
  185. border-radius: 2px;
  186. border: 1px solid #1890ff;
  187. color: #1890ff;
  188. }
  189. }
  190. .el-select {
  191. --el-select-width: 215px;
  192. }
  193. </style>