Merge remote-tracking branch 'origin/main'

main
王家东 5 months ago
commit ae9aa70c09
  1. 35
      jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/annualCompPoint/controller/AnnualCompPointController.java
  2. 1
      jeecg-boot-master/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/awardpersion/controller/AwardPersionController.java
  3. 496
      jeecgboot-vue3-master/src/views/depart/workbench/components/chDepartment/index.vue
  4. 230
      jeecgboot-vue3-master/src/views/depart/workbench/components/chDepartment/options.js
  5. 296
      jeecgboot-vue3-master/src/views/depart/workbench/components/chExpert/index.vue
  6. 455
      jeecgboot-vue3-master/src/views/depart/workbench/components/chSchool/index.vue
  7. 4
      jeecgboot-vue3-master/src/views/depart/workbench/components/index.ts
  8. 4
      jeecgboot-vue3-master/src/views/depart/workbench/index.vue
  9. 11
      jeecgboot-vue3-master/src/views/scorepersion/ScorePersion.api.ts
  10. 12
      jeecgboot-vue3-master/src/views/scorepersion/ScorePersionList.vue
  11. 172
      jeecgboot-vue3-master/src/views/scorepersion/components/ScorePersionForm2.vue
  12. 2
      jeecgboot-vue3-master/src/views/scorepersion/components/ScorePersionModal1.vue
  13. 75
      jeecgboot-vue3-master/src/views/scorepersion/components/ScorePersionModal2.vue

