left.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <template>
  2. <BasePanelLeft>
  3. <div class="safety-inspection-left-container">
  4. <base-header title="巡查记录"></base-header>
  5. <div class="card-item">
  6. <ul class="record-list">
  7. <template v-if="recordList.length > 0">
  8. <li class="record-list-item" v-for="(obj, i) in recordList" :key="i">
  9. <div class="record-title">{{ obj.securityPatrolName }}</div>
  10. <div class="record-content">
  11. <div class="record-item">
  12. <span>巡查开始时间:</span><span>{{ formatDate(obj.startTime) }}</span>
  13. </div>
  14. <div class="record-item">
  15. <span>巡查结束时间:</span><span>{{ formatDate(obj.endTime) }}</span>
  16. </div>
  17. <div class="record-item" style="display: flex; justify-content: space-between">
  18. <div>
  19. <span>巡查点位数:</span><span>{{ obj.countPatrolPoints }}个</span>
  20. </div>
  21. <div>
  22. <span>巡查责任人:</span><span>{{ obj.responsiblePerson }}</span>
  23. </div>
  24. </div>
  25. </div>
  26. </li>
  27. <!-- <el-collapse v-model="activeNames" class="v-collapse">
  28. <template v-for="(item, index) in listItem">
  29. <el-collapse-item :title="item.responsiblePerson" :name="index" :key="index">
  30. <template slot="title">
  31. <div class="title-num">
  32. <div class="left">{{ item.responsiblePerson }}</div>
  33. <div class="right">{{ item.lists.length }}条</div>
  34. </div>
  35. </template>
  36. <li class="record-list-item" v-for="(obj, i) in item.lists" :key="i">
  37. <div class="record-title">{{ obj.securityPatrolName }}</div>
  38. <div class="record-content">
  39. <div class="record-item">
  40. <span>巡查开始时间:</span><span>{{ formatDate(obj.startTime) }}</span>
  41. </div>
  42. <div class="record-item">
  43. <span>巡查结束时间:</span><span>{{ formatDate(obj.endTime) }}</span>
  44. </div>
  45. <div class="record-item" style="display: flex; justify-content: space-between">
  46. <div>
  47. <span>巡查点位数:</span><span>{{ obj.countPatrolPoints }}个</span>
  48. </div>
  49. <div>
  50. <span>巡查责任人:</span><span>{{ obj.responsiblePerson }}</span>
  51. </div>
  52. </div>
  53. </div>
  54. </li>
  55. </el-collapse-item>
  56. </template>
  57. </el-collapse -->
  58. </template>
  59. <template v-else>
  60. <div class="noData">
  61. <img src="@/assets/image/comprehensive/noData.png" alt="" />
  62. <div class="txt">暂无巡查记录</div>
  63. </div>
  64. </template>
  65. </ul>
  66. <!-- 添加分页组件 -->
  67. <div class="pagination-container" v-if="total > 0">
  68. <el-pagination
  69. @current-change="handlePageChange"
  70. :current-page="pageNum"
  71. :page-size="pageSize"
  72. :total="total"
  73. layout="prev, pager, next"
  74. background
  75. small>
  76. </el-pagination>
  77. </div>
  78. </div>
  79. </div>
  80. </BasePanelLeft>
  81. </template>
  82. <script>
  83. import BasePanelLeft from '@/components/base-panel/base-panel-left'
  84. import BaseHeader from '@/components/base-header/base-header'
  85. import { getPatrolList } from '@/api/securityPatrolApi'
  86. import moment from 'moment'
  87. export default {
  88. name: 'safetyInspectionLeft',
  89. components: { BasePanelLeft, BaseHeader },
  90. data() {
  91. return {
  92. recordList: [],
  93. activeNames:[0,1,2,3],
  94. pageNum: 1, // 当前页码
  95. pageSize: 5, // 每页显示数量
  96. total: 0 // 总记录数
  97. }
  98. },
  99. mounted() {
  100. this.getPatrolList()
  101. },
  102. computed: {
  103. // 将数据按 responsiblePerson 分组
  104. listItem() {
  105. const grouped = {}
  106. this.recordList.forEach((item) => {
  107. const person = item.responsiblePerson
  108. if (!grouped[person]) {
  109. grouped[person] = {
  110. responsiblePerson: person,
  111. lists: []
  112. }
  113. }
  114. grouped[person].lists.push(item)
  115. })
  116. return Object.values(grouped)
  117. },
  118. },
  119. methods: {
  120. getPatrolList() {
  121. let pageNum = this.pageNum
  122. let pageSize = this.pageSize
  123. let params = { finishedState: 1, pageNum, pageSize }
  124. getPatrolList(params).then((res) => {
  125. this.recordList = res.data.records
  126. this.total = res.data.total
  127. })
  128. },
  129. // 处理页码变化
  130. handlePageChange(val) {
  131. console.log(val)
  132. this.pageNum = val
  133. this.getPatrolList()
  134. },
  135. formatDate(date) {
  136. return moment(date).format('YYYY-MM-DD HH:mm:ss')
  137. }
  138. }
  139. }
  140. </script>
  141. <style scoped lang="scss">
  142. @import url('@/assets/scss/px-to-rem.scss');
  143. .safety-inspection-left-container {
  144. position: relative;
  145. height: 100%;
  146. z-index: 1;
  147. .noData {
  148. width: 100%;
  149. height: 100%;
  150. text-align: center;
  151. img {
  152. margin-top: px-to-rem(70);
  153. margin-bottom: px-to-rem(20);
  154. }
  155. .txt {
  156. color: #fff;
  157. font-size: px-to-rem(14);
  158. }
  159. }
  160. .card-item {
  161. position: relative;
  162. width: 3.68rem;
  163. padding: px-to-rem(10);
  164. margin-bottom: px-to-rem(19);
  165. background: url('@/assets/image/common/areaBg.png') no-repeat 0 0 / 100% 100%;
  166. height: calc(100% - px-to-rem(72));
  167. }
  168. .record-list {
  169. display: flex;
  170. flex-direction: column;
  171. padding: px-to-rem(10);
  172. padding-top: 0;
  173. height: 92%;
  174. overflow: auto;
  175. .v-collapse {
  176. border-top: 0;
  177. border-bottom: 0;
  178. margin-top: px-to-rem(11);
  179. :deep(.el-collapse-item__header) {
  180. background: #2c5789;
  181. font-weight: 500;
  182. font-size: px-to-rem(14);
  183. color: #ffffff;
  184. padding: px-to-rem(5) px-to-rem(11);
  185. height: auto;
  186. line-height: initial;
  187. border-bottom: 0;
  188. }
  189. :deep(.el-collapse-item__wrap) {
  190. background-color: transparent;
  191. border-bottom: 0;
  192. }
  193. :deep(.el-collapse-item__content) {
  194. padding: px-to-rem(12) px-to-rem(0);
  195. }
  196. .title-num {
  197. width: 90%;
  198. display: flex;
  199. justify-content: space-between;
  200. }
  201. }
  202. &::-webkit-scrollbar {
  203. display: none;
  204. }
  205. .record-list-item {
  206. display: flex;
  207. flex-direction: column;
  208. margin-bottom: px-to-rem(10);
  209. .record-title {
  210. font-weight: bold;
  211. font-size: px-to-rem(14);
  212. color: #fff;
  213. line-height: px-to-rem(30);
  214. }
  215. .record-content {
  216. display: flex;
  217. flex-direction: column;
  218. border-bottom: 1px solid #5a80b4;
  219. padding-bottom: px-to-rem(20);
  220. .record-item {
  221. font-weight: 400;
  222. font-size: px-to-rem(14);
  223. color: #fff;
  224. opacity: 0.8;
  225. line-height: px-to-rem(30);
  226. }
  227. }
  228. }
  229. }
  230. }
  231. </style>