owner_serach.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. <template>
  2. <div class="flex flex-center padding white-bg">
  3. <el-form v-model="form" class="lab mt-20 full-width" label-width="145px">
  4. <div class="flex">
  5. <!-------left------->
  6. <div class="flex flex-col mr-10">
  7. <el-form-item class="full-width" label="项目名称">
  8. <el-input
  9. v-model="form.projectName"
  10. placeholder="输入项目关键字"
  11. prefix-icon="Search"
  12. clearable
  13. />
  14. </el-form-item>
  15. <div class="flex flex-center">
  16. <el-form-item class="full-width" label="是否开工">
  17. <el-select v-model="form.isStart" style="width: 100%" clearable>
  18. <el-option
  19. v-for="item in start"
  20. :key="item.value"
  21. :label="item.label"
  22. :value="item.value"
  23. />
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item class="full-width" label="是否入库">
  27. <el-select v-model="form.isStorage" style="width: 100%" clearable>
  28. <el-option
  29. v-for="item in storage"
  30. :key="item.value"
  31. :label="item.label"
  32. :value="item.value"
  33. />
  34. </el-select>
  35. </el-form-item>
  36. </div>
  37. <div>
  38. <el-form-item class="full-width" label="计划(实际)开工时间">
  39. <el-date-picker
  40. v-model="time1"
  41. type="daterange"
  42. @visible-change="visibleTime($event, 1)"
  43. range-separator="至"
  44. start-placeholder="开始时间"
  45. end-placeholder="结束时间"
  46. value-format="YYYY-MM-DD"
  47. format="YYYY-MM-DD"
  48. clearable
  49. />
  50. </el-form-item>
  51. </div>
  52. <div>
  53. <el-form-item class="full-width" label="认定时间">
  54. <el-select v-model="form.projectYear" style="width: 100%">
  55. <el-option
  56. v-for="item in years"
  57. :key="item.value"
  58. :label="item.label"
  59. :value="item.value"
  60. />
  61. </el-select>
  62. </el-form-item>
  63. </div>
  64. </div>
  65. <!-------right------->
  66. <div class="flex flex-col ml-10">
  67. <div class="flex flex-center">
  68. <el-form-item class="full-width" label="省重点">
  69. <el-select
  70. v-model="form.isImportant"
  71. style="width: 100%"
  72. clearable
  73. >
  74. <el-option
  75. v-for="item in isimport"
  76. :key="item.value"
  77. :label="item.label"
  78. :value="item.value"
  79. />
  80. </el-select>
  81. </el-form-item>
  82. <el-form-item class="full-width" label="省集中开工">
  83. <el-select
  84. v-model="form.isFocusStart"
  85. style="width: 100%"
  86. clearable
  87. >
  88. <el-option
  89. v-for="item in isfocus"
  90. :key="item.value"
  91. :label="item.label"
  92. :value="item.value"
  93. />
  94. </el-select>
  95. </el-form-item>
  96. </div>
  97. <div class="flex flex-center flex-justify-between">
  98. <el-form-item class="full-width" label="总投资额">
  99. <el-select
  100. v-model="form.amount"
  101. @change="changeAmount"
  102. style="width: 100%"
  103. clearable
  104. >
  105. <el-option
  106. v-for="item in totalAmount"
  107. :key="item.value"
  108. :label="item.name"
  109. :value="item.value"
  110. />
  111. </el-select>
  112. </el-form-item>
  113. <el-form-item class="full-width" label="机构选择">
  114. <div class="grey-9 pointer chose-box nowrap" @click="getOrg">
  115. {{ deptName }}
  116. </div>
  117. </el-form-item>
  118. </div>
  119. <div class="flex flex-center flex-justify-end"></div>
  120. <div>
  121. <el-form-item class="full-width" label="计划(实际)入库时间">
  122. <el-date-picker
  123. v-model="time2"
  124. type="daterange"
  125. @visible-change="visibleTime($event, 2)"
  126. range-separator="至"
  127. start-placeholder="开始时间"
  128. end-placeholder="结束时间"
  129. value-format="YYYY-MM-DD"
  130. format="YYYY-MM-DD"
  131. clearable
  132. />
  133. </el-form-item>
  134. </div>
  135. <div class="flex flex-align-center flex-justify-end">
  136. <base-button
  137. class="pointer"
  138. icon="Delete"
  139. title="清空"
  140. type="0"
  141. :width="130"
  142. @click="clear"
  143. />
  144. <base-button class="pointer ml-20" width="130" @click="sure" />
  145. </div>
  146. </div>
  147. </div>
  148. </el-form>
  149. <!----机构选择----->
  150. <el-dialog
  151. v-model="showOrg"
  152. append-to-body
  153. center
  154. title="机构选择"
  155. width="45%"
  156. >
  157. <div class="flex flex-col">
  158. <el-input
  159. v-model="keyWords"
  160. clearable
  161. placeholder="机构快速搜索"
  162. prefix-icon="Search"
  163. @blur="change"
  164. />
  165. </div>
  166. <el-divider />
  167. <div
  168. class="hide-scrollbar full-width"
  169. style="height: 40vh; overflow-x: scroll"
  170. >
  171. <!-- <div v-if='attaches.length === 0' class='full-width flex flex-center '>-->
  172. <!-- <el-empty image-size='100'/>-->
  173. <!-- </div>-->
  174. <div class="flex flex-justify-between flex-center">
  175. <span class="bold font-15 grey ml-5">部门</span>
  176. </div>
  177. <div
  178. class="grid radius mt-15 padding"
  179. style="border: 1px solid #dddfe6"
  180. >
  181. <div
  182. v-for="(item, index) in deptList"
  183. :key="item.id"
  184. class="flex flex-center pointer padding"
  185. :class="item.search ? 'org-search' : item.checked ? 'org-s' : 'org'"
  186. @click="changeChecked(index)"
  187. >
  188. <div :class="item.checked ? 'dot-checked' : 'dot'"></div>
  189. <div
  190. class="ml-5 full-width"
  191. :class="item.checked || item.search ? 'white' : ''"
  192. >
  193. {{ item.deptName }}
  194. </div>
  195. </div>
  196. </div>
  197. </div>
  198. <div class="flex flex-center mt-20 mb-5">
  199. <base-button title="重置" type="0" icon="Refresh" @click="orgRefresh" />
  200. <base-button
  201. class="ml-20"
  202. title="确定"
  203. icon="Check"
  204. @click="orgCheck"
  205. />
  206. </div>
  207. </el-dialog>
  208. </div>
  209. </template>
  210. <script>
  211. import baseButton from '../../../components/base-button.vue'
  212. import { useStore } from '@/store/user.js'
  213. export default {
  214. name: 'owner_serach',
  215. components: { baseButton },
  216. watch: {
  217. keyWords: {
  218. handler(val) {
  219. setTimeout(() => {
  220. this.change()
  221. }, 500)
  222. },
  223. immediate: true
  224. }
  225. },
  226. setup() {
  227. const user = useStore()
  228. return { user }
  229. },
  230. data() {
  231. return {
  232. deptList: [],
  233. form: {
  234. projectName: '', // 项目名称/关键字
  235. typeId: '', // 项目分类
  236. isStart: '', // 是否开工
  237. isStorage: '', // 是否入库
  238. amount: '',
  239. isImportant: '', // 是否省重点
  240. isFocusStart: '', // 是否集中开工
  241. deptIds: '', // 机构id,多选
  242. type: true,
  243. projectYear: ''
  244. },
  245. totalAmount: [
  246. {
  247. name: '5000万以下',
  248. value: '0,4999' // 0 max 1 min
  249. },
  250. {
  251. name: '5000-9999万',
  252. value: '5000,9999'
  253. },
  254. {
  255. name: '1 亿以上',
  256. value: '10000,-'
  257. }
  258. ],
  259. start: [
  260. {
  261. label: '否',
  262. value: 0
  263. },
  264. {
  265. label: '是',
  266. value: 1
  267. }
  268. ],
  269. storage: [
  270. {
  271. label: '否',
  272. value: 0
  273. },
  274. {
  275. label: '是',
  276. value: 1
  277. }
  278. ],
  279. isimport: [
  280. {
  281. label: '否',
  282. value: 0
  283. },
  284. {
  285. label: '是',
  286. value: 1
  287. }
  288. ],
  289. isfocus: [
  290. {
  291. label: '否',
  292. value: 0
  293. },
  294. {
  295. label: '是',
  296. value: 1
  297. }
  298. ],
  299. years: [
  300. {
  301. value: 2023
  302. },
  303. {
  304. value: 2022
  305. },
  306. {
  307. value: 2021
  308. },
  309. {
  310. value: 2020
  311. },
  312. {
  313. value: 2019
  314. },
  315. {
  316. value: 2018
  317. },
  318. {
  319. value: 2017
  320. }
  321. ],
  322. typeList: [],
  323. showOrg: false,
  324. keyWords: '',
  325. checked: false,
  326. time1: null, // 计划 实际开工时间
  327. time2: null, // 计划 实际入库时间
  328. deptName: '机构选择'
  329. }
  330. },
  331. created() {
  332. this.getTypeList()
  333. this.form.projectYear = new Date().getFullYear()
  334. },
  335. methods: {
  336. getTypeList() {
  337. this.$api.project.typeList().then(res => {
  338. this.typeList = res.data.records
  339. })
  340. },
  341. sure() {
  342. if (this.time1 !== null && this.form.isStart.length === 0) {
  343. this.$message.error('请先选择是否开工')
  344. return
  345. } else if (this.time2 !== null && this.form.isStorage.length === 0) {
  346. this.$message.error('请先选择是否入库')
  347. return
  348. }
  349. if (this.form.isStart === 0) {
  350. this.form.planCommencementTime =
  351. this.time1 === null ? '' : this.time1.join(',')
  352. this.form.startTime = ''
  353. } else if (this.form.isStart === 1 && this.time1 !== null) {
  354. this.form.planCommencementTime = ''
  355. this.form.startTime = this.time1.join(',')
  356. } else {
  357. this.form.planCommencementTime = ''
  358. this.form.startTime = ''
  359. }
  360. if (this.form.isStorage === 0) {
  361. this.form.planStorageTime =
  362. this.time2 === null ? '' : this.time2.join(',')
  363. this.form.storageTime = ''
  364. } else if (this.form.isStorage === 1 && this.time2 !== null) {
  365. this.form.planStorageTime = ''
  366. this.form.storageTime = this.time2.join(',')
  367. } else {
  368. this.form.planStorageTime = ''
  369. this.form.storageTime = ''
  370. }
  371. this.$bus.emit('serach', this.form)
  372. },
  373. visibleTime(event, type) {
  374. if (event) {
  375. console.log(this.form.isStart)
  376. if (type === 1) {
  377. if (this.form.isStart.length === 0) {
  378. this.$message.error('请先选择是否开工')
  379. return
  380. }
  381. }
  382. if (type === 2) {
  383. if (this.form.isStorage.length === 0) {
  384. this.$message.error('请先选择是否入库')
  385. }
  386. }
  387. }
  388. },
  389. clear() {
  390. this.form.projectName = ''
  391. this.form.typeId = ''
  392. this.form.isStorage = ''
  393. this.form.isStart = ''
  394. this.form.amount = ''
  395. this.form.isFocusStart = ''
  396. this.form.isImportant = ''
  397. this.form.deptIds = ''
  398. this.form.type = false
  399. this.form.planCommencementTime = ''
  400. this.form.startTime = ''
  401. this.form.planStorageTime = ''
  402. this.form.storageTime = ''
  403. this.form.projectYear = ''
  404. this.time1 = null
  405. this.time2 = null
  406. this.deptName = '机构选择'
  407. this.$bus.emit('serach', this.form)
  408. },
  409. changeAmount() {
  410. const tmps = this.form.amount.split(',')
  411. this.form.totalAmountMin = tmps[0] === '-' ? '' : tmps[0]
  412. this.form.totalAmountMax = tmps[1] === '-' ? '' : tmps[1]
  413. },
  414. getOrg() {
  415. if (this.deptList.length > 0) {
  416. this.showOrg = true
  417. return
  418. }
  419. // const parentId = [0, 2].includes(this.user.info.viewStage) ? this.user.info.parentDeptId : this.user.info.deptId
  420. this.$api.common.deptList().then(res => {
  421. if (res.code === 200) {
  422. this.showOrg = true
  423. this.deptList = res.data.map(e => {
  424. e.checked = false
  425. return e
  426. })
  427. } else {
  428. this.$message.error(res.msg)
  429. }
  430. })
  431. },
  432. changeChecked(index) {
  433. this.deptList[index].checked = !this.deptList[index].checked
  434. },
  435. orgCheck() {
  436. const checked = this.deptList.filter(sub => sub.checked)
  437. this.form.deptIds = checked.map(sub => sub.id).join(',')
  438. const tmp = checked.map(e => e.deptName)
  439. if (tmp.length > 0) {
  440. this.deptName = tmp[0]
  441. }
  442. this.showOrg = false
  443. },
  444. orgRefresh() {
  445. this.deptList = this.deptList.map(sub => {
  446. sub.checked = false
  447. return sub
  448. })
  449. },
  450. change() {
  451. if (this.keyWords.length === 0) {
  452. this.deptList.forEach(sub => (sub.search = false))
  453. return
  454. }
  455. const tmp = this.deptList
  456. .filter(sub => sub.deptName.indexOf(this.keyWords) > -1)
  457. .map(sub => sub.id)
  458. tmp.forEach(sub => {
  459. const index = this.deptList.findIndex(ele => ele.id === sub)
  460. this.deptList[index].search = true
  461. })
  462. }
  463. }
  464. }
  465. </script>
  466. <style lang="scss" scoped>
  467. .lab {
  468. :deep(.el-form-item__label) {
  469. color: #707070;
  470. font-size: 15px;
  471. font-weight: 500;
  472. }
  473. }
  474. .chose-box {
  475. width: 100%;
  476. border: 1px solid #dddfe6;
  477. border-radius: 5px;
  478. }
  479. .grid {
  480. display: grid;
  481. grid-template-columns: auto auto auto auto;
  482. }
  483. .org {
  484. border-radius: 8px;
  485. width: 150px;
  486. margin: 10px;
  487. }
  488. .dot {
  489. width: 10px;
  490. height: 10px;
  491. border-radius: 10px;
  492. border: 4px solid #eeeeee;
  493. }
  494. .dot-checked {
  495. width: 10px;
  496. height: 10px;
  497. border-radius: 10px;
  498. border: 4px solid #ecab56;
  499. .title {
  500. color: white;
  501. }
  502. }
  503. .org-search {
  504. border-radius: 8px;
  505. background: #4e637f;
  506. width: 150px;
  507. margin: 10px;
  508. }
  509. .org-s {
  510. border-radius: 8px;
  511. background: #4e637f;
  512. width: 150px;
  513. margin: 10px;
  514. }
  515. </style>