list.vue 8.7 KB

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