list.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <template>
  2. <hc-card class="hc-project-collect-admin-list" w-to="1660">
  3. <template #headerToSearch>
  4. <hc-date-year v-model="searchForm.startYear" v-model:end="searchForm.endYear" />
  5. <div class="relative ml-3 w-[300px]">
  6. <hc-search-input v-model="searchForm.queryValue" text="搜索" color="#151921" @search="searchClick">
  7. <!-- <template #prepend>
  8. <el-select v-model="searchForm.year" placeholder="年份" clearable style="width: 80px">
  9. <el-option label="2023" value="2023" />
  10. <el-option label="2024" value="2024" />
  11. </el-select>
  12. </template> -->
  13. </hc-search-input>
  14. </div>
  15. </template>
  16. <template #extraToHeader>
  17. <div class="w-[120px]">
  18. <el-select v-model="searchForm.key1" filterable clearable block placeholder="项目阶段" @change="searchClick">
  19. <el-option v-for="item in stateOptions" :key="item.id" :label="item.dictValue" :value="item.id" />
  20. </el-select>
  21. </div>
  22. <div class="ml-2 w-[100px]">
  23. <el-select v-model="searchForm.key2" filterable clearable block placeholder="项目类型" @change="searchClick">
  24. <el-option v-for="item in typeOptions" :key="item.id" :label="item.dictValue" :value="item.id" />
  25. </el-select>
  26. </div>
  27. </template>
  28. <template #extra>
  29. <el-button type="success" class="ml-6" @click="reportsClick">生成报告</el-button>
  30. <el-button v-del-com:[delTableItem] type="danger" class="ml-2" :disabled="tableCheckKeys.length <= 0">批量删除</el-button>
  31. <el-button type="warning" class="ml-2" @click="importClick">导入</el-button>
  32. <el-button v-yes-com:[deriveTableItem] type="primary" class="ml-2" :disabled="tableCheckKeys.length <= 0">批量导出</el-button>
  33. </template>
  34. <HcTableList ref="tableRef" is-admin @tap="rowNameClick" @check="tableCheck" />
  35. <template #action>
  36. <div>建设规模:共计 xx 公里</div>
  37. <hc-pages :pages="searchForm" @change="pageChange" />
  38. </template>
  39. <!-- 生成报告 -->
  40. <hc-dialog v-model="isReportsShow" widths="24rem" title="生成报告" @close="reportsModalClose">
  41. <el-form ref="reportsFormRef" :model="reportsForm" :rules="reportsFormRules" label-position="top" label-width="auto">
  42. <el-row :gutter="20">
  43. <el-col :span="12">
  44. <el-form-item label="选择季度:" prop="key1">
  45. <el-select v-model="reportsForm.key1" placeholder="选择季度">
  46. <el-option label="一季度" value="1" />
  47. <el-option label="二季度" value="2" />
  48. <el-option label="三季度" value="3" />
  49. <el-option label="四季度" value="4" />
  50. </el-select>
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="12">
  54. <el-form-item label="选择月份:" prop="key2">
  55. <el-select v-model="reportsForm.key2" placeholder="选择月份">
  56. <template v-for="item in 12" :key="item">
  57. <el-option :label="`${item}月`" :value="item" />
  58. </template>
  59. </el-select>
  60. </el-form-item>
  61. </el-col>
  62. </el-row>
  63. </el-form>
  64. <template #footer>
  65. <div class="dialog-footer">
  66. <el-button size="large" @click="reportsModalClose">取消</el-button>
  67. <el-button :loading="reportsLoding" type="primary" @click="saveReportsClick">确定</el-button>
  68. </div>
  69. </template>
  70. </hc-dialog>
  71. <!-- 导入 -->
  72. <hc-dialog v-model="isImportShow" widths="24rem" title="项目数据导入" :footer="false" @close="modalImportClose">
  73. <hc-form-upload
  74. v-model="importFile" class="hc-form-drop-upload"
  75. :options="{ num: 0, type: 'list', drop: true }"
  76. :upload="{ options: uploadOptions }"
  77. />
  78. <div class="hc-flex mt-5">
  79. <span class="mr-2">模板下载:</span>
  80. <el-button color="#20C98B" size="small" class="text-white">点击下载</el-button>
  81. </div>
  82. </hc-dialog>
  83. </hc-card>
  84. </template>
  85. <script setup>
  86. import { onMounted, ref } from 'vue'
  87. import HcTableList from '../modules/project-list.vue'
  88. import { getDictionary } from '~api/dictbiz'
  89. import { getArrValue } from 'js-fast-way'
  90. //事件
  91. const emit = defineEmits(['edit'])
  92. //渲染完成
  93. onMounted(() => {
  94. getProStation()
  95. getProType()
  96. })
  97. const tableRef = ref(null)
  98. //项目阶段
  99. const stateOptions = ref([])
  100. const getProStation = async () => {
  101. const { error, code, data } = await getDictionary({ code:'projectStage' })
  102. if (!error && code === 200) {
  103. stateOptions.value = getArrValue(data)
  104. } else {
  105. stateOptions.value = []
  106. }
  107. }
  108. //项目类型
  109. const typeOptions = ref([])
  110. const getProType = async () => {
  111. const { error, code, data } = await getDictionary({ code:'projectType' })
  112. if (!error && code === 200) {
  113. typeOptions.value = getArrValue(data)
  114. } else {
  115. typeOptions.value = []
  116. }
  117. }
  118. //搜索条件
  119. const searchForm = ref({
  120. startYear: '', endYear: '', queryValue: '', year: '',
  121. current: 1, size: 20, total: 0,
  122. })
  123. const searchClick = () => {
  124. }
  125. //分页
  126. const pageChange = ({ current, size }) => {
  127. searchForm.value.current = current
  128. searchForm.value.size = size
  129. }
  130. //表格被选择
  131. const tableCheckKeys = ref([])
  132. const tableCheck = (row) => {
  133. tableCheckKeys.value = row
  134. }
  135. //项目名称被点击
  136. const rowNameClick = (row) => {
  137. emit('edit', row)
  138. }
  139. //批量删除
  140. const delTableItem = (_, resolve) => {
  141. tableRef.value?.batchRemove()
  142. resolve()
  143. }
  144. //批量导出
  145. const deriveTableItem = (_, resolve) => {
  146. tableRef.value?.batchExport()
  147. resolve()
  148. }
  149. //生成报告弹窗
  150. const isReportsShow = ref(false)
  151. const reportsClick = () => {
  152. isReportsShow.value = true
  153. }
  154. //生成报告表单
  155. const reportsFormRef = ref(null)
  156. const reportsForm = ref({})
  157. const reportsFormRules = {
  158. key1: {
  159. required: true,
  160. trigger: 'blur',
  161. message: '请选择季度',
  162. },
  163. key2: {
  164. required: true,
  165. trigger: 'blur',
  166. message: '请选择月份',
  167. },
  168. }
  169. //确认生成报告
  170. const reportsLoding = ref(false)
  171. const saveReportsClick = () => {
  172. isReportsShow.value = false
  173. }
  174. //关闭弹窗
  175. const reportsModalClose = () => {
  176. isReportsShow.value = false
  177. }
  178. //项目数据导入
  179. const isImportShow = ref(false)
  180. const importFile = ref([])
  181. const uploadOptions = {
  182. accept: '.xls,.xlsx',
  183. accept_tip: '请选择Excel文件',
  184. }
  185. const importClick = () => {
  186. isImportShow.value = true
  187. }
  188. //关闭项目数据导入弹窗
  189. const modalImportClose = () => {
  190. isImportShow.value = false
  191. }
  192. </script>
  193. <style lang="scss">
  194. .hc-project-collect-admin-list {
  195. .hc-card-action {
  196. display: flex;
  197. align-items: center;
  198. }
  199. }
  200. </style>