scanDetail.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <template>
  2. <!-- 扫描详情 -->
  3. <div class="page_list">
  4. <div class="search_content">
  5. <div class="content_left">
  6. <el-select v-model="params.batchNo" placeholder="选择批次" @change="GoSearch()" class="select_width" >
  7. <el-option label="全部批次" value=""></el-option>
  8. <el-option v-for="item in batchList"
  9. :key="item.value"
  10. :label="item.label" :value="item.value"></el-option>
  11. </el-select>
  12. <el-select v-model="params.batchNo" placeholder="选择状态" @change="GoSearch()" class="select_width" >
  13. <el-option label="全部状态" value=""></el-option>
  14. <el-option v-for="item in batchList"
  15. :key="item.value"
  16. :label="item.label" :value="item.value"></el-option>
  17. </el-select>
  18. <el-input placeholder="考试名称,编号" v-model="params.keyWord" @input="GoSearch" @change="GoSearch()" class="input_width" >
  19. <el-button @click="GoSearch()" slot="append" icon="el-icon-search"></el-button>
  20. </el-input>
  21. </div>
  22. <div class="content_right">
  23. <el-button @click="Refresh" >
  24. <i class="iconfont icon_shuaxin"></i>刷新
  25. </el-button>
  26. <!-- <el-button class="delete_item" type="text" @click="OpenDeleteAllDialog" v-if="tableData.length>0">删除所有</el-button> -->
  27. <el-button @click="OpenReIdentify" >重新识别</el-button>
  28. <el-button @click="OpenEditExamList()" type="primary" v-if="isImportStudent">编辑考场名单</el-button>
  29. <el-button @click="OpenImportStudent()" type="primary" v-else>导入考场名单</el-button>
  30. </div>
  31. </div>
  32. <div class="page_jg_20"></div>
  33. <div class="page_content" >
  34. <div class="content_table">
  35. <div class="table_header">
  36. <div class="header_left">
  37. <div class="scan_button_header">
  38. <el-button @click="ChangeMode('list')" :type="listMode=='list'?'primary':''"><el-icon><Menu /></el-icon> 列表模式</el-button>
  39. <el-button @click="ChangeMode('pic')" :type="listMode=='pic'?'primary':''"><el-icon><Picture /></el-icon> 图片模式</el-button>
  40. </div>
  41. </div>
  42. <div class="header_right">
  43. 客户端状态:
  44. <span class="scan_state_open" v-if="scanClientStates">
  45. <i class="iconfont icon_open"></i>已打开</span>
  46. <span class="scan_state_close" v-else>
  47. <i class="iconfont icon_close"></i>未打开</span>
  48. </div>
  49. </div>
  50. <div class="page_jg_20"></div>
  51. <div class="page_table">
  52. <el-table :data="tableData" style="width: 100%" :height="tableHeight">
  53. <el-table-column prop="questionName" label="序号" width="100" align="center" >
  54. </el-table-column>
  55. <el-table-column prop="questionType" label="批次" width="120" align="center">
  56. </el-table-column>
  57. <el-table-column prop="questionType" label="考号" width="120" align="center">
  58. </el-table-column>
  59. <el-table-column prop="date" label="客观题" align="center">
  60. <template v-slot="scope">
  61. </template>
  62. </el-table-column>
  63. <el-table-column prop="fullScore" label="状态" width="120" align="center">
  64. <template v-slot="scope">
  65. <div class="full_mark_input">
  66. <el-input v-model="scope.row.fullScore" maxlength="3" @input="(val: any) => onScoreInput(scope.row, 'fullScore', val)"></el-input>
  67. </div>
  68. </template>
  69. </el-table-column>
  70. <el-table-column prop="name" label="操作" width="150" align="center">
  71. <template v-slot="scope">
  72. <div class="ele_button table_row_button">
  73. <span class="btn_editor">编辑</span>
  74. <span class="btn_delete" @click="DeleteSingle(scope.row)">删除</span>
  75. </div>
  76. </template>
  77. </el-table-column>
  78. </el-table>
  79. </div>
  80. </div>
  81. <div class="content_right">
  82. <div class="right_header">
  83. <span> 扫描 设置</span>
  84. <span>
  85. 识别号:
  86. <el-select v-model="params.batchNo" placeholder="请选择" @change="GoSearch()" style="width: 120px;">
  87. <el-option label="全部状态" value=""></el-option>
  88. <el-option v-for="item in batchList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  89. </el-select>
  90. </span>
  91. </div>
  92. <div class="right_center">
  93. <div class="scan_buttons" @click="OpenScan">
  94. <ScanButton></ScanButton>
  95. </div>
  96. <div class="scan_list">
  97. <div class="list_item no_scan" >
  98. <div class="list_item_info " @click="GotoDetail(0)">
  99. <div class="item_info_title">
  100. 未扫描
  101. </div>
  102. <div class="item_info_number">
  103. <span class="number_no_scan">{{}}人</span>
  104. <!-- <span class="number_no_icon"><img src="../../assets/icon/no_scan_icon.png"></span> -->
  105. </div>
  106. </div>
  107. </div>
  108. <div class="list_item no_exam" >
  109. <div class="list_item_info " @click="GotoDetail(2)">
  110. <div class="item_info_title">
  111. 缺考
  112. </div>
  113. <div class="item_info_number">
  114. <span class="number_no_exam">{{}}人</span>
  115. <!-- <span class="number_no_icon"><img src="../../assets/icon/miss_exam.png"></span> -->
  116. </div>
  117. </div>
  118. </div>
  119. <div class="list_item annormal_icon" >
  120. <div class="list_item_info " @click="GotoDetail(3)">
  121. <div class="item_info_title">
  122. 异常
  123. </div>
  124. <div class="item_info_number">
  125. <span class="number_abnormal">{{}}份</span>
  126. <!-- <span class="number_no_icon"><img src="../../assets/icon/abnormal_icon.png"></span> -->
  127. </div>
  128. </div>
  129. </div>
  130. <div class="list_item sucess_upload" >
  131. <div class="list_item_info " @click="GotoDetail(1)">
  132. <div class="item_info_title">
  133. 已上传
  134. </div>
  135. <div class="item_info_number">
  136. <span class="number_uploaded">{{}}人</span>
  137. <!-- <span class="number_no_icon"><img src="../../assets/icon/sucess_upload.png"></span> -->
  138. </div>
  139. </div>
  140. </div>
  141. </div>
  142. </div>
  143. <div class="right_button">
  144. <el-button type="primary" @click="GoSearch()" style="width:calc(100% - 40px);">扫描完成</el-button>
  145. </div>
  146. </div>
  147. </div>
  148. <SelectStudent v-model="showSelectStudent" @success="StudentSuccess"></SelectStudent>
  149. </div>
  150. </template>
  151. <script lang="ts" setup>
  152. import { useExamStore } from '@/store/exam'
  153. import { useRouter } from 'vue-router'
  154. import { onMounted ,ref,computed} from 'vue';
  155. import ScanButton from './components/scanButton.vue'
  156. import SelectStudent from './components/selectStudent.vue'
  157. import { hasImportStudent, } from '@/api/exam'
  158. // 实例化 Store
  159. const examStore = useExamStore()
  160. const router = useRouter()
  161. // 考试科目 ID
  162. const examSubjectId = computed(() => {
  163. return examStore.currentExam?.id
  164. })//计算属性
  165. const params=ref({
  166. batchNo:'',
  167. keyWord:''
  168. })
  169. const batchList=[];
  170. const listMode=ref('list');
  171. const scanClientStates=ref(false);//客户端状态
  172. const tableData=ref([]);
  173. const tableHeight=ref(500);
  174. const isImportStudent=ref(false);//是否导入了学生名单
  175. const showSelectStudent=ref(false);//是否显示选择学生名单弹窗
  176. // 打开导入学生名单
  177. const OpenImportStudent = () => {
  178. showSelectStudent.value=true;
  179. }
  180. // 打开编辑考试名单
  181. const OpenEditExamList = () => {
  182. router.push({
  183. path: '/exam/examList',
  184. query: {
  185. examSubjectId: examSubjectId.value,
  186. },
  187. });
  188. }
  189. //学生名单导入成功
  190. const StudentSuccess = () => {
  191. HasImportStudent();
  192. }
  193. //查询是否导入了学生名单
  194. const HasImportStudent = async () => {
  195. const params = {
  196. examSubjectId: examSubjectId.value,
  197. schoolId: 0,//单校 0
  198. };
  199. const res = await hasImportStudent(params);
  200. console.log("打印是否导入了学生名单",res);
  201. if(res.code==200)
  202. {
  203. isImportStudent.value=res.data;
  204. }
  205. else{
  206. isImportStudent.value=false;
  207. }
  208. }
  209. onMounted(() => {
  210. if (!examStore.currentExam) {
  211. console.warn('当前没有选中的考试信息')
  212. // 可选:如果没有数据,可以重定向回列表页或提示用户
  213. }
  214. HasImportStudent();
  215. })
  216. </script>
  217. <style lang="scss" scoped>
  218. .page_list
  219. {
  220. width: 100%;
  221. height: 100%;
  222. padding: 20px;
  223. background-color: #fff;
  224. border-radius: 4px;
  225. box-sizing: border-box;
  226. }
  227. </style>