QueryConditionComplex.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. <!-- 复杂查询过滤 -->
  2. <template>
  3. <div class="buttons">
  4. <a-button
  5. type="primary"
  6. class="item"
  7. @click="complexSearch()"
  8. >
  9. {{ $t('lang.QueryConditionComplex.filter') }}
  10. </a-button>
  11. <template v-if="!isSearchWidget">
  12. <a-button
  13. class="item"
  14. @click="executeExport()"
  15. >
  16. {{ $t('lang.QueryConditionComplex.export') }}
  17. </a-button>
  18. <!-- <template v-for="infoButton in infoButtons" :key="infoButton.name">
  19. <a-button
  20. v-tooltip.right="Language.getHelpTrl($i18n.locale, infoButton)"
  21. class="item"
  22. type="dashed"
  23. @click="executeProcess(infoButton)"
  24. >
  25. {{ Language.getNameTrl($i18n.locale, infoButton) }}
  26. </a-button>
  27. </template> -->
  28. </template>
  29. </div>
  30. <div>
  31. <div>
  32. <div class="form-inline">
  33. <div
  34. v-for="(item,index) in filterFields"
  35. v-show="item.isShow"
  36. :key="index"
  37. class="form-group m-form-group"
  38. >
  39. <label
  40. v-tooltip.right="Language.getHelpTrl($i18n.locale, item)"
  41. :for="item.id"
  42. class="m-form-group-label"
  43. >
  44. {{ Language.getNameTrl($i18n.locale, item) }}
  45. </label>
  46. <div
  47. v-if="item.index == 1"
  48. class="form-inline-div"
  49. @keyup.enter="complexSearch()"
  50. >
  51. <SearchInput
  52. v-if="item.displayType =='TextEditor' && item.apiUrl != null && item.apiUrl.length >0"
  53. v-model:value="item.value.value1"
  54. :api-url="item.apiUrl"
  55. :api-response-data-text-filed-name="
  56. item.apiResponseDataTextFiledName
  57. "
  58. class="form-control form-control-complex form-input"
  59. />
  60. <input
  61. v-if="item.displayType =='TextEditor' && !item.apiUrl"
  62. :id="item.id"
  63. v-model="item.value.value1"
  64. autocomplete="off"
  65. type="text"
  66. :placeholder="$t('lang.QueryConditionComplex.pleaseInputTheContent')"
  67. class="form-control form-control-complex form-input"
  68. />
  69. <input
  70. v-if="item.displayType =='NumberEditor'"
  71. :id="item.id"
  72. v-model="item.value.value1"
  73. autocomplete="off"
  74. type="number"
  75. class="form-control form-control-complex form-input"
  76. :placeholder="$t('lang.QueryConditionComplex.pleaseEnterANumber')"
  77. onmousewheel="return false;"
  78. @mousewheel="mouseWheelEvent"
  79. />
  80. <select
  81. v-if="item.displayType =='CheckBoxEditor'"
  82. v-model="item.value.value1"
  83. class="form-control form-control-complex form-input form-select"
  84. >
  85. <option value="">{{ $t('lang.QueryConditionComplex.all') }}</option>
  86. <option value="true">{{ $t('lang.QueryConditionComplex.true') }}</option>
  87. <option value="false">{{ $t('lang.QueryConditionComplex.false') }}</option>
  88. </select>
  89. <DateTime
  90. v-if="item.displayType =='DateTimeBoxEditor'"
  91. v-model="item.value.value1"
  92. class="m-form-input"
  93. @update:model-value="dateValueChange($event, item, 'value1')"
  94. />
  95. <!-- 年份选择器-->
  96. <YearPicker
  97. v-if="item.displayType =='YearEditor'"
  98. v-model="item.value.value1"
  99. class="m-form-input"
  100. @selected="textChanged(item, 'value1', $event)"
  101. />
  102. <!-- 年月选择器 -->
  103. <VueMonthlyPicker
  104. v-if="item.displayType =='YearMonthEditor'"
  105. id="month-picker"
  106. v-model="item.value.value1"
  107. date-format="YYYY-MM"
  108. class="form-inline-div m-form-input"
  109. @selected="refresh"
  110. />
  111. <!-- 日期选择器 -->
  112. <DateWidget
  113. v-if="item.displayType =='DateBoxEditor'"
  114. v-model="item.value.value1"
  115. class="m-form-input"
  116. @on-value-change="dateValueChange($event, item, 'value1')"
  117. />
  118. <EnumSelectWidgetInfo
  119. v-if="item.displayType =='ListBoxEnumEditor'"
  120. :field="item"
  121. :field-value="item.fieldValue"
  122. @value-changed="tabValueChanged($event, item, 'value1')"
  123. />
  124. <SearchWidget
  125. v-if="item.displayType =='SearchBoxEditor'"
  126. :where-clause-source="{'infoFilterField': {'infoWindowNo': infoWindowNo, 'fieldName' : item.fieldName}}"
  127. :info-window-no="item.infoWindowNo"
  128. :title-name="item.name"
  129. :field-value="item.fieldValue"
  130. :display-name="item.listFieldNames"
  131. class="m-form-input"
  132. @value-changed="tabValueChanged($event, item)"
  133. />
  134. <!-- 多选搜索框 number类型-->
  135. <MultiSearchWidget
  136. v-if="item.displayType =='MultiSearchBoxEditor'"
  137. :where-clause-source="{'infoFilterField': {'infoWindowNo': infoWindowNo, 'fieldName' : item.fieldName}}"
  138. :info-window-no="item.infoWindowNo"
  139. :title-name="item.name"
  140. :field-value="item.fieldValue"
  141. :display-name="item.listFieldNames"
  142. class="m-form-input"
  143. @value-changed="multiSearchValueChange($event, item)"
  144. />
  145. </div>
  146. <div
  147. v-if="item.index == 2"
  148. class="form-inline-div"
  149. >
  150. <SearchInput
  151. v-if="item.displayType =='TextEditor' && item.apiUrl != null && item.apiUrl.length >0"
  152. v-model:value="item.value.value1"
  153. :api-url="item.apiUrl"
  154. :api-response-data-text-filed-name="
  155. item.apiResponseDataTextFiledName
  156. "
  157. class="form-control form-control-complex form-input"
  158. @keyup.enter="complexSearch()"
  159. />
  160. <input
  161. v-if="item.displayType =='TextEditor' && !item.apiUrl"
  162. :id="item.id"
  163. v-model="item.value.value1"
  164. autocomplete="off"
  165. type="text"
  166. :placeholder="$t('lang.QueryConditionComplex.pleaseInputTheContent')"
  167. class="form-control form-control-complex form-input"
  168. />
  169. <input
  170. v-if="item.displayType =='NumberEditor'"
  171. :id="item.id"
  172. v-model="item.value.value2"
  173. autocomplete="off"
  174. type="number"
  175. class="form-control form-control-complex form-input"
  176. :placeholder="$t('lang.QueryConditionComplex.pleaseEnterANumber')"
  177. @keyup.enter="complexSearch()"
  178. />
  179. <select
  180. v-if="item.displayType =='CheckBoxEditor'"
  181. v-model="item.value.value2"
  182. class="form-control form-control-complex form-input form-select"
  183. >
  184. <option value="">{{ $t('lang.QueryConditionComplex.all') }}</option>
  185. <option value="true">{{ $t('lang.QueryConditionComplex.true') }}</option>
  186. <option value="false">{{ $t('lang.QueryConditionComplex.false') }}</option>
  187. </select>
  188. <!-- <input autocomplete="off" v-if="item.displayType =='CheckBoxEditor'"
  189. type="checkbox" class="form-control form-control-complex form-input"
  190. :id="item.id" v-model="item.value.value2"
  191. @keyup.enter="complexSearch()"> -->
  192. <!-- <input autocomplete="off" v-if="item.displayType =='DateTimeBoxEditor'"
  193. type="date"
  194. placeholder="yyyy-MM-dd"
  195. class="form-control form-control-complex form-input"
  196. :id="item.id"
  197. v-model="item.value.value2"
  198. @keyup.enter="complexSearch()"> -->
  199. <DateTime
  200. v-if="item.displayType =='DateTimeBoxEditor'"
  201. v-model="item.value.value2"
  202. class="m-form-input"
  203. @update:model-value="dateValueChange($event, item, 'value2')"
  204. />
  205. <!-- 年份选择器-->
  206. <YearPicker
  207. v-if="item.displayType =='YearEditor'"
  208. v-model="item.value.value2"
  209. class="m-form-input"
  210. @selected="textChanged(item, 'value2', $event)"
  211. />
  212. <!-- 年月选择器 -->
  213. <vue-monthly-picker
  214. v-if="item.displayType =='YearMonthEditor'"
  215. id="month-picker"
  216. v-model="item.value.value2"
  217. date-format="YYYY-MM"
  218. class="form-inline-div m-form-input"
  219. @selected="refresh"
  220. />
  221. <!-- 日期选择器 -->
  222. <DateWidget
  223. v-if="item.displayType =='DateBoxEditor'"
  224. v-model="item.value.value2"
  225. class="m-form-input"
  226. @on-value-change="dateValueChange($event, item, 'value2')"
  227. />
  228. <EnumSelectWidgetInfo
  229. v-if="item.displayType =='ListBoxEnumEditor'"
  230. :field="item"
  231. :field-value="item.fieldValue"
  232. class="m-form-input"
  233. @value-changed="tabValueChanged($event, item)"
  234. />
  235. <!--单选number类型-->
  236. <SearchWidget
  237. v-if="item.displayType =='SearchBoxEditor'"
  238. :where-clause-source="{'infoFilterField': {'infoWindowNo': infoWindowNo, 'fieldName' : item.fieldName}}"
  239. :info-window-no="item.infoWindowNo"
  240. :title-name="item.name"
  241. :field-value="item.fieldValue"
  242. :display-name="item.listFieldNames"
  243. class="m-form-input"
  244. @value-changed="tabValueChanged($event, item)"
  245. />
  246. </div>
  247. </div>
  248. </div>
  249. </div>
  250. </div>
  251. </template>
  252. <script>
  253. import { defineAsyncComponent } from 'vue';
  254. import SearchInput from './SearchInput.vue';
  255. import EnumSelectWidgetInfo from './EnumSelectWidgetInfo.vue';
  256. import DateTime from '../../datetime/src/DateTime.vue';
  257. import YearPicker from '../../year-picker/src/YearPicker.vue';
  258. import DateWidget from '../../date/src/Date.vue';
  259. import VueMonthlyPicker from '../../vue-monthly-picker/src/VueMonthlyPicker.vue';
  260. import Language from '../../common/Language.js';
  261. export default {
  262. components: {
  263. EnumSelectWidgetInfo,
  264. DateTime,
  265. SearchWidget : defineAsyncComponent(() =>
  266. import('./SearchWidget.vue'),
  267. ),
  268. MultiSearchWidget : defineAsyncComponent(() =>
  269. import('./MultiSearchWidget.vue'),
  270. ),
  271. DateWidget,
  272. VueMonthlyPicker,
  273. YearPicker,
  274. SearchInput,
  275. },
  276. props: {
  277. 'infoWindowNo':{
  278. type: String,
  279. default: null,
  280. },
  281. 'filterFields': {
  282. type: Array,
  283. default: null,
  284. },
  285. 'infoButtons': {
  286. type: Array,
  287. default: null,
  288. },
  289. 'isSearchWidget':{
  290. type: Boolean,
  291. default: null,
  292. },
  293. 'showButton':{
  294. type: Boolean,
  295. default: null,
  296. },
  297. },
  298. emits: ['complexSearch', 'executeExport', 'executeProcess'],
  299. data: function () {
  300. this.Language = Language;
  301. return {
  302. simpleConditionValue: '',
  303. selectedText: [],
  304. };
  305. },
  306. methods: {
  307. /**
  308. * 日期时间选择框值改变事件
  309. */
  310. dateValueChange: function (value, item, fieldName) {
  311. item.value[fieldName] = value;
  312. },
  313. /**
  314. * 年月选择器时间改变
  315. */
  316. refresh: function () {
  317. },
  318. /**
  319. * 年份选择器的值改变
  320. * @param {Object} item
  321. * @param {Object} key
  322. * @param {Object} val
  323. */
  324. textChanged: function (item, key, val) {
  325. var value = val + ' ';
  326. item.value[key] = value.replace(/(^\s*)|(\s*$)/g, '');
  327. },
  328. /**
  329. * 搜索框值发生改变
  330. * @param {Object} newFieldValue 改变后的值
  331. * @param {Object} item 当前field
  332. * @return {void}
  333. */
  334. tabValueChanged: function (newFieldValue, item) {
  335. item.fieldValue = newFieldValue;
  336. if (item.index == 1) {
  337. if (item.displayType == 'ListBoxEnumEditor') {
  338. item.value.value1 = newFieldValue.displayValue[0];
  339. } else {
  340. item.value.value1 = newFieldValue.id;
  341. }
  342. } else if (item.index == 2) {
  343. item.value.value2 = newFieldValue.id;
  344. }
  345. item.value.infoFilterFieldId = item.id;
  346. },
  347. // 多选搜索框值发生改变事件
  348. multiSearchValueChange: function (newFieldValue, item) {
  349. var _self = this;
  350. item.fieldValue = newFieldValue;
  351. var ids = newFieldValue.ids;
  352. var texts = newFieldValue.displayValue;
  353. if (item.index == 1) {
  354. item.value.value1 = ids.join(',');
  355. } else if (item.index == 2) {
  356. item.value.value2 = ids.join(',');
  357. }
  358. item.value.infoFilterFieldId = item.id;
  359. },
  360. /**
  361. * 回车键查询
  362. * @return {void}
  363. */
  364. complexSearch: function () {
  365. this.$emit('complexSearch','complex');
  366. },
  367. /**
  368. * 执行导出
  369. * @return {void}
  370. */
  371. executeExport: function () {
  372. this.$emit('executeExport');
  373. },
  374. /**
  375. * 获取查询条件供外部调用
  376. * @return {Object} 查询条件
  377. */
  378. getQueryCondition: function () {
  379. var _self = this;
  380. var values = [];
  381. _self.filterFields.forEach(function (item) {
  382. if (item.index == 1) {
  383. item.value.fieldName = item.fieldName;
  384. values.push(item.value);
  385. }
  386. });
  387. return values;
  388. },
  389. /**
  390. * 执行流程
  391. *
  392. */
  393. executeProcess: function (infoButton) {
  394. this.$emit('executeProcess', infoButton);
  395. },
  396. /**
  397. * 禁止滚轮滚动影响数字
  398. */
  399. mouseWheelEvent: function (event) {
  400. if (event || Window.event) {
  401. event.preventDefault();
  402. }
  403. },
  404. },
  405. };
  406. </script>
  407. <style scoped>
  408. .form-input {
  409. border-radius: 4px !important;
  410. }
  411. .form-inline-div {
  412. display: inline-block;
  413. }
  414. .m-select {
  415. display: inline-block !important;
  416. }
  417. .m-form-group {
  418. margin-left: 5px !important;
  419. margin-right: 5px !important;
  420. margin-bottom: 5px !important;
  421. }
  422. .m-form-group-label{
  423. white-space: nowrap;
  424. text-overflow: ellipsis;
  425. }
  426. @media (max-width: 768px) {
  427. .m-form-group-label {
  428. text-align: left;
  429. padding-right: 10px;
  430. }
  431. }
  432. @media (min-width: 768px) {
  433. .m-form-group-label {
  434. width: 100px;
  435. text-align: center;
  436. padding-right: 10px;
  437. }
  438. .input-switches {
  439. width: 100%;
  440. }
  441. }
  442. .btn-process {
  443. margin-right: 5px;
  444. }
  445. .m-row {
  446. margin-bottom: 5px;
  447. text-align: left;
  448. }
  449. .form-control-complex {
  450. float: none !important;
  451. width: auto !important;
  452. }
  453. .input-simple {
  454. width: 100% !important;
  455. }
  456. .input-switches {
  457. width: 200px;
  458. }
  459. .form-select {
  460. width: 200px !important;
  461. }
  462. .m-form-input {
  463. border-radius: 4px !important;
  464. width: 200px !important;
  465. }
  466. .form-control-complex {
  467. width: 200px !important;
  468. }
  469. .m-btn {
  470. float: left;
  471. margin-right: 5px;
  472. }
  473. .buttons {
  474. display: flex;
  475. justify-content: space-between;
  476. flex-wrap: wrap;
  477. margin-bottom: 6px;
  478. }
  479. .buttons:after {
  480. content: "";
  481. flex: auto;
  482. }
  483. .item{
  484. margin-right: 4px;
  485. }
  486. </style>