@ -444,6 +444,41 @@ public class AnnualCompPointController extends JeecgController<AnnualCompPoint,
return Result.OK("成功!");
}
/**
* 同分复评
*
* @param
* @return
*/
@AutoLog(value = "同分复评")
@ApiOperation(value="同分复评", notes="同分复评")
@PostMapping(value = "/tffp")
public Result<String> tffp(@RequestBody ScorePersion scorePersiontem,HttpServletRequest req) {
ScorePersion scorePersionsc = new ScorePersion();
QueryWrapper<ScorePersion> queryWrappersc = QueryGenerator.initQueryWrapper(scorePersionsc, req.getParameterMap());
queryWrappersc.eq("annualid",scorePersiontem.getAnnualid());
queryWrappersc.eq("annual_compid",scorePersiontem.getAnnualCompid());
queryWrappersc.eq("annual_comp_p",scorePersiontem.getAnnualCompP());
queryWrappersc.inSql("score","SELECT score FROM score_persion GROUP BY score HAVING COUNT( score ) > 1");
List<ScorePersion> listsc = scorePersionService.list(queryWrappersc);
if(listsc.size()>0){
for (int i = 0 ; i < listsc.size(); i++){
ExpScore expScore = new ExpScore();
QueryWrapper<ExpScore> queryWrapper = QueryGenerator.initQueryWrapper(expScore, req.getParameterMap());
queryWrapper.eq("annid",listsc.get(i).getAnnualid());
queryWrapper.eq("annal_comp",listsc.get(i).getAnnualCompid());
queryWrapper.eq("ann_com_p",listsc.get(i).getAnnualCompP());
queryWrapper.eq("bmcode",listsc.get(i).getEnrollCode());
List<ExpScore> list = expScoreService.list(queryWrapper);
ExpScore expScore1 = list.get(0);
expScore1.setIspf("0");
}
}
return Result.OK("成功!");
}
/**
* 评奖数据生成
*

@ -105,6 +105,7 @@ public class AwardPersionController extends JeecgController<AwardPersion, IAward
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
//逻辑变动:奖项管理针对学生(上传证书和查询),组委会(全部都可以),学院(上传和查询),学校(教务处)(全部都可以),做一下数据筛选以及操作列权限
LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
Comp comp = new Comp();
QueryWrapper<Comp> queryWrappercomp = QueryGenerator.initQueryWrapper(comp, req.getParameterMap());

@ -1,108 +1,185 @@
<template>
<div class="department">
<div class="header">
<div class="card">
<div class="top">
<div class="text">
本年度已开展比赛数
<a-row :gutter="[16, 16]" type="flex" justify="space-between" style="width: 100%;">
<a-col :xs="12" :xl="6">
<div class="card">
<div class="top">
<div class="text">
本年度已开展比赛数
</div>
<Icon icon="mainHome-time|svg" :size="20" />
</div>
<div class="center">
<div class="text">
67
</div>
</div>
<div class="bottom">
<div class="bot_card">国赛12</div>
<div class="bot_card">省赛12</div>
<div class="bot_card">校赛24</div>
</div>
</div>
<Icon icon="mainHome-time|svg" :size="20" />
</div>
<div class="center">
<div class="text">
67
</a-col>
<a-col :xs="12" :xl="6">
<div class="card">
<div class="top">
<div class="text">
本年度参加比赛队伍数
</div>
<Icon icon="mainHome-mp|svg" :size="20" />
</div>
<div class="center">
<div class="text">
1262
</div>
</div>
<div class="bottom">
<div class="bot_card">国赛120</div>
<div class="bot_card">省赛1230</div>
<div class="bot_card">校赛24</div>
</div>
</div>
</div>
<div class="bottom">
<div class="bot_card">国赛12</div>
<div class="bot_card">省赛12</div>
<div class="bot_card">校赛24</div>
</div>
</div>
<div class="card">
<div class="top">
<div class="text">
本年度参加比赛队伍数
</a-col>
<a-col :xs="12" :xl="6">
<div class="card">
<div class="top">
<div class="text">
正在进行的比赛数
</div>
<Icon icon="mainHome-down|svg" :size="20" />
</div>
<div class="center">
<div class="text" style="color: #74D472;">
45
</div>
</div>
<div class="bottom">
<div class="bot_card">国赛9</div>
<div class="bot_card">省赛13</div>
<div class="bot_card">校赛26</div>
</div>
</div>
<Icon icon="mainHome-mp|svg" :size="20" />
</div>
<div class="center">
<div class="text">
1262
</a-col>
<a-col :xs="12" :xl="6">
<div class="card2">
<div class="top">
<div class="text">
已经完成的比赛
</div>
<Icon icon="mainHome-time|svg" :size="20" />
</div>
<div class="center">
<div class="percent">
78%
</div>
<div>
<a-progress stroke-linecap="square" :percent="78" :show-info="false" />
</div>
</div>
<div class="bottom">
<div class="text">
已完成的比赛11
</div>
<div class="text">
未完成的比赛11
</div>
</div>
</div>
</div>
<div class="bottom">
<div class="bot_card">国赛120</div>
<div class="bot_card">省赛1230</div>
<div class="bot_card">校赛24</div>
</div>
</div>
<div class="card">
<div class="top">
<div class="text">
正在进行的比赛数
</div>
<Icon icon="mainHome-down|svg" :size="20" />
</div>
<div class="center">
<div class="text" style="color: #74D472;">
45
</div>
</div>
<div class="bottom">
<div class="bot_card">国赛9</div>
<div class="bot_card">省赛13</div>
<div class="bot_card">校赛26</div>
</div>
</div>
<div class="card2">
<div class="top">
<div class="text">
已经完成的比赛
</div>
<Icon icon="mainHome-time|svg" :size="20" />
</div>
<div class="center">
<div class="percent">
78%
</div>
<div>
<a-progress stroke-linecap="square" :percent="78" :show-info="false" />
</div>
</div>
<div class="bottom">
<div class="text">
已完成的比赛11
</div>
<div class="text">
未完成的比赛11
</div>
</div>
</div>
</a-col>
</a-row>
</div>
<div class="content">
<div class="con_left">
<div class="title-box">
<div class="title">部门比赛情况分布</div>
</div>
<div class="ec-box">
<div id="ec" ref="ec"></div>
</div>
</div>
<div class="con_right">
<div class="title-box">
<div class="tit">部门近两年维度积分</div>
<div class="bas"></div>
</div>
</div>
<a-row :gutter="[17, 16]" type="flex" justify="space-between" style="width: 100%;">
<a-col :xs="24" :xl="7">
<div class="con_left">
<div class="title-box">
<div class="title">部门比赛情况分布</div>
</div>
<div class="ec-box">
<div id="ec" ref="ec"></div>
</div>
</div>
</a-col>
<a-col :xs="24" :xl="17">
<div class="con_right">
<div class="title-box">
<div class="tit">部门近两年维度积分</div>
<div class="bas"></div>
</div>
<div class="ec-box">
<!-- 柱状图 -->
<div id="ec_bar" ref="ec_bar"></div>
<div class="infor">
<ul class="card-box">
<li v-for="i in 12" :key="i">
<div class="ol">{{ i }}</div>
<div class="text">奠定基础</div>
</li>
</ul>
</div>
</div>
</div>
</a-col>
</a-row>
</div>
<div class="footer">
<div class="foo_card"></div>
<div class="foo_card"></div>
<a-row :gutter="[25, 16]" type="flex" justify="space-between" style="width: 100%;">
<a-col :xs="24" :xl="12">
<div class="foo_card">
<div class="title">
部门比赛积分排名
</div>
<div class="table">
<div class="t_item t_head">
<div class="ranking">排名</div>
<div class="name">比赛名称</div>
<div class="total">比赛积分</div>
<div class="operate">操作</div>
</div>
<div class="t_item t_con" v-for="i in 6" :key="i">
<div class="ranking">
<div class="ol" :class="{ ac: i <= 3 }">{{ i }}</div>
</div>
<div class="name">国家电网竞赛</div>
<div class="total">7059</div>
<div class="operate">详情</div>
</div>
</div>
</div>
</a-col>
<a-col :xs="24" :xl="12">
<div class="foo_card">
<div class="title">
部门学生积分排名
</div>
<div class="table">
<div class="t_item t_head">
<div class="ranking">排名</div>
<div class="name">参赛选手名</div>
<div class="total">比赛积分</div>
<div class="operate">操作</div>
</div>
<div class="t_item t_con" v-for="i in 6" :key="i">
<div class="ranking">
<div class="ol" :class="{ ac: i <= 3 }">{{ i }}</div>
</div>
<div class="name">王晨</div>
<div class="total">4221</div>
<div class="operate">详情</div>
</div>
</div>
</div>
</a-col>
</a-row>
</div>
</div>
</template>
@ -110,17 +187,72 @@
import { Progress as AProgress } from 'ant-design-vue';
import { onMounted, ref } from 'vue';
import * as echarts from 'echarts';
import { optionRing } from './options'
import { optionRing, optionBar } from './options'
const ec = ref()
const ec_bar = ref()
onMounted(() => {
const myChart = echarts.init(ec.value);
myChart.setOption(optionRing);
const bar = echarts.init(ec_bar.value);
bar.setOption(optionBar);
window.addEventListener('resize', function () {
myChart.resize()
bar.resize()
})
})
</script>
<style lang="less" scoped>
::v-deep #ec_bar .bar_card {
width: 120px;
height: 116px;
background: #FFFFFF;
box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.08), 0px 16px 24px 2px rgba(0, 0, 0, 0.04), 0px 6px 30px 5px rgba(0, 0, 0, 0.05);
border-radius: 3px 3px 3px 3px;
border: 1px solid #DCDCDC;
opacity: 0.98;
padding-top: 16px;
padding-left: 16px;
.title {
height: 20px;
font-size: 12px;
color: rgba(0, 0, 0, 0.4);
line-height: 20px;
margin-bottom: 16px;
}
.item {
padding-left: 24px;
position: relative;
height: 20px;
font-size: 12px;
color: rgba(0, 0, 0, 0.9);
line-height: 20px;
&::after {
content: '';
display: block;
position: absolute;
top: 50%;
left: 4px;
transform: translateY(-50%);
width: 8px;
height: 8px;
background: #0052D9;
border-radius: 50%;
}
}
}
::v-deep #ec_bar>div[style*="z-index: 9999999;"] {
padding: 0 !important;
border: none !important;
box-shadow: none !important;
}
.department {
padding: 16px 16px 0;
@ -134,6 +266,8 @@ onMounted(() => {
.card,
.card2 {
width: 405px;
// width: 24.251%;
width: 100%;
height: 182px;
background: #FFFFFF;
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.02), 0px 1px 6px -1px rgba(0, 0, 0, 0.02), 0px 1px 2px 0px rgba(0, 0, 0, 0.03);
@ -244,7 +378,8 @@ onMounted(() => {
margin-top: 16px;
.con_left {
width: 489px;
// width: 489px;
width: 100%;
height: 459px;
background: #FFFFFF;
border-radius: 2px 2px 2px 2px;
@ -281,18 +416,22 @@ onMounted(() => {
}
.con_right {
width: 1160px;
// width: 1160px;
width: 100%;
height: 458px;
background: #FFFFFF;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 4px 4px 4px 4px;
padding-left: 16px;
// padding-left: 16px;
display: flex;
flex-direction: column;
.title-box {
height: 57px;
display: flex;
align-items: center;
position: relative;
padding-left: 16px;
.tit {
height: 26px;
@ -304,7 +443,7 @@ onMounted(() => {
.bas {
position: absolute;
bottom: 0;
left: 0;
left: 16px;
width: 100%;
height: 1px;
border: 1px solid rgba(5, 5, 5, 0.06);
@ -321,6 +460,71 @@ onMounted(() => {
}
}
}
.ec-box {
display: flex;
justify-content: space-between;
flex-grow: 1;
column-gap: 22px;
padding-left: 39px;
#ec_bar {
flex-grow: 1;
}
.infor {
width: 241px;
display: flex;
.card-box {
margin: auto;
width: 100%;
height: 177px;
display: flex;
flex-wrap: wrap;
flex-direction: column;
row-gap: 9px;
li {
width: 110px;
height: 22px;
font-size: 14px;
color: rgba(51, 51, 51, 0.88);
line-height: 22px;
display: flex;
justify-content: space-between;
align-items: center;
&:nth-child(1)>.ol,
&:nth-child(2)>.ol,
&:nth-child(3)>.ol {
background-color: #314659;
color: #fff;
}
.ol {
width: 20px;
height: 20px;
border-radius: 50%;
line-height: 20px;
text-align: center;
background: #F5F5F5;
color: #000000;
font-size: 12px;
}
.text {
width: 67px;
font-size: 14px;
color: rgba(51, 51, 51, 0.88);
}
}
}
}
}
}
}
@ -328,11 +532,107 @@ onMounted(() => {
margin-top: 21px;
.foo_card {
width: 820px;
// width: 820px;
width: 100%;
height: 502px;
background: #FFFFFF;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 6px 6px 6px 6px;
padding: 0 32px;
.title {
padding-left: 23px;
height: 57px;
line-height: 57px;
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
position: relative;
&::before {
content: '';
display: block;
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 1px;
background-color: rgba(5, 5, 5, 0.06);
}
}
.table {
width: 100%;
padding-left: 32px;
.t_item {
width: 100%;
height: 54px;
border-bottom: 1px solid #E7E7E7;
display: flex;
align-items: center;
.ranking {
// width: 80px;
width: calc((80 / 756) * 100%);
}
.name {
// width: 542px;
width: calc((542 / 756) * 100%);
}
.total {
// width: 74px;
width: calc((74 / 756) * 100%);
}
.operate {
// width: 60px;
width: calc((60 / 756) * 100%);
}
}
.t_head {
font-size: 14px;
color: rgba(0, 0, 0, 0.4);
}
.t_con {
.ranking {
.ol {
width: 24px;
height: 24px;
background: #E7E7E7;
color: rgba(0, 0, 0, 0.9);
font-size: 14px;
line-height: 24px;
text-align: center;
border-radius: 50%;
&.ac {
background: #0052D9;
color: rgba(255, 255, 255, 0.9);
}
}
}
.name {
font-size: 14px;
color: rgba(0, 0, 0, 0.9);
}
.total {
font-size: 14px;
color: rgba(0, 0, 0, 0.9);
}
.operate {
font-size: 14px;
color: #0052D9;
cursor: pointer;
}
}
}
}
}

@ -1,10 +1,10 @@
// 部门比赛情况分布 圆环
export const optionRing = {
color: [
'#0052D9',
'#699EF5',
'#B5C7FF',
],
color: [
'#0052D9',
'#699EF5',
'#B5C7FF',
],
legend: {
x: 'center',
orient: 'horizontal',
@ -14,7 +14,7 @@ export const optionRing = {
series: [
{
type: 'pie',
center:['50%', '41%'],
center: ['50%', '41%'],
radius: ['35%', '45%'],
avoidLabelOverlap: false,
label: {
@ -38,4 +38,222 @@ export const optionRing = {
]
}
]
};
export const optionBar = {
tooltip: {
trigger: 'axis', // 触发类型为坐标轴触发
axisPointer: {
type: 'line',
label: {
backgroundColor: '#6a7985' // 自定义交叉线标签的背景色
}
},
formatter: function (params) {
let result = '<div class="bar_card">';
result += `<div class="title">维度名称</div>`
params.forEach(param => {
result += `<div class="item" style="color: ${param.color};">
${param.seriesName} ${param.value}
</div>`;
});
result += '</div>';
return result;
}
},
grid: {
left: '0%',
right: '0%',
top: '5%',
bottom: '86px',
// 如果需要,还可以设置containLabel来控制坐标轴标签是否完全包含在grid区域内
containLabel: true
},
legend: {
data: ['2023', '2024'],
bottom: '39px',
},
xAxis: {
data: ['维度一', '维度一', '维度一', '维度一', '维度一', '维度一', '维度一']
},
yAxis: {
type: 'value',
min: 0,
max: 100,
},
series: [
{
name: '2023',
type: 'bar',
data: [33, 44, 58, 85, 47, 38, 45],
barWidth: '20px',
itemStyle: {
color: '#0052D9',
}
},
{
name: '2024',
type: 'bar',
data: [36, 34, 48, 62, 43, 30, 37],
barWidth: '20px',
itemStyle: {
color: '#699EF5',
}
},
]
};
var colorArr = ['#fff', '#fff']; //颜色
var dataArr = [
{
value: [4000, 700, 3600, 3900, 1800, 4200, 700, 3600, 4200, 700, 3600, 4200, 700, 3600],
name: '1',
itemStyle: {
normal: {
lineStyle: {
color: '#55d7f2',
},
shadowColor: '#4A99FF',
shadowBlur: 10,
},
},
areaStyle: {
normal: {
// 单项区域填充样式
color: {
type: 'linear',
x: 1, //右
y: 0, //下
x2: 1, //左
y2: 1, //上
colorStops: [
{
offset: 0,
color: '#f0a223',
},
{
offset: 1,
color: '#093138',
},
],
globalCoord: false,
},
opacity: 1, // 区域透明度
},
},
},
];
var indicator = [
{
text: '前言探索',
max: 6000,
},
{
text: '奠定基础',
max: 5000,
},
{
text: '知识分析',
max: 5000,
},
{
text: '社会责任',
max: 5000,
},
{
text: '独立思考',
max: 5500,
},
{
text: '拓宽视野',
max: 5000,
},
{
text: '激发兴趣',
max: 5000,
},
{
text: '沟通协调',
max: 5000,
},
{
text: '设计开发',
max: 5000,
},
{
text: '研判分析',
max: 5000,
},
{
text: '创新能力',
max: 5000,
},
{
text: '团队协作',
max: 5000,
},
];
export const optionRadar = {
backgroundColor: "transparent",
color: colorArr,
// legend: {
// orient: "vertical",
// // icon: 'circle', //图例形状
// // data: legendData,
// top: 0,
// left: 20,
// itemWidth: 8, // 图例标记的图形宽度。[ default: 25 ]
// itemHeight: 8, // 图例标记的图形高度。[ default: 14 ]
// itemGap: 22, // 图例每项之间的间隔。[ default: 10 ]横向布局时为水平间隔,纵向布局时为纵向间隔。
// textStyle: {
// fontSize: 12,
// fontWeight: "bold",
// color: "#00E4FF",
// },
// },
tooltip: {
trigger: 'item'
},
radar: {
// shape: 'circle',
name: {
textStyle: {
color: "#9ca4a6",
fontSize: 12,
},
},
indicator: indicator,
splitArea: {
// 坐标轴在 grid 区域中的分隔区域,默认不显示。
show: true,
areaStyle: {
// 分隔区域的样式设置。
color: ["rgba(255,255,255,0)", "rgba(255,255,255,0)"], // 分隔区域颜色。分隔区域会按数组中颜色的顺序依次循环设置颜色。默认是一个深浅的间隔色。
},
},
axisLine: {
//指向外圈文本的分隔线样式
lineStyle: {
color: "#2a5f61",
},
},
splitLine: {
lineStyle: {
color: "#2a5f61", // 分隔线颜色
width: 1, // 分隔线线宽
},
},
},
series: [
{
type: "radar",
symbolSize: 6,
symbol: "circle",
data: dataArr,
},
],
};

@ -0,0 +1,296 @@
<template>
<div class="expert">
<a-row :gutter="[16, 16]" type="flex" justify="space-between">
<a-col :md="24" :xl="12">
<a-row :gutter="[16, 16]" type="flex" justify="space-between">
<a-col :span="12">
<div class="card">
<div class="top">
<div class="text">
本年度已开展比赛数
</div>
<Icon icon="mainHome-time|svg" :size="20" />
</div>
<div class="center">
<div class="text">
67
</div>
</div>
<div class="bottom">
<div class="bot_card">国赛12</div>
<div class="bot_card">省赛12</div>
<div class="bot_card">校赛24</div>
</div>
</div>
</a-col>
<a-col :span="12">
<div class="card">
<div class="top">
<div class="text">
本年度已开展比赛数
</div>
<Icon icon="mainHome-time|svg" :size="20" />
</div>
<div class="center">
<div class="text">
67
</div>
</div>
<div class="bottom">
<div class="bot_card">国赛12</div>
<div class="bot_card">省赛12</div>
<div class="bot_card">校赛24</div>
</div>
</div>
</a-col>
<a-row style="margin-top: 8px;width: 100%;">
<a-col :span="24">
<div class="foo_card">
<div class="title">
参与评分的比赛
</div>
<div class="table">
<div class="t_item t_head">
<div class="ranking">排名</div>
<div class="name">比赛名称</div>
<div class="total">比赛状态</div>
<div class="operate">操作</div>
</div>
<div class="t_item t_con" v-for="i in 6" :key="i">
<div class="ranking">
<div class="ol" :class="{ ac: i <= 3 }">{{ i }}</div>
</div>
<div class="name">国家电网竞赛</div>
<div class="total">已完赛</div>
<div class="operate">详情</div>
</div>
</div>
</div>
</a-col>
</a-row>
</a-row>
</a-col>
<a-col :md="24" :xl="12">
<!-- 带评分 -->
<div class="tape-score foo_card">
<div class="title">
参与评分的比赛
</div>
<div class="table">
<div class="t_item t_con" v-for="i in 6" :key="i">
<div class="name">金话筒主持人大赛</div>
<div class="total">已完赛</div>
<div class="operate">详情</div>
</div>
</div>
</div>
</a-col>
</a-row>
</div>
</template>
<script setup lang="ts">
</script>
<style lang="less" scoped>
.expert {
padding-top: 16px;
padding-left: 16px;
.card {
width: 100%;
width: 100%;
height: 182px;
background: #FFFFFF;
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.02), 0px 1px 6px -1px rgba(0, 0, 0, 0.02), 0px 1px 2px 0px rgba(0, 0, 0, 0.03);
border-radius: 4px 4px 4px 4px;
padding: 20px 24px 0;
.top {
display: flex;
justify-content: space-between;
.text {
height: 22px;
font-family: Inter, Inter;
font-weight: 400;
font-size: 14px;
color: rgba(0, 0, 0, 0.45);
line-height: 22px;
text-align: left;
font-style: normal;
text-transform: none;
}
}
.center {
margin-top: 4px;
width: 357px;
height: 78px;
border-radius: 0px 0px 0px 0px;
display: flex;
align-items: center;
.text {
height: 38px;
font-family: Inter, Inter;
font-weight: 400;
font-size: 48px;
color: rgba(51, 51, 51, 0.88);
line-height: 38px;
text-align: left;
font-style: normal;
text-transform: none;
}
}
.bottom {
margin-top: 18px;
display: flex;
justify-content: space-between;
.bot_card {
width: 91px;
height: 22px;
font-family: Inter, Inter;
font-weight: 400;
font-size: 14px;
color: rgba(51, 51, 51, 0.88);
line-height: 22px;
text-align: left;
font-style: normal;
text-transform: none;
}
}
}
.foo_card {
width: 100%;
height: 502px;
background: #FFFFFF;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 6px 6px 6px 6px;
.title {
padding-left: 23px;
height: 57px;
line-height: 57px;
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
position: relative;
&::before {
content: '';
display: block;
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 1px;
background-color: rgba(5, 5, 5, 0.06);
}
}
.table {
width: 100%;
padding-left: 32px;
.t_item {
width: 100%;
height: 54px;
border-bottom: 1px solid #E7E7E7;
display: flex;
align-items: center;
.ranking {
width: calc((80 / 756) * 100%);
}
.name {
width: calc((542 / 756) * 100%);
}
.total {
width: calc((74 / 756) * 100%);
}
.operate {
width: calc((60 / 756) * 100%);
}
}
.t_head {
font-size: 14px;
color: rgba(0, 0, 0, 0.4);
}
.t_con {
.ranking {
.ol {
width: 24px;
height: 24px;
background: #E7E7E7;
color: rgba(0, 0, 0, 0.9);
font-size: 14px;
line-height: 24px;
text-align: center;
border-radius: 50%;
&.ac {
background: #0052D9;
color: rgba(255, 255, 255, 0.9);
}
}
}
.name {
font-size: 14px;
color: rgba(0, 0, 0, 0.9);
}
.total {
font-size: 14px;
color: rgba(0, 0, 0, 0.9);
}
.operate {
font-size: 14px;
color: #0052D9;
cursor: pointer;
}
}
}
}
.tape-score {
height: 708px;
.table {
.t_item {
width: 100%;
height: 54px;
border-bottom: 1px solid #E7E7E7;
display: flex;
align-items: center;
.name {
width: calc((542 / 676) * 100%);
}
.total {
width: calc((74 / 676) * 100%);
}
.operate {
width: calc((60 / 676) * 100%);
}
}
}
}
}
</style>

@ -0,0 +1,455 @@
<template>
<div class="school">
<a-row :gutter="[16, 16]" type="flex" justify="space-between">
<a-col :lg="12" :xl="6" v-for="i in 4" :key="i">
<div class="card">
<div class="top">
<div class="text">
本年度已开展比赛数
</div>
<Icon icon="mainHome-time|svg" :size="20" />
</div>
<div class="center">
<div class="text">
67
</div>
</div>
<div class="bottom">
<div class="bot_card">国赛12</div>
<div class="bot_card">省赛12</div>
<div class="bot_card">校赛24</div>
</div>
</div>
</a-col>
</a-row>
<a-row :gutter="[16, 16]" type="flex" justify="space-between">
<a-col :xs="24" :xl="8">
<div class="ec_radar-box">
<div class="title-box">
<div class="tit">年度维度分析</div>
<div class="p">前沿探索</div>
<div class="p">奠定基础</div>
</div>
<div class="ec_radar" ref="ec_radar"></div>
</div>
</a-col>
<a-col :xs="24" :xl="16">
<div class="con_right">
<div class="title-box">
<div class="tit">部门近两年维度积分</div>
<div class="bas"></div>
</div>
<div class="ec-box">
<!-- 柱状图 -->
<div id="ec_bar" ref="ec_bar"></div>
<div class="infor">
<ul class="card-box">
<li v-for="i in 12" :key="i">
<div class="ol">{{ i }}</div>
<div class="text">奠定基础</div>
</li>
</ul>
</div>
</div>
</div>
</a-col>
</a-row>
<a-row :gutter="[16, 16]" type="flex">
<a-col :xs="24" :xl="12">
<div class="foo_card">
<div class="title">
部门比赛积分排名
</div>
<div class="table">
<div class="t_item t_head">
<div class="ranking">排名</div>
<div class="name">比赛名称</div>
<div class="total">比赛积分</div>
<div class="operate">操作</div>
</div>
<div class="t_item t_con" v-for="i in 6" :key="i">
<div class="ranking">
<div class="ol" :class="{ ac: i <= 3 }">{{ i }}</div>
</div>
<div class="name">国家电网竞赛</div>
<div class="total">7059</div>
<div class="operate">详情</div>
</div>
</div>
</div>
</a-col>
<a-col :xs="24" :xl="12">
<div class="foo_card">
<div class="title">
部门学生积分排名
</div>
<div class="table">
<div class="t_item t_head">
<div class="ranking">排名</div>
<div class="name">参赛选手名</div>
<div class="total">比赛积分</div>
<div class="operate">操作</div>
</div>
<div class="t_item t_con" v-for="i in 6" :key="i">
<div class="ranking">
<div class="ol" :class="{ ac: i <= 3 }">{{ i }}</div>
</div>
<div class="name">王晨</div>
<div class="total">4221</div>
<div class="operate">详情</div>
</div>
</div>
</div>
</a-col>
</a-row>
</div>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import * as echarts from 'echarts';
import { optionRadar, optionBar } from '../chDepartment/options'
const ec_radar = ref()
const ec_bar = ref()
onMounted(() => {
const myChart = echarts.init(ec_radar.value);
myChart.setOption(optionRadar);
const bar = echarts.init(ec_bar.value);
bar.setOption(optionBar);
window.addEventListener('resize', function () {
myChart.resize()
bar.resize()
})
})
</script>
<style lang="less" scoped>
.school {
padding: 16px 16px 0;
.card {
width: 100%;
width: 100%;
height: 182px;
background: #FFFFFF;
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.02), 0px 1px 6px -1px rgba(0, 0, 0, 0.02), 0px 1px 2px 0px rgba(0, 0, 0, 0.03);
border-radius: 4px 4px 4px 4px;
padding: 20px 24px 0;
.top {
display: flex;
justify-content: space-between;
.text {
height: 22px;
font-family: Inter, Inter;
font-weight: 400;
font-size: 14px;
color: rgba(0, 0, 0, 0.45);
line-height: 22px;
text-align: left;
font-style: normal;
text-transform: none;
}
}
.center {
margin-top: 4px;
width: 357px;
height: 78px;
border-radius: 0px 0px 0px 0px;
display: flex;
align-items: center;
.text {
height: 38px;
font-family: Inter, Inter;
font-weight: 400;
font-size: 48px;
color: rgba(51, 51, 51, 0.88);
line-height: 38px;
text-align: left;
font-style: normal;
text-transform: none;
}
}
.bottom {
margin-top: 18px;
display: flex;
justify-content: space-between;
.bot_card {
width: 91px;
height: 22px;
font-family: Inter, Inter;
font-weight: 400;
font-size: 14px;
color: rgba(51, 51, 51, 0.88);
line-height: 22px;
text-align: left;
font-style: normal;
text-transform: none;
}
}
}
.ec_radar-box {
margin-top: 17px;
width: 100%;
height: 459px;
background: #FFFFFF;
border-radius: 2px 2px 2px 2px;
display: flex;
flex-direction: column;
.title-box {
height: 58px;
border-radius: 2px 2px 0px 0px;
border-bottom: 1px solid #F0F0F0;
display: flex;
.tit {
margin-left: 4%;
height: 58px;
line-height: 58px;
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
}
.p {
margin-left: 7%;
font-size: 12px;
color: #333333;
height: 27px;
align-self: flex-end;
}
}
.ec_radar {
width: 100%;
flex-grow: 1;
}
}
.con_right {
margin-top: 17px;
// width: 1160px;
width: 100%;
height: 458px;
background: #FFFFFF;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 4px 4px 4px 4px;
// padding-left: 16px;
display: flex;
flex-direction: column;
.title-box {
height: 57px;
display: flex;
align-items: center;
position: relative;
padding-left: 16px;
.tit {
height: 26px;
font-size: 16px;
color: #1890FF;
text-shadow: 0px 0px 0px #1890FF;
}
.bas {
position: absolute;
bottom: 0;
left: 16px;
width: 100%;
height: 1px;
border: 1px solid rgba(5, 5, 5, 0.06);
&::before {
content: '';
display: block;
position: absolute;
bottom: 0;
left: 0;
width: 48px;
height: 2px;
background: #1890FF;
}
}
}
.ec-box {
display: flex;
justify-content: space-between;
flex-grow: 1;
column-gap: 22px;
padding-left: 39px;
#ec_bar {
flex-grow: 1;
}
.infor {
width: 241px;
display: flex;
.card-box {
margin: auto;
width: 100%;
height: 177px;
display: flex;
flex-wrap: wrap;
flex-direction: column;
row-gap: 9px;
li {
width: 110px;
height: 22px;
font-size: 14px;
color: rgba(51, 51, 51, 0.88);
line-height: 22px;
display: flex;
justify-content: space-between;
align-items: center;
&:nth-child(1)>.ol,
&:nth-child(2)>.ol,
&:nth-child(3)>.ol {
background-color: #314659;
color: #fff;
}
.ol {
width: 20px;
height: 20px;
border-radius: 50%;
line-height: 20px;
text-align: center;
background: #F5F5F5;
color: #000000;
font-size: 12px;
}
.text {
width: 67px;
font-size: 14px;
color: rgba(51, 51, 51, 0.88);
}
}
}
}
}
}
.foo_card {
margin-top: 20px;
width: 100%;
height: 502px;
background: #FFFFFF;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 6px 6px 6px 6px;
.title {
padding-left: 23px;
height: 57px;
line-height: 57px;
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
position: relative;
&::before {
content: '';
display: block;
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 1px;
background-color: rgba(5, 5, 5, 0.06);
}
}
.table {
width: 100%;
padding-left: 32px;
.t_item {
width: 100%;
height: 54px;
border-bottom: 1px solid #E7E7E7;
display: flex;
align-items: center;
.ranking {
width: calc((80 / 756) * 100%);
}
.name {
width: calc((542 / 756) * 100%);
}
.total {
width: calc((74 / 756) * 100%);
}
.operate {
width: calc((60 / 756) * 100%);
}
}
.t_head {
font-size: 14px;
color: rgba(0, 0, 0, 0.4);
}
.t_con {
.ranking {
.ol {
width: 24px;
height: 24px;
background: #E7E7E7;
color: rgba(0, 0, 0, 0.9);
font-size: 14px;
line-height: 24px;
text-align: center;
border-radius: 50%;
&.ac {
background: #0052D9;
color: rgba(255, 255, 255, 0.9);
}
}
}
.name {
font-size: 14px;
color: rgba(0, 0, 0, 0.9);
}
.total {
font-size: 14px;
color: rgba(0, 0, 0, 0.9);
}
.operate {
font-size: 14px;
color: #0052D9;
cursor: pointer;
}
}
}
}
}
</style>

@ -1 +1,3 @@
export {default as ChDepartment } from './chDepartment/index.vue'
export {default as ChDepartment } from './chDepartment/index.vue'
export {default as ChExpert } from './chExpert/index.vue'
export {default as ChSchool } from './chSchool/index.vue'

@ -4,9 +4,9 @@
</div>
</template>
<script lang="ts" setup>
import { ChDepartment } from './components/index'
import { ChSchool } from './components/index'
function com(){
return ChDepartment
return ChSchool
}
</script>

@ -14,6 +14,7 @@ enum Api {
exportXlsMb = '/scorepersion/scorePersion/exportXlsMb',
queryCompId = '/annualcompgroup/annualCompGroup/queryCompId',
save1='/AnnualCompPoint/annualCompPoint/cjcxhq',
save2='/AnnualCompPoint/annualCompPoint/tffp',
}
export const queryCompId = (params) => defHttp.get({ url: Api.queryCompId, params }, { successMessageMode: 'none' });
@ -56,6 +57,16 @@ export const saveOrUpdate1 = (params, isUpdate) => {
return defHttp.post({ url: url, params }, { isTransformResponse: false });
}
/**
*
* @param params
* @param isUpdate
*/
export const saveOrUpdate2 = (params, isUpdate) => {
let url = isUpdate ? Api.edit : Api.save2;
return defHttp.post({ url: url, params }, { isTransformResponse: false });
}
/**
*
* @param params

@ -35,6 +35,7 @@
<template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" @click="cxhq" preIcon="ant-design:sync-outlined"> 重新获取</a-button>
<a-button type="primary" @click="tpfp" preIcon="ant-design:sync-outlined"> 同分复评</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXlsMb"> 导出模板</a-button>
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
@ -72,6 +73,7 @@
<!-- 表单区域 -->
<ScorePersionModal ref="registerModal" @success="handleSuccess"></ScorePersionModal>
<ScorePersionModal1 ref="registerModal1" @success="handleSuccess"></ScorePersionModal1>
<ScorePersionModal2 ref="registerModal2" @success="handleSuccess"></ScorePersionModal2>
</div>
</template>
@ -84,6 +86,7 @@
import { downloadFile } from '/@/utils/common/renderUtils';
import ScorePersionModal from './components/ScorePersionModal.vue'
import ScorePersionModal1 from './components/ScorePersionModal1.vue'
import ScorePersionModal2 from './components/ScorePersionModal2.vue'
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import JSearchSelect from '/@/components/Form/src/jeecg/components/JSearchSelect.vue';
@ -92,6 +95,7 @@
const toggleSearchStatus = ref<boolean>(false);
const registerModal = ref();
const registerModal1 = ref();
const registerModal2 = ref();
//table
const { prefixCls, tableContext, onExportXls, onImportXls,onExportXlsMb } = useListPage({
tableProps: {
@ -148,6 +152,14 @@
registerModal1.value.add();
}
/**
* 同分复评
*/
function tpfp() {
registerModal2.value.disableSubmit = false;
registerModal2.value.add();
}
/**
* 编辑事件
*/

