details.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. <template>
  2. <view class="detail">
  3. <image :src="bgimg" class="bgimg"></image>
  4. <view class="dbox">
  5. <view class="top">
  6. <view class="tit">{{datainfo.scoreTitle||''}}</view>
  7. <!-- <view class="txt">学生姓名:周小亚</view> -->
  8. <view class="txt">考试类型:{{kaType(datainfo.scoreType,kaoshilist)||''}}</view>
  9. <view class="txt">学生班级:{{datainfo.scoreClassName||''}}</view>
  10. <view class="txt">考试时间:{{datainfo.scoreTime||''}}</view>
  11. <!-- <view class="txt">发布时间:{{datainfo.scoreTitle}}</view> -->
  12. <!-- <image :src="shareimg" class="shareimg"></image> -->
  13. </view>
  14. <!-- 家长 -->
  15. <block v-if="roles=='parents'">
  16. <block v-if="scorlist&&scorlist.length">
  17. <view class="dmain mb10" style="flex: 0 0 auto;overflow: hidden;" v-for="(ite,idx) in scorlist" :key='idx'>
  18. <view class="tit mb20">成绩详情 </view>
  19. <view class="list">
  20. <view class="label">姓名</view>
  21. <view class="rtxt rtxt1">{{ite.scoreDataName}}</view>
  22. </view>
  23. <block v-if="ite.scoreDataDetailVoList&&ite.scoreDataDetailVoList.length">
  24. <view class="list" v-for="(site,sidx) in ite.scoreDataDetailVoList" :key="sidx">
  25. <view class="label">{{site.xueke}}</view>
  26. <view class="rtxt rtxt1">{{site.score}}<text>/{{site.scoreSort}}</text></view>
  27. </view>
  28. </block>
  29. <view class="list">
  30. <view class="label">总分</view>
  31. <view class="rtxt rtxt1">{{ite.zongfen}}</view>
  32. </view>
  33. <view class="list">
  34. <view class="label">排名</view>
  35. <view class="rtxt rtxt2">{{ite.scoreSort}}</view>
  36. </view>
  37. <water-mark :info="markinfo" v-if="watermarkflag=='true'"></water-mark>
  38. </view>
  39. </block>
  40. <view class="dmain" v-else>
  41. <view class="nodata">
  42. <image :src="noiconpimg"></image>
  43. <view>暂无相关考试成绩</view>
  44. </view>
  45. </view>
  46. </block>
  47. <!-- 老师 -->
  48. <view class="dmain flex1" style="overflow: hidden;" v-else>
  49. <view class="flex0 flexcj mb20">
  50. <view class="tit">成绩详情</view>
  51. <view @click="getDel" class="delbox" v-if="checkPermi(['score:data:remove'])">删除</view>
  52. <!-- <view class="search flexc mb28">
  53. <image :src="searchimg" class="img"></image>
  54. <input placeholder="输入学生姓名进行搜索" v-model="name" class="flex1 input"/>
  55. <view class="btn" @click="getSearch">搜索</view>
  56. </view> -->
  57. <!-- 表格 -->
  58. </view>
  59. <!-- :pullUpLoading="pullUpLoading"
  60. :isShowLoadMore="true" -->
  61. <view class="flex1" style="overflow: hidden;position: relative;">
  62. <zb-table
  63. :show-header="true"
  64. :columns="columns"
  65. :stripe="true"
  66. :fit="false"
  67. @rowClick="rowClick"
  68. @toggleRowSelection="toggleRowSelection"
  69. @toggleAllSelection="toggleAllSelection"
  70. :border="border"
  71. @edit="buttonEdit"
  72. @dele="dele"
  73. :data="scorlist"></zb-table>
  74. <water-mark :info="markinfo" v-if="watermarkflag=='true'"></water-mark>
  75. </view>
  76. </view>
  77. <view class="fbtns" @click="getTotal" v-if="datainfo.scoreType!=4&&roles!='parents'">
  78. <image :src="total"></image>
  79. 查看成绩统计分析
  80. </view>
  81. <!-- 年级统计 -->
  82. <view style="height: 120rpx;flex:0 0 auto" v-if="datainfo.scoreType!=4&&roles!='parents'"></view>
  83. </view>
  84. <!-- 水印 -->
  85. </view>
  86. </template>
  87. <script>
  88. // import tabSearch from "@/components/toptab/search.vue";
  89. import {getDictionaryFn,getconfigKeyFn} from '@/api/mine/register.js'
  90. import zbTable from "@/mine/components/zb-table/zb-tables.vue"
  91. import waterMark from '@/mine/components/popup/watermark.vue' //
  92. import { selectDictValue } from '@/utils/common.js';
  93. import {getscoreDetFn,getscoreListFn,getscoreDelFn} from "@/api/mine/score.js"
  94. import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
  95. export default {
  96. data() {
  97. return {
  98. bgimg: require("@/mine/static/score/scbg.png"),
  99. shareimg: require("@/mine/static/score/share.png"),
  100. searchimg: require("@/mine/static/score/search.png"),
  101. total: require("@/mine/static/score/total.png"),
  102. noiconpimg:require("@/static/images/noiconp.png"),
  103. name:'',
  104. flag1:true,
  105. columns:[],
  106. num:0,
  107. scoreId:'',
  108. datainfo:{},
  109. sublist:[],
  110. scorlist:[],
  111. allscorlist:[],
  112. kaoshilist:[],
  113. roles:this.$store.state.user.choseroles,
  114. markinfo:this.$store.state.user.phonenumber,
  115. watermarkflag:'false',
  116. border:false,
  117. }
  118. },
  119. components:{zbTable,waterMark},
  120. onLoad: function(e) {
  121. if(e&&e.id){
  122. this.scoreId=e.id;
  123. this.getDataFn();
  124. this.init()
  125. }
  126. uni.removeStorageSync('scorecount')
  127. },
  128. onUnload(){
  129. uni.removeStorageSync('scorecount')
  130. },
  131. methods: {
  132. checkPermi, checkRole,
  133. getTotal(){
  134. var obj={
  135. scoreTime:this.datainfo.scoreTime,
  136. scoreType:this.datainfo.scoreType,
  137. scoreClassName:this.datainfo.scoreClassName,
  138. scoreClassId:this.datainfo.scoreClassId,
  139. scoreId:this.scoreId,
  140. }
  141. uni.setStorageSync('scorecount',JSON.stringify(obj))
  142. this.$tab.navigateTo('/mine/pages/release/count')
  143. },
  144. kaType(data, list) {
  145. return selectDictValue(list, data);
  146. },
  147. init(){
  148. // 考试类型
  149. getDictionaryFn('kaoshi').then(res=>{
  150. if(res.code==200){
  151. this.kaoshilist = res.data.map(v => {
  152. return {
  153. dictLabel: v.dictLabel,
  154. dictValue:v.dictValue,
  155. }
  156. })
  157. }
  158. })
  159. // 参数设置
  160. getconfigKeyFn('sys.index.scoreWatermark').then(res=>{
  161. if(res.code==200){
  162. this.watermarkflag=res.msg
  163. }
  164. })
  165. // 学科
  166. // getDictionaryFn('chjbxk').then(res=>{
  167. // if(res.code==200){
  168. // this.subjectlist = res.data.map(v => {
  169. // return {
  170. // tit: v.dictLabel,
  171. // val:v.dictValue,
  172. // check:false
  173. // }
  174. // })
  175. // }
  176. // })
  177. },
  178. getColumns(info){
  179. var newArr=info;
  180. var narr=[];
  181. var column1=[{ type:'index',label: '序号', fixed:true,width:80,align:'center', },{ name: 'scoreDataName', label: '姓名',fixed:true,width:140,emptyString:'--',align:'center' }];
  182. var narr=[{ name: 'zongfen', label: '总分',align:'center',width:112 },
  183. { name: 'scoreSort', label: '排名',align:'center',width:112 }]
  184. Object.keys(newArr).some((key) => {
  185. var obj={};
  186. obj.name=newArr[key].xueke;
  187. obj.label=newArr[key].xueke;
  188. obj.manfen=newArr[key].manfen;
  189. obj.sorter=true;
  190. obj.align='center';
  191. obj.width=190;
  192. obj.paddingRight=20;
  193. obj.show='true'
  194. column1.push(obj)
  195. })
  196. column1=column1.concat(narr)
  197. this.columns=JSON.parse(JSON.stringify(column1))
  198. },
  199. getDataFn(){
  200. var roles=this.$store.state.user.choseroles;
  201. var obj={
  202. role:roles
  203. }
  204. var params={
  205. scoreId:this.scoreId,
  206. params:obj
  207. }
  208. getscoreDetFn(params).then(res=>{
  209. if(res.code==200){
  210. this.datainfo=res.data;
  211. // 表头
  212. if(res.data.scoreDataMfVoList&&res.data.scoreDataMfVoList.length){
  213. this.getColumns(res.data.scoreDataMfVoList)
  214. }
  215. // 数据
  216. if(res.data.scoreDataStudentVoList&&res.data.scoreDataStudentVoList.length){
  217. if(roles=='parents'){
  218. this.scorlist=res.data.scoreDataStudentVoList;
  219. }else{
  220. this.scorlist=this.gethandleTable(res.data.scoreDataStudentVoList);
  221. }
  222. }
  223. // console.log(this.column1)
  224. // 表格展示
  225. }else{
  226. this.$toast(res.msg)
  227. }
  228. })
  229. },
  230. // 处理成表格数据
  231. gethandleTable(info){
  232. var strarr=[];
  233. var newArr=info;
  234. Object.keys(newArr).some((key) => {
  235. var params={}
  236. params.scoreDataName=newArr[key].scoreDataName;
  237. params.scoreDataNameId=newArr[key].scoreDataNameId;
  238. params.zongfen=newArr[key].zongfen.toFixed(2);
  239. params.scoreSort=newArr[key].scoreSort;
  240. if (newArr[key].scoreDataDetailVoList&&newArr[key].scoreDataDetailVoList.length) {
  241. var scBoList=newArr[key].scoreDataDetailVoList;
  242. scBoList.forEach(ite=>{
  243. params[ite.xueke]=ite.score
  244. })
  245. }
  246. strarr.push(params);
  247. })
  248. return strarr
  249. },
  250. getDel(){
  251. var that=this;
  252. this.$modal.confirm('确定删除该信息吗?').then(() => {
  253. getscoreDelFn(that.scoreId).then(res=>{
  254. if (res.code == 200) {
  255. that.$toast('删除成功')
  256. setTimeout(function(){
  257. uni.$emit('refreshscorelist');
  258. uni.navigateBack({
  259. delta:1
  260. })
  261. },1500)
  262. } else {
  263. that.$toast(res.msg)
  264. }
  265. })
  266. })
  267. },
  268. getSearch(){
  269. var name=this.name;
  270. // var params={}
  271. // params['scoreClassId']=this.datainfo.scoreClassId
  272. // params['params[scoreDataName]']=this.name
  273. // params['params[role]']=this.$store.state.user.choseroles
  274. // getscoreListFn(params).then(res=>{
  275. // if(res.code==200){
  276. // }else{
  277. // this.$toast(res.msg)
  278. // }
  279. // })
  280. },
  281. pullUpLoading(done){
  282. if(!this.flag1){
  283. return
  284. }
  285. this.flag1 = true;
  286. setTimeout(()=>{
  287. this.data.push({id:"20", date: '2016-05-02', name: '王小虎4',yw: 5,sx: 91,yy:89,},)
  288. this.flag1 = false;
  289. this.num ++
  290. if(this.num===2){
  291. done('ok')
  292. this.flag1 = true
  293. }else {
  294. done()
  295. }
  296. },2000)
  297. },
  298. },
  299. }
  300. </script>
  301. <style lang="scss" scoped>
  302. .detail{
  303. .bgimg{width: 750rpx;height: 400rpx;}
  304. .dbox{padding: 0 36rpx 20rpx;margin-top: -368rpx;position: relative;height: calc(100vh - 32rpx);
  305. display: flex;flex-direction: column;
  306. .top{position: relative;padding-bottom: 20rpx;flex: 0 0 auto;
  307. .tit{font-size: 36rpx;font-weight: bold;color: #FFFFFF;margin-bottom: 24rpx;}
  308. .txt{font-size: 30rpx;color: #D3DFFD;line-height: 40rpx;margin-bottom: 12rpx;}
  309. .shareimg{width: 28rpx;height: 34rpx;position: absolute;right: 0rpx;top: 0rpx;}
  310. }
  311. .dmain{padding: 40rpx 24rpx 10rpx;background: #FFFFFF;border-radius: 18rpx;position: relative;
  312. display: flex;flex-direction: column;
  313. .tit{font-size: 30rpx;font-weight: bold;color: #161616;}
  314. .list{width: 100%;background: #F7F7F7;display: flex;align-items: flex-start;line-height: 48rpx;
  315. border-radius: 10rpx;min-height: 100rpx;padding: 26rpx;box-sizing: border-box;margin-bottom: 22rpx;
  316. .label{font-size: 30rpx;font-weight: bold;color: #161616;font-weight: bold;flex: 0 0 auto;}
  317. .rtxt{flex: 1;text-align: right;margin-left: 12rpx;
  318. &.rtxt1{font-size: 32rpx;font-weight: bold;color: #FE5A0E;
  319. text{color: #161616;font-size: 30rpx;font-weight: normal;}
  320. }
  321. &.rtxt2{font-size: 30rpx;font-weight: 500;color: #161616;}
  322. }
  323. }
  324. .search{height: 80rpx;background: #F2F5FB;border-radius: 40rpx;padding-left: 40rpx;
  325. .img{width: 30rpx;height: 32rpx;flex:0 0 auto;margin-right: 30rpx;}
  326. .btn{width: 120rpx;height: 80rpx;background: #1f57e6;border-radius: 40rpx;font-size: 30rpx;font-weight: 500;
  327. color: #FFFFFF;text-align: center;line-height: 80rpx;flex:0 0 auto}
  328. .input{font-size: 30rpx;color: #161616;line-height: 80rpx;}
  329. }
  330. .delbox{font-size: 30rpx;color: #FE5A0E;padding:0 20rpx;}
  331. }
  332. }
  333. }
  334. .nodata{
  335. display: flex;flex-direction: column;align-items: center;box-sizing: border-box;padding: 80rpx 0 120rpx;
  336. image{width: 456rpx;height: 178rpx;margin-bottom: 28rpx;}
  337. view{font-size: 30rpx;color: #AAAAAA;font-weight: bold;}
  338. }
  339. .fbtns{display: flex;align-items: center;background-color: #ffffff;padding:0rpx 30rpx 0rpx;box-shadow: 0px 0px 18rpx 0px rgba(121,121,121,0.39);height:100rpx;flex: 0 0 auto;justify-content: center;font-size: 30rpx;font-weight: 500;
  340. color: #4775EA;
  341. image{width: 32rpx;height: 30rpx;margin-right: 20rpx;}
  342. }
  343. .detail /deep/ .zb-table-header{background-color: #F2F5FB !important;}
  344. .detail /deep/ .zb-table-applet .zb-table-header .zb-stick-side{background-color: #F2F5FB !important;}
  345. .detail /deep/ .odd{background-color: #F2F5FB !important;}
  346. .detail /deep/ .item-td{border-bottom: none !important;}
  347. .detail /deep/ .item-th{border-bottom: none !important;background-color: #F2F5FB !important;}
  348. </style>