score.vue 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730
  1. <template>
  2. <div class="pb_content" style="width: 100%">
  3. <div
  4. class="pb_head"
  5. style="
  6. display: flex;
  7. flex-direction: row;
  8. flex-wrap: nowrap;
  9. justify-content: space-between;
  10. align-items: center;
  11. "
  12. >
  13. <div>
  14. <span>评分管理</span>
  15. </div>
  16. <div @click="goTo('/eventCenter?steps=' + '1')" class="clear">返回</div>
  17. </div>
  18. <div class="touTop" v-if="CourseType.length > 0">
  19. <div class="touLeft">
  20. <div class="sTop">
  21. <div>
  22. <div
  23. class="all_choose"
  24. v-for="(item, index) in CourseType[0]"
  25. :key="index"
  26. >
  27. <span>{{ item.name }}</span>
  28. <el-select
  29. v-model="courseTypeId[item.id]"
  30. placeholder="请选择"
  31. @change="search"
  32. >
  33. <el-option label="全部" value="1">全部</el-option>
  34. <el-option
  35. v-for="item1 in CourseTypeJson[item.id]"
  36. :key="item1.id"
  37. :label="item1.name"
  38. :value="item1.id"
  39. >
  40. </el-option>
  41. </el-select>
  42. </div>
  43. </div>
  44. <div @click="clear" class="clear">重置</div>
  45. </div>
  46. <div class="aName">
  47. <div class="search" @click="search">
  48. <img src="../../../assets/icon/search.png" alt="" />
  49. </div>
  50. <el-input
  51. v-model="anliName"
  52. auto-complete="off"
  53. placeholder="请输入案例名称"
  54. ></el-input>
  55. <!-- @input="search" -->
  56. </div>
  57. </div>
  58. <!-- 导出所有评分数据 -->
  59. <!-- <el-button
  60. v-show="false"
  61. type="primary"
  62. size="small"
  63. @click="exportAllScore"
  64. style="margin-right: 10px"
  65. >导出Excel</el-button
  66. > -->
  67. <!-- 导出个人评分数据 -->
  68. <!-- <el-button
  69. v-show="false"
  70. type="primary"
  71. size="small"
  72. @click="exportScoreByUid"
  73. style="margin-right: 10px"
  74. >导出Excel</el-button
  75. > -->
  76. </div>
  77. <div v-if="isNoTableData" class="isNoMessage">
  78. <img src="../../../assets/icon/isNoMessage.png" alt />
  79. </div>
  80. <div
  81. class="pb_content_body"
  82. style="margin: 0 auto"
  83. v-if="tableData.length > 0"
  84. >
  85. <div class="student_table">
  86. <el-table
  87. ref="table"
  88. :data="tableData"
  89. border
  90. :fit="true"
  91. v-loading="isLoading"
  92. style="width: 100%;"
  93. @sort-change="ownScoreSort"
  94. :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }"
  95. :row-class-name="tableRowClassName"
  96. :default-sort = "{prop: 'ownScore', order: 'descending'}"
  97. >
  98. <el-table-column label="序号" min-width="5" align="center">
  99. <template slot-scope="scope">
  100. <div>
  101. {{ (page - 1) * 10 + scope.$index + 1 }}
  102. </div>
  103. </template>
  104. </el-table-column>
  105. <el-table-column
  106. label="创建人"
  107. min-width="5"
  108. align="center"
  109. v-if="false"
  110. >
  111. <template slot-scope="scope">
  112. <div class="userImg">
  113. <div>
  114. {{ scope.row.uname }}
  115. </div>
  116. </div>
  117. </template>
  118. </el-table-column>
  119. <el-table-column label="项目案例" min-width="20" align="center">
  120. <template slot-scope="scope">
  121. <div>
  122. {{ scope.row.info.title ? scope.row.info.title : "暂无名称" }}
  123. </div>
  124. </template>
  125. </el-table-column>
  126. <el-table-column
  127. label="案例分类"
  128. min-width="20"
  129. align="center"
  130. v-if="['0','2'].includes(tType)"
  131. >
  132. <template slot-scope="scope">
  133. <div>{{ scope.row.typename ? scope.row.typename : "-" }}</div>
  134. </template>
  135. </el-table-column>
  136. <el-table-column
  137. label="我的评分"
  138. min-width="10"
  139. align="center"
  140. prop="ownScore"
  141. sortable="custom"
  142. v-if="tType == 2"
  143. >
  144. <!-- <template slot="header">
  145. <div style="display: flex;float: left;align-items: center;position: relative;">
  146. <el-tooltip effect="light" :content="`一等90分以上 占比${ratingData.one[1]}%,二等75-89 占比${ratingData.two[1]}%,三等60-74 占比${ratingData.three[1]}%`" placement="top">
  147. <div style="position:relative;left:15px;top:5px;">我的评分</div>
  148. </el-tooltip>
  149. </div>
  150. </template> -->
  151. <template slot-scope="scope">
  152. <div>{{ scope.row.ownScore ? scope.row.ownScore : "-" }}</div>
  153. </template>
  154. </el-table-column>
  155. <el-table-column
  156. label="所属单位"
  157. min-width="10"
  158. align="center"
  159. v-if="tType == 0"
  160. >
  161. <template slot-scope="scope">
  162. <div>
  163. {{ scope.row.school ? scope.row.school : "暂无单位" }}
  164. </div>
  165. </template>
  166. </el-table-column>
  167. <el-table-column
  168. label="评委姓名/分数"
  169. min-width="10"
  170. align="center"
  171. v-if="tType == 0"
  172. >
  173. <template slot-scope="scope">
  174. <div
  175. v-for="(item, index) in scope.row.scoreList"
  176. :key="index"
  177. v-if="scope.row.scoreList.length > 0"
  178. >
  179. {{ item.name + "/" + item.score }}
  180. </div>
  181. <div v-else>"-"</div>
  182. </template>
  183. </el-table-column>
  184. <!-- <el-table-column
  185. label="评委姓名/分数"
  186. min-width="10"
  187. align="center"
  188. v-if="tType == 0"
  189. >
  190. <template slot-scope="scope">
  191. <div>
  192. {{
  193. scope.row.secondPw
  194. ? scope.row.secondPw.name + "/" + scope.row.secondPw.score
  195. : "-"
  196. }}
  197. </div>
  198. </template>
  199. </el-table-column> -->
  200. <el-table-column
  201. label="平均得分"
  202. min-width="10"
  203. align="center"
  204. sortable="custom"
  205. v-if="tType == 0"
  206. >
  207. <!-- <template slot="header">
  208. <div style="display: flex;float: left;align-items: center;position: relative;">
  209. <el-tooltip effect="light" :content="`一等90分以上 占比${ratingDataAdmin.one[1]}%,二等75-89 占比${ratingDataAdmin.two[1]}%,三等60-74 占比${ratingDataAdmin.three[1]}%`" placement="top">
  210. <div style="position:relative;left:40px;top:5px;">平均得分</div>
  211. </el-tooltip>
  212. </div>
  213. </template> -->
  214. <template slot-scope="scope">
  215. <div>{{ scope.row.scoreList.length>0?scope.row.scoreList.length>=2?scope.row.sum ? scope.row.sum : "-":"-":""}}</div>
  216. <!-- <div>{{ scope.row.sum ? scope.row.sum : "-" }}</div> -->
  217. </template>
  218. </el-table-column>
  219. <!-- <el-table-column
  220. label="所获奖项"
  221. min-width="10"
  222. align="center"
  223. v-if="tType == 2"
  224. >
  225. <template slot-scope="scope">
  226. <div>
  227. {{
  228. scope.row.award == 1
  229. ? "特等奖"
  230. : scope.row.award == 2
  231. ? "一等奖"
  232. : scope.row.award == 3
  233. ? "二等奖"
  234. : scope.row.award == 4
  235. ? "三等奖"
  236. : scope.row.award == 5
  237. ? "四等奖"
  238. : "-"
  239. }}
  240. </div>
  241. </template>
  242. </el-table-column> -->
  243. <el-table-column
  244. label="评分时间"
  245. min-width="10"
  246. align="center"
  247. v-if="tType == 2"
  248. >
  249. <template slot-scope="scope">
  250. <div>{{ scope.row.scoreTime ? scope.row.scoreTime : "-" }}</div>
  251. </template>
  252. </el-table-column>
  253. <el-table-column label="操作" min-width="20" width="100">
  254. <template slot-scope="scope">
  255. <div class="tableButton">
  256. <div
  257. v-if="tType == 0"
  258. @click="
  259. goTo(
  260. '/anliDetail?aid=' +
  261. scope.row.id +
  262. '&userid=' +
  263. userid +
  264. '&oid=' +
  265. oid +
  266. '&org=' +
  267. org +
  268. '&tType=' +
  269. tType
  270. )
  271. "
  272. >
  273. 查看
  274. </div>
  275. <!-- <div @click="openScore(scope.row, 1)">立即评分</div> -->
  276. <div
  277. v-if="tType == 2"
  278. @click="
  279. goTo(
  280. '/anliDetail?aid=' +
  281. scope.row.id +
  282. '&userid=' +
  283. userid +
  284. '&oid=' +
  285. oid +
  286. '&org=' +
  287. org +
  288. '&tType=' +
  289. tType
  290. )
  291. "
  292. >
  293. 立即评分
  294. </div>
  295. <!-- <div @click="openScore(scope.row, 2)">推荐</div> -->
  296. </div>
  297. </template>
  298. </el-table-column>
  299. </el-table>
  300. </div>
  301. <div class="student_page">
  302. <el-pagination
  303. background
  304. layout="prev, pager, next"
  305. :page-size="10"
  306. :total="total"
  307. v-if="page && tableData.length"
  308. style="padding-bottom: 20px"
  309. @current-change="handleCurrentChange"
  310. >
  311. </el-pagination>
  312. <el-tooltip v-if="tType=='2'" effect="light" :content="`评分比例为一等90分以上占比30%,二等 75-89分占比40%,三等60-74分占比30%`" placement="top-start">
  313. <div class="rating_information">
  314. <div class="ri-card" :style="`background-color: ${Math.abs(30-ratingData.one[1])<=5?'#E2F0D9':'#FCE4D6'}`">90分以上:{{ratingData.one[0]}}个 {{ratingData.one[1]}}%</div>
  315. <div class="ri-card" :style="`background-color: ${Math.abs(40-ratingData.two[1])<=5?'#E2F0D9':'#FCE4D6'}`">89-75分:{{ratingData.two[0]}}个 {{ratingData.two[1]}}%</div>
  316. <div class="ri-card" :style="`background-color: ${Math.abs(30-ratingData.three[1])<=5?'#E2F0D9':'#FCE4D6'}`">74-60分以上:{{ratingData.three[0]}}个 {{ratingData.three[1]}}%</div>
  317. <div class="ri-card" :style="`background-color: #FCE4D6`" v-if="ratingData.four[0]!=0">60分以下:{{ratingData.four[0]}}个 {{ratingData.four[1]}}%</div>
  318. <div class="ri-card" style="background-color: #E7E6E6;">未评分:{{ratingData.five[0]}}个 {{ratingData.five[1]}}%</div>
  319. </div>
  320. </el-tooltip>
  321. <el-tooltip v-if="tType=='0'" effect="light" :content="`评分比例为一等90分以上占比30%,二等 75-89分占比40%,三等60-74分占比30%`" placement="top-start">
  322. <div class="rating_information">
  323. <div class="ri-card" :style="`background-color: ${Math.abs(30-ratingDataAdmin.one[1])<=5?'#E2F0D9':'#FCE4D6'}`">90分以上:{{ratingDataAdmin.one[0]}}个 {{ratingDataAdmin.one[1]}}%</div>
  324. <div class="ri-card" :style="`background-color: ${Math.abs(40-ratingDataAdmin.two[1])<=5?'#E2F0D9':'#FCE4D6'}`">89-75分:{{ratingDataAdmin.two[0]}}个 {{ratingDataAdmin.two[1]}}%</div>
  325. <div class="ri-card" :style="`background-color: ${Math.abs(30-ratingDataAdmin.three[1])<=5?'#E2F0D9':'#FCE4D6'}`">74-60分以上:{{ratingDataAdmin.three[0]}}个 {{ratingDataAdmin.three[1]}}%</div>
  326. <div class="ri-card" :style="`background-color: #FCE4D6`" v-if="ratingDataAdmin.four[0]!=0">60分以下:{{ratingDataAdmin.four[0]}}个 {{ratingDataAdmin.four[1]}}%</div>
  327. <div class="ri-card" style="background-color: #E7E6E6;">未评分:{{ratingDataAdmin.five[0]}}个 {{ratingDataAdmin.five[1]}}%</div>
  328. </div>
  329. </el-tooltip>
  330. </div>
  331. </div>
  332. <el-dialog
  333. title="评分"
  334. :visible.sync="dialogVisibleScore"
  335. :append-to-body="true"
  336. width="25%"
  337. height="80%"
  338. :before-close="handleClose"
  339. class="dialog_diy customWidth1"
  340. >
  341. <div class="scoreBox" v-for="(s, sIndex) in scoreDetail" :key="sIndex">
  342. <div class="scoreCss">
  343. <div class="scoreTitle">
  344. <div><img src="../../../assets/avatar.png" alt="" /></div>
  345. <div>{{ s.uname }}</div>
  346. </div>
  347. <div class="anliTitle">
  348. <div>案例名称</div>
  349. <div>{{ s.title }}</div>
  350. </div>
  351. <div class="anliBrief">
  352. <div>案例简介</div>
  353. <div style="width: 650px; height: 150px; overflow: auto">
  354. {{ s.detail }}
  355. </div>
  356. </div>
  357. <div class="anliScore">
  358. <div>请选择评分</div>
  359. <div>
  360. <div class="scoreDiv">
  361. <div>项目式学习</div>
  362. <div>
  363. <el-input
  364. placeholder="输入分数"
  365. v-model="s.scoreAll.first"
  366. @change="isNumber($event, 1)"
  367. ></el-input>
  368. </div>
  369. </div>
  370. <div class="scoreDiv">
  371. <div>项目成果</div>
  372. <div>
  373. <el-input
  374. placeholder="输入分数"
  375. v-model="s.scoreAll.second"
  376. @change="isNumber($event, 2)"
  377. ></el-input>
  378. </div>
  379. </div>
  380. <div class="scoreDiv">
  381. <div>项目评价</div>
  382. <div>
  383. <el-input
  384. placeholder="输入分数"
  385. v-model="s.scoreAll.third"
  386. @change="isNumber($event, 3)"
  387. ></el-input>
  388. </div>
  389. </div>
  390. <!-- <div class="scoreDiv">
  391. <div>评审维度4</div>
  392. <div>
  393. <el-input
  394. placeholder="输入分数"
  395. v-model="s.scoreAll.fourth"
  396. @change="isNumber($event, 4)"
  397. ></el-input>
  398. </div>
  399. </div>
  400. <div class="scoreDiv">
  401. <div>评审维度5</div>
  402. <div>
  403. <el-input
  404. placeholder="输入分数"
  405. v-model="s.scoreAll.fivth"
  406. @change="isNumber($event, 5)"
  407. ></el-input>
  408. </div>
  409. </div> -->
  410. </div>
  411. </div>
  412. <div class="anliContent">
  413. <textarea
  414. :rows="5"
  415. class="tAreaCss"
  416. placeholder="请输入评语。"
  417. v-model="s.scoreAll.content"
  418. ></textarea>
  419. </div>
  420. <div class="addScore" @click="addScore">进行评分</div>
  421. </div>
  422. </div>
  423. </el-dialog>
  424. <el-dialog
  425. title="推荐省级评奖"
  426. :visible.sync="dialogVisibleRecommend"
  427. :append-to-body="true"
  428. width="25%"
  429. height="80%"
  430. :before-close="handleClose"
  431. class="dialog_diy customWidth1"
  432. >
  433. <div v-for="(r, rIndex) in scoreDetail" :key="rIndex">
  434. <div class="reTitle">
  435. <div>案例名称</div>
  436. <div>{{ r.title }}</div>
  437. </div>
  438. <div class="reDetail">
  439. <div>案例简介</div>
  440. <div>{{ r.detail }}</div>
  441. </div>
  442. <div class="reScore">
  443. <div>当前得分</div>
  444. <div>
  445. <span>{{ r.sumScore }}</span
  446. >分
  447. </div>
  448. </div>
  449. <div class="reBottom">
  450. <div>提示:点击确定提交,即可推送到市级进行评奖</div>
  451. <div @click="dialogVisibleRecommend = false">取消</div>
  452. <div @click="addRecommend">确定提交</div>
  453. </div>
  454. </div>
  455. </el-dialog>
  456. </div>
  457. </template>
  458. <script>
  459. export default {
  460. data() {
  461. return {
  462. userid: this.$route.query.userid
  463. ? this.$route.query.userid
  464. : this.$cookies.get("teacherInfo").userid,
  465. oid: this.$route.query.oid
  466. ? this.$route.query.oid
  467. : this.$cookies.get("teacherInfo").oid,
  468. org: this.$route.query.org
  469. ? this.$route.query.org
  470. : this.$cookies.get("teacherInfo").org,
  471. tType: this.$route.query.type
  472. ? this.$route.query.type
  473. : this.$cookies.get("teacherInfo").type,
  474. page: 1,
  475. total: 0,
  476. // anliType: "",
  477. tableHeight: "",
  478. isLoading: false,
  479. CourseType: [],
  480. CourseTypeJson: {},
  481. courseTypeId: {},
  482. courseTypeSon: [],
  483. anliName: "",
  484. anliBox: "",
  485. tableData: [],
  486. scoreListData:[],
  487. allScoreList:[],
  488. scoreFn:2,// 0 默认 1 升序 2 降序
  489. reviewer: "",
  490. reviewerBox: [],
  491. checkboxList: [],
  492. checkboxIdList: [],
  493. isNoTableData: false,
  494. isIndeterminate: false,
  495. checkAll: false,
  496. dialogVisibleScore: false,
  497. dialogVisibleRecommend: false,
  498. scoreDetail: [
  499. {
  500. id: "",
  501. uname: "",
  502. title: "",
  503. detail: "",
  504. scoreAll: {
  505. first: "",
  506. second: "",
  507. third: "",
  508. // fourth: "",
  509. // fivth: "",
  510. content: "",
  511. },
  512. sumScore: 0,
  513. },
  514. ],
  515. reCid: "",
  516. };
  517. },
  518. computed: {
  519. ratingData(){
  520. const myScore = this.allScoreList.filter(i=>i.scorer===this.userid)
  521. let one = [0,0];
  522. let two = [0,0];
  523. let three = [0,0];
  524. let four = [0,0];
  525. let five = [0,0]
  526. myScore.forEach(i=>{
  527. let score = JSON.parse(i.score);
  528. let total = (parseFloat(score.first)+parseFloat(score.second)+parseFloat(score.third))/3
  529. if(total>=90){
  530. one[0]++;
  531. }else if(total>=75 && total<=89){
  532. two[0]++;
  533. }else if(total>=60 && total<=74){
  534. three[0]++;
  535. }else{
  536. four[0]++;
  537. }
  538. })
  539. five[0] = this.total-myScore.length;
  540. one[1] = (one[0]/this.total*100).toFixed(0)
  541. two[1] = (two[0]/this.total*100).toFixed(0)
  542. three[1] = (three[0]/this.total*100).toFixed(0)
  543. four[1] = (four[0]/this.total*100).toFixed(0)
  544. five[1] = (five[0]/this.total*100).toFixed(0)
  545. return {one:one,two:two,three:three,four:four,five:five}
  546. },
  547. ratingDataAdmin(){
  548. const score = this.scoreListData;
  549. let one = [0,0];
  550. let two = [0,0];
  551. let three = [0,0];
  552. let four = [0,0];
  553. let five = [0,0]
  554. score.forEach(i=>{
  555. let sum = i.sum;
  556. if(!sum){
  557. return five[0]++
  558. }
  559. if(parseFloat(sum)>=90){
  560. return one[0]++
  561. }else if(parseFloat(sum)>=75 && parseFloat(sum)<=89){
  562. return two[0]++;
  563. }else if(parseFloat(sum)>=60 && parseFloat(sum)<=74){
  564. return three[0]++;
  565. }else{
  566. return four[0]++;
  567. }
  568. })
  569. one[1] = (one[0]/this.total*100).toFixed(0)
  570. two[1] = (two[0]/this.total*100).toFixed(0)
  571. three[1] = (three[0]/this.total*100).toFixed(0)
  572. four[1] = (four[0]/this.total*100).toFixed(0)
  573. five[1] = (five[0]/this.total*100).toFixed(0)
  574. return {one:one,two:two,three:three,four:four,five:five}
  575. }
  576. },
  577. mounted() {
  578. this.$nextTick(function () {
  579. this.tableHeight =
  580. window.innerHeight - this.$refs.table.$el.offsetTop - 200;
  581. if (this.tableHeight <= 530) {
  582. this.tableHeight = 530;
  583. }
  584. // 监听窗口大小变化
  585. let self = this;
  586. window.onresize = function () {
  587. self.tableHeight =
  588. window.innerHeight - self.$refs.table.$el.offsetTop - 200;
  589. if (self.tableHeight <= 530) {
  590. self.tableHeight = 530;
  591. }
  592. };
  593. });
  594. },
  595. methods: {
  596. tableRowClassName({ row, rowIndex }) {
  597. if ((rowIndex + 1) % 2 === 0) {
  598. return "even_row";
  599. } else {
  600. return "";
  601. }
  602. },
  603. handleCurrentChange(val) {
  604. this.page = val;
  605. this.getAnliList(this.reCid);
  606. },
  607. search() {
  608. this.page = 1;
  609. this.getAnliList(this.reCid);
  610. },
  611. goTo(path) {
  612. this.$router.push(path);
  613. },
  614. isNumber(e, t) {
  615. if (e.includes(".")) {
  616. this.$message.error("暂时不支持小数点评分");
  617. }
  618. let value = /^\d+$/.test(e);
  619. // let value = e.replace(/[^d]/g, ""); // 只能输入数字
  620. if (value == true) {
  621. if (e < 0) {
  622. this.$message.error("请输入大于0的数值");
  623. if (t == 1) {
  624. this.scoreDetail[0].scoreAll.first = "";
  625. } else if (t == 2) {
  626. this.scoreDetail[0].scoreAll.second = "";
  627. } else {
  628. this.scoreDetail[0].scoreAll.third = "";
  629. }
  630. // else if (t == 4) {
  631. // this.scoreDetail[0].scoreAll.fourth = "";
  632. // } else {
  633. // this.scoreDetail[0].scoreAll.fivth = "";
  634. // }
  635. return;
  636. } else if (e > 100) {
  637. this.$message.error("数值不能大于100");
  638. if (t == 1) {
  639. this.scoreDetail[0].scoreAll.first = "";
  640. } else if (t == 2) {
  641. this.scoreDetail[0].scoreAll.second = "";
  642. } else {
  643. this.scoreDetail[0].scoreAll.third = "";
  644. }
  645. // else if (t == 4) {
  646. // this.scoreDetail[0].scoreAll.fourth = "";
  647. // } else {
  648. // this.scoreDetail[0].scoreAll.fivth = "";
  649. // }
  650. return;
  651. }
  652. } else {
  653. if (t == 1) {
  654. this.scoreDetail[0].scoreAll.first = "";
  655. } else if (t == 2) {
  656. this.scoreDetail[0].scoreAll.second = "";
  657. } else {
  658. this.scoreDetail[0].scoreAll.third = "";
  659. }
  660. // else if (t == 4) {
  661. // this.scoreDetail[0].scoreAll.fourth = "";
  662. // } else {
  663. // this.scoreDetail[0].scoreAll.fivth = "";
  664. // }
  665. this.$message.error("请输入数字");
  666. return;
  667. }
  668. // value = value.replace(/^0+(d)/, "$1"); // 第一位0开头,0后面为数字,则过滤掉,取后面的数字
  669. // value = value.replace(/(d{15})d*/, "$1"); // 最多保留15位整数
  670. // this.height = value;
  671. },
  672. handleClose(done) {
  673. done();
  674. },
  675. clear() {
  676. for (var i = 0; i < this.CourseType[0].length; i++) {
  677. this.courseTypeId[this.CourseType[0][i].id] = "";
  678. }
  679. this.anliName = "";
  680. this.anliBox = "";
  681. this.getAnliList(this.reCid);
  682. },
  683. getAnliList(rc) {
  684. this.isLoading = true;
  685. var typeE = [];
  686. var typea, typeb, typec, typed;
  687. for (var i = 0; i < this.CourseType[0].length; i++) {
  688. if (this.courseTypeId[this.CourseType[0][i].id] == "1") {
  689. // typeE.push(this.CourseType[0][i].id);
  690. typeE = [];
  691. } else if (this.courseTypeId[this.CourseType[0][i].id] != "") {
  692. typeE.push(this.CourseType[0][i].id);
  693. if (this.CourseType[0][i].name == "类型") {
  694. typea = this.courseTypeId[this.CourseType[0][i].id];
  695. } else if (this.CourseType[0][i].name == "学科") {
  696. typeb = this.courseTypeId[this.CourseType[0][i].id];
  697. }
  698. this.courseTypeSon.push(this.courseTypeId[this.CourseType[0][i].id]);
  699. }
  700. }
  701. let params = {
  702. typea: typea != undefined ? typea : "",
  703. typeb: typeb != undefined ? typeb : "",
  704. typec: typec != undefined ? typec : "",
  705. typed: typed != undefined ? typed : "",
  706. typeE: typeE.join(","),
  707. cn: this.anliBox == "" ? 0 : this.anliBox,
  708. cid: rc ? rc : "",
  709. title: this.anliName,
  710. };
  711. this.ajax
  712. .get(this.$store.state.api + "selectPointAll", params)
  713. .then((res) => {
  714. this.total = res.data[0].length > 0 ? res.data[0].length : 0;
  715. var scoreList = res.data[0];
  716. this.scoreListData = scoreList;
  717. for (var i = 0; i < scoreList.length; i++) {
  718. scoreList[i].info = JSON.parse(scoreList[i].info);
  719. if (scoreList[i].score != null) {
  720. var point = JSON.parse(scoreList[i].score);
  721. var a = parseInt(point.first);
  722. var b = parseInt(point.second);
  723. var c = parseInt(point.third);
  724. var sumScore = Math.round((a + b + c) / 3);
  725. scoreList[i].sum = sumScore;
  726. }
  727. }
  728. // 降序
  729. // scoreList.sort((item1, item2) => item2.sum - item1.sum);
  730. // 升序
  731. // scoreList.sort((item1, item2) => item1.sum - item2.sum);
  732. // const start = (this.page - 1) * 10;
  733. // const end = start + 10;
  734. // let pageData = scoreList.slice(start, end);
  735. this.selectPwScore(scoreList);
  736. this.isLoading = false;
  737. })
  738. .catch((err) => {
  739. console.error(err);
  740. });
  741. },
  742. selectPwScore(p) {
  743. this.ajax
  744. .get(this.$store.state.api + "selectAllScore")
  745. .then((res) => {
  746. var scoreList = res.data[0];
  747. this.allScoreList = scoreList;
  748. for (var j = 0; j < p.length; j++) {
  749. let sum = 0;
  750. let isScore = 0;
  751. p[j].scoreList = [];
  752. for (var i = 0; i < scoreList.length; i++) {
  753. if (p[j].id == scoreList[i].rid) {
  754. var point = JSON.parse(scoreList[i].score);
  755. var a = parseInt(point.first);
  756. var b = parseInt(point.second);
  757. var c = parseInt(point.third);
  758. var sumScore = Math.round((a + b + c) / 3);
  759. sum += sumScore;
  760. isScore++;
  761. if (scoreList[i].scorer == this.userid) {
  762. if (!p[j].ownScore) {
  763. p[j].ownScore = sumScore;
  764. }
  765. }
  766. p[j].scoreList.push({
  767. name: scoreList[i].scoreName,
  768. score: sumScore,
  769. });
  770. // else {
  771. // if (!p[j].secondPw) {
  772. // p[j].secondPw = {
  773. // score: sumScore,
  774. // name: scoreList[i].scoreName,
  775. // };
  776. // }
  777. // }
  778. }
  779. }
  780. p[j].sum = isScore == 0 ? 0 : (sum / isScore).toFixed(2);
  781. }
  782. if(this.scoreFn===1){//升序
  783. // 升序
  784. p.sort((a, b) => {
  785. let aScore = a.hasOwnProperty(this.tType==2?'ownScore':'sum') ? this.tType=='2'?a.ownScore:a.sum===0?Number.MAX_VALUE: parseFloat(a.sum) : Number.MAX_VALUE;
  786. let bScore = b.hasOwnProperty(this.tType==2?'ownScore':'sum') ? this.tType=='2'?b.ownScore:b.sum===0?Number.MAX_VALUE: parseFloat(b.sum) : Number.MAX_VALUE;
  787. return aScore - bScore;
  788. })
  789. }else if(this.scoreFn===2){//降序
  790. //降序
  791. p.sort((a, b) => {
  792. let aScore = a.hasOwnProperty(this.tType==2?'ownScore':'sum') ? this.tType=='2'?a.ownScore:a.sum===0?-1: parseFloat(a.sum) : -1;
  793. let bScore = b.hasOwnProperty(this.tType==2?'ownScore':'sum') ? this.tType=='2'?b.ownScore:b.sum===0?-1: parseFloat(b.sum) : -1;
  794. return bScore - aScore;
  795. });
  796. }
  797. sessionStorage.setItem("allScoreList",JSON.stringify(p.map(i=>i.id)))
  798. const start = (this.page - 1) * 10;
  799. const end = start + 10;
  800. let result = p.slice(start, end);
  801. this.tableData = result;
  802. this.$forceUpdate();
  803. })
  804. .catch((err) => {
  805. console.error(err);
  806. });
  807. },
  808. selectType(rc) {
  809. this.ajax
  810. .get(this.$store.state.api + "selectMatTypeYT")
  811. .then((res) => {
  812. this.CourseType = res.data;
  813. for (var i = 0; i < res.data[0].length; i++) {
  814. for (var j = 0; j < res.data[1].length; j++) {
  815. if (res.data[0][i].id == res.data[1][j].pid) {
  816. if (!this.CourseTypeJson[res.data[0][i].id]) {
  817. this.CourseTypeJson[res.data[0][i].id] = [];
  818. }
  819. this.CourseTypeJson[res.data[0][i].id].push(res.data[1][j]);
  820. }
  821. }
  822. }
  823. if (rc) {
  824. this.getAnliList(rc);
  825. } else {
  826. this.getAnliList();
  827. }
  828. })
  829. .catch((err) => {
  830. console.error(err);
  831. });
  832. },
  833. getAdmin() {
  834. let params = {
  835. uid: this.userid,
  836. cn: "",
  837. page: this.page,
  838. };
  839. this.ajax
  840. .get(this.$store.state.api + "selectReviewer", params)
  841. .then((res) => {
  842. this.reviewerBox = res.data[0];
  843. })
  844. .catch((err) => {
  845. console.error(err);
  846. });
  847. },
  848. getReviewerOrAdmin() {
  849. if (this.tType == 2) {
  850. this.getUser();
  851. } else {
  852. this.selectType();
  853. }
  854. },
  855. getUser() {
  856. let params = {
  857. uid: this.userid,
  858. };
  859. this.ajax
  860. .get(this.$store.state.api + "selectCaseUser", params)
  861. .then((res) => {
  862. if (res.data[0].length > 0) {
  863. var reCid = res.data[0][0].aBox;
  864. this.reCid = reCid;
  865. this.selectType(reCid);
  866. } else {
  867. this.isNoTableData = true;
  868. }
  869. })
  870. .catch((err) => {
  871. console.error(err);
  872. });
  873. },
  874. openScore(a, t) {
  875. this.scoreDetail[0].id = a.id;
  876. this.scoreDetail[0].title = a.info.title;
  877. this.scoreDetail[0].detail = a.info.courseText;
  878. this.scoreDetail[0].uname = a.uname;
  879. this.getScore(a.id, t);
  880. },
  881. getScore(id, t) {
  882. let params = {
  883. rid: id,
  884. suser: this.userid,
  885. };
  886. this.ajax
  887. .get(this.$store.state.api + "selectScore", params)
  888. .then((res) => {
  889. if (res.data[0].length > 0) {
  890. this.scoreDetail[0].scoreAll = JSON.parse(res.data[0][0].score);
  891. var a = parseInt(this.scoreDetail[0].scoreAll.first);
  892. var b = parseInt(this.scoreDetail[0].scoreAll.second);
  893. var c = parseInt(this.scoreDetail[0].scoreAll.third);
  894. // var d = parseInt(this.scoreDetail[0].scoreAll.fourth);
  895. // var e = parseInt(this.scoreDetail[0].scoreAll.fivth);
  896. // this.scoreDetail[0].sumScore = Math.round((a + b + c + d + e) / 5);
  897. this.scoreDetail[0].sumScore = Math.round((a + b + c) / 3);
  898. } else {
  899. this.scoreDetail[0].scoreAll = {
  900. first: "",
  901. second: "",
  902. third: "",
  903. // fourth: "",
  904. // fivth: "",
  905. content: "",
  906. };
  907. this.scoreDetail[0].sumScore = 0;
  908. }
  909. if (t == 1) {
  910. this.dialogVisibleScore = true;
  911. } else {
  912. this.dialogVisibleRecommend = true;
  913. }
  914. })
  915. .catch((err) => {
  916. console.error(err);
  917. });
  918. },
  919. addScore() {
  920. if (this.scoreDetail[0].scoreAll.first == "") {
  921. this.$message.error("请将信息填写完整");
  922. return;
  923. } else if (this.scoreDetail[0].scoreAll.second == "") {
  924. this.$message.error("请将信息填写完整");
  925. return;
  926. } else if (this.scoreDetail[0].scoreAll.third == "") {
  927. this.$message.error("请将信息填写完整");
  928. return;
  929. }
  930. // else if (this.scoreDetail[0].scoreAll.fourth == "") {
  931. // this.$message.error("请将信息填写完整");
  932. // return;
  933. // } else if (this.scoreDetail[0].scoreAll.fivth == "") {
  934. // this.$message.error("请将信息填写完整");
  935. // return;
  936. // }
  937. let params = [
  938. {
  939. rid: this.scoreDetail[0].id,
  940. suser: this.userid,
  941. s: JSON.stringify(this.scoreDetail[0].scoreAll),
  942. },
  943. ];
  944. this.ajax
  945. .post(this.$store.state.api + "addScore", params)
  946. .then((res) => {
  947. this.$message({
  948. message: "评分成功",
  949. type: "success",
  950. });
  951. this.scoreDetail = [
  952. {
  953. id: "",
  954. uname: "",
  955. title: "",
  956. detail: "",
  957. scoreAll: {
  958. first: "",
  959. second: "",
  960. third: "",
  961. // fourth: "",
  962. // fivth: "",
  963. content: "",
  964. },
  965. sumScore: 0,
  966. },
  967. ];
  968. this.dialogVisibleScore = false;
  969. this.getReviewerOrAdmin();
  970. })
  971. .catch((err) => {
  972. console.error(err);
  973. });
  974. },
  975. addRecommend() {
  976. if (this.scoreDetail[0].sumScore == 0) {
  977. this.$message.error("还未评审,不可推荐");
  978. return;
  979. }
  980. let params = {
  981. id: this.scoreDetail[0].id,
  982. rec: 2,
  983. };
  984. this.ajax
  985. .get(this.$store.state.api + "updateRaceRec", params)
  986. .then((res) => {
  987. this.$message({
  988. message: "推荐成功",
  989. type: "success",
  990. });
  991. this.dialogVisibleRecommend = false;
  992. })
  993. .catch((err) => {
  994. console.error(err);
  995. });
  996. },
  997. // lookDetail(aid) {
  998. // window.open(
  999. // window.origin +
  1000. // "/#/anliDetail?aid=" +
  1001. // aid +
  1002. // "&userid=" +
  1003. // this.$store.state.userInfo.userid +
  1004. // "&oid=" +
  1005. // this.$store.state.userInfo.oid +
  1006. // "&tType=" +
  1007. // this.$store.state.userInfo.type
  1008. // );
  1009. // },
  1010. exportAllScore() {
  1011. this.ajax
  1012. .get(this.$store.state.api + "selectAllScore")
  1013. .then((res) => {
  1014. var scoreList = res.data[0];
  1015. // 将score值转换为对象
  1016. for (var i = 0; i < scoreList.length; i++) {
  1017. scoreList[i].score = JSON.parse(scoreList[i].score);
  1018. }
  1019. // 根据rid进行分组
  1020. var grouped = scoreList.reduce(function (acc, cur) {
  1021. if (!acc[cur.rid]) {
  1022. acc[cur.rid] = [];
  1023. }
  1024. acc[cur.rid].push(cur.score);
  1025. return acc;
  1026. }, {});
  1027. // 计算每组的first、second和third的平均值,并将结果存储在新的数组b中
  1028. var b = Object.keys(grouped).map(function (key) {
  1029. var scores = grouped[key];
  1030. var firstPw = Math.round(
  1031. (parseInt(scores[0].first) +
  1032. parseInt(scores[0].second) +
  1033. parseInt(scores[0].third)) /
  1034. 3
  1035. );
  1036. var secondPw = Math.round(
  1037. (parseInt(scores[1].first) +
  1038. parseInt(scores[1].second) +
  1039. parseInt(scores[1].third)) /
  1040. 3
  1041. );
  1042. var sum = ((firstPw + secondPw) / 2).toFixed(2);
  1043. return { rid: key, firstPw: firstPw, secondPw: secondPw, sum: sum };
  1044. });
  1045. for (var i = 0; i < b.length; i++) {
  1046. for (var j = 0; j < scoreList.length; j++) {
  1047. if (scoreList[j].rid == b[i].rid) {
  1048. if (!b[i].title) {
  1049. b[i].title = JSON.parse(scoreList[j].info).title;
  1050. }
  1051. }
  1052. }
  1053. }
  1054. this.exportExcel(b);
  1055. })
  1056. .catch((err) => {
  1057. this.isLoading = false;
  1058. console.error(err);
  1059. });
  1060. },
  1061. exportScoreByUid() {
  1062. this.ajax
  1063. .get(this.$store.state.api + "selectAllScore")
  1064. .then((res) => {
  1065. var scoreList = res.data[0];
  1066. let params = {
  1067. uid: this.userid,
  1068. };
  1069. this.ajax
  1070. .get(this.$store.state.api + "selectScoreByUid", params)
  1071. .then((res) => {
  1072. var scoreListByuid = res.data[0];
  1073. for (var i = 0; i < scoreList.length; i++) {
  1074. for (var j = 0; j < scoreListByuid.length; j++) {
  1075. if (scoreList[i].rid == scoreListByuid[j].rid) {
  1076. if (scoreList[i].scorer == scoreListByuid[j].scorer) {
  1077. var point = JSON.parse(scoreListByuid[j].score);
  1078. var a = parseInt(point.first);
  1079. var b = parseInt(point.second);
  1080. var c = parseInt(point.third);
  1081. var sumScore = Math.round((a + b + c) / 3);
  1082. scoreListByuid[j].firstPw = sumScore;
  1083. } else {
  1084. var point = JSON.parse(scoreList[i].score);
  1085. var a = parseInt(point.first);
  1086. var b = parseInt(point.second);
  1087. var c = parseInt(point.third);
  1088. var sumScore = Math.round((a + b + c) / 3);
  1089. scoreListByuid[j].secondPw = sumScore;
  1090. }
  1091. }
  1092. if (scoreListByuid[j].firstPw && scoreListByuid[j].secondPw) {
  1093. scoreListByuid[j].sum = (
  1094. (scoreListByuid[j].firstPw + scoreListByuid[j].secondPw) /
  1095. 2
  1096. ).toFixed(2);
  1097. scoreListByuid[j].title = JSON.parse(
  1098. scoreListByuid[j].info
  1099. ).title;
  1100. }
  1101. }
  1102. }
  1103. this.exportExcel(scoreListByuid);
  1104. })
  1105. .catch((err) => {
  1106. console.error(err);
  1107. });
  1108. })
  1109. .catch((err) => {
  1110. this.isLoading = false;
  1111. console.error(err);
  1112. });
  1113. },
  1114. exportExcel(t) {
  1115. var res = t;
  1116. //如果value的json字段的key值和想要的headers值不一致时,可做如下更改
  1117. //将和下面的Object.fromEntries结合,将json字段的key值改变为要求的excel的header值
  1118. var array = [];
  1119. for (var i = 0; i < res.length; i++) {
  1120. var _json = {};
  1121. _json["案例名称"] = res[i].title;
  1122. _json["评审1"] = res[i].firstPw;
  1123. _json["评审2"] = res[i].secondPw;
  1124. _json["平均分"] = res[i].sum;
  1125. array.push(_json);
  1126. }
  1127. var XLSX = require("xlsx");
  1128. const workbook = XLSX.utils.book_new(); //创建一个新的工作簿对象
  1129. let ws = XLSX.utils.json_to_sheet(array); //将json对象数组转化成工作表
  1130. // ws["!cols"] = [
  1131. // //设置每一列的宽度
  1132. // { wch: 50 },
  1133. // { wch: 50 },
  1134. // { wch: 50 },
  1135. // ];
  1136. XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
  1137. XLSX.writeFile(workbook, "项目数据导出.xlsx");
  1138. // const wopts = { bookType: "xlsx", bookSST: false, type: "array" };//写入的样式bookType:输出的文件类型,type:输出的数据类型,bookSST: 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
  1139. // const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
  1140. // FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} demo.xlsx`);//保存文件
  1141. this.$message({
  1142. message: "导出成功",
  1143. type: "success",
  1144. });
  1145. },
  1146. // 我的评分排序
  1147. ownScoreSort(row,column){
  1148. if(row.order==="descending"){
  1149. this.scoreFn=2
  1150. }else if(row.order==="ascending"){
  1151. this.scoreFn=1
  1152. }else{
  1153. this.scoreFn=2
  1154. }
  1155. this.search()
  1156. }
  1157. },
  1158. created() {
  1159. // this.getAnliList();
  1160. this.getAdmin();
  1161. // this.selectType();
  1162. this.getReviewerOrAdmin();
  1163. },
  1164. };
  1165. </script>
  1166. <style scoped>
  1167. .el-popover {
  1168. min-width: 80px;
  1169. text-align: center;
  1170. }
  1171. </style>
  1172. <style scoped>
  1173. .dialog_diy1 >>> .el-dialog__header,
  1174. .dialog_diy >>> .el-dialog__header {
  1175. background: #3d67bd !important;
  1176. padding: 15px 20px;
  1177. }
  1178. .dialog_diy1 >>> .el-dialog__header {
  1179. text-align: center;
  1180. }
  1181. .dialog_diy1 >>> .el-dialog__title,
  1182. .dialog_diy >>> .el-dialog__title {
  1183. color: #fff;
  1184. }
  1185. .dialog_diy1 >>> .el-dialog__headerbtn,
  1186. .dialog_diy >>> .el-dialog__headerbtn {
  1187. top: 19px;
  1188. }
  1189. .dialog_diy1 >>> .el-dialog__headerbtn .el-dialog__close,
  1190. .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
  1191. color: #fff;
  1192. }
  1193. .dialog_diy1 >>> .el-dialog__headerbtn .el-dialog__close:hover,
  1194. .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
  1195. color: #fff;
  1196. }
  1197. .dialog_diy1 >>> .el-dialog__body,
  1198. .dialog_diy1 >>> .el-dialog__footer,
  1199. .dialog_diy >>> .el-dialog__body,
  1200. .dialog_diy >>> .el-dialog__footer {
  1201. background: #fafafa;
  1202. }
  1203. .disUoloadSty >>> .el-upload--picture-card {
  1204. display: none;
  1205. /* 上传按钮隐藏 */
  1206. }
  1207. .tou {
  1208. border-bottom: 1px solid #c9c9c9;
  1209. height: 50px;
  1210. font-size: 30px;
  1211. }
  1212. .touTop {
  1213. margin: 15px auto;
  1214. display: flex;
  1215. flex-direction: row;
  1216. flex-wrap: nowrap;
  1217. align-items: center;
  1218. justify-content: space-between;
  1219. width: 94%;
  1220. }
  1221. .touLeft {
  1222. display: flex;
  1223. flex-direction: row;
  1224. flex-wrap: nowrap;
  1225. align-items: baseline;
  1226. justify-content: space-between;
  1227. width: 100%;
  1228. }
  1229. .sTop > div:nth-child(1) {
  1230. display: flex;
  1231. flex-direction: row;
  1232. flex-wrap: wrap;
  1233. align-items: center;
  1234. }
  1235. .sTop > div > div {
  1236. margin: 0 10px 0 0;
  1237. display: flex;
  1238. flex-direction: row;
  1239. align-items: center;
  1240. }
  1241. .sTop > div > div {
  1242. margin-right: 10px;
  1243. }
  1244. .touRight > div:nth-child(2) > .el-button {
  1245. background: #2268bd;
  1246. color: #fff;
  1247. }
  1248. .student_page {
  1249. width: 100%;
  1250. margin: 20px auto 0;
  1251. display: flex;
  1252. align-items: center;
  1253. justify-content: space-between;
  1254. }
  1255. .rating_information{
  1256. flex: 1;
  1257. height: 100%;
  1258. margin-left: 20px;
  1259. display: flex;
  1260. margin-bottom: 20px;
  1261. }
  1262. .ri-card{
  1263. width: auto;
  1264. font-size: 14px;
  1265. display: flex;
  1266. align-items: center;
  1267. justify-content: center;
  1268. padding: 5px 10px;
  1269. white-space: nowrap;
  1270. margin-right: 20px;
  1271. border-radius: 5px;
  1272. }
  1273. .anliBox {
  1274. display: flex;
  1275. flex-direction: row;
  1276. flex-wrap: wrap;
  1277. align-items: flex-start;
  1278. margin: 25px auto 0;
  1279. width: 95%;
  1280. height: 570px;
  1281. }
  1282. .anLi {
  1283. width: 280px;
  1284. margin: 0 20px 10px 0;
  1285. box-shadow: 3px 1px 15px 3px #f0f0f2;
  1286. }
  1287. .anliImg {
  1288. width: 100%;
  1289. height: 170px;
  1290. }
  1291. .anliImg > img {
  1292. width: 100%;
  1293. height: 100%;
  1294. }
  1295. .anliBot {
  1296. background: #fff;
  1297. border: 1px solid #f5f5f5;
  1298. padding: 5px 0 10px 0;
  1299. box-sizing: border-box;
  1300. }
  1301. .detailBox {
  1302. padding: 0 0 0 10px;
  1303. box-sizing: border-box;
  1304. }
  1305. .detailBox > div:nth-child(1) {
  1306. font-size: 20px;
  1307. width: 250px;
  1308. white-space: nowrap;
  1309. overflow: hidden;
  1310. text-overflow: ellipsis;
  1311. word-break: break-word;
  1312. }
  1313. .detailBox > div:nth-child(2) {
  1314. color: #999;
  1315. margin-top: 5px;
  1316. font-size: 14px;
  1317. }
  1318. .anliButton {
  1319. display: flex;
  1320. flex-direction: row;
  1321. flex-wrap: nowrap;
  1322. align-items: center;
  1323. justify-content: center;
  1324. padding: 10px 0 0 0;
  1325. }
  1326. .anliButton > div {
  1327. margin-right: 5px;
  1328. }
  1329. .anliButton > div > .el-button {
  1330. background: #409efe;
  1331. color: #fff;
  1332. width: 80px;
  1333. border-radius: 5px;
  1334. }
  1335. .customWidth >>> .el-dialog {
  1336. min-width: 500px !important;
  1337. }
  1338. .customWidth1 >>> .el-dialog {
  1339. min-width: 800px !important;
  1340. }
  1341. .people {
  1342. border: 1px solid rgb(229 229 229);
  1343. height: 495px;
  1344. border-radius: 5px;
  1345. width: 100%;
  1346. overflow: auto;
  1347. background: #fff;
  1348. box-shadow: 0px 0px 10px 8px #ededed;
  1349. }
  1350. .people::-webkit-scrollbar {
  1351. /*滚动条整体样式*/
  1352. width: 6px;
  1353. /*高宽分别对应横竖滚动条的尺寸*/
  1354. height: 6px;
  1355. }
  1356. /*定义滚动条轨道 内阴影+圆角*/
  1357. .people::-webkit-scrollbar-track {
  1358. border-radius: 10px;
  1359. background-color: #eee;
  1360. }
  1361. /*定义滑块 内阴影+圆角*/
  1362. .people::-webkit-scrollbar-thumb {
  1363. border-radius: 10px;
  1364. -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
  1365. background-color: rgba(0, 0, 0, 0.1);
  1366. }
  1367. .people_top {
  1368. display: flex;
  1369. width: 100%;
  1370. flex-direction: column;
  1371. padding: 10px 25px 10px;
  1372. box-sizing: border-box;
  1373. border-bottom: 1px solid #f4f4f7;
  1374. }
  1375. .people_top_right {
  1376. height: 40px;
  1377. margin-bottom: 10px;
  1378. }
  1379. .people_search {
  1380. display: flex;
  1381. flex-direction: row;
  1382. flex-wrap: nowrap;
  1383. align-items: center;
  1384. }
  1385. .people_search > div:nth-child(1) {
  1386. font-size: 20px;
  1387. margin-right: 10px;
  1388. }
  1389. .t_j_box {
  1390. display: flex;
  1391. }
  1392. .t_j_box span:nth-child(1) {
  1393. width: 15%;
  1394. overflow: hidden;
  1395. margin-right: 10px;
  1396. text-overflow: ellipsis;
  1397. white-space: nowrap;
  1398. }
  1399. .t_j_box span:nth-child(2) {
  1400. width: 300px;
  1401. overflow: hidden;
  1402. text-overflow: ellipsis;
  1403. margin-right: 10px;
  1404. }
  1405. .t_j_box span:nth-child(3) {
  1406. width: calc(55% - 20px);
  1407. overflow: hidden;
  1408. text-overflow: ellipsis;
  1409. }
  1410. .people_name {
  1411. display: flex;
  1412. flex-direction: column;
  1413. flex-wrap: wrap;
  1414. align-items: flex-start;
  1415. padding: 15px 0 0 15px;
  1416. }
  1417. .people_name >>> .el-checkbox {
  1418. margin-bottom: 10px;
  1419. }
  1420. .all_choose > span {
  1421. margin-right: 10px;
  1422. }
  1423. .clear {
  1424. width: 70px;
  1425. height: 35px;
  1426. background: #2268bc;
  1427. color: #fff;
  1428. text-align: center;
  1429. border-radius: 5px;
  1430. line-height: 35px;
  1431. cursor: pointer;
  1432. font-size: 16px;
  1433. }
  1434. .anliCss {
  1435. display: flex;
  1436. flex-direction: row;
  1437. flex-wrap: nowrap;
  1438. align-items: center;
  1439. }
  1440. .anliCss > div:nth-child(1) {
  1441. margin-right: 10px;
  1442. }
  1443. .scoreBox {
  1444. background: #fff;
  1445. }
  1446. .scoreCss {
  1447. padding: 10px;
  1448. }
  1449. .scoreTitle {
  1450. display: flex;
  1451. flex-direction: row;
  1452. flex-wrap: nowrap;
  1453. align-items: center;
  1454. }
  1455. .scoreTitle > div:nth-child(1) {
  1456. width: 50px;
  1457. }
  1458. .scoreTitle > div:nth-child(1) > img {
  1459. width: 100%;
  1460. height: 100%;
  1461. }
  1462. .scoreTitle > div:nth-child(2) {
  1463. margin-left: 15px;
  1464. }
  1465. .anliTitle,
  1466. .anliBrief,
  1467. .anliScore {
  1468. display: flex;
  1469. flex-direction: row;
  1470. flex-wrap: nowrap;
  1471. align-items: flex-start;
  1472. padding: 10px 0 10px 0;
  1473. font-size: 18px;
  1474. }
  1475. .anliTitle > div:nth-child(1),
  1476. .anliBrief > div:nth-child(1) {
  1477. min-width: 75px;
  1478. width: 75px;
  1479. }
  1480. .anliTitle > div:nth-child(2),
  1481. .anliBrief > div:nth-child(2) {
  1482. font-size: 17px;
  1483. margin-left: 35px;
  1484. color: #b0b0b0;
  1485. }
  1486. .anliScore > div:nth-child(2) {
  1487. margin: -13px 0 0 20px;
  1488. }
  1489. .scoreDiv {
  1490. display: flex;
  1491. flex-direction: row;
  1492. flex-wrap: nowrap;
  1493. align-items: center;
  1494. padding: 10px 0;
  1495. }
  1496. .scoreDiv > div:nth-child(1) {
  1497. min-width: 90px;
  1498. width: 90px;
  1499. }
  1500. .scoreDiv > div:nth-child(2) {
  1501. margin-left: 10px;
  1502. }
  1503. .scoreDiv > div:nth-child(2) >>> .el-input__inner {
  1504. border-radius: 15px;
  1505. background: #fafafa;
  1506. height: 30px;
  1507. font-size: 16px;
  1508. }
  1509. .anliContent {
  1510. width: 80%;
  1511. margin: 0 auto;
  1512. border-top: 2px solid #ededed;
  1513. padding: 10px 0 0 0;
  1514. }
  1515. .tAreaCss {
  1516. resize: none;
  1517. width: 100%;
  1518. text-indent: 10px;
  1519. border: 1px solid #e6e6e8;
  1520. background: #fafafa;
  1521. }
  1522. .tAreaCss:focus-visible {
  1523. outline: none !important;
  1524. }
  1525. .addScore {
  1526. width: 75%;
  1527. margin: 10px auto;
  1528. background: #409efe;
  1529. color: #fff;
  1530. height: 35px;
  1531. text-align: center;
  1532. line-height: 35px;
  1533. border-radius: 5px;
  1534. cursor: pointer;
  1535. }
  1536. .reTitle {
  1537. font-size: 18px;
  1538. }
  1539. .reTitle > div:nth-child(2) {
  1540. width: 99%;
  1541. border: 1px solid #dbdbdb;
  1542. font-size: 16px;
  1543. height: 35px;
  1544. line-height: 35px;
  1545. text-indent: 10px;
  1546. border-radius: 5px;
  1547. margin: 10px 0;
  1548. white-space: nowrap;
  1549. overflow: hidden;
  1550. text-overflow: ellipsis;
  1551. word-break: break-word;
  1552. }
  1553. .reDetail,
  1554. .reScore {
  1555. display: flex;
  1556. flex-direction: row;
  1557. flex-wrap: nowrap;
  1558. align-items: flex-start;
  1559. padding: 10px 0 10px 0;
  1560. font-size: 18px;
  1561. }
  1562. .reDetail > div:nth-child(2) {
  1563. font-size: 17px;
  1564. margin-left: 10px;
  1565. color: #b0b0b0;
  1566. width: 650px;
  1567. height: 150px;
  1568. overflow: auto;
  1569. }
  1570. .reScore > div:nth-child(2) {
  1571. font-size: 35px;
  1572. margin-left: 20px;
  1573. }
  1574. .reScore > div:nth-child(2) > span {
  1575. color: #6188d5;
  1576. }
  1577. .reBottom {
  1578. display: flex;
  1579. flex-direction: row;
  1580. flex-wrap: nowrap;
  1581. align-items: center;
  1582. justify-content: flex-end;
  1583. }
  1584. .reBottom > div:nth-child(2) {
  1585. border: 1px solid #d7d7d9;
  1586. width: 70px;
  1587. height: 35px;
  1588. text-align: center;
  1589. line-height: 35px;
  1590. border-radius: 5px;
  1591. margin: 0 10px 0 20px;
  1592. cursor: pointer;
  1593. }
  1594. .reBottom > div:nth-child(3) {
  1595. background: #409efe;
  1596. color: #fff;
  1597. height: 35px;
  1598. line-height: 35px;
  1599. width: 85px;
  1600. text-align: center;
  1601. border-radius: 5px;
  1602. cursor: pointer;
  1603. }
  1604. .tableButton {
  1605. display: flex;
  1606. flex-direction: row;
  1607. flex-wrap: nowrap;
  1608. align-items: center;
  1609. color: #43a0f5;
  1610. }
  1611. .tableButton > div {
  1612. margin-right: 10px;
  1613. cursor: pointer;
  1614. }
  1615. .isNoMessage {
  1616. width: 20%;
  1617. margin: 10% auto 0;
  1618. }
  1619. .isNoMessage > img {
  1620. width: 100%;
  1621. height: 100%;
  1622. }
  1623. .aName >>> .el-input__inner {
  1624. width: 300px;
  1625. }
  1626. .sTop {
  1627. display: flex;
  1628. flex-direction: row;
  1629. flex-wrap: nowrap;
  1630. justify-content: center;
  1631. align-items: center;
  1632. }
  1633. .aName {
  1634. position: relative;
  1635. }
  1636. .search {
  1637. width: 25px;
  1638. position: absolute;
  1639. top: 7px;
  1640. right: 10px;
  1641. z-index: 9;
  1642. cursor: pointer;
  1643. }
  1644. .search > img {
  1645. width: 100%;
  1646. height: 100%;
  1647. }
  1648. </style>