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