index.vue 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <template>
  2. <div class="layout-pd">
  3. <el-row>
  4. <!--操作-->
  5. <el-col :xs="24" >
  6. <el-card class="mt8" shadow="hover" >
  7. <el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom: -3vh;">
  8. <el-form-item prop="name" style="width: 100%">
  9. <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
  10. <el-form-item label="检测员">
  11. <el-input v-model="state.filter.lastTestUser" placeholder="请输入检测员" clearable></el-input>
  12. </el-form-item>
  13. </el-col>
  14. <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
  15. <el-form-item label="主板类型">
  16. <el-select v-model="state.filter.boardType" placeholder="">
  17. <el-option v-for="(value, key) in PCBABoardType" :key="key" :label="value[1].name"
  18. :value="Number(value[1].value)" />
  19. </el-select>
  20. </el-form-item>
  21. </el-col>
  22. <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
  23. <el-form-item label="创建时间">
  24. <el-date-picker
  25. v-model="state.filter.createTimeRange"
  26. type="daterange"
  27. value-format="YYYY-MM-DD HH:mm:ss"
  28. range-separator="To"
  29. start-placeholder="开始日期"
  30. end-placeholder="结束日期"
  31. />
  32. </el-form-item>
  33. </el-col>
  34. </el-form-item>
  35. </el-form>
  36. <hr>
  37. <el-row class="submit-button" style="margin-bottom:-6px">
  38. <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
  39. <el-button type="primary" icon="ele-Document" @click="exportDataToExcel"> 导出 </el-button>
  40. </el-row>
  41. </el-card>
  42. </el-col>
  43. <!--表格-->
  44. <el-col :xs="24" >
  45. <el-card class="my-fill mt8" shadow="hover">
  46. <el-table v-loading="state.loading" ref="myTable" stripe :data="state.tableModel" row-key="id" style="width: 100%">
  47. <!--<el-table-column v-for="column in state.dynamicColumns" :key="column.prop" :prop="column.prop" :label="column.label" >
  48. </el-table-column>-->
  49. <el-table-column prop="boardType" label="主板类型">
  50. <template #default="{ row }">
  51. <div :style="{ color: getPCBABoardType(row.boardType).color }" class="bold-font">
  52. {{ getPCBABoardType(row.boardType).name }}
  53. </div>
  54. </template>
  55. </el-table-column>
  56. <el-table-column prop="code" label="功能码" />
  57. <el-table-column prop="name" label="功能名称" />
  58. <el-table-column prop="num" label="测试功能数量" />
  59. <el-table-column prop="successNum" label="通过数量" />
  60. <el-table-column prop="oneTestSuccessNum" label="测试一次通过数量" />
  61. <el-table-column prop="testTimes" label="测试次数" />
  62. <el-table-column prop="testSuccessTimes" label="测试成功次数" />
  63. <el-table-column prop="successRate" label="测试通过率" >
  64. <template #default="{ row }">
  65. <div> {{row.successRate }}%</div>
  66. </template>
  67. </el-table-column>
  68. <el-table-column prop="oneTestSuccessRate" label="测试一次通过率" >
  69. <template #default="{ row }">
  70. <div> {{row.oneTestSuccessRate }}%</div>
  71. </template>
  72. </el-table-column>
  73. <el-table-column prop="testSuccessRate" label="测试成功率">
  74. <template #default="{ row }">
  75. <div> {{row.testSuccessRate }}%</div>
  76. </template>
  77. </el-table-column>
  78. </el-table>
  79. <div class="my-flex my-flex-end" style="margin-top: 20px">
  80. <el-pagination
  81. v-model:currentPage="pageState.pageInput.currentPage"
  82. v-model:page-size="pageState.pageInput.pageSize"
  83. :total="state.total"
  84. :page-sizes="[10, 15, 20, 50, 100]"
  85. small
  86. background
  87. @size-change="onSizeChange"
  88. @current-change="onCurrentChange"
  89. layout="total, sizes, prev, pager, next, jumper"
  90. />
  91. </div>
  92. </el-card>
  93. </el-col>
  94. </el-row>
  95. </div>
  96. </template>
  97. <script setup lang="ts">
  98. import {onBeforeMount, onMounted, reactive, watch,ref} from "vue";
  99. import eventBus from "/@/utils/mitt";
  100. import { BoardFunctionSummaryApi } from '/@/api/admin/PCBA/boardFunctionSummaryApi'
  101. import { BoardFunctionSummaryOutput } from '/@/api/admin/PCBA/boardFunctionSummaryDto'
  102. import type { pageInput } from "/@/api/admin/shareDto/shareDto";
  103. import { useGlobalCacheStore } from "/@/stores/globalCacheStore";
  104. import { getCurrentInstance } from 'vue';
  105. import { saveAs } from 'file-saver';
  106. import * as ExcelJS from 'exceljs';
  107. import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
  108. // 使用组合式函数获取分页状态
  109. const pageState = useDynamicPageSize(10, 15);
  110. const { proxy: ctx } = getCurrentInstance();
  111. /**获取全局缓存*/
  112. const globalCacheStore = useGlobalCacheStore()
  113. /**数据字典缓存*/
  114. const PCBATestState = ref(globalCacheStore.getGlobalStore().get('pcbaTestState'))
  115. const PCBABoardType = ref(globalCacheStore.getGlobalStore().get('pcbaBoardType'))
  116. const getPCBATestState = (val) => {
  117. val = String(val)
  118. if(PCBATestState.value?.has(val)){
  119. return PCBATestState.value.get(val)
  120. }else {
  121. return val
  122. }
  123. }
  124. const getPCBABoardType = (val) => {
  125. val = String(val)
  126. if(PCBABoardType.value?.has(val)){
  127. return PCBABoardType.value.get(val)
  128. }else {
  129. return val
  130. }
  131. }
  132. /**数据对象*/
  133. const state = reactive({
  134. /**加载显示 */
  135. loading: false,
  136. /**条件查询模块 */
  137. filter: {
  138. /**boardType */
  139. boardType: -1,
  140. /**检测员 */
  141. lastTestUser: "",
  142. // 创建时间范围
  143. createTimeRange:[],
  144. },
  145. /**表格信息 */
  146. tableModel: [] as BoardFunctionSummaryOutput,
  147. /**动态表头 */
  148. dynamicColumns: [
  149. { prop: 'code', label: '功能码' },
  150. { prop: 'name', label: '功能名称' },
  151. { prop: 'num', label: '测试功能数量' },
  152. { prop: 'successNum', label: '通过数量' },
  153. { prop: 'oneTestSuccessNum', label: '测试一次性通过数量' },
  154. { prop: 'testTimes', label: '测试次数' },
  155. { prop: 'testSuccessTimes', label: '测试成功次数' },
  156. { prop: 'successRate', label: '测试通过率,单位:%' },
  157. { prop: 'oneTestSuccessRate', label: '测试一次性通过率,单位:%' },
  158. { prop: 'testSuccessRate', label: '测试成功率,单位:%' },],
  159. /**分页标识 */
  160. pageInput:{
  161. CurrentPage: 1,
  162. PageSize: 10,
  163. } as pageInput,
  164. /**分页总数 */
  165. total: 0,
  166. })
  167. onMounted(() => {
  168. // 初始化分页大小
  169. state.pageInput.PageSize = pageState.pageInput.pageSize;
  170. init()
  171. eventBus.off('refreshView')
  172. eventBus.on('refreshView', async () => {
  173. await init()
  174. })
  175. })
  176. onBeforeMount(() => {
  177. eventBus.off('refreshView')
  178. })
  179. /**页条数变化*/
  180. const onSizeChange = () => {
  181. init()
  182. }
  183. /**页数变化*/
  184. const onCurrentChange = () => {
  185. init()
  186. }
  187. /**
  188. * 监听变换
  189. */
  190. watch(() => {},() => {})
  191. /**条件查询 */
  192. const onQuery = () => {
  193. init()
  194. }
  195. /**初始化 */
  196. const init = async () => {
  197. state.loading = true;
  198. // 处理时间范围,将数组中的开始和结束时间分别赋值给API需要的字段
  199. const { createTimeRange, ...filterWithoutTimeRange } = state.filter;
  200. const beginCreateTime = createTimeRange.length > 0? createTimeRange[0] : "";
  201. const endCreateTime = createTimeRange.length > 1? createTimeRange[1] : "";
  202. const res: any = await new BoardFunctionSummaryApi().getList({
  203. ...pageState.pageInput,
  204. Filter: {
  205. ...filterWithoutTimeRange,
  206. beginCreateTime,
  207. endCreateTime,
  208. },
  209. });
  210. state.total = res?.data?.total?? 0;
  211. state.tableModel = res?.data?.list?? [];
  212. state.loading = false;
  213. };
  214. async function exportDataToExcel() {
  215. const tableData = ctx.$refs.myTable.data;
  216. const workbook = new ExcelJS.Workbook();
  217. const worksheet = workbook.addWorksheet('My Sheet');
  218. worksheet.columns = [
  219. { header: '主板类型', key: 'boardType', width: 15 },
  220. { header: '功能码', key: 'code', width: 15 },
  221. { header: '功能名称', key: 'name', width: 15 },
  222. { header: '测试功能数量', key: 'num', width: 15 },
  223. { header: '通过数量', key: 'successNum', width: 15 },
  224. { header: '测试一次通过数量', key: 'oneTestSuccessNum', width: 15 },
  225. { header: '测试次数', key: 'testTimes', width: 15 },
  226. { header: '测试成功次数', key: 'testSuccessTimes', width: 15 },
  227. { header: '测试通过率', key: 'successRate', width: 15 },
  228. { header: '测试一次通过率', key: 'oneTestSuccessRate', width: 15 },
  229. { header: '测试成功率', key: 'testSuccessRate', width: 15 }
  230. ];
  231. for (let i = 0; i < tableData.length; i++)
  232. {
  233. let data = {...tableData[i]};
  234. data.boardType = getPCBABoardType(data.boardType).name
  235. data.successRate +="%";
  236. data.oneTestSuccessRate +="%";
  237. data.testSuccessRate +="%";
  238. worksheet.addRow(data);
  239. }
  240. // await workbook.xlsx.writeFile('output.xlsx');
  241. // 生成 Excel 文件
  242. const buffer = await workbook.xlsx.writeBuffer();
  243. // 将文件保存到本地
  244. const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
  245. saveAs(blob, '主板功能检测汇总.xlsx');
  246. console.log('文件已成功导出!');
  247. }
  248. </script>
  249. <style scoped lang="scss">
  250. .el-input,
  251. .el-select {
  252. width: 240px;
  253. }
  254. /* 输入框标签固定四个字符宽度 */
  255. ::v-deep .el-form-item__label {
  256. // 字体大小14,4个字符,12px右间距
  257. width: 14*4px+12px;
  258. justify-content: start;
  259. }
  260. /* 数据表头 设置灰色样式 */
  261. ::v-deep .el-table th.el-table__cell {
  262. background-color: #F6F6F6;
  263. }
  264. </style>