demand.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <div class="index">
  3. <el-row>
  4. <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
  5. <custom-form v-model="form" :fields="formFields" :rules="rules" @save="toSave" @draftSave="toDraftSave">
  6. <template #is_use>
  7. <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
  8. </template>
  9. <template #field>
  10. <el-option v-for="i in fieldList" :key="i.id" :label="i.label" :value="i.label"></el-option>
  11. </template>
  12. <template #industry>
  13. <el-option v-for="i in sectorList" :key="i.id" :label="i.title" :value="i.title"></el-option>
  14. </template>
  15. <template #urgent>
  16. <el-option v-for="i in urgentList" :key="i.id" :label="i.label" :value="i.value"></el-option>
  17. </template>
  18. <template #method>
  19. <el-option v-for="i in methodList" :key="i.id" :label="i.label" :value="i.value"></el-option>
  20. </template>
  21. <template #area>
  22. <el-cascader v-model="form.area" :props="{ value: 'name', label: 'name' }" :options="cityList" style="width: 100%" />
  23. </template>
  24. <template #tags>
  25. <el-select v-model="form.tags" multiple filterable allow-create default-first-option :reserve-keyword="false" placeholder="请选择标签" style="width: 100%">
  26. <el-option v-for="item in tagsList" :key="item.id" :label="item.title" :value="item.title" />
  27. </el-select>
  28. </template>
  29. </custom-form>
  30. </el-col>
  31. </el-row>
  32. </div>
  33. </template>
  34. <script setup>
  35. import { cloneDeep, get } from 'lodash-es'
  36. const $checkRes = inject('$checkRes')
  37. import { UserStore } from '@/store/user'
  38. const userStore = UserStore()
  39. const user = computed(() => userStore.user)
  40. // 接口
  41. import { DemandStore } from '@/store/api/platform/demand'
  42. import { DictDataStore } from '@/store/api/system/dictData'
  43. import { TagsStore } from '@/store/api/system/tags'
  44. import { SectorStore } from '@/store/api/platform/sector'
  45. import { RegionStore } from '@/store/api/system/region'
  46. const regionStore = RegionStore()
  47. const store = DemandStore()
  48. const dictDataStore = DictDataStore()
  49. const tagsStore = TagsStore()
  50. const sectorStore = SectorStore()
  51. // 加载中
  52. const loading = ref(false)
  53. // 字典表
  54. const isUseList = ref([])
  55. const statusList = ref([])
  56. const methodList = ref([])
  57. const urgentList = ref([])
  58. const fieldList = ref([])
  59. const cityList = ref([])
  60. const demandList = ref([])
  61. const tagsList = ref([])
  62. const sectorList = ref([])
  63. const form = ref({ time: [] })
  64. const formFields = ref([
  65. { label: '需求名称', model: 'name' },
  66. { label: '标签', model: 'tags', custom: true, mark: 'tags' },
  67. { label: '所属产业', model: 'industry', type: 'select' },
  68. { label: '行业领域', model: 'field' },
  69. { label: '需求紧急度', model: 'urgent', type: 'select', mark: 'dict', code: 'urgent' },
  70. { label: '合作方式', model: 'method', type: 'select', mark: 'dict', code: 'method' },
  71. { label: '价格(万元)', model: 'money' },
  72. { label: '所属企业', model: 'company' },
  73. { label: '企业简况', model: 'company_brief', type: 'textarea' },
  74. { label: '联系人', model: 'contacts' },
  75. { label: '联系电话', model: 'tel' },
  76. { label: '年份', model: 'year', type: 'year' },
  77. { label: '月份', model: 'month', type: 'month' },
  78. { label: '技术需求名称', model: 'tec_name' },
  79. { label: '待解决问题', model: 'question', type: 'textarea' },
  80. { label: '需求地区', model: 'area', custom: true, mark: 'area' },
  81. { label: '发布时间', model: 'time', type: 'daterange', mark: 'time' },
  82. { label: '是否公开', model: 'is_use', type: 'radio', mark: 'dict', code: 'isUse' },
  83. { label: '简介', model: 'brief', type: 'textarea' }
  84. ])
  85. const rules = reactive({ name: [{ required: true, message: '请输入需求名称', trigger: 'blur' }] })
  86. // 请求
  87. onMounted(async () => {
  88. loading.value = true
  89. await searchOther()
  90. loading.value = false
  91. })
  92. const searchOther = async () => {
  93. let result
  94. // 是否使用
  95. result = await dictDataStore.query({ code: 'isUse', is_use: '0' })
  96. if ($checkRes(result)) isUseList.value = result.data
  97. // 状态
  98. result = await dictDataStore.query({ code: 'examStatus', is_use: '0' })
  99. if ($checkRes(result)) statusList.value = result.data
  100. // 合作方式
  101. result = await dictDataStore.query({ code: 'method', is_use: '0' })
  102. if ($checkRes(result)) methodList.value = result.data
  103. // 需求紧急度
  104. result = await dictDataStore.query({ code: 'urgent', is_use: '0' })
  105. if ($checkRes(result)) urgentList.value = result.data
  106. // 技术领域
  107. result = await dictDataStore.query({ code: 'field', is_use: '0' })
  108. if ($checkRes(result)) fieldList.value = result.data
  109. // 需求状态
  110. result = await dictDataStore.query({ code: 'demandStatus', is_use: '0' })
  111. if ($checkRes(result)) demandList.value = result.data
  112. // 标签
  113. result = await tagsStore.query({ is_use: '0' })
  114. if ($checkRes(result)) tagsList.value = result.data
  115. // 行业
  116. result = await sectorStore.query({ is_use: '0' })
  117. if ($checkRes(result)) sectorList.value = result.data
  118. // 城市
  119. result = await regionStore.area({ level: 'province', code: 22 })
  120. if ($checkRes(result)) cityList.value = result.data
  121. }
  122. const toSave = async () => {
  123. const data = cloneDeep(form.value)
  124. const other = { status: '0', user: user.value.id }
  125. if (data.time && data.time.length > 1) {
  126. data.start_time = data.time[0]
  127. data.end_time = data.time[1]
  128. }
  129. delete data.time
  130. let res
  131. if (get(data, 'id')) res = await store.update({ ...data, ...other })
  132. else res = await store.create({ ...data, ...other })
  133. if ($checkRes(res, true)) ElMessage({ message: `发布成功可以长历史发布查看`, type: 'success' })
  134. }
  135. const toDraftSave = async () => {
  136. const data = cloneDeep(form.value)
  137. const other = { status: '-2', user: user.value.id }
  138. if (data.time && data.time.length > 1) {
  139. data.start_time = data.time[0]
  140. data.end_time = data.time[1]
  141. }
  142. delete data.time
  143. let res
  144. if (get(data, 'id')) res = await store.update({ ...data, ...other })
  145. else res = await store.create({ ...data, ...other })
  146. if ($checkRes(res, true)) ElMessage({ message: `发布成功可以长历史发布查看`, type: 'success' })
  147. }
  148. </script>
  149. <style scoped lang="scss"></style>