@ -0,0 +1,172 @@
<template>
<a-spin :spinning="confirmLoading">
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-row>
<a-col :span="24">
<a-form-item label="年度" v-bind="validateInfos.annualid">
<j-dict-select-tag v-model:value="formData.annualid" dictCode="annual,annual_name,id" placeholder="请选择年度" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="年度比赛" v-bind="validateInfos.annualCompid">
<j-search-select v-model:value="formData.annualCompid" :dict="strst" :disabled="disabled" />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="年度比赛项目" v-bind="validateInfos.annualCompP">
<j-search-select v-model:value="formData.annualCompP" :dict="ndbsxm" :disabled="disabled" />
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</template>
<script lang="ts" setup>
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted,watch } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { useMessage } from '/@/hooks/web/useMessage';
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import JSearchSelect from '/@/components/Form/src/jeecg/components/JSearchSelect.vue';
import { getValueType } from '/@/utils';
import { saveOrUpdate2,queryCompId } from '../ScorePersion.api';
import { Form } from 'ant-design-vue';
import { duplicateValidate } from '/@/utils/helper/validator'
let strst = ref();
let ndbsxm = ref();
const props = defineProps({
formDisabled: { type: Boolean, default: false },
formData: { type: Object, default: ()=>{} },
formBpm: { type: Boolean, default: true }
});
const formRef = ref();
const useForm = Form.useForm;
const emit = defineEmits(['register', 'ok']);
const formData = reactive<Record<string, any>>({
id: '',
annualid: '',
annualCompid: '',
annualCompP: '',
enrollCode: '',
score: '',
sort: undefined,
});
const { createMessage } = useMessage();
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
const confirmLoading = ref<boolean>(false);
//
const validatorRules = {
annualid: [{ required: true, message: '请输入年度!'},],
annualCompid: [{ required: true, message: '请输入年度比赛!'},],
annualCompP: [{ required: true, message: '请输入年度比赛项目!'},],
};
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: true });
//
const disabled = computed(()=>{
if(props.formBpm === true){
if(props.formData.disabled === false){
return false;
}else{
return true;
}
}
return props.formDisabled;
});
watch(formData, (newVal) => {
if(formData.annualid==null||formData.annualid==""){
}else{
queryCompId("").then((result)=>{
//console.log(result);
const str = result;
if (str!=null&&str!="") {
//const ndbs = "annual_comp,name,id,annualid='1691982939857920001' and (compid='1696134761153875969' or compid='1697137689830363138')";
var ndbsstr="annual_comp,name,id,annualid='"+formData.annualid+"' and "+"("+str+")";
strst.value=ndbsstr;
}
});
}
if(formData.annualCompid!=""){
ndbsxm.value = "annual_comp_point,obj_name,id,annual_comp_id='"+formData.annualCompid+"'";
}
});
/**
* 新增
*/
function add() {
edit({});
}
/**
* 编辑
*/
function edit(record) {
nextTick(() => {
resetFields();
//
Object.assign(formData, record);
});
}
/**
* 提交数据
*/
async function submitForm() {
//
await validate();
confirmLoading.value = true;
const isUpdate = ref<boolean>(false);
//
let model = formData;
if (model.id) {
isUpdate.value = true;
}
//
for (let data in model) {
//
if (model[data] instanceof Array) {
let valueType = getValueType(formRef.value.getProps, data);
//
if (valueType === 'string') {
model[data] = model[data].join(',');
}
}
}
await saveOrUpdate2(model, isUpdate.value)
.then((res) => {
if (res.success) {
createMessage.success(res.message);
emit('ok');
} else {
createMessage.warning(res.message);
}
})
.finally(() => {
confirmLoading.value = false;
});
}
async function enrollCodeDuplicatevalidate(_r, value) {
return duplicateValidate('score_persion', 'enroll_code', value, formData.id || '')
}
defineExpose({
add,
edit,
submitForm,
});
</script>
<style lang="less" scoped>
.antd-modal-form {
min-height: 500px !important;
overflow-y: auto;
padding: 24px 24px 24px 24px;
}
</style>

