personPage.vue 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680
  1. <template>
  2. <div>
  3. <div class="personPage">
  4. <div
  5. style="width: 100%;display: flex;justify-content: flex-end;align-items: center;"
  6. >
  7. <!-- <el-select v-model="teas" multiple placeholder="请选择">
  8. <el-option
  9. v-for="item in TeaList"
  10. :key="item.id"
  11. :label="item.name"
  12. :value="item.id"
  13. >
  14. </el-option>
  15. </el-select> -->
  16. <!-- <div style="margin-left: 10px;">
  17. <el-button type="primary" @click="remindExamine" size="mini"
  18. >提醒</el-button
  19. >
  20. </div> -->
  21. </div>
  22. <el-table
  23. :data="copyTableData"
  24. class="scoTab"
  25. v-loading="tabLoading"
  26. style="width: 100%"
  27. >
  28. <el-table-column type="index" align="center" label="序号" width="180">
  29. </el-table-column>
  30. <el-table-column prop="username" align="center" label="教师姓名">
  31. </el-table-column>
  32. <el-table-column
  33. prop="tea"
  34. show-overflow-tooltip
  35. :filters="TeachingOptions"
  36. :filter-method="filterTea"
  37. align="center"
  38. label="教研室"
  39. width="180"
  40. >
  41. </el-table-column>
  42. <el-table-column
  43. :filters="[
  44. { text: '已完成', value: '已完成' },
  45. { text: '未完成', value: '未完成' }
  46. ]"
  47. :filter-method="filterExa"
  48. :filter-multiple="false"
  49. prop="state"
  50. align="center"
  51. label="考核进度"
  52. >
  53. <template slot-scope="scope">
  54. <div v-if="scope.row.step == scope.row.allStep">√</div>
  55. <div v-else>{{ scope.row.step }}/{{ scope.row.allStep }}</div>
  56. </template>
  57. </el-table-column>
  58. <el-table-column
  59. prop="evaSca"
  60. :sortable="true"
  61. :sort-method="sortEvaMethod"
  62. align="center"
  63. label="自评总分"
  64. >
  65. </el-table-column>
  66. <!-- <el-table-column align="center" label="一级指标评分" >
  67. <template slot-scope="scope">
  68. <div class= "scoreBox" v-for="item, index in scope.row.json" :key="index">
  69. <el-tooltip :content="item.name" placement="top" effect="dark">
  70. <span>{{ item.name }}</span>
  71. </el-tooltip>
  72. :<span>{{ scoreChildren(item.children) }}</span>
  73. </div>
  74. </template>
  75. </el-table-column>
  76. <el-table-column
  77. prop="cogSco"
  78. :sortable="true"
  79. :sort-method="sortCogMethod"
  80. align="center"
  81. label="考核总分"
  82. >
  83. </el-table-column> -->
  84. <el-table-column
  85. align="center"
  86. label="状态"
  87. >
  88. <template slot-scope="scope">
  89. <div class="taskArea" v-if="[0,1].includes(scope.row.isReview)">
  90. <span :class="`task_${scope.row.isReview}`">{{ typeStatusList[scope.row.isReview] }}</span>
  91. </div>
  92. <span v-else>/</span>
  93. <!-- <div v-if="scope.row.state == '已完成'">已完成</div>
  94. <div v-else>未完成</div> -->
  95. </template>
  96. </el-table-column>
  97. <el-table-column align="center" label="操作">
  98. <template slot-scope="scope">
  99. <div style="display: flex;justify-content: center;">
  100. <div class="TabBtn" @click="lookScore(scope.row)">评分</div>
  101. <div class="TabBtn" @click="withdraw(scope.row.id)">退回</div>
  102. <div class="TabBtn" @click="recordBtn(scope.row.id)">记录</div>
  103. </div>
  104. </template>
  105. </el-table-column>
  106. </el-table>
  107. </div>
  108. <!-- 点击评分 -->
  109. <el-dialog
  110. title=""
  111. :visible.sync="diaSco"
  112. :append-to-body="true"
  113. width="95%"
  114. :before-close="handleClose"
  115. class="dialog_diy"
  116. >
  117. <div v-loading="digLoading" class="testPersonExamine">
  118. <div class="testTit">
  119. <div class="teaLis">
  120. <div
  121. class="teal"
  122. v-if="digType==2"
  123. @click="cutPage(2)"
  124. :class="[digType == 2 ? 'Tbor' : '']"
  125. >
  126. 专任教师
  127. </div>
  128. <div
  129. class="teal"
  130. @click="cutPage(1)"
  131. v-if="digType == 1"
  132. :class="[digType == 1 ? 'Tbor' : '']"
  133. >
  134. 班主任考核
  135. </div>
  136. </div>
  137. </div>
  138. <div class="digTop">
  139. <div
  140. style="width: 230px;display: flex;justify-content: space-between;align-items: center;margin-left: 15px;"
  141. >
  142. <div class="digUsernameCss">{{ digUsername }}</div>
  143. <div
  144. v-if="tableData.length > 0"
  145. style="display: flex;justify-content: space-between;width: 150px;"
  146. >
  147. <div style="margin-right:10px">
  148. <el-button type="primary" size="mini" @click="upTea"
  149. >上一个</el-button
  150. >
  151. </div>
  152. <div style="margin-right:10px">
  153. <el-button type="primary" size="mini" @click="nextTea"
  154. >下一个</el-button
  155. >
  156. </div>
  157. <div style="margin-right:10px">
  158. <el-button type="primary" size="mini" @click="saveBtn"
  159. >保存</el-button
  160. >
  161. </div>
  162. <div style="margin-right:10px">
  163. <el-button type="primary" size="mini" @click="exportExlec"
  164. >导出</el-button
  165. >
  166. </div>
  167. </div>
  168. </div>
  169. <div
  170. style="width: 650px;display: flex;justify-content: space-between;margin-left: 6px;"
  171. >
  172. <div style="display: flex;">
  173. <span>教研室:</span
  174. ><el-tooltip
  175. class="item"
  176. effect="dark"
  177. :content="disTeaClass"
  178. placement="top"
  179. >
  180. <div
  181. style="width: 100px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;"
  182. >
  183. {{ disTeaClass }}
  184. </div>
  185. </el-tooltip>
  186. </div>
  187. <div>审核进度:{{ computedStep }}/{{ twoTarget }}</div>
  188. <div>自评分数:{{ DigSelfSco }}</div>
  189. <div>考核分数:{{ computedSco }}</div>
  190. </div>
  191. </div>
  192. <div style="height:100%;overflow: auto;padding-bottom: 80px;">
  193. <div class="sBox_table">
  194. <div class="table_title">
  195. <div style="width: 150px;">一级指标</div>
  196. <div style="width: 160px;">二级指标</div>
  197. <div style="width: 160px;">评价方法</div>
  198. <div style="width: 110px;">分值</div>
  199. <div style="width: 110px;">自评</div>
  200. <div style="flex: 1;">自评概述</div>
  201. <div style="width: 250px;">数据来源</div>
  202. <div style="width: 110px;">认定</div>
  203. <div style="flex: 1;">认定概述</div>
  204. </div>
  205. <div
  206. style="height: 100%;overflow: auto;overflow-x: hidden;border-left: 1px #ccc solid;"
  207. >
  208. <div
  209. class="table_Content"
  210. v-for="item in PageBaseData"
  211. :key="item.id"
  212. >
  213. <div class="twoCol">
  214. <div class="ColTit">{{ item.name }}</div>
  215. <div class="ColCon">
  216. <div class="twoCon" v-for="k in item.children" :key="k.id">
  217. <div>{{ k.name }}</div>
  218. <div style="padding: 10px;box-sizing: border-box;">
  219. {{ k.evaMethod }}
  220. </div>
  221. <div>{{ k.score }}</div>
  222. <div>
  223. {{ k.sco1 }}
  224. </div>
  225. <div>
  226. <div class="tArea">
  227. {{ k.selfSummary }}
  228. </div>
  229. </div>
  230. <div>
  231. <div v-if="!k.testid.test.length">/</div>
  232. <div v-else style="padding-top: 10px;">
  233. <!-- {{ reverseString(k.testid.test) }} -->
  234. <div
  235. v-for="(item2) in k.testid.test"
  236. :key="item2.courseId"
  237. class="orgData"
  238. >
  239. <div :style="item2.status==2?`color:red`:''" @click="lookUserPrize(item2.courseId)">
  240. {{ item2.title }}:{{ item2.num }}份
  241. </div>
  242. </div>
  243. </div>
  244. </div>
  245. <div style="display: flex;justify-content: center;">
  246. <div v-if="tableData.length > 0" class="ScoreStep">
  247. <el-input
  248. :style="{
  249. color: k.sco1 == k.sco2 ? '#000' : 'red'
  250. }"
  251. @blur="
  252. saveTab(
  253. k.id,
  254. k.sco2 > k.score
  255. ? (k.sco2 = k.score)
  256. : '' || k.sco2 < 0
  257. ? (k.sco2 = '')
  258. : ''
  259. )
  260. "
  261. v-model="k.sco2"
  262. v-stopMousewheel
  263. @input="val => {
  264. // 只允许输入数字(整数或小数)
  265. let num = val.replace(/[^0-9.]/g, '');
  266. // 防止多个小数点
  267. num = num.replace(/\.{2,}/g, '.');
  268. num = num.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
  269. // 防止小数点开头
  270. if(num !== '' && num[0] === '.') num = '';
  271. // 防止小数点后多余数字
  272. if(num.split('.').length > 1 && num.split('.')[1].length > 2) {
  273. num = num.split('.')[0] + '.' + num.split('.')[1].slice(0, 2);
  274. }
  275. k.sco2 = num;
  276. }"
  277. ></el-input>
  278. </div>
  279. </div>
  280. <div style="display: flex;justify-content: center;">
  281. <textarea
  282. v-if="tableData.length > 0"
  283. @blur="saveTab(k.id)"
  284. v-model.trim="k.cogSum"
  285. />
  286. </div>
  287. </div>
  288. </div>
  289. </div>
  290. </div>
  291. </div>
  292. </div>
  293. </div>
  294. </div>
  295. </el-dialog>
  296. <!-- 查看数据来源 -->
  297. <el-dialog
  298. title=""
  299. :visible.sync="diaIframe"
  300. :append-to-body="true"
  301. width="95%"
  302. :before-close="handleClose2"
  303. class="dialog_diy"
  304. >
  305. <div style="height: 100%;">
  306. <iframe
  307. ref="viframe"
  308. style="width: 100%; height: 99%; border: none"
  309. :src="ifmUrl"
  310. ></iframe>
  311. </div>
  312. </el-dialog>
  313. <!-- 提醒弹框 -->
  314. <shareBox
  315. :remDig.sync="remDig"
  316. :pType="pType"
  317. :TeaList="TeaList"
  318. ></shareBox>
  319. <el-dialog
  320. title="评分记录"
  321. :visible.sync="recordVisible"
  322. class="recordDig"
  323. :before-close="recordHandleClose"
  324. >
  325. <div>
  326. <el-table border height="500px" :data="RecordList" style="width: 100%">
  327. <el-table-column align="center" type="index" label="序号" width="80">
  328. </el-table-column>
  329. <el-table-column
  330. align="center"
  331. show-overflow-tooltip
  332. prop="username"
  333. label="教师姓名"
  334. >
  335. </el-table-column>
  336. <el-table-column align="center" prop="dateTime" label="评分时间">
  337. </el-table-column>
  338. </el-table>
  339. </div>
  340. </el-dialog>
  341. <!-- <el-dialog
  342. title="提醒"
  343. :visible.sync="remDig"
  344. :append-to-body="true"
  345. width="600"
  346. :before-close="handleClose3"
  347. class="dialog_remDig"
  348. >
  349. <div v-loading="digLoading" style="height: 100%;padding: 15px;">
  350. <div class="remFlex" style="align-items: center;">
  351. <div class="remFlexTit">填写范围:</div>
  352. <el-select v-model="teas" multiple placeholder="请选择">
  353. <el-option
  354. v-for="item in TeaList"
  355. :key="item.id"
  356. :label="item.name"
  357. :value="item.id"
  358. @change="remindExamine"
  359. >
  360. </el-option>
  361. </el-select>
  362. </div>
  363. <div class="remFlex">
  364. <div class="remFlexTit">需提交人数:</div>
  365. <div>{{ remindNum }}</div>
  366. </div>
  367. <div class="remFlex">
  368. <div class="remFlexTit">未完成人数:</div>
  369. <div>{{ remindList.length }}</div>
  370. </div>
  371. <div class="remFlex">
  372. <div class="remFlexTit">需提交人数:</div>
  373. <div class="remFlex" style="flex-wrap: wrap;">
  374. <div
  375. v-for="(item, index) in remindList"
  376. :key="index"
  377. style="margin-right: 2px;"
  378. >
  379. {{ item }},
  380. </div>
  381. </div>
  382. </div>
  383. </div>
  384. </el-dialog> -->
  385. </div>
  386. </template>
  387. <script>
  388. import shareBox from "./shareBox/index";
  389. export default {
  390. directives: {
  391. stopMousewheel: {
  392. inserted: function(el) {
  393. const ele = el.tagName === 'INPUT' ? el : el.querySelector('input');
  394. ele.addEventListener("mousewheel", () => {
  395. ele.blur();
  396. });
  397. }
  398. }
  399. },
  400. props: {
  401. pType: {
  402. //2专任教师 1班主任
  403. type: Number,
  404. default: 0
  405. },
  406. teacherName: {
  407. type: String,
  408. default: ""
  409. },
  410. timeA: {
  411. type:String,
  412. default:""
  413. },
  414. timeB: {
  415. type: String,
  416. default:""
  417. }
  418. },
  419. components: {
  420. shareBox
  421. },
  422. data() {
  423. return {
  424. digType: 2,
  425. diaSco: false,
  426. diaIframe: false,
  427. recordVisible: false,
  428. RecordList: [],
  429. ifmUrl: false,
  430. PageBaseData: [],
  431. digUserid: "", //用户id
  432. digTid: "", //表单id
  433. cutTeaNum: 0, //第几位教师
  434. disTeaClass: "", //教研室
  435. digLoading: false,
  436. DigSelfSco: 0,
  437. digUsername: "",
  438. twoTarget: 0,
  439. computedScoData: 0,
  440. computedStepData: 0,
  441. computedCogSCoData: 0,
  442. TeaList: [],
  443. tabLoading: false,
  444. userid: this.$route.query.userid, //用户id
  445. oid: this.$route.query.oid, //学校id
  446. org: this.$route.query.org, //组织id
  447. tableData: [],
  448. copyTableData:[],
  449. TeachingOptions: [],
  450. PageBaseDataTwo: [],
  451. remDig: false,
  452. timeSortList:[],
  453. typeStatusList:["待办","已完成",'/']
  454. };
  455. },
  456. watch: {
  457. pType(newVal, oldVal) {
  458. this.getData();
  459. },
  460. digType(newVal, oldVal) {
  461. this.getDataDig();
  462. },
  463. timeA(newVal){
  464. if(newVal){
  465. this.timeSortFn()
  466. }
  467. },
  468. timeB(newVal){
  469. if(newVal){
  470. this.timeSortFn()
  471. }
  472. }
  473. },
  474. computed: {
  475. computedSco() {
  476. this.computedScoData = 0; // 初始化一个局部变量来存储累加结果
  477. // 定义一个函数来执行累加操作
  478. const accumulateSco = () => {
  479. if (this.PageBaseData) {
  480. // 确保 this.PageBaseData 存在
  481. this.PageBaseData.forEach(e => {
  482. // 假设 e.children 是一个可以迭代的数组或类似结构
  483. e.children.forEach(i => {
  484. if (!!i.sco2) {
  485. this.computedScoData += i.sco2 * 1;
  486. }
  487. });
  488. });
  489. this.computedScoData = this.computedScoData.toFixed(2);
  490. }
  491. return this.computedScoData; // 返回累加结果
  492. };
  493. // 立即调用函数并返回结果
  494. return accumulateSco();
  495. },
  496. computedStep() {
  497. this.computedStepData = 0; // 初始化一个局部变量来存储累加结果
  498. // 定义一个函数来执行累加操作
  499. const accumulateSco2 = () => {
  500. if (this.PageBaseData) {
  501. this.PageBaseData.forEach(e => {
  502. e.children.forEach(i => {
  503. if (!!i.sco2) {
  504. this.computedStepData++;
  505. }
  506. });
  507. });
  508. }
  509. return this.computedStepData; // 返回累加结果
  510. };
  511. // 立即调用函数并返回结果
  512. return accumulateSco2();
  513. },
  514. scoreChildren() {
  515. return function(children){
  516. let score = 0;
  517. children.forEach(item => {
  518. if (item.sco2 && parseFloat(item.sco2) > 0) {
  519. score += parseFloat(item.sco2);
  520. }
  521. });
  522. return score;
  523. }
  524. },
  525. },
  526. mounted() {
  527. this.getData();
  528. this.getTeaList();
  529. },
  530. methods: {
  531. exportExlec(){
  532. let headers = [
  533. ['一级指标', '二级指标', '评价方法', '分值', '自评', '自评概述', '认定', '认定概述']
  534. ];
  535. var XLSX = require("xlsx");
  536. let data = [
  537. ...headers,
  538. ...this.PageBaseData.flatMap(parent =>
  539. parent.children.map(child => [
  540. parent.name, // 一级指标
  541. child.name, // 二级指标
  542. child.evaMethod, // 评分方法
  543. child.score, // 分值
  544. child.sco1, // 自评
  545. child.selfSummary, // 自评概述
  546. child.sco2, // 认定
  547. child.cogSum // 认定概述
  548. ]))
  549. ]
  550. const wb = XLSX.utils.book_new(); //创建一个新的工作簿对象
  551. // 创建一个Worksheet对象
  552. let ws = XLSX.utils.aoa_to_sheet(data);
  553. // 定义通用样式(包含居中)
  554. const commonStyle = {
  555. alignment: {
  556. horizontal: "center",
  557. vertical: "center"
  558. },
  559. font: {
  560. sz: 12
  561. }
  562. };
  563. // 定义表头特殊样式
  564. const headerStyle = {
  565. ...commonStyle,
  566. fill: { fgColor: { rgb: "FFFF00" } },
  567. font: { ...commonStyle.font, bold: true, sz: 14 }
  568. };
  569. // 应用样式到所有单元格
  570. for (let r = 0; r < data.length; ++r) {
  571. for (let c = 0; c < data[r].length; ++c) {
  572. const cellRef = XLSX.utils.encode_cell({ r, c });
  573. ws[cellRef] = ws[cellRef] || {};
  574. ws[cellRef].s = r === 0 ? headerStyle : commonStyle;
  575. }
  576. }
  577. // 设置列宽
  578. ws['!cols'] = [
  579. { wch: 20 }, // 一级指标
  580. { wch: 20 }, // 二级指标
  581. { wch: 30 }, // 评价方法
  582. { wch: 10 }, // 分值
  583. { wch: 10 }, // 自评
  584. { wch: 30 }, // 自评概述
  585. { wch: 10 }, // 认定
  586. { wch: 30 } // 认定概述
  587. ];
  588. // 设置行高
  589. ws['!rows'] = [
  590. { hpx: 30 }, // 表头行
  591. { hpx: 25 }, // 其他行的默认高度
  592. // 根据需要继续添加行高设置
  593. ];
  594. console.log('kk',data);
  595. // 合并单元格
  596. ws['!merges'] = [];
  597. // 记录合并单元格的逻辑
  598. let startRow = 1; // 数据开始行
  599. let previousParentName = null;
  600. let count = 0; // 计数连续相同的一级指标行
  601. for (let index = 1; index < data.length; index++) {
  602. const currentParentName = data[index][0]; // 当前行的一级指标
  603. if (currentParentName === previousParentName) {
  604. count++; // 继续计数
  605. } else {
  606. if (count > 0) { // 如果有连续的相同项
  607. ws['!merges'].push({
  608. s: { r: startRow, c: 0 },
  609. e: { r: startRow + count, c: 0 }
  610. });
  611. }
  612. // 更新开始行和计数
  613. startRow = index; // 更新为当前行的开始行
  614. count = 0; // 重置计数
  615. }
  616. previousParentName = currentParentName; // 更新前一个一级指标
  617. }
  618. // 检查最后一组
  619. if (count > 0) {
  620. ws['!merges'].push({
  621. s: { r: startRow, c: 0 },
  622. e: { r: startRow + count, c: 0 }
  623. });
  624. }
  625. XLSX.utils.book_append_sheet(wb, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
  626. XLSX.writeFile(wb, this.digUsername +'-'+ (this.digType == 1 ? '班主任考核' :'专任教师')+".xlsx");
  627. this.$message({
  628. message: "导出成功",
  629. type: "success"
  630. });
  631. },
  632. // 禁用滚轮事件
  633. handleWheel(event) {
  634. event.preventDefault();
  635. },
  636. // 获取页面数据
  637. getData() {
  638. this.tabLoading = true;
  639. let params = {
  640. oid: this.oid,
  641. org: this.org,
  642. type: this.pType,
  643. tname: this.teacherName
  644. };
  645. // console.log(params);
  646. this.ajax
  647. .get(this.$store.state.api + "selectTestExaminePersonData_filterTime", params)
  648. .then(async res => {
  649. let data = res.data[0];
  650. console.log(data)
  651. data.forEach(e => {
  652. e.json = JSON.parse(e.json);
  653. });
  654. data.forEach(e => {
  655. e.evaSca = 0;
  656. e.cogSco = 0;
  657. e.step = 0;
  658. e.allStep = 0;
  659. e.json.forEach(i => {
  660. i.children.forEach(k => {
  661. e.evaSca = e.evaSca + k.sco1 * 1;
  662. e.cogSco = e.cogSco + k.sco2 * 1;
  663. e.allStep++;
  664. if (!!k.sco2 * 1) {
  665. e.step++;
  666. }
  667. });
  668. });
  669. });
  670. data.forEach(e => {
  671. if (e.step == e.allStep) {
  672. e.state = "已完成";
  673. } else {
  674. e.state = "未完成";
  675. }
  676. if (!e.tea) {
  677. e.tea = "";
  678. }
  679. e.evaSca = e.evaSca.toFixed(2);
  680. e.cogSco = e.cogSco.toFixed(2);
  681. });
  682. for(let i = 0;i<data.length;i++){
  683. let testList = [];
  684. data[i].json.forEach(i2=>{
  685. if(i2.children.length>0){
  686. i2.children.forEach(i3=>{
  687. if(i3.testid.test.length>0){
  688. testList.push(...i3.testid.test)
  689. }
  690. })
  691. }
  692. })
  693. if(testList.length>0){
  694. let _time = data[i].timeValue?JSON.parse(data[i].timeValue):{};
  695. let testData = await this.computedTest(testList,data[i].userid,_time)
  696. let _isReviewNum = 0;
  697. let _num = 0;
  698. testData.forEach(i=>{
  699. _isReviewNum+=i.isReviewNum;
  700. _num+=i.num;
  701. })
  702. if(_num>0){
  703. if(_num==_isReviewNum){
  704. data[i].isReview = 1;
  705. }else{
  706. data[i].isReview = 0;
  707. }
  708. }else{
  709. data[i].isReview = 2;
  710. }
  711. }
  712. }
  713. this.tableData = data;
  714. this.copyTableData = data;
  715. this.tabLoading = false;
  716. this.timeSortFn()
  717. })
  718. .catch(error => {
  719. this.tabLoading = false;
  720. console.log(error);
  721. });
  722. },
  723. // 点击评分
  724. lookScore(val) {
  725. this.digLoading = true;
  726. // console.log("valvalvalval", val);
  727. // 重置自评分,二级指标个数
  728. this.DigSelfSco = 0;
  729. this.twoTarget = 0;
  730. this.digType = this.pType;
  731. this.digTid = val.id;
  732. this.diaSco = true;
  733. this.digUserid = val.userid;
  734. this.disTeaClass = val.tea;
  735. if(val.timeValue){
  736. this.timeSortList = JSON.parse(val.timeValue)
  737. }
  738. this.cutPerson();
  739. this.getPageBase();
  740. },
  741. // 获取教研室
  742. getTeaList() {
  743. let params = {
  744. oid: this.oid
  745. };
  746. this.ajax
  747. .get(this.$store.state.api + "selectTeacherOfficeBySchool", params)
  748. .then(res => {
  749. // return console.log("this.TeachingOptions", res.data[0]);
  750. let data = res.data[0];
  751. let dataCopy = [];
  752. data.forEach(e => {
  753. if(e.parentid == '6'){
  754. let a = {};
  755. a.value = e.name;
  756. a.text = e.name;
  757. dataCopy.push(a);
  758. }
  759. });
  760. data.forEach(e => {
  761. if(e.parentid == '6'){
  762. let a = {};
  763. a.id = e.id;
  764. a.name = e.name;
  765. this.TeaList.push(a);
  766. }
  767. });
  768. this.TeachingOptions = dataCopy;
  769. // console.log("this.TeachingOptions", this.TeachingOptions);
  770. })
  771. .catch(err => {
  772. console.error(err);
  773. });
  774. },
  775. // 撤回
  776. withdraw(id) {
  777. let params = [
  778. {
  779. tid: id
  780. }
  781. ];
  782. this.$confirm("是否确认退回?", "提示", {
  783. confirmButtonText: "确定",
  784. cancelButtonText: "取消",
  785. type: " info"
  786. })
  787. .then(() => {
  788. this.ajax
  789. .post(this.$store.state.api + "updateExamineState", params)
  790. .then(res => {
  791. this.getData();
  792. })
  793. .catch(error => {
  794. console.log(error);
  795. });
  796. })
  797. .catch(() => {
  798. // this.$message({
  799. // type: "info",
  800. // message: "已取消退回"
  801. // });
  802. });
  803. },
  804. recordBtn(val) {
  805. this.RecordList = [];
  806. this.recordVisible = true;
  807. this.getRecordData(val);
  808. },
  809. // 查看记录
  810. getRecordData(val) {
  811. let params = {
  812. tid: val,
  813. type: this.pType
  814. };
  815. this.ajax
  816. .get(this.$store.state.api + "selectExamineOperateRecord", params)
  817. .then(res => {
  818. // console.log(res.data[0]);
  819. this.RecordList = res.data[0];
  820. })
  821. .catch(err => {
  822. console.error(err);
  823. });
  824. },
  825. recordHandleClose(done) {
  826. done();
  827. },
  828. // 提醒
  829. remindExamine() {
  830. this.remDig = true;
  831. },
  832. // 下载excel
  833. getExcel() {
  834. var res = this.tableData;
  835. // console.log('导出数据',res);
  836. //如果value的json字段的key值和想要的headers值不一致时,可做如下更改
  837. //将和下面的Object.fromEntries结合,将json字段的key值改变为要求的excel的header值
  838. var array = [];
  839. for (var i = 0; i < res.length; i++) {
  840. var _json = {};
  841. _json["教师姓名"] = res[i].username;
  842. _json["教师账号"] = res[i].eName;
  843. _json["所属教研室"] = res[i].tea;
  844. _json["考核进度"] = `${res[i].step}/${res[i].allStep}`;
  845. _json["自评分数"] = res[i].evaSca;
  846. _json["考核分数"] = res[i].cogSco;
  847. array.push(_json);
  848. }
  849. var XLSX = require("xlsx");
  850. const workbook = XLSX.utils.book_new(); //创建一个新的工作簿对象
  851. let ws = XLSX.utils.json_to_sheet(array); //将json对象数组转化成工作表
  852. ws["!cols"] = [
  853. //设置每一列的宽度
  854. { wch: 20 },
  855. { wch: 30 },
  856. { wch: 30 },
  857. { wch: 30 },
  858. { wch: 30 },
  859. { wch: 30 }
  860. ];
  861. XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
  862. XLSX.writeFile(workbook, "教师发展.xlsx");
  863. // const wopts = { bookType: "xlsx", bookSST: false, type: "array" };//写入的样式bookType:输出的文件类型,type:输出的数据类型,bookSST: 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
  864. // const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
  865. // FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} demo.xlsx`);//保存文件
  866. this.$message({
  867. message: "导出成功",
  868. type: "success"
  869. });
  870. },
  871. // 按照数字大小排序 方法-
  872. sortCogMethod(before, after) {
  873. return Number(before.cogSco) - Number(after.cogSco);
  874. },
  875. sortEvaMethod(before, after) {
  876. return Number(before.evaSca) - Number(after.evaSca);
  877. },
  878. // 教研室筛选
  879. filterTea(value, row, column) {
  880. // console.log(value, row, column);
  881. const property = column["property"];
  882. return row[property].includes(value);
  883. },
  884. // 是否完成筛选
  885. filterExa(value, row, column) {
  886. // console.log(value, row, column);
  887. const property = column["property"];
  888. return row[property] == value;
  889. },
  890. // ----------------
  891. // 保存修改
  892. saveTab(id) {
  893. let a = { sco2: 0, cogSum: "" };
  894. let b = { sco2: 0, cogSum: "" };
  895. this.PageBaseData.forEach(e => {
  896. e.children.forEach(i => {
  897. if (i.id == id) {
  898. a.sco2 = i.sco2;
  899. a.cogSum = i.cogSum;
  900. }
  901. });
  902. });
  903. this.PageBaseDataTwo.forEach(e => {
  904. e.children.forEach(i => {
  905. if (i.id == id) {
  906. b.sco2 = i.sco2;
  907. b.cogSum = i.cogSum;
  908. }
  909. });
  910. });
  911. console.log(a, b, id);
  912. if (
  913. a.sco2 == b.sco2 &&
  914. JSON.stringify(a.cogSum) === JSON.stringify(b.cogSum)
  915. )
  916. return;
  917. let PageBaseDataCopy = JSON.parse(JSON.stringify(this.PageBaseData));
  918. for (const e of PageBaseDataCopy) {
  919. for (const k of e.children) {
  920. if (k.testid.test.length > 0) {
  921. k.testid.test = k.testid.test.map(item => item.courseId);
  922. }
  923. }
  924. }
  925. let params = [
  926. {
  927. uid: this.userid,
  928. tid: this.digTid,
  929. typ: this.pType,
  930. // json: JSON.stringify(PageBaseDataCopy)
  931. json: JSON.stringify(PageBaseDataCopy),
  932. rjson: JSON.stringify({
  933. rjson: PageBaseDataCopy,
  934. text: `按人员,进行修改`
  935. })
  936. }
  937. ];
  938. console.log("params",params[0])
  939. // return console.log(params);
  940. this.ajax
  941. .post(this.$store.state.api + "updateExamineCogDataCopy", params)
  942. .then(res => {
  943. // console.log("updateExamineCogDataCopy", res);
  944. // this.CopDigSco();
  945. this.getDigData();
  946. })
  947. .catch(error => {
  948. console.log(error);
  949. });
  950. },
  951. // 查看数据来源
  952. lookUserPrize(cid) {
  953. // return console.log(val);
  954. if (this.tableData.length <= 0)
  955. return this.$message.error("暂无人员提交");
  956. // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.userid}`;
  957. if(this.timeSortList){
  958. let timeValue = this.timeSortList.time
  959. this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?userid=${this.userid}&cid=${cid}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.digUserid}&timeLimit=${timeValue}&review=1&disableBack=true`;
  960. }else{
  961. this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?userid=${this.userid}&cid=${cid}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.digUserid}&review=1&disableBack=true`;
  962. }
  963. // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/test?userid=${this.userid}&oid=45facc0a-1211-11ec-80ad-005056b86db5&org=&role=0`;
  964. this.diaIframe = true;
  965. },
  966. // 弹框方法切换专任,班主任
  967. cutPage(e) {
  968. this.digType = e;
  969. this.digLoading = true;
  970. // this.getDataDig();
  971. },
  972. // 弹框内班主任与专任教师切换,刷新tableData数据
  973. getDataDig() {
  974. let params = {
  975. oid: this.oid,
  976. org: this.org,
  977. type: this.digType
  978. };
  979. // console.log(params);
  980. this.ajax
  981. .get(this.$store.state.api + "selectTestExamineSecondData", params)
  982. .then(res => {
  983. let data = res.data[0];
  984. this.tableData = data;
  985. // 这一步是为了获取弹窗表单第一个人,如果为空的话就清空数据
  986. if (this.tableData.length > 0) {
  987. this.DigSelfSco = 0; //弹框自评分
  988. this.twoTarget = 0; //二级指标个数
  989. this.digTid = this.tableData[0].id; //表单id
  990. // this.diaSco = true;
  991. this.digUserid = this.tableData[0].userid; //弹框tableData数组中第一个数据userid
  992. this.disTeaClass = this.tableData[0].tea; //弹框tableData数组中第一个数据教研室
  993. // 判断所处数组第几位,方便后面上下切换
  994. this.cutPerson();
  995. // 获取基础模版,重新开始渲染数据
  996. this.getPageBase();
  997. } else {
  998. // 切换后tableData里没有数据的话将,自评分什么的清空
  999. this.getPageBase2();
  1000. }
  1001. // console.log("this.tableData", this.tableData);
  1002. })
  1003. .catch(error => {
  1004. console.log(error);
  1005. });
  1006. },
  1007. // 弹框切换上一个教师
  1008. upTea() {
  1009. if (this.cutTeaNum <= 0) return this.$message.error("已经是第一个了");
  1010. this.digLoading = true;
  1011. this.cutTeaNum--;
  1012. this.digUsername = this.copyTableData[this.cutTeaNum].username;
  1013. this.disTeaClass = this.copyTableData[this.cutTeaNum].tea;
  1014. this.digUserid = this.copyTableData[this.cutTeaNum].userid;
  1015. this.digTid = this.copyTableData[this.cutTeaNum].id;
  1016. this.getPageBase();
  1017. },
  1018. // 弹框切换下一个教师
  1019. nextTea() {
  1020. // console.log("this.tableData", this.tableData);
  1021. if (this.cutTeaNum + 1 >= this.copyTableData.length)
  1022. return this.$message.error("已经是最后一个了");
  1023. this.digLoading = true;
  1024. this.cutTeaNum++;
  1025. this.digUsername = this.copyTableData[this.cutTeaNum].username;
  1026. this.disTeaClass = this.copyTableData[this.cutTeaNum].tea;
  1027. this.digUserid = this.copyTableData[this.cutTeaNum].userid;
  1028. this.digTid = this.copyTableData[this.cutTeaNum].id;
  1029. this.getPageBase();
  1030. },
  1031. // 弹框专任与班主任切换数据为空时,将表单清空
  1032. getPageBase2() {
  1033. let params = {
  1034. typ: this.digType,
  1035. org: this.org,
  1036. oid: this.oid
  1037. };
  1038. this.ajax
  1039. .get(this.$store.state.api + "selectTestExamineBase", params)
  1040. .then(res => {
  1041. // console.log("selectTestExamineBase", res.data[0][0]);
  1042. this.DigSelfSco = 0;
  1043. this.twoTarget = 0;
  1044. this.digTid = "";
  1045. this.digUserid = "";
  1046. this.disTeaClass = "";
  1047. this.digUsername = "暂无提交";
  1048. this.PageBaseData = JSON.parse(res.data[0][0].json);
  1049. // 处理数据来源
  1050. this.handleData();
  1051. this.digLoading = false;
  1052. })
  1053. .catch(error => {
  1054. console.log(error);
  1055. });
  1056. },
  1057. // 弹框获取页面基础ui信息
  1058. getPageBase() {
  1059. let params = {
  1060. typ: this.digType,
  1061. org: this.org,
  1062. oid: this.oid
  1063. };
  1064. this.ajax
  1065. .get(this.$store.state.api + "selectTestExamineBase", params)
  1066. .then(res => {
  1067. // console.log("selectTestExamineBase", res.data[0][0]);
  1068. this.PageBaseData = JSON.parse(res.data[0][0].json);
  1069. this.PageBaseDataTwo = JSON.parse(res.data[0][0].json);
  1070. // 处理数据来源
  1071. this.handleData();
  1072. // 先获取基础模板,然后再获取用户又没有填写过,填写过就开始循环赋值给基础模板,最后提交基础模板
  1073. this.getDigData();
  1074. })
  1075. .catch(error => {
  1076. console.log(error);
  1077. });
  1078. },
  1079. // 弹框获取页面渲染数据
  1080. getDigData() {
  1081. let params = {
  1082. uid: this.digUserid,
  1083. type: this.digType
  1084. };
  1085. this.ajax
  1086. .get(this.$store.state.api + "getTestExamineByUserId", params)
  1087. .then(res => {
  1088. console.log("getTestExamineByUserId", res);
  1089. if (res.data[0].length > 0) {
  1090. let _data = res.data[0].find(i=>i.id==this.digTid)
  1091. if(_data){
  1092. let val = JSON.parse(_data.json);
  1093. this.PageBaseData.forEach(e => {
  1094. val.forEach(i => {
  1095. if (e.id == i.id) {
  1096. e.children.forEach(a => {
  1097. i.children.forEach(b => {
  1098. if (a.id == b.id) {
  1099. a.sco1 = b.sco1;
  1100. a.sco2 = b.sco2;
  1101. a.cogSum = b.cogSum;
  1102. a.selfSummary = b.selfSummary;
  1103. }
  1104. });
  1105. });
  1106. }
  1107. });
  1108. });
  1109. this.PageBaseDataTwo = val;
  1110. // 弹框计算自评分数,与二级指标个数
  1111. this.getTwoRigData();
  1112. }
  1113. } else {
  1114. // 清空自评分数,与二级指标个数
  1115. this.DigSelfSco = 0;
  1116. this.twoTarget = 0;
  1117. }
  1118. this.digLoading = false;
  1119. })
  1120. .catch(error => {
  1121. console.log(error);
  1122. });
  1123. },
  1124. // 弹框计算自评分数,与二级指标个数
  1125. getTwoRigData() {
  1126. this.DigSelfSco = 0;
  1127. this.twoTarget = 0;
  1128. // 计算自评分数,与二级指标个数
  1129. this.PageBaseData.forEach(e => {
  1130. e.children.forEach(i => {
  1131. this.DigSelfSco += i.sco1 * 1;
  1132. this.twoTarget++;
  1133. });
  1134. });
  1135. this.DigSelfSco = this.DigSelfSco.toFixed(2);
  1136. },
  1137. // 获取用户列表位置,以及用户名称
  1138. cutPerson() {
  1139. this.tableData.forEach((e, index) => {
  1140. if (e.userid == this.digUserid) {
  1141. this.cutTeaNum = index;
  1142. this.digUsername = e.username;
  1143. }
  1144. });
  1145. },
  1146. // 评分关闭弹框
  1147. handleClose(done) {
  1148. this.timeSortList = [];
  1149. this.getData();
  1150. done();
  1151. },
  1152. // 数据来源关闭弹框
  1153. handleClose2(done) {
  1154. this.digLoading = true;
  1155. this.getPageBase();
  1156. done();
  1157. },
  1158. // handleClose3(done) {
  1159. // done();
  1160. // },
  1161. // 处理数据来源
  1162. async handleData() {
  1163. for (const e of this.PageBaseData) {
  1164. for (const k of e.children) {
  1165. if (k.testid.test.length > 0) {
  1166. k.testid.test = await this.computedTest(k.testid.test);
  1167. }
  1168. }
  1169. }
  1170. },
  1171. // 处理数据来源
  1172. computedTest(val,uid='',timeSortList=this.timeSortList) {
  1173. let params = [
  1174. {
  1175. uid: uid?uid:this.digUserid,
  1176. testId: val.join(",")
  1177. }
  1178. ];
  1179. let _fnStr = `selectExamineTestName`
  1180. console.log("this.timeSortList",timeSortList)
  1181. if(timeSortList && timeSortList.time && timeSortList.time.length>0){
  1182. const timeValue = timeSortList.time;
  1183. params[0].startTime = timeValue[0];
  1184. params[0].endTime = timeValue[1];
  1185. _fnStr = `selectExamineTestNameFilterTime`
  1186. }
  1187. return new Promise(resolve => {
  1188. this.ajax
  1189. .post(this.$store.state.api + _fnStr, params)
  1190. .then(res => {
  1191. let _data = res.data[0];
  1192. _data.forEach(i=>{
  1193. if(i.num>0){
  1194. if(i.num==i.isReviewNum){
  1195. i.status = 1;
  1196. }else{
  1197. i.status = 2;
  1198. }
  1199. }else{
  1200. i.status = 0;
  1201. }
  1202. })
  1203. console.log("_data",_data)
  1204. resolve(_data);
  1205. })
  1206. .catch(error => {
  1207. console.log(error);
  1208. });
  1209. });
  1210. },
  1211. //时间筛选
  1212. timeSortFn(){
  1213. console.log("timeSortFn",this.timeA,this.timeB)
  1214. if(this.pType == 1 && this.timeA){
  1215. this.copyTableData = this.tableData.filter(i=>i.time == this.timeA)
  1216. }else if(this.pType == 2 && this.timeB){
  1217. this.copyTableData = this.tableData.filter(i=>i.time == this.timeB)
  1218. }
  1219. },
  1220. //保存按钮
  1221. saveBtn(){
  1222. let PageBaseDataCopy = JSON.parse(JSON.stringify(this.PageBaseData));
  1223. for (const e of PageBaseDataCopy) {
  1224. for (const k of e.children) {
  1225. if (k.testid.test.length > 0) {
  1226. k.testid.test = k.testid.test.map(item => item.courseId);
  1227. }
  1228. }
  1229. }
  1230. let params = [
  1231. {
  1232. uid: this.userid,
  1233. tid: this.digTid,
  1234. typ: this.pType,
  1235. // json: JSON.stringify(PageBaseDataCopy)
  1236. json: JSON.stringify(PageBaseDataCopy),
  1237. rjson: JSON.stringify({
  1238. rjson: PageBaseDataCopy,
  1239. text: `按人员,进行修改`
  1240. })
  1241. }
  1242. ];
  1243. // return console.log(params);
  1244. this.ajax
  1245. .post(this.$store.state.api + "updateExamineCogDataCopy", params)
  1246. .then(res => {
  1247. // console.log("updateExamineCogDataCopy", res);
  1248. // this.CopDigSco();
  1249. this.getDigData();
  1250. this.$message.success("保存成功")
  1251. })
  1252. .catch(error => {
  1253. console.log(error);
  1254. });
  1255. }
  1256. }
  1257. };
  1258. </script>
  1259. <style scoped>
  1260. .personPage >>> .el-table tr {
  1261. height: 70px;
  1262. }
  1263. .digUsernameCss {
  1264. width: 70px;
  1265. overflow: hidden;
  1266. white-space: nowrap;
  1267. text-overflow: ellipsis;
  1268. }
  1269. .recordDig >>> .el-dialog {
  1270. height: 600px;
  1271. width: 500px !important;
  1272. }
  1273. .remFlex {
  1274. display: flex;
  1275. justify-content: flex-start;
  1276. margin-bottom: 20px;
  1277. }
  1278. .remFlexTit {
  1279. width: 80px;
  1280. flex-shrink: 0;
  1281. }
  1282. .digTop {
  1283. display: flex;
  1284. justify-content: space-between;
  1285. align-items: center;
  1286. margin: 15px 0;
  1287. }
  1288. .TabBtn {
  1289. cursor: pointer;
  1290. color: #528df6;
  1291. margin: 0 10px;
  1292. }
  1293. .dialog_remDig >>> .el-dialog {
  1294. height: 700px;
  1295. margin: 0 auto !important;
  1296. margin-top: 20px !important;
  1297. overflow: hidden;
  1298. min-width: 800px !important;
  1299. }
  1300. .dialog_remDig >>> .el-dialog__header {
  1301. background: #454545 !important;
  1302. padding: 15px 20px;
  1303. }
  1304. .dialog_diy >>> .el-dialog {
  1305. height: 95%;
  1306. margin: 0 auto !important;
  1307. margin-top: 20px !important;
  1308. overflow: hidden;
  1309. min-width: 800px !important;
  1310. }
  1311. .dialog_diy >>> .el-dialog__header {
  1312. background: #454545 !important;
  1313. padding: 25px 20px;
  1314. }
  1315. .dialog_diy >>> .el-dialog__body {
  1316. height: calc(100% - 50px);
  1317. box-sizing: border-box;
  1318. padding: 0px;
  1319. }
  1320. .dialog_diy >>> .el-dialog__title {
  1321. color: #fff;
  1322. }
  1323. .dialog_diy >>> .el-dialog__headerbtn {
  1324. top: 19px;
  1325. }
  1326. .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
  1327. color: #fff;
  1328. }
  1329. .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
  1330. color: #fff;
  1331. }
  1332. .dialog_diy >>> .el-dialog__body,
  1333. .dialog_diy >>> .el-dialog__footer {
  1334. background: #fafafa;
  1335. }
  1336. .ScoreStep {
  1337. height: 100%;
  1338. width: 100%;
  1339. }
  1340. .ScoreStep > input {
  1341. height: 100% !important;
  1342. outline-style: none;
  1343. padding: 5px;
  1344. width: 100%;
  1345. text-align: center;
  1346. box-sizing: border-box;
  1347. border-radius: 4px;
  1348. border: none !important;
  1349. /* border: 1px solid #dcdfe6 !important; */
  1350. }
  1351. .ScoreStep >>> .el-input-number {
  1352. height: 100% !important;
  1353. }
  1354. .ScoreStep >>> .el-input {
  1355. height: 100% !important;
  1356. }
  1357. .ScoreStep >>> .el-input__inner {
  1358. height: 100%;
  1359. padding-left: 15px;
  1360. border: none;
  1361. padding-right: 15px;
  1362. }
  1363. .testPersonExamine {
  1364. width: 100%;
  1365. min-width: calc(50px * 10);
  1366. height: 100%;
  1367. padding: 10px;
  1368. display: flex;
  1369. flex-direction: column;
  1370. /* overflow: auto; */
  1371. box-sizing: border-box;
  1372. background-color: #fff;
  1373. }
  1374. .tArea {
  1375. width: 100%;
  1376. height: 100%;
  1377. padding: 5px;
  1378. box-sizing: border-box;
  1379. display: block !important;
  1380. text-align: left;
  1381. }
  1382. .testPersonExamine > .testTit {
  1383. height: 100px;
  1384. display: flex;
  1385. padding: 15px 0;
  1386. justify-content: space-between;
  1387. align-items: center;
  1388. }
  1389. .teaLis {
  1390. display: flex;
  1391. }
  1392. .teal {
  1393. padding: 10px 20px;
  1394. cursor: pointer;
  1395. }
  1396. .Tbor {
  1397. border-bottom: 2px rgba(54, 129, 252, 1) solid;
  1398. font-weight: 600;
  1399. }
  1400. .testCon {
  1401. box-sizing: border-box;
  1402. padding: 20px;
  1403. }
  1404. .orgData {
  1405. cursor: pointer;
  1406. color: #528df6;
  1407. margin-bottom: 10px;
  1408. }
  1409. .sBox_table {
  1410. width: 100%;
  1411. min-width: 1500px;
  1412. height: 100%;
  1413. margin: 0 auto;
  1414. /* min-width: 1520px; */
  1415. font-size: 14px;
  1416. }
  1417. .table_title {
  1418. width: calc(100% - 6px);
  1419. /* min-width: calc(100px * 9); */
  1420. height: 50px;
  1421. background: #e0eafb;
  1422. border: 1px solid #d5d8df;
  1423. display: flex;
  1424. flex-direction: row;
  1425. flex-wrap: nowrap;
  1426. align-items: center;
  1427. }
  1428. /* 取消[type='number']的input的上下箭头 */
  1429. input::-webkit-inner-spin-button {
  1430. -webkit-appearance: none !important;
  1431. }
  1432. input::-webkit-outer-spin-button {
  1433. -webkit-appearance: none !important;
  1434. }
  1435. input[type="number"] {
  1436. -moz-appearance: textfield;
  1437. }
  1438. .table_title > div {
  1439. /* width: calc(100% / 9); */
  1440. /* min-width: 110px; */
  1441. text-align: center;
  1442. box-sizing: border-box;
  1443. height: 100%;
  1444. line-height: 50px;
  1445. border-right: 1px solid #d5d8df;
  1446. }
  1447. .table_title > div:last-child {
  1448. border: none;
  1449. }
  1450. .table_Content {
  1451. width: 100%;
  1452. min-width: calc(100px * 9);
  1453. /* border: 1px solid #d5d8df; */
  1454. border: none;
  1455. display: flex;
  1456. flex-direction: row;
  1457. flex-wrap: nowrap;
  1458. text-align: center;
  1459. align-items: center;
  1460. }
  1461. .twoCol {
  1462. width: 100%;
  1463. display: flex;
  1464. }
  1465. .ColTit {
  1466. width: 150px !important;
  1467. display: flex;
  1468. justify-content: center;
  1469. align-items: center;
  1470. border-bottom: 1px #ccc solid;
  1471. }
  1472. .twoCon {
  1473. display: flex;
  1474. }
  1475. .twoCon > div > input {
  1476. border: none;
  1477. width: 100%;
  1478. height: 100%;
  1479. outline-style: none;
  1480. text-align: center;
  1481. }
  1482. .twoCon {
  1483. display: flex;
  1484. width: 100%;
  1485. }
  1486. .twoCon > div > textarea {
  1487. border: none;
  1488. width: 100%;
  1489. height: 100%;
  1490. resize: none;
  1491. box-sizing: border-box;
  1492. padding: 5px;
  1493. outline-style: none;
  1494. }
  1495. .twoCon > div {
  1496. /* width: 10%; */
  1497. /* min-width: 110px; */
  1498. min-height: 50px;
  1499. /* line-height: 50px; */
  1500. display: flex;
  1501. box-sizing: border-box;
  1502. justify-content: center;
  1503. align-items: center;
  1504. border-left: 1px #ccc solid;
  1505. border-bottom: 1px #ccc solid;
  1506. }
  1507. .twoCon > div:nth-child(1) {
  1508. width: 160px !important;
  1509. }
  1510. .twoCon > div:nth-child(2) {
  1511. width: 160px !important;
  1512. line-height: 20px;
  1513. }
  1514. .twoCon > div:nth-child(3) {
  1515. width: 110px !important;
  1516. }
  1517. .twoCon > div:nth-child(4) {
  1518. width: 110px !important;
  1519. }
  1520. .twoCon > div:nth-child(5) {
  1521. flex: 1;
  1522. }
  1523. .twoCon > div:nth-child(6) {
  1524. width: 250px !important;
  1525. }
  1526. .twoCon > div:nth-child(7) {
  1527. width: 110px !important;
  1528. }
  1529. .twoCon > div:nth-child(8) {
  1530. flex: 1;
  1531. }
  1532. .ColCon {
  1533. flex: 1;
  1534. }
  1535. .scoreBox{
  1536. display: flex;
  1537. align-items: center;
  1538. }
  1539. .scoreBox > span:nth-child(1){
  1540. max-width: 100px;
  1541. width: 100px;
  1542. overflow: hidden;
  1543. white-space: nowrap;
  1544. text-overflow: ellipsis;
  1545. text-align: right;
  1546. }
  1547. .scoreBox > span:nth-child(2){
  1548. margin-left: 10px;
  1549. }
  1550. .taskArea{
  1551. display: flex;
  1552. justify-content: center;
  1553. }
  1554. .task_0{
  1555. padding: 6px 20px;
  1556. background: #FEF5EC;
  1557. border: solid 1px #FAD0A1;
  1558. color: #F7933B;
  1559. border-radius: 4px;
  1560. }
  1561. .task_1{
  1562. padding: 6px 20px;
  1563. background: #E6F9EA;
  1564. border: solid 1px #A6E9B6;
  1565. color: #21ba45;
  1566. border-radius: 4px;
  1567. }
  1568. </style>