Merge remote-tracking branch 'origin/test'

This commit is contained in:
joylink_fanyuhong 2021-12-29 14:04:20 +08:00
commit 204995be22
16 changed files with 312 additions and 21 deletions

View File

@ -7,7 +7,7 @@ NODE_ENV = 'development'
# VUE_APP_BASE_API = 'http://192.168.3.4:9000'
VUE_APP_BASE_API = 'http://192.168.3.6:9000'
VUE_APP_VOICE_API = 'http://119.3.163.89/oss/joylink'
VUE_APP_UPLOAD_API = 'http://119.3.163.89/upload'
VUE_APP_UPLOAD_API = 'http://joylink.club/jlfile'
VUE_APP_BASE_SITE='https://test.joylink.club/cbtc'
# VUE_APP_VOICE_API = 'http://192.168.8.110:9008'

View File

@ -90,3 +90,25 @@ export function getExamListByMapIdAndPrdType(mapId, prdType) {
params: { prdType: prdType }
});
}
/** 更新试卷规则 */
export function updateExamRule(data) {
return request({
url: `/api/exam/update/rules`,
method: 'put',
data:data
});
}
/** 检查并更新【规则数据异常】状态 */
export function checkAndUpdateAbnormal(mapId) {
return request({
url: `/api/exam/checkAndUpdateAbnormal/${mapId}`,
method: 'put'
});
}
/** 重新生成考试规则 */
export function regenerateRule (mapId) {
return request({
url: `/api/exam/regenerateRules/${mapId}`,
method: 'put'
});
}

View File