@ -19,7 +19,7 @@
* 新增
*/
function add() {
title.value = '新增';
title.value = '重新获取';
visible.value = true;
nextTick(() => {
registerForm.value.add();

@ -0,0 +1,75 @@
<template>
<a-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
<ScorePersionForm2 ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></ScorePersionForm2>
</a-modal>
</template>
<script lang="ts" setup>
import { ref, nextTick, defineExpose } from 'vue';
import ScorePersionForm2 from './ScorePersionForm2.vue'
const title = ref<string>('');
const width = ref<number>(800);
const visible = ref<boolean>(false);
const disableSubmit = ref<boolean>(false);
const registerForm = ref();
const emit = defineEmits(['register', 'success']);
/**
* 新增
*/
function add() {
title.value = '同分复评';
visible.value = true;
nextTick(() => {
registerForm.value.add();
});
}
/**
* 编辑
* @param record
*/
function edit(record) {
title.value = disableSubmit.value ? '详情' : '编辑';
visible.value = true;
nextTick(() => {
registerForm.value.edit(record);
});
}
/**
* 确定按钮点击事件
*/
function handleOk() {
registerForm.value.submitForm();
}
/**
* form保存回调事件
*/
function submitCallback() {
handleCancel();
emit('success');
}
/**
* 取消按钮回调事件
*/
function handleCancel() {
visible.value = false;
}
defineExpose({
add,
edit,
disableSubmit,
});
</script>
<style>
/**隐藏样式-modal确定按钮 */
.jee-hidden {
display: none !important;
}
</style>
Loading…
Cancel
Save