QueryConditionComplex.vue 15 KB

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