@ -257,6 +257,29 @@ export function JobPaneData() {
},
],
},
{
name:"信号楼值班员",
value:"xhlzby",
text:"",
picurl:"",
controlList:[
//联控
{
name:"联控",
data:[],
},
//动作
{
name:"动作",
data:[],
},
//口呼
{
name:"口呼",
data:[],
},
],
},
{
name:"通号调度",
value:"scdd",

View File

@ -24,7 +24,7 @@
>确定</el-button>
</div>
<div style="width:100%; padding-top: 20px">
<span> 版权所有C2010-2011 北京玖琏科技有限公司</span>
<span v-if="!thirdLogin"> 版权所有C2010-2011 北京玖琏科技有限公司</span>
</div>
</div>
</div>
@ -40,7 +40,8 @@
<script>
import { OperationEvent } from '@/scripts/cmdPlugin/OperationHandler';
import { NoCopyrightList } from '@/scripts/ProjectConfig';
import { getSessionStorage } from '@/utils/auth';
export default {
name: 'ManageUser',
data() {
@ -71,6 +72,9 @@ export default {
},
title() {
return '关于ControlMonitor';
},
thirdLogin() {
return NoCopyrightList.includes(getSessionStorage('project'));
}
},
methods: {

View File

@ -41,6 +41,7 @@
<script>
import { OperationEvent } from '@/scripts/cmdPlugin/OperationHandler';
import { getSessionStorage } from '@/utils/auth';
import { NoCopyrightList } from '@/scripts/ProjectConfig';
export default {
name: 'ManageUser',
data() {
@ -73,7 +74,7 @@ export default {
return this.$t('menu.menuDialog.about');
},
thirdLogin() {
return getSessionStorage('project') == 'richor';
return NoCopyrightList.includes(getSessionStorage('project'));
}
},
methods: {

View File

@ -761,6 +761,10 @@ export const NoQrcodeList = ['heb', 'designheb', 'cgy', 'designcgy', 'ntyl', 'de
/** 综合演练 无二维码 */
export const NoSimulationQrCodeList = ['heb', 'bjd'];
export const RegisterCodeList = ['cgy', 'designcgy'];
/** 展示中航锐创联系我们 */
export const RichorContectUsList = ['richor', 'richorygy'];
/** 帮助中不展示版权(福州 佛山) */
export const NoCopyrightList = ['richor', 'richorygy'];
/** 导航栏快速切换平台 */
export const goOtherPlatformMenu = {
login: '/design/login',

View File

@ -3,14 +3,14 @@ export function getBaseUrl() {
if (process.env.NODE_ENV === 'development') {
// BASE_API = 'https://joylink.club/jlcloud';
// BASE_API = 'https://test.joylink.club/jlcloud';
BASE_API = 'http://114.116.51.125/jlcloud';
// BASE_API = 'http://114.116.51.125/jlcloud';
// BASE_API = 'http://192.168.8.152:9000'; // 袁琪
// BASE_API = 'http://192.168.8.172:9200'; // 旭强
// BASE_API = 'http://192.168.8.109:9000'; // 张赛
// BASE_API = 'http://192.168.8.140:9000'; // 杜康
// BASE_API = 'http://b29z135112.zicp.vip';
// BASE_API = 'http://2925963m2a.zicp.vip'; // 杜康
// BASE_API = 'http://2i38984j47.qicp.vip'; // 张赛
BASE_API = 'http://2i38984j47.qicp.vip'; // 张赛
} else {
BASE_API = process.env.VUE_APP_BASE_API;
}

View File

@ -35,6 +35,7 @@
<script>
import wchat from '@/assets/wchat.png';
import { getSessionStorage } from '@/utils/auth';
import { RichorContectUsList } from '@/scripts/ProjectConfig';
export default {
name:'',
data() {
@ -45,7 +46,7 @@ export default {
},
computed:{
thirdLogin() {
return getSessionStorage('project') == 'richor';
return RichorContectUsList.includes(getSessionStorage('project'));
}
},
methods:{

View File

@ -86,6 +86,16 @@ export default {
},
tagType: (row) => { return ''; }
},
{
title: '试卷规则状态',
prop: 'abnormal',
type: 'tag',
width: '80',
columnValue: (row) => {
return row.abnormal ? '异常' : '正常';
},
tagType: (row) => { return row.abnormal ? 'danger' : 'success'; }
},
{
title: '开始时间',
prop: 'startTime'

View File

@ -0,0 +1,109 @@
<template>
<el-dialog v-dialogDrag :title="title" :visible.sync="dialogShow" :before-close="handleCancel" :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="140px">
<el-form-item label="试卷地图" prop="trainingType">
<el-select v-model="form.mapId" placeholder="地图" style="width:240px;">
<el-option v-for="nor in mapIdList" :key="nor.id" :label="nor.name" :value="nor.id"/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="handleCancel">{{ $t('global.cancel') }}</el-button>
<el-button v-if="type === 'check'" type="primary" @click="handleCheck">校验</el-button>
<el-button v-if="type === 'regenerate'" type="primary" @click="handleRegenerate">重新生成</el-button>
</div>
</el-dialog>
</template>
<script>
import { checkAndUpdateAbnormal, regenerateRule } from '@/api/management/exam';
export default {
name: 'EditRule',
props: {
mapIdList: {
type: Array,
required:true
}
},
data() {
return {
title: '',
form: {
mapId: ''
},
dialogShow: false,
type: '',
rules: {
mapId: [
{ required: true, message: '请选择地图数据', trigger: 'change' }
]
},
typeList: [],
operationTypeList: []
};
},
mounted() {},
methods: {
doShow(type) {
this.type = type;
this.dialogShow = true;
this.$nextTick(() => {
this.$refs.form.resetFields();
if (type === 'check') {
this.title = '校验试卷规则';
} else if (type === 'regenerate') {
this.title = '重新生成试卷规则';
}
});
},
handleCancel() {
this.type = '';
this.title = '';
this.form.mapId = '';
this.dialogShow = false;
},
handleCheck() {
this.$refs['form'].validate((valid) => {
if (valid) {
checkAndUpdateAbnormal(this.form.mapId).then(resp => {
this.$message.success('校验试卷规则成功!');
this.$emit('reload');
this.handleCancel();
}).catch(e => {
this.$message.error('校验试卷规则失败!');
this.handleCancel();
});
}
});
},
handleRegenerate() {
this.$refs['form'].validate((valid) => {
if (valid) {
regenerateRule(this.form.mapId).then(resp => {
this.$message.success('重新生成试卷规则成功!');
this.handleCancel();
}).catch(e => {
this.$message.error('重新生成试卷规则失败!');
this.handleCancel();
});
}
});
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
/deep/ {
.el-dialog {
width: 600px;
}
.el-form-item__content {
width: calc(100% - 80px);
}
.el-cascader {
width: 100%;
}
}
</style>

View File

@ -2,12 +2,12 @@
<el-dialog v-dialogDrag :title="title" :visible.sync="dialogShow" :before-close="handleCancel" :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="140px">
<el-form-item :label="$t('publish.trainingType')" prop="trainingType">
<el-select v-model="form.trainingType" :placeholder="$t('publish.selectTypeScope')" :disabled="editOk" style="width:240px;" @change="changeCourse">
<el-select v-model="form.trainingType" :placeholder="$t('publish.selectTypeScope')" style="width:240px;" @change="changeCourse">
<el-option v-for="nor in trainingTypeList" :key="nor.value" :label="nor.label" :value="nor.value" :disabled="nor.disabled" />
</el-select>
</el-form-item>
<el-form-item :label="$t('publish.operationType')" prop="operateType">
<el-select v-model="form.operateType" clearable :placeholder="$t('publish.selectScope')" :disabled="editOk" @change="changeOperation">
<el-select v-model="form.operateType" clearable :placeholder="$t('publish.selectScope')" @change="changeOperation">
<el-option v-for="nor in operationTypeList" :key="nor.value" :label="nor.label" :value="nor.value" :disabled="nor.disabled" />
</el-select>
</el-form-item>
@ -146,6 +146,7 @@ export default {
changeCourse(val) {
this.operationTypeList = this.operationTypeMap[val];
this.topicNum = this.trainingTypeNums[val];
this.form.operateType = '';
},
changeOperation(val) {
if (val) {

View File

@ -62,13 +62,13 @@ export default {
return this.display == 2;
},
isNextStep() {
return this.display == 1 && this.$route.params.mode != 'edit';
return this.display == 1;
},
isUpdate() {
return this.display == 1 && this.$route.params.mode == 'edit';
return this.$route.params.mode == 'edit';
},
isCreate() {
return this.display == 2;
return this.display == 2 && this.$route.params.mode !== 'edit';
},
isFastCreate() {
return this.display == 1 && this.$route.params.mode != 'edit' && Number(this.$route.params.ruleId);
@ -149,7 +149,11 @@ export default {
this.$refs.exam.checkedForm('goNextStep');
},
update() {
this.$refs.exam.updateForm();
if(this.display === 1) {
this.$refs.exam.updateForm();
} else if (this.display === 2) {
this.$refs.rule.updateOk();
}
},
create() {
this.$refs.rule.creatOk();

View File

@ -8,13 +8,25 @@
<span>{{ getOperateName(scope.row) }}</span>
</template>
</el-table-column>
<el-table-column prop="num" :label="$t('publish.questionsNumber')" width="100" />
<el-table-column prop="num" :label="$t('publish.questionsNumber')" width="100">
<template slot-scope="scope">
<span>{{ scope.row.num }}</span>
<el-tooltip v-if="checkNum(scope.row)" effect="dark" content="题库数量不足" placement="top">
<i class="el-icon-warning-outline"></i>
</el-tooltip>
</template>
</el-table-column>
<el-table-column prop="point" :label="$t('publish.eachScore')" width="100" />
<el-table-column :label="$t('publish.totalScore')" width="100">
<template slot-scope="scope">
<span>{{ Number(scope.row.num) * Number(scope.row.point) }}</span>
</template>
</el-table-column>
<el-table-column label="题库题数">
<template slot-scope="scope">
<span>{{ getTopicNum(scope.row) }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('global.operate')" width="100">
<template slot-scope="scope">
<el-button type="text" size="small" @click="handleForm(scope)">{{ $t('global.edit') }}</el-button>
@ -38,7 +50,7 @@
</template>
<script>
import { createExam } from '@/api/management/exam';
import { createExam, updateExamRule } from '@/api/management/exam';
import { UrlConfig, getOperateTypeMap } from '@/scripts/ConstDic';
import editRule from './editRule';
import ConstConfig from '@/scripts/ConstConfig';
@ -135,6 +147,36 @@ export default {
this.$messageBox(this.$t('publish.addExamRules'));
}
},
async updateOk() {
if (this.ruleList.length) {
let flag = 0;
this.ruleList.forEach(rule => {
flag = flag + (Number(rule.num) * Number(rule.point));
});
if (flag == this.examData.fullMark) {
const result = {
id: this.$route.params.ruleId,
duration: Number(this.examData.duration) * 60, //
examDefinitionRulesVOList: this.ruleList, //
fullPoint: Number(this.examData.fullMark), //
mapId: this.examData.mapId,
prdType: this.examData.prdType,
name: this.examData.name, //
passingPoint: Number(this.examData.passMark), //
remarks: this.examData.desc, //
endTime: this.examData.endDate,
startTime: this.examData.startDate,
type: this.examData.type, //
trial: this.examData.trial == 2 //
};
await this.update(result);
} else {
this.$messageBox(this.$t('publish.addExamRluesError'));
}
} else {
this.$messageBox(this.$t('publish.addExamRules'));
}
},
async save(data) {
try {
const res = await createExam(data);
@ -150,6 +192,21 @@ export default {
this.$messageBox(`${this.$t('publish.saveRuleFailed')} ${error.message}`);
}
},
async update(data) {
try {
const res = await updateExamRule(data);
this.$message.success({ message: res.message });
this.$store.dispatch('exam/setRuleList', []); //
const path = `${this.$route.path.match(/(\/.*)\/examRule/)[1]}${UrlConfig.examRuleManage}`;
if (this.$route.query.source === 'org') {
this.$router.go(-1);
} else {
this.$router.replace({ path: `${path}`, query: { mapId: this.$route.query.mapId, noPreLogout: this.$route.query.noPreLogout} });
}
} catch (error) {
this.$messageBox(`${this.$t('publish.saveRuleFailed')} ${error.message}`);
}
},
addRuleList(data) {
const element = {
trainingType: data.trainingType,
@ -200,7 +257,24 @@ export default {
return trainingName;
}
},
getTopicNum(row) {
//this.operationTypeNums
//console.log(row, this.operationTypeNums);
return this.operationTypeNums[row.trainingType] ? (this.operationTypeNums[row.trainingType][row.operateType]||0): 0;
},
checkNum(row) {
if(!this.operationTypeNums[row.trainingType]) {
return true;
} else if(!this.operationTypeNums[row.trainingType][row.operateType]){
return true;
} else if(row.num > this.operationTypeNums[row.trainingType][row.operateType]) {
return true;
} else {
return false;
}
},
handleForm(data) {
this.changeCourseDisable();
this.indexCourse = data.$index;
const list = JSON.stringify(data.row);
const detail = JSON.parse(list);

View File

@ -8,6 +8,7 @@
<QueryListPage ref="queryListPage" :pager-config="pagerConfig" :query-form="queryForm" :query-list="queryList" />
</el-scrollbar>
</div>
<check-or-regenerate ref="checkOrRegenerate" :map-id-list="mapIdList" @reload="reload" />
</div>
</template>
@ -15,9 +16,13 @@
import { getExamList, deleteExam, setExamEfficacy, setExamEffectivey } from '@/api/management/exam';
import { UrlConfig } from '@/scripts/ConstDic';
import { getPublishMapListOnline } from '@/api/jmap/map';
import CheckOrRegenerate from './checkOrRegenerate'
export default {
name: 'List',
components: {
CheckOrRegenerate
},
data() {
return {
BizTypeList: [],
@ -104,6 +109,15 @@ export default {
default: return 'danger';
}
}
},
{
title: '试卷规则状态',
prop: 'abnormal',
type: 'tag',
columnValue: (row) => {
return row.abnormal ? '异常' : '正常';
},
tagType: (row) => { return row.abnormal ? 'danger' : 'success'; }
},
{
type: 'button',
@ -150,6 +164,8 @@ export default {
actions: [
{ text: this.$t('global.add'), btnCode: 'employee_insert', handler: this.handleNormalAdd },
{ text: this.$t('global.back'), show: !this.$route.path.includes('device'), btnCode: 'employee_back', handler: this.handlerBack },
{ text: '检查', show: !this.$route.path.includes('device'), btnCode: 'employee_back', handler: this.handleCheck },
{ text: '重新生成', show: !this.$route.path.includes('device'), btnCode: 'employee_back', handler: this.handleRegenerate },
{ text: '退出', show: this.$route.path.includes('device'), btnCode: 'employee_back', handler: this.handelQuit}
]
}
@ -168,6 +184,7 @@ export default {
reset: true
} : {
labelWidth: '160px',
leftSpan: 17,
queryObject: {
'name': {
type: 'text',
@ -289,6 +306,15 @@ export default {
},
handelQuit() {
window.close();
},
reload() {
this.queryList.reload();
},
handleCheck() {
this.$refs.checkOrRegenerate.doShow('check');
},
handleRegenerate() {
this.$refs.checkOrRegenerate.doShow('regenerate');
}
}
};

View File

@ -24,7 +24,8 @@ export default {
formModel: {
id: '',
domainName: '',
project: ''
project: '',
resourcesDomainName: ''
},
loading: false
};
@ -34,7 +35,8 @@ export default {
const form = {
labelWidth: '120px',
items: [
{ prop: 'domainName', label: '域名', type: 'text', required: true, placeholder: '请输入域名' },
{ prop: 'domainName', label: '接口域名', type: 'text', required: true, placeholder: '请输入域名' },
{ prop: 'resourcesDomainName', label: '资源域名', type: 'text', required: true, placeholder: '请输入域名' },
{ prop: 'project', label: '项目', type: 'select', required: true, options: this.projectList, placeholder: '请选择项目' }
]
};
@ -43,7 +45,10 @@ export default {
rules() {
const crules = {
domainName: [
{ required: true, message: '请输入域名', trigger: 'blur' }
{ required: true, message: '请输入接口域名', trigger: 'blur' }
],
resourcesDomainName: [
{ required: true, message: '请输入资源域名', trigger: 'blur' }
],
project: [
{ required: true, message: '请选择项目', trigger: 'change' }
@ -63,6 +68,7 @@ export default {
this.formModel.id = data.id;
this.formModel.domainName = data.domainName;
this.formModel.project = data.project;
this.formModel.resourcesDomainName = data.resourcesDomainName;
}
this.dialogVisible = true;
},
@ -72,7 +78,8 @@ export default {
const data = {
id: this.formModel.id,
domainName: this.formModel.domainName,
project: this.formModel.project.toUpperCase()
project: this.formModel.project.toUpperCase(),
resourcesDomainName: this.formModel.resourcesDomainName
};
if (data.id) {
updateProjectServer(data.id, data).then(resp => {
@ -99,7 +106,8 @@ export default {
this.formModel = {
id: '',
domainName: '',
project: ''
project: '',
resourcesDomainName: ''
};
this.$refs.dataform.resetForm();
this.dialogVisible = false;

View File

@ -44,9 +44,13 @@ export default {
indexShow: true,
columns: [
{
title: '域名',
title: '接口域名',
prop: 'domainName'
},
{
title: '资源域名',
prop: 'resourcesDomainName'
},
{
title: '项目名称',
prop: 'projectCode',