fillingManage.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <template>
  2. <div>
  3. <div v-show="!fillingAddState.show && !tableDetailsState.show" class="app-container">
  4. <div>
  5. <transition name="fade">
  6. <div v-show="showSearch">
  7. <el-form ref="queryFormRef" :model="queryParams">
  8. <el-row :gutter="20">
  9. <!-- 表格名称 -->
  10. <el-col :span="6">
  11. <el-form-item label="表格名称:" prop="table_name" label-width="auto">
  12. <el-input v-model="queryParams.table_name" placeholder="请输入表格名称"></el-input>
  13. </el-form-item>
  14. </el-col>
  15. <!-- 表格状态 -->
  16. <el-col :span="6">
  17. <el-form-item label="表格状态:" prop="status">
  18. <!-- <el-radio-group v-model="form.task_status">-->
  19. <!-- <el-radio value="0" size="large">在用</el-radio>-->
  20. <!-- <el-radio value="1" size="large">禁止</el-radio>-->
  21. <!-- </el-radio-group>-->
  22. <el-select
  23. v-model="queryParams.status"
  24. clearable
  25. placeholder="请选择"
  26. style="width: 240px"
  27. >
  28. <el-option
  29. v-for="item in options"
  30. :key="item.value"
  31. :label="item.label"
  32. :value="item.value"
  33. />
  34. </el-select>
  35. </el-form-item>
  36. </el-col>
  37. <!-- 发布时间 -->
  38. <el-col :span="6">
  39. <el-form-item label="发布时间:" prop="release_time">
  40. <el-date-picker
  41. v-model="selectedTime"
  42. type="daterange"
  43. range-separator="至"
  44. start-placeholder="开始日期"
  45. end-placeholder="结束日期"
  46. value-format="YYYY-MM-DD HH:mm:ss"
  47. />
  48. </el-form-item>
  49. </el-col>
  50. <!-- 下发状态 -->
  51. <el-col :span="6">
  52. <el-form-item label="发布状态:" prop="issued_status">
  53. <!-- <el-radio-group v-model="queryParams.issued_status">-->
  54. <!-- <el-radio value="0" size="large">待发布</el-radio>-->
  55. <!-- <el-radio value="1" size="large">已发布</el-radio>-->
  56. <!-- </el-radio-group>-->
  57. <el-select
  58. v-model="queryParams.issued_status"
  59. clearable
  60. placeholder="请选择"
  61. style="width: 240px"
  62. >
  63. <el-option
  64. v-for="item in options1"
  65. :key="item.value"
  66. :label="item.label"
  67. :value="item.value"
  68. />
  69. </el-select>
  70. </el-form-item>
  71. </el-col>
  72. <!-- 操作按钮 -->
  73. <el-col :span="6">
  74. <el-button type="primary" @click="handleQuery">查询</el-button>
  75. <el-button type="primary" @click="resetQuery">重置</el-button>
  76. <el-button type="primary" @click="exportTableData()">导出</el-button>
  77. <el-button type="primary" @click="handleAdd">新增</el-button>
  78. </el-col>
  79. </el-row>
  80. </el-form>
  81. </div>
  82. </transition>
  83. <!-- 表格组件 -->
  84. <el-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
  85. <el-table-column label="序号" align="center" prop="id" />
  86. <el-table-column label="表格名称" align="center" prop="table_name" />
  87. <el-table-column label="发布日期" align="center" prop="start_time" />
  88. <el-table-column label="发布状态" align="center" prop="issued_status">
  89. <template #default="scope">
  90. {{ scope.row.issued_status === 2 ? '已发布' : '待发布' }}
  91. </template>
  92. </el-table-column>
  93. <el-table-column label="截止填报时间" align="center" prop="end_time" />
  94. <el-table-column label="状态" align="center" prop="status">
  95. <template #default="scope">
  96. {{ scope.row.status === 1 ? '禁用' : scope.row.status === 0 ? "在用" : "废止" }}
  97. </template>
  98. </el-table-column>
  99. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  100. <template #default="scope">
  101. <!-- 只有待发布状态才显示下发按钮 -->
  102. <el-text v-if="scope.row.issued_status === 1" class="common-btn-text-primary" @click="handleIssue(scope.row)">下发</el-text>
  103. <el-text class="common-btn-text-primary" @click="handleView(scope.row)">详情</el-text>
  104. </template>
  105. </el-table-column>
  106. </el-table>
  107. <pagination
  108. v-show="total > 0"
  109. v-model:page="queryParams.page"
  110. v-model:limit="queryParams.pageSize"
  111. :total="total"
  112. @pagination="handlePagination"
  113. />
  114. </div>
  115. </div>
  116. <FillingAdd v-if="fillingAddState.show" :event-id="fillingAddState.eventId" @close="handleCancel" />
  117. <TableDetails v-if="tableDetailsState.show" :event-id="tableDetailsState.eventId" @close="handleCancel" />
  118. </div>
  119. </template>
  120. <script setup lang="ts">
  121. import { onMounted, reactive, ref, toRefs } from 'vue';
  122. import FillingAdd from './fillingAdd.vue';
  123. import TableDetails from './tableDetails.vue';
  124. import { ElButton, ElCol } from 'element-plus';
  125. import { fillingSelect, fillingRelease } from '@/api/dataFilling/fillingManage';
  126. import * as XLSX from 'xlsx';
  127. import { deepClone } from '@/utils';
  128. import { addDateRange2, parseTime } from '@/utils/ruoyi';
  129. import { fillList } from '@/api/dataFilling/datafilling';
  130. const loading = ref(true);
  131. const showSearch = ref(true);
  132. const selectedTime = ref([]);
  133. const ids = ref<Array<number | string>>([]);
  134. const total = ref(0);
  135. const tableData = ref([]);
  136. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  137. const options = [
  138. {
  139. value: '1',
  140. label: '禁止',
  141. },
  142. {
  143. value: '0',
  144. label: '在用',
  145. }]
  146. const options1 = [
  147. {
  148. value: '1',
  149. label: '待发布',
  150. },
  151. {
  152. value: '2',
  153. label: '已发布',
  154. }]
  155. const initFormData = reactive({
  156. table_id: '',
  157. table_name: '',
  158. filling_time: '',
  159. release_time: '',
  160. release_status: '',
  161. task_status: '',
  162. status: ''
  163. });
  164. const data = reactive({
  165. form: { ...initFormData },
  166. queryParams: {
  167. page: 1,
  168. pageSize: 10,
  169. table_name: '',
  170. release_status: '',
  171. task_status: '',
  172. status: '',
  173. issued_status:''
  174. }
  175. });
  176. const { form, queryParams } = toRefs(data);
  177. let fillingAddState = reactive({
  178. show: false,
  179. eventId: ''
  180. });
  181. let tableDetailsState = reactive({
  182. show: false,
  183. eventId: ''
  184. });
  185. const handleCancel = () => {
  186. fillingAddState.show = false;
  187. tableDetailsState.show = false;
  188. fetchFillList();
  189. };
  190. const handleAdd = () => {
  191. fillingAddState.eventId = null; // 表示新增记录
  192. fillingAddState.show = true;
  193. };
  194. const handleView = (row) => {
  195. if (row) {
  196. tableDetailsState.eventId = row.report_id; // 使用 report_id 作为事件ID
  197. tableDetailsState.show = true;
  198. }
  199. };
  200. const fetchFillList = () => {
  201. loading.value = true;
  202. let params = addDateRange2(deepClone(queryParams.value), selectedTime.value, 'start_time', 'end_time');
  203. // params.status = !queryParams.value.status ? [] : [queryParams.value.status];
  204. // params.issued_status = !queryParams.value.issued_status ? [] : [queryParams.value.issued_status];
  205. fillingSelect(params)
  206. .then((res) => {
  207. for(let i = 0; i < res.data.length; i++) {
  208. res.data[i].end_time = parseTime(res.data[i].end_time);
  209. res.data[i].start_time = parseTime(res.data[i].start_time);
  210. }
  211. tableData.value = res.data;
  212. total.value = res.total;
  213. })
  214. .finally(() => {
  215. loading.value = false;
  216. });
  217. };
  218. onMounted(() => {
  219. fetchFillList();
  220. });
  221. const handleQuery = () => {
  222. queryParams.value.page = 1; // 重置页码
  223. fetchFillList();
  224. };
  225. // 重置查询条件
  226. const resetQuery = () => {
  227. queryParams.value = { page: 1, pageSize: 10, table_name: '', release_status: '', task_status: '' };
  228. selectedTime.value = [];
  229. handleQuery();
  230. };
  231. const handleSelectionChange = (selection) => {
  232. ids.value = selection.map((item) => item.id);
  233. };
  234. const handleTimeChange = () => {
  235. // selectedTimeLabel.value = value ? `${value[0]} 至 ${value[1]}` : '请选择时间';
  236. };
  237. const exportTableData = () => {
  238. const worksheet = XLSX.utils.json_to_sheet(tableData.value);
  239. const workbook = { Sheets: { data: worksheet }, SheetNames: ['data'] };
  240. const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
  241. const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
  242. const link = document.createElement('a');
  243. const url = window.URL.createObjectURL(blob);
  244. link.href = url;
  245. link.download = 'SheetJS.xlsx';
  246. link.click();
  247. window.URL.revokeObjectURL(url); // 清理
  248. };
  249. const handlePagination = ({ page, limit }) => {
  250. queryParams.value.page = page;
  251. queryParams.value.pageSize = limit;
  252. fetchFillList();
  253. };
  254. const handleIssue = (row) => {
  255. fillingAddState.show = true;
  256. fillingAddState.eventId = row.id;
  257. // 检查是否有report_id
  258. // if (!row.report_id) {
  259. // console.error('报告ID不存在,无法下发');
  260. // return;
  261. // }
  262. // // 构造下发请求的URL
  263. // const releaseUrl = `${row.report_id}`;
  264. // 发起下发请求
  265. // fillingRelease(releaseUrl)
  266. // .then(() => {
  267. // fetchFillList();
  268. // })
  269. // .catch((error) => {
  270. // console.error('下发操作失败:', error);
  271. // });
  272. };
  273. </script>