FormSearch.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. <template>
  2. <div class="formSearch">
  3. <el-form :model="form" label-width="140px" size="small" label-position="right">
  4. <template v-for="item in constants.searchField" >
  5. <div :key="item.label" v-if="(dbType ==2 && item.value!='typeAndStatus')||dbType !=2 ">
  6. <div>
  7. <span>{{item.label}}</span>
  8. <el-divider></el-divider>
  9. </div>
  10. <div>
  11. <el-row>
  12. <el-col :span="24">
  13. <div v-for="(i,index) in item.children" :key="i.value">
  14. <div v-if="index%2==0">
  15. <el-col :span="12" v-if="(item.children[index].type == dbType || item.children[index].type == 3)">
  16. <el-form-item :label="item.children[index].label+':'">
  17. <!-- <el-select v-model="form[item.children[index].value]" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
  18. <el-option
  19. v-for="item in constants[item.children[index].value]"
  20. :key="item.value"
  21. :label="item.label"
  22. :value="item.value">
  23. </el-option>
  24. </el-select> -->
  25. <div v-if="item.children[index].dataType==2" style="display:flex;width:100%">
  26. <el-date-picker
  27. v-model="form[item.children[index].value][0]"
  28. style="width:50%"
  29. type="date"
  30. size='small'
  31. value-format="yyyyMMdd"
  32. placeholder="开始,例:20000101">
  33. </el-date-picker>
  34. <el-date-picker
  35. style="width:50%"
  36. v-model="form[item.children[index].value][1]"
  37. type="date"
  38. size='small'
  39. value-format="yyyyMMdd"
  40. placeholder="结束,例:20001231">
  41. </el-date-picker>
  42. </div>
  43. <div v-else-if="item.children[index].dataType==3" style="width:100%">
  44. <el-select v-model="form[item.children[index].value]" size="small" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
  45. <el-option
  46. v-for="item in item.children[index].value=='GJ'?countryList:constants[item.children[index].value]"
  47. :key="item.value"
  48. :label="item.label"
  49. :value="item.value">
  50. </el-option>
  51. </el-select>
  52. </div>
  53. <div v-else style="width:100%"><el-input size='small' style="width:100%" v-model="form[item.children[index].value]" :placeholder="item.children[index].placeholder"></el-input> </div>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="12" v-if="(item.children[index+1]) && (item.children[index+1].type == dbType || item.children[index+1].type == 3)" >
  57. <el-form-item :label="item.children[index+1].label+':'">
  58. <!-- <el-select v-model="form[item.children[index+1]?.value]" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
  59. <el-option
  60. v-for="item in constants[item.children[index+1]?.value]"
  61. :key="item.value"
  62. :label="item.label"
  63. :value="item.value">
  64. </el-option>
  65. </el-select> -->
  66. <div v-if="item.children[index+1].dataType==2" style="display:flex;width:100%">
  67. <el-date-picker
  68. v-model="form[item.children[index+1].value][0]"
  69. style="width:50%"
  70. type="date"
  71. size='small'
  72. value-format="yyyyMMdd"
  73. placeholder="开始,例:20000101">
  74. </el-date-picker>
  75. <el-date-picker
  76. style="width:50%"
  77. v-model="form[item.children[index+1].value][1]"
  78. type="date"
  79. size='small'
  80. value-format="yyyyMMdd"
  81. placeholder="结束,例:20001231">
  82. </el-date-picker>
  83. </div>
  84. <div v-else-if="item.children[index+1].dataType==3" style="width:100%">
  85. <el-select v-model="form[item.children[index+1].value]" size="small" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
  86. <el-option
  87. v-if="item.children[index+1].value=='GJ'"
  88. @click.native.stop="selectAll"
  89. :label="checked?'取消全选':'全选'"
  90. :value="-1">
  91. </el-option>
  92. <el-option
  93. v-for="item1 in item.children[index+1].value=='GJ'?countryList1:constants[item.children[index+1].value]"
  94. :key="item1.value"
  95. :disabled="item.children[index+1].value=='GJ' && checked"
  96. :label="item1.label"
  97. :value="item1.value">
  98. </el-option>
  99. </el-select>
  100. </div>
  101. <div v-else style="width:100%"><el-input size='small' style="width:100%" v-model="form[item.children[index+1].value]" :placeholder="item.children[index+1].placeholder"></el-input> </div>
  102. </el-form-item>
  103. </el-col>
  104. </div>
  105. </div>
  106. </el-col>
  107. </el-row>
  108. </div>
  109. </div>
  110. </template>
  111. </el-form>
  112. <div class="foot_btn">
  113. <el-button type="danger" plain size="small" style="width:100px" @click="cancel">清空</el-button>
  114. <el-button type="primary" size="small" style="width:100px" @click="search">检索</el-button>
  115. </div>
  116. </div>
  117. </template>
  118. <script>
  119. export default {
  120. name:'FormSearch',
  121. props:['countryList','DBType','selected','editData'],
  122. data() {
  123. return {
  124. form:{
  125. // AD:[],
  126. // PD:[],
  127. // GD:[]
  128. },
  129. dbType:this.DBType=='WD'?'2':'1',
  130. constants:this.$constants,
  131. filedList:[],
  132. option1:[//法律状态
  133. {
  134. label:'有效',
  135. value:1
  136. },
  137. {
  138. label:'无效',
  139. value:2
  140. },
  141. {
  142. label:'审中',
  143. value:3
  144. },
  145. ],
  146. option2:[//专利类型
  147. {
  148. label:'发明',
  149. value:1
  150. },
  151. {
  152. label:'新型',
  153. value:2
  154. },
  155. {
  156. label:'外观',
  157. value:3
  158. },
  159. ],
  160. checked:false,
  161. countryList1:[]
  162. }
  163. },
  164. watch:{
  165. DBType(val){
  166. this.dbType = val == 'WD'?'2':'1'
  167. this.setGJValue()
  168. },
  169. 'countryList'(){
  170. this.countryList1 = this.countryList.filter(item=>item.value!='CN')
  171. },
  172. 'selected'(val){
  173. if(this.selected){
  174. this.setGJValue()
  175. }
  176. },
  177. },
  178. mounted() {
  179. this.countryList1 = this.countryList.filter(item=>item.value!='CN')
  180. this.setGJValue()
  181. var field=JSON.parse(JSON.stringify(this.$constants.searchField))
  182. this.filedList =[].concat(...field.map(item=>{return item.children}))
  183. if(this.editData && this.editData.component == 'FormSearch'){
  184. if(this.editData.data && this.editData.data.length>0){
  185. this.form = this.customToForm(this.editData.data)
  186. }
  187. }
  188. },
  189. methods: {
  190. setGJValue(){
  191. if(this.DBType == 'WD'){
  192. this.$set(this.form,'GJ',JSON.parse(JSON.stringify(this.selected)))
  193. if(this.countryList1.length>0){
  194. if(this.form.GJ.length == this.countryList1.length){
  195. this.checked = true
  196. }
  197. }
  198. }else{
  199. this.$set(this.form,'GJ',[])
  200. }
  201. },
  202. selectAll () {
  203. if (this.form.GJ.length < this.countryList1.length) { // 非全选时,点击选择全部
  204. this.form.GJ = this.countryList1.map((item) => {
  205. return item.value
  206. })
  207. this.checked = true
  208. // this.form.GJ.unshift('-1')
  209. } else { // 全选时,点击置空
  210. this.form.GJ = []
  211. this.checked = false
  212. }
  213. },
  214. cancel(){
  215. this.form = {
  216. AD:[],
  217. PD:[],
  218. GD:[]
  219. }
  220. },
  221. search(){
  222. var str = ''
  223. var keys = Object.keys(this.form)
  224. for(let i = 0;i<keys.length;i++){
  225. var str1 = ''
  226. if(typeof this.form[keys[i]] == 'object'){
  227. if(this.form[keys[i]].length>0){
  228. if(keys[i]=='PD' || keys[i]=='GD' || keys[i]=='AD'){
  229. if(this.form[keys[i]].length>0){
  230. // if(this.form[keys[i]][0]){
  231. // str1 = str1 + keys[i] + '>=' + this.form[keys[i]][0]
  232. // }
  233. // console.log(this.form[keys[i]])
  234. if(!this.form[keys[i]][0] && !this.form[keys[i]][1]){
  235. }else{
  236. if( this.form[keys[i]][0] && this.form[keys[i]][1] ){
  237. // str1 = str1 + ' AND ' + keys[i] + '<=' + this.form[keys[i]][1]
  238. str1 = str1 + keys[i] + '=(' + this.form[keys[i]][0] +'~'+this.form[keys[i]][1] +')'
  239. }else if(!this.form[keys[i]][0] || !this.form[keys[i]][1]){
  240. // str1 = str1 + keys[i] + '<=' + this.form[keys[i]][1]
  241. str1 = str1 + keys[i] + '=(' + (this.form[keys[i]][0] || this.form[keys[i]][1]) +')'
  242. }
  243. }
  244. }
  245. }else if(keys[i]=='GJ'){
  246. if(this.form[keys[i]].length==1){
  247. str1 = str1 + keys[i] + '=(' + this.form[keys[i]][0] +')'
  248. }else if(!this.checked){
  249. str1 = str1 + keys[i] + '=(' + this.form[keys[i]].join(" OR ") +')'
  250. }
  251. }
  252. else{
  253. // this.form[keys[i]].forEach((item,index)=>{
  254. // if(index<this.form[keys[i]].length-1){
  255. // str1 = str1 + keys[i] + '=' + item + ' AND '
  256. // }else{
  257. // str1 = str1 + keys[i] + '=' + item
  258. // }
  259. // })
  260. // if(keys[i] == 'GJ'){
  261. // var index = this.form.GJ.findIndex(item=>{return item == '-1'})
  262. // if(index!=-1){
  263. // this.form.GJ.splice(index,1)
  264. // }
  265. // }
  266. if(this.form[keys[i]].length>1){
  267. str1 = str1 + keys[i] + '=(' + this.form[keys[i]].join(" OR ") +')'
  268. }else{
  269. str1 = str1 + keys[i] + '=(' + this.form[keys[i]][0] +')'
  270. }
  271. }
  272. }
  273. }else{
  274. if(this.form[keys[i]]){
  275. // var a = this.form[keys[i]].replace(/("[^"]*"|'[^']*')/g,'')
  276. // var arr = a.match(/\s{1}and|AND|OR|or|NOT|not\s{1}/g)
  277. // if(arr&&arr.length>0){
  278. // str1 = str1 + keys[i] + '=(' + this.form[keys[i]]+')'
  279. // }else{
  280. // str1 = str1 + keys[i] + '=' + this.form[keys[i]]
  281. // }
  282. str1 = str1 + keys[i] + '=(' + this.form[keys[i]] + ')'
  283. }
  284. }
  285. if(str1!=''){
  286. if(i<keys.length-1){
  287. str = str + str1 + ' AND '
  288. }else{
  289. str = str + str1
  290. }
  291. }
  292. }
  293. if(str.charAt(str.length-1)==' '){
  294. str=str.slice(0,str.length-5);
  295. }
  296. var params = {
  297. data:this.formToCustom(this.form),
  298. DBType:this.DBType,
  299. component:'FormSearch'
  300. }
  301. this.$emit('search',str,params)
  302. },
  303. //表格数据格式转高级检索数据格式
  304. formToCustom(data){
  305. var list = []
  306. for(let key in data){
  307. var item = data[key]
  308. var a = this.filedList.find(item=>{
  309. return item.value == key
  310. })
  311. var obj = {
  312. dataType : a.dataType,
  313. placeholder : a.placeholder,
  314. field:key,
  315. value:item,
  316. logical:'AND',
  317. operator:'=',
  318. }
  319. list.push(obj)
  320. }
  321. return list
  322. },
  323. //高级检索数据格式转表格数据格式
  324. customToForm(data){
  325. var obj = {}
  326. for(var i = 0;i<data.length;i++){
  327. var item = data[i]
  328. obj[item.field] = item.value
  329. }
  330. return obj
  331. },
  332. },
  333. }
  334. </script>
  335. <style lang="scss">
  336. .formSearch .el-divider{
  337. margin-top:5px;
  338. margin-bottom:24px;
  339. }
  340. </style>
  341. <style lang="scss" scoped>
  342. .formSearch{
  343. padding:10px 10px 50px 10px;
  344. }
  345. .foot_btn{
  346. display:flex;
  347. justify-content: center;
  348. flex-direction: column;
  349. position: fixed;
  350. bottom: 10px;
  351. right: 45px;
  352. &>*{
  353. margin: 0;
  354. margin-bottom: 10px;
  355. }
  356. }
  357. </style>