SearchFormItem.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. <template>
  2. <a-form-item v-if="item.view === DateTypeEnum.Date" :labelCol="labelCol" :class="'jeecg-online-search'">
  3. <template #label>
  4. <span :title="item.label" class="label-text">{{ item.label }}</span>
  5. </template>
  6. <template v-if="single_mode === item.mode">
  7. <a-date-picker :showTime="false" valueFormat="YYYY-MM-DD" :placeholder="'请选择' + item.label" v-model:value="queryParam[item.field]" />
  8. </template>
  9. <template v-else>
  10. <a-date-picker
  11. :showTime="false"
  12. valueFormat="YYYY-MM-DD"
  13. placeholder="开始日期"
  14. v-model:value="queryParam[item.field + '_begin']"
  15. style="width: calc(50% - 15px)"
  16. />
  17. <span class="group-query-strig">~</span>
  18. <a-date-picker
  19. :showTime="false"
  20. valueFormat="YYYY-MM-DD"
  21. placeholder="结束日期"
  22. v-model:value="queryParam[item.field + '_end']"
  23. style="width: calc(50% - 15px)"
  24. />
  25. </template>
  26. </a-form-item>
  27. <a-form-item v-else-if="item.view === DateTypeEnum.Datetime" :labelCol="labelCol" :class="'jeecg-online-search'">
  28. <template #label :title="item.label">
  29. <span :title="item.label" class="label-text">{{ item.label }}</span>
  30. </template>
  31. <template v-if="single_mode === item.mode">
  32. <a-date-picker
  33. :placeholder="'请选择' + item.label"
  34. :show-time="true"
  35. valueFormat="YYYY-MM-DD HH:mm:ss"
  36. v-model:value="queryParam[item.field]"
  37. />
  38. </template>
  39. <template v-else>
  40. <a-date-picker
  41. placeholder="选择开始时间"
  42. :show-time="true"
  43. valueFormat="YYYY-MM-DD HH:mm:ss"
  44. v-model:value="queryParam[item.field + '_begin']"
  45. style="width: calc(50% - 9px); min-width: 60px"
  46. />
  47. <span class="group-query-strig" style="width: auto; padding: 0 4px">~</span>
  48. <a-date-picker
  49. placeholder="选择结束时间"
  50. :show-time="true"
  51. valueFormat="YYYY-MM-DD HH:mm:ss"
  52. v-model:value="queryParam[item.field + '_end']"
  53. style="width: calc(50% - 9px); min-width: 60px"
  54. />
  55. </template>
  56. </a-form-item>
  57. <a-form-item v-else-if="item.view === DateTypeEnum.Time" :labelCol="labelCol" :class="'jeecg-online-search'">
  58. <template #label>
  59. <span :title="item.label" class="label-text">{{ item.label }}</span>
  60. </template>
  61. <template v-if="single_mode === item.mode">
  62. <a-date-picker :placeholder="'请选择' + item.label" mode="time" valueFormat="HH:mm:ss" v-model:value="queryParam[item.field]" />
  63. </template>
  64. <template v-else>
  65. <a-date-picker
  66. placeholder="请选择开始时间"
  67. mode="time"
  68. valueFormat="HH:mm:ss"
  69. v-model:value="queryParam[item.field + '_begin']"
  70. style="width: calc(50% - 15px)"
  71. />
  72. <span class="group-query-strig">~</span>
  73. <a-date-picker
  74. placeholder="请选择结束时间"
  75. mode="time"
  76. valueFormat="HH:mm:ss"
  77. v-model:value="queryParam[item.field + '_end']"
  78. style="width: calc(50% - 15px)"
  79. />
  80. </template>
  81. </a-form-item>
  82. <a-form-item
  83. v-else-if="item.view === CompTypeEnum.List || item.view === CompTypeEnum.Radio || item.view === CompTypeEnum.Switch"
  84. :labelCol="labelCol"
  85. :class="'jeecg-online-search'"
  86. >
  87. <template #label>
  88. <span :title="item.label" class="label-text">{{ item.label }}</span>
  89. </template>
  90. <JDictSelectTag v-if="item.config === '1'" :placeholder="'请选择' + item.label" v-model="queryParam[item.field]" :dictCode="getDictCode(item)" />
  91. <a-select v-else :placeholder="'请选择' + item.label" v-model:value="queryParam[item.field]">
  92. <template v-for="(obj, index) in dictOptions[getDictOptionKey(item)]" :key="index">
  93. <a-select-option :value="obj.value"> {{ obj.text }}</a-select-option>
  94. </template>
  95. </a-select>
  96. </a-form-item>
  97. <a-form-item v-else-if="item.view === CompTypeEnum.SelTree" :labelCol="labelCol" :class="'jeecg-online-search'">
  98. <template #label>
  99. <span :title="item.label" class="label-text">{{ item.label }}</span>
  100. </template>
  101. <JTreeSelect
  102. :placeholder="'请选择' + item.label"
  103. v-model:value="queryParam[item.field]"
  104. :dict="item.dict"
  105. :pidField="item.pidField"
  106. :pidValue="item.pidValue"
  107. :hasChildField="item.hasChildField"
  108. load-triggle-change
  109. />
  110. </a-form-item>
  111. <a-form-item v-else-if="item.view === CompTypeEnum.CatTree" :labelCol="labelCol" :class="'jeecg-online-search'">
  112. <template #label>
  113. <span :title="item.label" class="label-text">{{ item.label }}</span>
  114. </template>
  115. <JCategorySelect :pcode="item.pcode" v-model:value="queryParam[item.field]" :placeholder="'请选择' + item.label" />
  116. </a-form-item>
  117. <a-form-item v-else-if="item.view === CompTypeEnum.SelSearch" :labelCol="labelCol" :class="'jeecg-online-search'">
  118. <template #label>
  119. <span :title="item.label" class="label-text">{{ item.label }}</span>
  120. </template>
  121. <JOnlineSearchSelect v-model:value="queryParam[item.field]" :placeholder="'请选择' + item.label" :sql="item.sql" />
  122. </a-form-item>
  123. <a-form-item v-else-if="item.view === CompTypeEnum.SelUser" :labelCol="labelCol" :class="'jeecg-online-search'">
  124. <template #label>
  125. <span :title="item.label" class="label-text">{{ item.label }}</span>
  126. </template>
  127. <JSelectUserByDept v-model:value="queryParam[item.field]" :placeholder="'请选择' + item.label" />
  128. </a-form-item>
  129. <a-form-item v-else-if="item.view == CompTypeEnum.SelDepart" :labelCol="labelCol" :class="'jeecg-online-search'">
  130. <template #label>
  131. <span :title="item.label" class="label-text">{{ item.label }}</span>
  132. </template>
  133. <JSelectDept v-model:value="queryParam[item.field]" :placeholder="'请选择' + item.label" />
  134. </a-form-item>
  135. <a-form-item v-else-if="item.view === CompTypeEnum.Popup" :labelCol="labelCol" :class="'jeecg-online-search'">
  136. <template #label>
  137. <span :title="item.label" class="label-text">{{ item.label }}</span>
  138. </template>
  139. <JPopup
  140. :placeholder="'请选择' + item.label"
  141. v-model:value="queryParam[item.field]"
  142. :formElRef="formElRef"
  143. :code="item.dictTable"
  144. :field-config="item.dictCode"
  145. :multi="true"
  146. />
  147. </a-form-item>
  148. <a-form-item v-else-if="item.view === CompTypeEnum.Pca" :labelCol="labelCol" :class="'jeecg-online-search'">
  149. <template #label>
  150. <span :title="item.label" class="label-text">{{ item.label }}</span>
  151. </template>
  152. <JAreaLinkage :placeholder="'请选择' + item.label" v-model:value="queryParam[item.field]" />
  153. </a-form-item>
  154. <!--TODO 缺少的组件-->
  155. <a-form-item
  156. v-else-if="item.view === CompTypeEnum.Checkbox || item.view === CompTypeEnum.ListMulti"
  157. :labelCol="labelCol"
  158. :label="item.label"
  159. :class="'jeecg-online-search'"
  160. >
  161. <!-- <j-select-multiple
  162. v-if="item.config==='1'"
  163. :placeholder=" '请选择'+item.label "
  164. v-model="queryParam[item.field]"
  165. :dictCode="getDictCode(item)">
  166. </j-select-multiple>
  167. <j-select-multiple
  168. v-else
  169. :placeholder=" '请选择'+item.label "
  170. :options="dictOptions[item.dbField]"
  171. v-model="queryParam[item.field]">
  172. </j-select-multiple>-->
  173. </a-form-item>
  174. <a-form-item v-else :labelCol="labelCol" :class="'jeecg-online-search'">
  175. <template #label>
  176. <span :title="item.label" class="label-text">{{ item.label }}</span>
  177. </template>
  178. <template v-if="single_mode === item.mode && 'string' == item.view">
  179. <j-input :placeholder="'请输入' + item.label" v-model:value="queryParam[item.field]" />
  180. </template>
  181. <template v-else-if="single_mode === item.mode">
  182. <a-input :placeholder="'请输入' + item.label" v-model:value="queryParam[item.field]" />
  183. </template>
  184. <template v-else>
  185. <a-input :placeholder="'请输入开始' + item.label" v-model:value="queryParam[item.field + '_begin']" style="width: calc(50% - 15px)" />
  186. <span class="group-query-strig">~</span>
  187. <a-input :placeholder="'请输入结束' + item.label" v-model:value="queryParam[item.field + '_end']" style="width: calc(50% - 15px)" />
  188. </template>
  189. </a-form-item>
  190. </template>
  191. <script lang="ts">
  192. //import JOnlineSearchSelect from '@/components/online/autoform/comp/JOnlineSearchSelect'
  193. import { defineComponent, ref } from 'vue';
  194. import { DateTypeEnum } from '/@/enums/DateTypeEnum.ts';
  195. import { CompTypeEnum } from '/@/enums/CompTypeEnum.ts';
  196. import {
  197. JDictSelectTag,
  198. JTreeSelect,
  199. JCategorySelect,
  200. JSelectUserByDept,
  201. JSelectDept,
  202. JPopup,
  203. JAreaLinkage,
  204. JInput,
  205. JSearchSelect,
  206. } from '/@/components/Form';
  207. export default defineComponent({
  208. name: 'SearchFormItem',
  209. components: {
  210. //JOnlineSearchSelect
  211. JDictSelectTag,
  212. JTreeSelect,
  213. JCategorySelect,
  214. JSelectUserByDept,
  215. JSelectDept,
  216. JPopup,
  217. JAreaLinkage,
  218. JInput,
  219. },
  220. props: {
  221. formElRef: {
  222. type: Object,
  223. default: () => {},
  224. },
  225. item: {
  226. type: Object,
  227. default: () => {},
  228. required: true,
  229. },
  230. dictOptions: {
  231. type: Object,
  232. default: () => {},
  233. required: true,
  234. },
  235. queryParam: {
  236. type: Object,
  237. default: () => {},
  238. required: true,
  239. },
  240. },
  241. setup(props) {
  242. const single_mode = ref('single');
  243. console.log('dictOptions===>', props.dictOptions);
  244. function getDictCode(item) {
  245. if (item.dictTable && item.dictTable.length > 0) {
  246. return item.dictTable + ',' + item.dictText + ',' + item.dictCode;
  247. } else {
  248. return item.dictCode;
  249. }
  250. }
  251. function getSqlByDictCode(item) {
  252. let { dictTable, dictCode, dictText } = item;
  253. let temp = dictTable.toLowerCase();
  254. let arr = temp.split('where');
  255. let condition = '';
  256. if (arr.length > 1) {
  257. condition = ' where' + arr[1];
  258. }
  259. let sql = 'select ' + dictCode + " as 'value', " + dictText + " as 'text' from " + arr[0] + condition;
  260. console.log('sql', sql);
  261. return sql;
  262. }
  263. function getDictOptionKey(item) {
  264. if (item.dbField) {
  265. return item.dbField;
  266. } else {
  267. return item.field;
  268. }
  269. }
  270. // 定义查询条件 文本label的最大宽度 比起单纯的控制字体个数更好
  271. const labelTextMaxWidth = '120px';
  272. const labelCol = {
  273. style: {
  274. 'max-width': labelTextMaxWidth,
  275. },
  276. };
  277. return {
  278. labelTextMaxWidth,
  279. labelCol,
  280. single_mode,
  281. getDictOptionKey,
  282. getDictCode,
  283. getSqlByDictCode,
  284. DateTypeEnum,
  285. CompTypeEnum,
  286. };
  287. },
  288. });
  289. </script>
  290. <style lang="less" scoped>
  291. @ventSpace: zxm;
  292. .group-query-strig {
  293. width: 30px;
  294. text-align: center;
  295. display: inline-block;
  296. }
  297. /* 查询条件左对齐样式设置 */
  298. .jeecg-online-search :deep(.@{ventSpace}-form-item-label) {
  299. flex: 0 0 auto !important;
  300. width: auto;
  301. }
  302. .jeecg-online-search :deep(.@{ventSpace}-form-item-control) {
  303. max-width: 100%;
  304. }
  305. /* label显示宽度 超出显示... */
  306. .jeecg-online-search :deep(.label-text) {
  307. max-width: v-bind(labelTextMaxWidth);
  308. overflow: hidden;
  309. white-space: nowrap;
  310. text-overflow: ellipsis;
  311. overflow-wrap: break-word;
  312. }
  313. </style>