mattersListDrawer.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <template>
  2. <div class="ship-info-drawer">
  3. <el-drawer
  4. :model-value="visible"
  5. @close="emit('update:visible', false)"
  6. title="事项清单查询列表"
  7. :with-header="true"
  8. :close-on-click-modal="false"
  9. size="70%"
  10. >
  11. <!-- 搜索区域 -->
  12. <div class="search-container">
  13. <el-form
  14. label-width="120px"
  15. inline
  16. :model="searchForm"
  17. class="search-form">
  18. <el-row>
  19. <el-col :span="8">
  20. <el-form-item label="通报类型">
  21. <el-select v-model="searchForm.reportType" placeholder="请选择通报类型">
  22. <el-option label="内部" value="internal"></el-option>
  23. <el-option label="外部" value="external"></el-option>
  24. </el-select>
  25. </el-form-item>
  26. </el-col>
  27. <el-col :span="8">
  28. <el-form-item label="通报事项类型">
  29. <el-select v-model="searchForm.reportType" placeholder="请选择通报类型">
  30. <el-option label="内部" value="internal"></el-option>
  31. <el-option label="外部" value="external"></el-option>
  32. </el-select>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="8">
  36. <el-form-item label="通报事项">
  37. <el-input v-model="searchForm.reportItem" placeholder="请输入通报事项"></el-input>
  38. </el-form-item>
  39. </el-col>
  40. </el-row>
  41. <el-row>
  42. <el-col :span="8">
  43. <el-form-item label="通报依据">
  44. <el-input v-model="searchForm.reportItem" placeholder="请输入通报事项"></el-input>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="8">
  48. <el-form-item label="处置建议">
  49. <el-select v-model="searchForm.reportType" placeholder="请选择通报类型">
  50. <el-option label="内部" value="internal"></el-option>
  51. <el-option label="外部" value="external"></el-option>
  52. </el-select>
  53. </el-form-item>
  54. </el-col>
  55. <el-col :span="8">
  56. <el-form-item label="发出单位">
  57. <el-select v-model="searchForm.reportType" placeholder="请选择通报类型">
  58. <el-option label="内部" value="internal"></el-option>
  59. <el-option label="外部" value="external"></el-option>
  60. </el-select>
  61. </el-form-item>
  62. </el-col>
  63. </el-row>
  64. <el-row>
  65. <el-col :span="8">
  66. <el-form-item label="通报依据">
  67. <el-input v-model="searchForm.reportItem" placeholder="请输入通报事项"></el-input>
  68. </el-form-item>
  69. </el-col>
  70. <el-col :span="8">
  71. <el-form-item>
  72. <el-button type="primary" @click="handleSearch">查询</el-button>
  73. <el-button @click="handleReset">重置</el-button>
  74. </el-form-item>
  75. </el-col>
  76. </el-row>
  77. </el-form>
  78. </div>
  79. <!-- 表格区域 -->
  80. <div class="table-container">
  81. <el-table
  82. :data="tableData"
  83. border
  84. stripe
  85. size="small"
  86. :row-class-name="rowClassName"
  87. @row-click="handleRowClick"
  88. :highlight-current-row="true"
  89. >
  90. <el-table-column fixed type="radio" label="序号" width="50" align="center">
  91. <template #default="{ row }">
  92. <el-radio
  93. :label="row.id"
  94. v-model="selectedId"
  95. @change="() => handleRadioChange(row)"
  96. />
  97. </template>
  98. </el-table-column>
  99. <el-table-column prop="reportItem" label="发布单位" min-width="200"></el-table-column>
  100. <el-table-column sortable prop="itemType" label="通报类型" min-width="120"></el-table-column>
  101. <el-table-column sortable prop="createDate" label="通报事项类别" min-width="120"></el-table-column>
  102. <el-table-column sortable prop="createDate" label="通报事项" min-width="120"></el-table-column>
  103. <el-table-column prop="createDate" label="通报标准" min-width="120"></el-table-column>
  104. <el-table-column prop="createDate" label="通报依据" min-width="120"></el-table-column>
  105. <el-table-column sortable prop="createDate" label="处置建议" min-width="120"></el-table-column>
  106. <el-table-column prop="createDate" label="发出单位" min-width="120"></el-table-column>
  107. <el-table-column prop="createDate" label="接收单位" min-width="120"></el-table-column>
  108. <el-table-column prop="createDate" label="创建日期" min-width="120"></el-table-column>
  109. <el-table-column prop="createDate" label="创建人员" min-width="120"></el-table-column>
  110. </el-table>
  111. <!-- 分页器 -->
  112. <div class="pagination-container">
  113. <el-pagination
  114. v-model:current-page="pagination.currentPage"
  115. v-model:page-size="pagination.pageSize"
  116. :total="pagination.total"
  117. layout="total, sizes, prev, pager, next, jumper"
  118. />
  119. </div>
  120. </div>
  121. <div class="drawer-footer">
  122. <el-button @click="emit('update:visible', false)">取消</el-button>
  123. <el-button
  124. type="primary"
  125. @click="confirmSelection"
  126. :disabled="!selectedRow"
  127. >
  128. 确认选择
  129. </el-button>
  130. </div>
  131. </el-drawer>
  132. </div>
  133. </template>
  134. <script setup lang="ts">
  135. import { ref, reactive, watch, defineProps, defineEmits } from 'vue';
  136. // 接收父组件传递的参数
  137. const props = defineProps({
  138. visible: { type: Boolean, default: false },
  139. });
  140. // 向父组件发送事件(v-model语法糖)
  141. const emit = defineEmits(['update:visible', 'update:selectedRow']);
  142. // 单选状态管理
  143. const selectedId = ref<number>(0); // 选中行的ID
  144. const selectedRow = ref<any>(null); // 选中的行数据
  145. const tableData = ref<any[]>([]); // 表格数据
  146. const pagination = reactive({ currentPage: 1, pageSize: 10, total: 0 });
  147. const searchForm = reactive({ reportType: '', reportItem: '' });
  148. // 监听抽屉打开/关闭
  149. watch(
  150. () => props.visible,
  151. (newVal) => {
  152. if (newVal) {
  153. // 抽屉打开时:加载数据 + 回显已选择项
  154. fetchTableData();
  155. } else {
  156. // 抽屉关闭时:重置选中状态(可选,根据需求保留)
  157. selectedId.value = 0;
  158. selectedRow.value = null;
  159. }
  160. }
  161. );
  162. // 加载表格数据(模拟接口)
  163. const fetchTableData = () => {
  164. // 实际项目中替换为接口调用
  165. tableData.value = [
  166. { id: 1, reportItem: '船舶硫含量超标燃油使用', itemType: '信息告知类', createDate: '2024-07-22' },
  167. { id: 2, reportItem: '水路运输市场监管违规', itemType: '协助处置类', createDate: '2023-07-07' },
  168. { id: 3, reportItem: '船舶超核定载重线航行', itemType: '信息告知类', createDate: '2024-07-22' }
  169. ];
  170. pagination.total = tableData.value.length;
  171. };
  172. // 点击行选中(单选逻辑)
  173. const handleRowClick = (row: any) => {
  174. selectedId.value = row.id;
  175. selectedRow.value = row;
  176. };
  177. // 单选框变更事件
  178. const handleRadioChange = (row: any) => {
  179. selectedRow.value = row;
  180. };
  181. // 确认选择(向父组件传递选中数据并关闭抽屉)
  182. const confirmSelection = () => {
  183. if (selectedRow.value) {
  184. emit('update:selectedRow', selectedRow.value); // 传递选中行数据
  185. emit('update:visible', false); // 关闭抽屉
  186. }
  187. };
  188. // 搜索/重置
  189. const handleSearch = () => { /* 实际项目中调用接口 */ };
  190. const handleReset = () => Object.assign(searchForm, { reportType: '', reportItem: '' });
  191. // 行样式(高亮选中行)
  192. const rowClassName = ({ row }: { row: any }) => {
  193. return row.id === selectedId.value ? 'selected-row' : '';
  194. };
  195. </script>
  196. <style scoped lang="scss">
  197. .ship-info-drawer {
  198. :deep(.el-drawer__header) {
  199. background-color: #163a8a !important;
  200. margin: 0 !important;
  201. padding: 20px !important;
  202. color: white !important;
  203. }
  204. }
  205. /* 选中行高亮样式 */
  206. .selected-row {
  207. background-color: #e6f7ff !important;
  208. }
  209. /* 底部按钮区域 */
  210. .drawer-footer {
  211. display: flex;
  212. justify-content: flex-end;
  213. gap: 10px;
  214. padding: 15px;
  215. margin-top: 20px;
  216. }
  217. </style>