Commit 314ff401 authored by 罗超's avatar 罗超

Merge branch 'master' of http://gitlab.oytour.com/luochao/confucius

# Conflicts:
#	src/App.vue
parents 2f92d143 dc6f1ec0
import request from '../../utils/request'
/**
* 获取OKR周期配置信息
* @param {JSON参数} data
*/
export function GetOKRPeriodConfigInfo(data) {
return request({
url: '/OKRPeriod/GetOKRPeriodConfigInfo',
method: 'post',
data
})
}
/**
* 保存OKR周期配置
* @param {JSON参数} data
*/
export function SetOKRPeriodConfigInfo(data) {
return request({
url: '/OKRPeriod/SetOKRPeriodConfigInfo',
method: 'post',
data
})
}
/**
* 获取规则分页列表
* @param {JSON参数} data
*/
export function GetOKRRulePageList(data) {
return request({
url: '/OKRPeriod/GetOKRRulePageList',
method: 'post',
data
})
}
/**
* 启用禁用删除规则状态
* @param {JSON参数} data
*/
export function SetOKRRuleState(data) {
return request({
url: '/OKRPeriod/SetOKRRuleState',
method: 'post',
data
})
}
/**
* 设置规则信息
* @param {JSON参数} data
*/
export function SetOKRRuleInfo(data) {
return request({
url: '/OKRPeriod/SetOKRRuleInfo',
method: 'post',
data
})
}
/**
* 获取规则枚举
* @param {JSON参数} data
*/
export function GetRuleTypeEnumList(data) {
return request({
url: '/OKRPeriod/GetRuleTypeEnumList',
method: 'post',
data
})
}
/**
* 获取OKR提醒列表
* @param {JSON参数} data
*/
export function GetOKRRemindList(data) {
return request({
url: '/OKRPeriod/GetOKRRemindList',
method: 'post',
data
})
}
/**
* 修改okr提醒启用
* @param {JSON参数} data
*/
export function SetOKRRemindEnable(data) {
return request({
url: '/OKRPeriod/SetOKRRemindEnable',
method: 'post',
data
})
}
/**
* 设置okr提醒
* @param {JSON参数} data
*/
export function SetOKRRemindInfo(data) {
return request({
url: '/OKRPeriod/SetOKRRemindInfo',
method: 'post',
data
})
}
/**
* 获取okr分数规则列表
* @param {JSON参数} data
*/
export function GetOKRScoreConfigPageList(data) {
return request({
url: '/OKRPeriod/GetOKRScoreConfigPageList',
method: 'post',
data
})
}
/**
* 设置分数规则
* @param {JSON参数} data
*/
export function SetOKRScoreConfigInfo(data) {
return request({
url: '/OKRPeriod/SetOKRScoreConfigInfo',
method: 'post',
data
})
}
/**
* 设置分数规则状态
* @param {JSON参数} data
*/
export function SetOKRScoreConfigState(data) {
return request({
url: '/OKRPeriod/SetOKRScoreConfigState',
method: 'post',
data
})
}
...@@ -228,3 +228,16 @@ export function RemoveQuestionBank(data) { ...@@ -228,3 +228,16 @@ export function RemoveQuestionBank(data) {
data data
}) })
} }
/**
* 批量设置问题考级程度
* @param {*} data
*/
export function saveBatchQuestionLevel(data) {
return request({
url: '/Question/SetBatchQuestionLevel',
method: 'post',
data
})
}
<style> <style>
.el-dialog__wrapper{ .app-attachment .el-dialog__wrapper{
z-index:99999!important; z-index:99999!important;
} }
.cloud_Table{ .cloud_Table{
...@@ -140,13 +140,14 @@ ...@@ -140,13 +140,14 @@
dialogVisible: false, dialogVisible: false,
title: "", title: "",
activeName: "first", activeName: "first",
fileDataList: [{ fileDataList:[],
IsCheck: false, // fileDataList: [{
FileName: "测试文件", // IsCheck: false,
FileUrl: "http://192.168.1.214:8130/EduSystem/Test/Upload/assistIcon/20201228032704905.jpg", // FileName: "测试文件",
FileSize: "100", // FileUrl: "http://192.168.1.214:8130/EduSystem/Test/Upload/assistIcon/20201228032704905.jpg",
CreateTimeStr: "2021-01-04" // FileSize: "100",
}], // CreateTimeStr: "2021-01-04"
// }],
chooseFileArray: [] chooseFileArray: []
}; };
}, },
......
...@@ -240,12 +240,6 @@ ...@@ -240,12 +240,6 @@
<q-select filled stack-label option-value="TId" option-label="TeacherName" <q-select filled stack-label option-value="TId" option-label="TeacherName"
v-model="addMsg.TeacherId" ref="Teacher_Id" :options="TeacherList" label="关联教师" v-model="addMsg.TeacherId" ref="Teacher_Id" :options="TeacherList" label="关联教师"
:dense="false" class="col-6 q-pb-lg" emit-value map-options /> :dense="false" class="col-6 q-pb-lg" emit-value map-options />
<!-- <div class="calenderClassDate">
<div>上课时间:{{item.ClassDateStr}}</div>
<div>
<i class="iconfont icon-zhuanhuan1"></i><span style="color:#2961fe;cursor:pointer;" @click="isShowCanlder=true;">变更时间</span>
</div>
</div> -->
<q-input filled v-model="addMsg.ClassDate" class="col-6 q-pb-lg" mask="date" label="上课时间"> <q-input filled v-model="addMsg.ClassDate" class="col-6 q-pb-lg" mask="date" label="上课时间">
<template v-slot:append> <template v-slot:append>
<q-icon name="event" class="cursor-pointer"> <q-icon name="event" class="cursor-pointer">
...@@ -400,12 +394,12 @@ ...@@ -400,12 +394,12 @@
TeacherList: [], //老师下拉数据 TeacherList: [], //老师下拉数据
addMsg: { addMsg: {
ClassPlanId: 0, ClassPlanId: 0,
ClassId: 1, ClassId: 0,
ClassDate: "", ClassDate: "",
ClassDateStr: "", ClassDateStr: "",
ClassRoomId: 1, ClassRoomId: 0,
RoomName: "", RoomName: "",
TeacherId: 1, TeacherId: 0,
TeacherName: "", TeacherName: "",
UserIcon: "", UserIcon: "",
PlanTimeList: [{ PlanTimeList: [{
...@@ -434,7 +428,10 @@ ...@@ -434,7 +428,10 @@
} }
}, },
created() { created() {
if(this.setingObj&&this.setingObj.ClassId)
{
this.addMsg.ClassId=this.setingObj.ClassId;
}
}, },
mounted() { mounted() {
this.initData(); this.initData();
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
//初始化表单 //初始化表单
initObj() { initObj() {
GetClassLessPlanList({}).then(res => { GetClassLessPlanList({}).then(res => {
console.log(res, '数据来了');
if (res.Code == 1) { if (res.Code == 1) {
this.tableData = res.Data; this.tableData = res.Data;
this.tableData.forEach(x => { this.tableData.forEach(x => {
...@@ -60,7 +60,6 @@ ...@@ -60,7 +60,6 @@
}) })
}, },
singleElection(row) { singleElection(row) {
console.log(row, 'row');
this.templateSelection = this.tableData.indexOf(row); this.templateSelection = this.tableData.indexOf(row);
this.checkedRow = row; this.checkedRow = row;
}, },
......
<style>
.el-select-dropdown {
z-index: 9999 !important;
}
.w280 {
width: 280px !important;
}
.el-tooltip__popper {
z-index: 9999 !important;
}
.w80 {
width: 80px !important;
}
</style>
<template>
<q-dialog v-model="persistent" maximized full-height seamless position="right" @hide="closeProcess">
<q-card style="margin-top:61px;width:500px" class="no-border-radius classinfo_Dialog">
<div class="baseSetForm_Dialog">
<div class="cycle_Title">周期设置</div>
<div class="Period-alert">
<i class="iconfont icon-tishi" style="color:#3370ff;margin-right:8px;"></i>
<span>本年度仅剩余 1 次修改机会。修改周期后,之前生效的周期将会保留</span>
</div>
<div class="Okr_Length">OKR 周期长度<span class="FormItem-asterisk">*</span></div>
<div style="width:130px;margin-top:10px;">
<el-radio-group v-model="addMsg.PeriodMonth" @change="getMonth(addMsg.PeriodMonth)">
<el-radio :label="1">1 个月</el-radio>
<el-radio :label="2">2 个月</el-radio>
<el-radio :label="3">3 个月(季度)</el-radio>
<el-radio :label="4">4 个月</el-radio>
<el-radio :label="6">半年</el-radio>
</el-radio-group>
</div>
<div class="Okr_Length">新生效周期
<span class="FormItem-asterisk">*</span>
<el-tooltip content="当前周期设置后的首个生效周期" placement="top" effect="light">
<i class="iconfont icon-tishi" style="margin-left:5px;"></i>
</el-tooltip>
</div>
<el-select v-model="ckedTime" class="baseDropdown w280" size="small" style="margin-top:10px;"
@change="getCycle(ckedTime)" placeholder="请选择">
<el-option v-for="item in timeList" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<div class="Okr_Length" style="margin-top:20px;">新周期出现时间
<span class="FormItem-asterisk">*</span>
<el-tooltip content="提前 30 天展示下周期的 OKR 填写入口" placement="top" effect="light">
<i class="iconfont icon-tishi" style="margin-left:5px;"></i>
</el-tooltip>
</div>
<div style="display:flex;align-items:center;margin-top:20px;">
<span>上个周期结束前</span>
<el-input type="text" v-model="addMsg.BeforeNum" class="w80" style="margin:0 20px;" @keyup.native="checkInteger(addMsg,'BeforeNum')" size="small"></el-input>
<el-select v-model="addMsg.BeforeType" class="baseDropdown w80" size="small" placeholder="请选择">
<el-option label="天" :value="1"></el-option>
<el-option label="月" :value="2"></el-option>
</el-select>
</div>
<div class="Okr_Length" style="margin:20px 0;">
<div style="color:#1f2329">年度 OKR</div>
<div style="color:#646a73;margin-top:5px;">开启年度周期,对 OKR 进行长期规划</div>
</div>
<el-switch v-model="addMsg.YearOKR" :active-value="1" :inactive-value="2">
</el-switch>
<div class="Okr_Length" style="margin:20px 0;">
<div style="color:#1f2329">主管审核</div>
</div>
<el-switch v-model="addMsg.DirectorAudit" :active-value="1" :inactive-value="2">
</el-switch>
</div>
<div class="process_Btn_List">
<div class="processBtn_Cancel" @click="closeProcess">关闭</div>
<div class="processBtn_Save" @click="setBaseInfo">确定</div>
</div>
</q-card>
<div class="dialog-out-close" @click="closeProcess"
style="height:40px !important;border-top-left-radius: 4px !important;border-bottom-left-radius: 4px !important;">
<q-icon name="iconfont icon-jujue1" size="26px" />
</div>
</q-dialog>
</template>
<script>
import {
SetOKRPeriodConfigInfo
} from '../../api/okr/index';
export default {
props: {
saveObj: {
type: Object,
default: null
}
},
data() {
return {
persistent: true,
addMsg: {
Id: 0,
PeriodMonth: 1, //月份
StartDate: '', //开始时间
EndDate: '', // 结束时间
BeforeNum: '', // 新周期出现时间
BeforeType: 1, //类型 1天 2月
YearOKR: 1, //年度是否开启 1是 2否
DirectorAudit: 1 //主管审核 1开启 2不开启
},
ckedTime: '', //选中的日期
timeList: []
}
},
mounted() {
this.addMsg.Id = this.saveObj.Id;
this.addMsg.PeriodMonth = this.saveObj.PeriodMonth;
this.addMsg.StartDate = this.saveObj.StartDate;
this.addMsg.EndDate = this.saveObj.EndDate;
this.addMsg.BeforeNum = this.saveObj.BeforeNum;
this.addMsg.BeforeType = this.saveObj.BeforeType;
this.addMsg.YearOKR = this.saveObj.YearOKR;
this.addMsg.DirectorAudit = this.saveObj.DirectorAudit;
this.getMonth(this.addMsg.PeriodMonth);
},
created(){
this.$nextTick(() => {
var newEndDate = '';
var newStartDate = '';
if(this.addMsg.StartDate){
let StartTime = this.addMsg.StartDate.split('年');
let month = StartTime[1].split('月')[0];
if(parseInt(month)<10){
month = month.split('0')[1]
}
newStartDate = StartTime[0]+'年'+month+'月'
}
if(this.addMsg.EndDate){
let EndTime = this.addMsg.EndDate.split('年');
let month = EndTime[1].split('月')[0];
if(parseInt(month)<10){
month = month.split('0')[1]
}
newEndDate = EndTime[0]+'年'+month+'月'
}
this.timeList.forEach(x=>{
if(newStartDate===x.StartDate&&newEndDate===x.EndDate){
this.ckedTime=x.value;
}
})
});
},
methods: {
getMonth(num) {
var date = new Date;
var year = date.getFullYear();
var month = date.getMonth() + 1;
var StartDate = '';
var EndDate = '';
this.ckedTime = '';
this.timeList = [];
for (let i = 1; i <= 12; i++) {
let currentDate = year + '-' + i;
currentDate = new Date(currentDate);
// 月份减去一
let lastDate = currentDate.setMonth(currentDate.getMonth() - num); // 输出日期格式为毫秒形式1551398400000
lastDate = new Date(lastDate);
let lastYear = lastDate.getFullYear();
let lastMonth = lastDate.getMonth() + 2;
if (lastMonth > 12) {
lastMonth = 1;
lastYear = lastYear + 1;
}
if (num == 1) {
lastDate = lastYear + ' ' + '年' + ' ' + lastMonth + ' ' + '月';
StartDate = lastYear + '年' + lastMonth + '月';
EndDate = lastYear + '年' + lastMonth + '月';
} else {
if (lastYear == year) {
lastDate = lastYear + ' ' + '年' + ' ' + lastMonth + ' ' + '-' + ' ' + i + ' ' + '月'
StartDate = lastYear + '年' + lastMonth + '月';
EndDate = lastYear + '年' + i + '月';
} else {
lastDate = lastYear + ' ' + '年' + ' ' + lastMonth + ' ' + '月' + ' ' + '-' + ' ' + year + ' ' + '年' + ' ' +
i + ' ' + '月'
StartDate = lastYear + '年' + lastMonth + '月';
EndDate = year + '年' + i + '月';
}
}
let obj = {
value: lastDate,
label: lastDate,
StartDate: StartDate,
EndDate: EndDate
}
this.timeList.push(obj);
}
},
getCycle(value) {
this.timeList.forEach(x => {
if (x.value == value) {
this.addMsg.StartDate = x.StartDate;
this.addMsg.EndDate = x.EndDate;
}
})
},
//关闭流程设置
closeProcess() {
this.persistent = false;
this.$emit('close');
},
//保存数据
setBaseInfo() {
if(this.ckedTime==''){
this.$q.notify({
type: 'negative',
position: "top",
message: `请选择新生效周期`
})
return;
}
if(this.addMsg.BeforeNum==''){
this.$q.notify({
type: 'negative',
position: "top",
message: `请填写上个周期结束天数`
})
return;
}
SetOKRPeriodConfigInfo(this.addMsg).then(res => {
if (res.Code == 1) {
this.$emit('success');
this.closeProcess();
}
})
}
}
}
</script>
<style>
.baseSetForm .Period-rules {
display: flex;
margin-bottom: 24px;
padding-left: 20px;
}
.baseSetForm .Period_Spreate {
flex: 1;
min-width: 200px;
margin-right: 32px;
}
.baseSetForm .Period-rule-title {
color: #646a73;
margin-bottom: 4px;
display: flex;
align-items: center;
}
.baseSetForm .Period-info-icon {
margin-left: 8px;
color: #8f959e;
line-height: 1;
vertical-align: top;
}
.process_Btn_List {
display: flex;
justify-content: flex-end;
padding: 20px;
}
.processBtn_Cancel {
width: 90px;
height: 35px;
border: 1px solid #A1AAB2;
color: #000000;
background-color: #fff;
text-align: center;
line-height: 35px;
border-radius: 5px;
cursor: pointer;
margin-right: 20px;
}
.processBtn_Save {
width: 90px;
height: 35px;
background-color: #2961FE;
color: #FFF;
text-align: center;
line-height: 35px;
border-radius: 5px;
cursor: pointer;
}
.baseSetForm_Dialog {
margin: 20px;
}
.cycle_Title {
font-size: 20px;
font-weight: 500;
color: #1f2329;
}
.Period-alert {
padding: 9px 16px;
border-radius: 4px;
background-color: #f0f4ff;
line-height: 22px;
color: #1f2329;
display: flex;
align-items: center;
margin-top: 20px;
margin-bottom: 12px;
font-size: 13px;
}
.Okr_Length {
font-weight: 500;
color: #1f2329;
}
.FormItem-asterisk {
position: relative;
top: 3px;
margin-left: 3px;
color: #f54a45;
line-height: 1;
}
.baseSetForm_Dialog .el-radio {
display: block;
margin-bottom: 15px;
}
</style>
<template>
<div class="baseSetForm">
<div style="text-align:right;">
<q-btn color="accent" size="sm" class="q-mr-md" @click="isShowBaseSet=true" label="修改基础配置" />
</div>
<div class="Period-rules">
<div class="Period_Spreate">
<div class="Period-rule-title">周期长度</div>
<div>{{getPerodMonth(baseObj.PeriodMonth)}}</div>
</div>
<div class="Period_Spreate">
<div class="Period-rule-title">
新生效周期
<span class="Period-info-icon">
<el-tooltip content="当前周期设置后的首个生效周期" placement="top" effect="light">
<i class="iconfont icon-tishi"></i>
</el-tooltip>
</span>
</div>
<div>{{baseObj.StartDate}} - {{baseObj.EndDate}}</div>
</div>
</div>
<div class="Period-rules">
<div class="Period_Spreate">
<div class="Period-rule-title">新周期出现时间</div>
<div>上个周期结束前 {{baseObj.BeforeNum}} {{baseObj.BeforeType==1?'天':'月'}}</div>
</div>
<div class="Period_Spreate">
<div class="Period-rule-title">
年度 OKR
</div>
<div>
{{baseObj.YearOKR==1?'已开启':'未开启'}}
</div>
</div>
</div>
<div class="Period-rules">
<div class="Period_Spreate">
<div class="Period-rule-title">
主管审核
</div>
<div>
{{baseObj.DirectorAudit==1?'已开启':'未开启'}}
</div>
</div>
</div>
<basecycle-form v-if="isShowBaseSet" :save-obj="baseObj" @close="closeProcessForm" @success="refreshPage">
</basecycle-form>
</div>
</template>
<script>
import {
GetOKRPeriodConfigInfo
} from '../../api/okr/index';
import basecycleForm from '../../components/okr/basecycle-form';
export default {
meta: {
title: ""
},
components: {
basecycleForm
},
data() {
return {
isShowBaseSet: false,
baseObj: {}
}
},
mounted() {
this.getList();
},
methods: {
//获取okr配置信息
getList() {
GetOKRPeriodConfigInfo({}).then(res => {
if (res.Code == 1) {
this.baseObj = res.Data;
}
})
},
//返回组装数据
getPerodMonth(num) {
let str = ''
switch (num) {
case 1:
str = 1 + ' ' + '个月'
break;
case 2:
str = 2 + ' ' + '个月'
break;
case 3:
str = 3 + ' ' + '个月'+' '+'(季度)'
break;
case 4:
str = 4 + ' ' + '个月'
break;
case 6:
str = '半年'
break;
default:
}
return str;
},
//关闭流程设置
closeProcessForm() {
this.isShowBaseSet = false;
},
refreshPage() {
this.getList();
},
}
}
</script>
<template>
<q-dialog v-model="dialog" maximized full-height seamless position="right">
<q-card style="margin-top:61px;width:420px" class="no-border-radius classinfo_Dialog">
<q-tabs
v-model="tab"
class="text-primary"
>
<q-tab name="one" label="填写指南" />
<q-tab name="two" label="最佳范例" />
</q-tabs>
<div class="WritingAssistant-tabContent-1nYI5" v-if="tab=='one'">
<div class="WritingGuide-section-1XCZt">
<h3 class="WritingGuide-title-3wBKZ">
如何写出好的 Objective?
</h3>
<div class="WritingGuide-block-3NjvJ">
<span class="WritingGuide-subtitle-6D5zl" >描述目标时要具体且有方向性</span>
<div class="WritingGuide-item-3QnrI">
<svg width="18" height="18" fill="none" class="svgstyle"><path d="M13.725 4.283a.747.747 0 00-1.057 0L9 7.943 5.333 4.275a.747.747 0 10-1.058 1.058L7.943 9l-3.668 3.668a.747.747 0 101.058 1.057L9 10.057l3.668 3.668a.747.747 0 101.057-1.057L10.057 9l3.668-3.667a.752.752 0 000-1.05z" fill="#D83931"></path></svg>
Objective:
<span class="AnnotatedSentence-annotatedWord-3YcNj" >提高英文水平
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px" self="center middle" anchor="top middle">
<span><span style="color: rgb(46, 161, 33)">解析:</span>「提高英文水平」目标描述不够具体,缺少方向性</span>
</q-tooltip>
</span>
</div>
<div class="WritingGuide-item-3QnrI"><svg class="svgstyle" width="18" height="18" fill="none"><path d="M6.75 12.15L4.125 9.525a.738.738 0 00-1.05 0 .738.738 0 000 1.05l3.143 3.143a.747.747 0 001.057 0l7.95-7.943a.738.738 0 000-1.05.738.738 0 00-1.05 0L6.75 12.15z" fill="#2EA121"></path></svg>Objective: 半年后,可以<span class="AnnotatedSentence-annotatedWord-3YcNj" aria-expanded="false">用英文做专业领域的分享
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px;max-width:350px" self="center middle" anchor="top middle">
<span><span style="color: rgb(46, 161, 33)">解析:</span>「用英文做专业领域的分享」描述了提高英文水平的方向和具体要实现的目标</span>
</q-tooltip>
</span></div>
</div>
<div class="WritingGuide-block-3NjvJ">
<span class="WritingGuide-subtitle-6D5zl" >制定目标时要有挑战性</span>
<div class="WritingGuide-item-3QnrI">
<svg class="svgstyle" width="18" height="18" fill="none"><path d="M13.725 4.283a.747.747 0 00-1.057 0L9 7.943 5.333 4.275a.747.747 0 10-1.058 1.058L7.943 9l-3.668 3.668a.747.747 0 101.058 1.057L9 10.057l3.668 3.668a.747.747 0 101.057-1.057L10.057 9l3.668-3.667a.752.752 0 000-1.05z" fill="#D83931"></path></svg>
十年后,可以用英文做专业领域的分享
</div>
<div class="WritingGuide-item-3QnrI"><svg class="svgstyle" width="18" height="18" fill="none"><path d="M6.75 12.15L4.125 9.525a.738.738 0 00-1.05 0 .738.738 0 000 1.05l3.143 3.143a.747.747 0 001.057 0l7.95-7.943a.738.738 0 000-1.05.738.738 0 00-1.05 0L6.75 12.15z" fill="#2EA121"></path></svg>Objective: <span class="AnnotatedSentence-annotatedWord-3YcNj" aria-expanded="false">半年
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px;max-width:350px" self="center middle" anchor="top middle">
<span><span style="color: rgb(46, 161, 33)">解析:</span>「半年」学会用英文做专业领域的分享,目标挑战性更强</span>
</q-tooltip>
</span>
<span>后,可以用英文做专业领域的分享</span>
</div>
</div>
</div>
<div class="WritingGuide-section-1XCZt">
<h3 class="WritingGuide-title-3wBKZ">
如何写出好的 Key Result?
</h3>
<div class="WritingGuide-block-3NjvJ">
<span class="WritingGuide-subtitle-6D5zl" >KR 要能支持目标实现</span>
<div class="WritingGuide-item-3QnrI">半年后,可以用英文做专业领域的分享</div>
<div class="WritingGuide-item-3QnrI">
<svg class="svgstyle" width="18" height="18" fill="none" ><path d="M13.725 4.283a.747.747 0 00-1.057 0L9 7.943 5.333 4.275a.747.747 0 10-1.058 1.058L7.943 9l-3.668 3.668a.747.747 0 101.058 1.057L9 10.057l3.668 3.668a.747.747 0 101.057-1.057L10.057 9l3.668-3.667a.752.752 0 000-1.05z" fill="#D83931"></path></svg>
KR 1:
<span class="AnnotatedSentence-annotatedWord-3YcNj" >学习日常口语
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px" self="center middle" anchor="top middle">
<span><span style="color: rgb(46, 161, 33)">解析:</span>仅靠「学习日常口语」无法支持「用英文做专业领域的分享」目标的实现</span>
</q-tooltip>
</span>
</div>
<div class="WritingGuide-item-3QnrI"><svg class="svgstyle" width="18" height="18" fill="none"><path d="M6.75 12.15L4.125 9.525a.738.738 0 00-1.05 0 .738.738 0 000 1.05l3.143 3.143a.747.747 0 001.057 0l7.95-7.943a.738.738 0 000-1.05.738.738 0 00-1.05 0L6.75 12.15z" fill="#2EA121"></path></svg>KR 1: 在某 App 学习与专业领域相关的口语表达,能口头说明专业概念</div>
</div>
<div class="WritingGuide-block-3NjvJ">
<span class="WritingGuide-subtitle-6D5zl" >定量或定性地描述 KR</span>
<div class="WritingGuide-item-3QnrI">
<svg class="svgstyle" width="18" height="18" fill="none"><path d="M13.725 4.283a.747.747 0 00-1.057 0L9 7.943 5.333 4.275a.747.747 0 10-1.058 1.058L7.943 9l-3.668 3.668a.747.747 0 101.058 1.057L9 10.057l3.668 3.668a.747.747 0 101.057-1.057L10.057 9l3.668-3.667a.752.752 0 000-1.05z" fill="#D83931"></path></svg>
KR 2:
<span class="AnnotatedSentence-annotatedWord-3YcNj" aria-expanded="false">背诵专业词汇
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px;max-width:350px" self="center middle" anchor="top middle">
<span><span style="color: rgb(46, 161, 33)">解析:</span>「背诵专业词汇」只是动作,不是关键结果,也无法衡量它的价值</span>
</q-tooltip>
</span>
</div>
<div class="WritingGuide-item-3QnrI"><svg class="svgstyle" width="18" height="18" fill="none"><path d="M6.75 12.15L4.125 9.525a.738.738 0 00-1.05 0 .738.738 0 000 1.05l3.143 3.143a.747.747 0 001.057 0l7.95-7.943a.738.738 0 000-1.05.738.738 0 00-1.05 0L6.75 12.15z" fill="#2EA121"></path></svg>
KR 2:
<span class="AnnotatedSentence-annotatedWord-3YcNj" aria-expanded="false">能熟练使用 200 个专业领域的词汇和表达
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px;max-width:350px" self="center middle" anchor="top middle">
<span><span style="color: rgb(46, 161, 33)">解析:</span>「能熟练使用200个专业领域的词汇和表达」,此结果对目标有价值且定量可衡量</span>
</q-tooltip>
</span>
</div>
<div class="WritingGuide-item-3QnrI">
<svg class="svgstyle" width="18" height="18" fill="none"><path d="M13.725 4.283a.747.747 0 00-1.057 0L9 7.943 5.333 4.275a.747.747 0 10-1.058 1.058L7.943 9l-3.668 3.668a.747.747 0 101.058 1.057L9 10.057l3.668 3.668a.747.747 0 101.057-1.057L10.057 9l3.668-3.667a.752.752 0 000-1.05z" fill="#D83931"></path></svg>
KR 3:能用英文
<span class="AnnotatedSentence-annotatedWord-3YcNj" aria-expanded="false">制作专业领域 PPT
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px;max-width:350px" self="center middle" anchor="top middle">
<span><span style="color: rgb(46, 161, 33)">解析:</span>「制作专业领域PPT」描述模棱两可,无法进行衡量和判断</span>
</q-tooltip>
</span>
</div>
<div class="WritingGuide-item-3QnrI"><svg class="svgstyle" width="18" height="18" fill="none"><path d="M6.75 12.15L4.125 9.525a.738.738 0 00-1.05 0 .738.738 0 000 1.05l3.143 3.143a.747.747 0 001.057 0l7.95-7.943a.738.738 0 000-1.05.738.738 0 00-1.05 0L6.75 12.15z" fill="#2EA121"></path></svg>
KR 3:能用英文制作专业领域 PPT,
<span class="AnnotatedSentence-annotatedWord-3YcNj" aria-expanded="false">可以准确解释专业概念
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px;max-width:350px" self="center middle" anchor="top middle">
<span><span style="color: rgb(46, 161, 33)">解析:</span>「可以准确解释专业概念」结果清晰,定性可衡量</span>
</q-tooltip>
</span>
</div>
</div>
</div>
<div class="WritingGuide-otherPrinciple-2AhOv" >
<h3 class="WritingGuide-title-3wBKZ">
其他制定原则
</h3>
<ul><li>Objective 和每个 Objective 对应的 Key Result 数量应控制在 3-5 个</li><li>及时与上级、合作方沟通目标,达成一致</li><li>想要了解更多? <a href="https://bytedance.feishu.cn/docs/doccnNcwoql8HhrXSYZ7phudjMg" target="_blank" rel="noopener noreferrer">OKR 制定常见误区</a></li></ul>
</div>
</div>
<div v-else class="WritingAssistant-tabContent-1nYI5">
<div class="BestCase-tagContainer-1k1dW">
<div v-for="(x,y) in list" :key="y" class="BestCase-tag-206SU" :class="{'BestCase-focused-2aQSy':index == y}" @click="index=y,Selectlist = list[y].list">
{{x.title}}
</div>
</div>
<div v-if="Selectlist.length>0">
<div class="BestCase-object-24od-" v-for="(x,y) in Selectlist" :key="y">
<div class="BestCase-title-2vD62">
<div class="BestCase-flag-1mIPx"></div>
<span v-if="x.type==0">{{x.title}}</span>
<span v-if="x.type==1" class="AnnotatedSentence-annotatedWord-3YcNj">
{{x.title}}
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px" anchor="top middle" self="bottom middle" :offset="[10, 10]">
<span><span style="color: rgb(46, 161, 33)">解析:</span>{{x.tool}}</span>
</q-tooltip>
</span>
<div v-for="(item,index) in x.list" :key="index" class="BestCase-kr-kB1n6">
<span v-if="item.type==0">{{item.content}}</span>
<span v-if="item.type==1">
<span class="AnnotatedSentence-annotatedWord-3YcNj">{{item.content1}}
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px" anchor="top middle" self="bottom middle" :offset="[10, 10]">
<span><span style="color: rgb(46, 161, 33)">解析:</span>{{item.tool}}</span>
</q-tooltip>
</span>
</span>
<span v-if="item.type==2">
<span class="AnnotatedSentence-annotatedWord-3YcNj">{{item.content2}}
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px" anchor="top middle" self="bottom middle" :offset="[10, 10]">
<span><span style="color: rgb(46, 161, 33)">解析:</span>{{item.tool}}</span>
</q-tooltip>
</span>
<span>{{item.content3}}</span>
</span>
<span v-if="item.type==3">
<span>{{item.content2}}</span>
<span class="AnnotatedSentence-annotatedWord-3YcNj">{{item.content3}}
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px" anchor="top middle" self="bottom middle" :offset="[10, 10]">
<span><span style="color: rgb(46, 161, 33)">解析:</span>{{item.tool}}</span>
</q-tooltip>
</span>
<span>{{item.content4}}</span>
</span>
<span v-if="item.type==4">
<span>{{item.content3}}</span>
<span class="AnnotatedSentence-annotatedWord-3YcNj">{{item.content4}}
<q-tooltip content-class="bg-white" max-width="350px" content-style="color:#111;font-size: 14px" anchor="top middle">
<span><span style="color: rgb(46, 161, 33)">解析:</span>{{item.tool}}</span>
</q-tooltip>
</span>
</span>
</div>
</div>
</div>
</div>
</div>
</q-card>
<div class="dialog-out-close" @click="closeSaveForm"
style="height:40px !important;border-top-left-radius: 4px !important;border-bottom-left-radius: 4px !important;">
<q-icon name="iconfont icon-jujue1" size="26px" />
</div>
</q-dialog>
</template>
<script>
export default {
name: "guide",
props: {
},
data() {
return {
dialog:true,
tab:'one',
list:[//type 0 没有弹出1 全部 2 前面 3 中间 4后面
{title:'市场',list:[
{title:'保持 XX 品牌领先优势,提升品牌知名度与影响力',type:0,tool:'',list:[
{type:0,content:'品牌策略:重新定义 XX 品牌,差异化表达品牌理念,以专项形式落地品牌策略,产出 10 个宣传素材,总曝光量达到 1 亿',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:4,content:'',
content1:'',
content2:'',
content3:'品牌宣传片:',
content4:'首月完成 1 支混剪出街视频,本次 OKR 周期结束前完成 XX 新品牌的视频拍摄',
tool:'明确关键结果完成时间,防止延期风险'
},
{type:0,content:'渠道合作:共创顶级 IP 合作(博物馆、历史文化、艺术、公益),吸引 10 个 XX 站粉丝量在 10 万以上的品牌账号入驻',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'沉淀创意经验和品牌管理方法论,输出中台支持能力',type:0,tool:'',list:[
{type:0,content:'完成素材中心系统的搭建,本周期内形成至少 1,000 份创意素材',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:1,content:'',
content1:'形成一套高质量的素材撰写方法论,提升整体员工撰写素材的效率和质量,至少缩短素材撰写周期 30%',
content2:'',
content3:'',
content4:'',
tool:'形成方法论的目的是提升撰写效率和质量,逻辑清晰,结果可衡量'
},
]},
{title:'通过在新社交媒体上的线上引流活动,提升活跃粉丝数量',type:0,tool:'',list:[
{type:0,content:'每周至少撰写 10 篇高质量推文,单篇阅读量不低于 10 万,周期内新增粉丝数 5 万 @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:3,content:'',
content1:'',
content2:'至少开展 10 场线上转发抽奖活动,单场平均转发量不低于 1 万,',
content3:'参与活动的粉丝占比不低于 30% ',
content4:'@王一 @王二',
tool:'可衡量的关键结果,明确支撑目标「提升活跃粉丝数量」'
},
{type:0,content:'进行推文数据分析,并根据结果调整写作方式,下半月阅读量均值比上半月提升 10% @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]}
]},
{title:'销售',list:[
{title:'赋能销售团队,提升销售团队效率',type:0,tool:'',list:[
{type:4,content:'',
content1:'',
content2:'',
content3:'在 1 月底之前,制定销售技能认证机制,规范不同技能组合的培训内容,形成标准化讲义,',
content4:'最终确保全体销售成员通过认证',
tool:'明确清晰的关键结果'
},
{type:0,content:'丰富销售团队梯度,本周期内入职 3 名高级销售经理',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:4,content:'',
content1:'',
content2:'',
content3:'实施 XX 新流程,',
content4:'缩短正常流程时间至一周以内',
tool:'明确支撑目标中的「提高销售团队效率」'
},
]},
{title:'为销售提供数据分析支持,提供销售决策建议',type:0,tool:'',list:[
{type:4,content:'',
content1:'',
content2:'',
content3:'平台搭建 - 建立销售分析和 BI 商业智能平台,确保数据的完整性和可提取性,',
content4:'缩短业务数据分析时间 20%',
tool:'关键结果可衡量,建立平台的目的是提高业务分析效率,用数据分析时间进行衡量'
},
{type:4,content:'',
content1:'',
content2:'',
content3:'商机库建设 - 完成商机库一期建设,匹配存量客户,',
content4:'关联和打通客户信息',
tool:'有明确的衡量标准,虽然不是量化的数字指标,但关联和打通客户信息」也是清晰的关键结果'
},
{type:0,content:'数据报告 - 活动指标、渠道指标和结果指标自动生成摘要报告,并发送给销售人员,节省销售人工填写报告时间 1 小时',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'深耕北区市场,销售额达到 1,000 万美金,达成公司第一季度销售额目标',type:0,tool:'',list:[
{type:0,content:'第 1 季度参加 3 次北区行业活动,收获有效线索 30 条以上,保证线索转化率不低于 20%',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'优化信息同步机制,及时梳理销售线索和团队资源,确保信息同步不隔天',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'至少 60% 的销售团队完成配额',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'加大组合销售策略的推广力度,确保 40% 以上的营业额来自于预定销售和套餐销售',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]}
]},
{title:'人力',list:[
{title:'完成团队规模和结构升级,本月招聘计划完成率提升至 80% 以上',type:1,tool:'目标的方向和目的明确,且3条关键结果对目标的支撑逻辑清晰',list:[
{type:0,content:'本月至少完成 3 条新招聘渠道的扩展,各渠道每月推送人才线索量应不低于 1,000 @王一',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'完成公司紧缺人才的招募,本月招聘完成率不低于 90% @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'满足 XX 业务发展要求,提升 XX 部门的员工占比至 20% @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'优化高管团队的薪酬方案,提高薪酬方案的激励性',type:0,tool:'',list:[
{type:3,content:'',
content1:'',
content2:'完成对高管团队的薪酬满意度调研,覆盖率需达到 95%,基于调研结果制定一套薪酬方案优化建议书,',
content3:'获得董事会批准通过 ',
content4:'@王一',
tool:'「获得董事会批准通过」也是明确清晰的关键结果'
},
{type:0,content:'对标同行业最佳实践,完成股权激励方案的设计,并获董事会批准通过 @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'推广实施新的薪酬方案,落地 2 个月后进行第二次薪酬满意度调研,满意度不低于 90%,并基于调研结果提出至少 5 条被董事会采纳的可行性改进建议',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'优化现有培训知识体系和平台,形成「全员学习」的公司文化',type:0,tool:'',list:[
{type:3,content:'',
content1:'',
content2:'搭建线上培训平台并推广落地,',
content3:'本月内',
content4:'高层试点覆盖率不低于 95%,全员覆盖率不低于 60%',
tool:'明确关键结果的完成时间,防止延期风险'
},
{type:4,content:'',
content1:'',
content2:'',
content3:'扩充现有培训知识库,每月需至少产出 10 套精品课程,',
content4:'课程内容满意度不低于 90%',
tool:'可衡量的关键结果'
},
{type:0,content:'优化现有的培训考核体系,倡导「全员学习」的理念,3 个月内全员平均培训参与度和各类考试平均分值通过率不低于 80%',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
]},
{title:'研发',list:[
{title:'为 XX 业务提供高效稳定的系统支持',type:0,tool:'',list:[
{type:0,content:'优化 XX 算法,缩短系统对客户需求的响应时间至 0.1 秒,同时维持 Bug 率不变 @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:3,content:'',
content1:'',
content2:'XX 方案平稳落地,',
content3:'Bug 率控制在 3% 之内,系统无重大事故',
content4:'@王一 @王二',
tool:'可衡量的关键结果'
},
{type:0,content:'新建 XX 评估方案与 XX 模型,实现「系统稳定性」的可量化统计分析',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'打造完善的企业数据中台,实现所有产品数据的可积累、可溯源',type:1,tool:'目标的方向和目的明确,且3条关键结果对目标的支撑逻辑清晰',list:[
{type:0,content:'完成数据中台框架设计与方案设计,获得高管层、业务端一致通过 @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'完成数据中台初代版本的模型搭建,稳定性保持在 99.9% 以上,无重大事故 @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'初代版本达成后实现主营业务各环节数据 100% 可溯源、可统计',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'为即将开始的 XX 业务储备好充分的研发人才',type:0,tool:'',list:[
{type:0,content:'招聘测试工程师 10 人(满足 XX 要求),提升团队 XX 能力',
content1:'',
content2:',',
content3:'',
content4:'',
tool:''
},
{type:2,content:'',
content1:'',
content2:'从一线大厂招聘有相似业务经历的 Leader 1 人',
content3:',带来成熟的业务经验',
content4:'',
tool:'关键结果衡量标准清晰明确'
},
{type:0,content:'新业务组全员进行 XX 课程培训并全部通过测试(60 分),确保 XX 能力达标 @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
]},
{title:'产品',list:[
{title:'进军 XX 赛道,完成赛道内初代产品设计',type:0,tool:'',list:[
{type:0,content:'通过调研用户圈层,提炼用户核心需求,输出相关统计结果',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:4,content:'',
content1:'',
content2:'',
content3:'根据调研结果,确定产品 XX 发展方向,并输出产品方案,',
content4:'获得各团队认可',
tool:'「获得各团队认可」也是明确的衡量方式'
},
{type:3,content:'',
content1:'',
content2:'进行灰度测试并优化产品,',
content3:'在周期内提升测试用户满意度至 90% ',
content4:'@王一 @王二',
tool:'明确关键结果的衡量指标及实现周期'
},
]},
{title:'完成产品基础能力优化,提升用户满意度',type:0,tool:'',list:[
{type:4,content:'调整 XX 体系,优化 XX 功能,用户满意度从 85% 提升至 90% @王一',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:3,content:'',
content1:'',
content2:'引入 XX 系统,强化产品 XX 能力,',
content3:'打通与业务团队 XX 的数据',
content4:'@王一',
tool:'「打通与业务团队ⅩX的数据」也是明确清晰的衡量方式'
},
{type:0,content:'完成产品需求的排期,明确当前所有需求的实现顺序,保证 P0 需求如期完成',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'优化 XX 产品的重点功能和体验,充分满足商业化要求',type:0,tool:'',list:[
{type:2,content:'',
content1:'',
content2:'X 月 X 日前完成 ',
content3:'XX 功能,满足 XX 应用商店上架标准 @王一',
content4:'',
tool:'明确关键结果的完成时间,防止延期风险'
},
{type:0,content:'在本次 OKR 周期前,打通 Y 产品的账户,支持免注册登录,免注册用户占比达到 20% @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'上架 1 个月内完成 2 个关键功能的 A/B 测试,提升平均页面留存率至 20% @王一',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
]},
{title:'财务',list:[
{title:'建立规范的预算管理体系,提升预算监控能力',type:1,tool:'目标的目的明确,3条关键结果对目标的支撑逻辑清晰',list:[
{type:3,content:'',
content1:'',
content2:'完成公司整体预算项目的梳理,',
content3:'明确预算项目和核算项目之间的映射关系,搭建一套完整、清晰的预实对比和分析体系(例如:明确分析周期、维度等)',
content4:'@王一 @王二',
tool:'关键结果的产出明确'
},
{type:0,content:'新版财务日报上线,展示科目和维度需进一步细化(依 XX 会议商定标准),数据更新周期缩短至 T+8 小时 @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'预算监控功能上线,各部门覆盖率达到 100%,月均预警次数不低于 5 次 @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'优化费用管控体系,提升业务部门差旅满意度',type:0,tool:'',list:[
{type:3,content:'',
content1:'',
content2:'完成同业最佳实践调研和公司内部满意度调研报告,',
content3:'首月末前',
content4:'提出针对管控优化方案的 5 点建议',
tool:'关键结果完成时间明确,防止延期风险'
},
{type:3,content:'',
content1:'',
content2:'基于优化方案建议,设计一套费用管控优化方案并推广实施,',
content3:'获得不同业务部门的认可',
content4:'@王一 @王二',
tool:'关键结果「获得不同业务部门的认可」清晰明确'
},
{type:0,content:'上线商旅系统,优化报销体验,缩短报销流程和时长至少 50%,业务部门差旅满意度提升 50% @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'搭建财务共享服务中心,实现财务团队的降本、增效、转型求',type:0,tool:'',list:[
{type:0,content:'引入咨询公司和技术公司,设计财务共享服务方案与平台,方案中需明确节省的人员成本和运转效率的提升程度 @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'落地财务共享服务方案,完成财务人员的集中管理,至少覆盖集团下属 80% 以上的子公司',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'完成 SSC 人员的职能专业化分工,效率提升比例不低于 50%(总工时统计);以及本地财务人员的释放和业务转型,释放和转型比例不低于 30%',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
]},
{title:'运营',list:[
{title:'结合目标用户群体核心需求,提出对当前产品的优化建议,提升用户使用粘性',type:1,tool:'「提岀增强用户粘性的5个优化建议」,「平均用户在线时长提升」和「用户流失率下降」明确支撑目标中的「提升用户使用粘性」',list:[
{type:0,content:'梳理现有产品功能使用情况,完成用户调研报告,明确用户群体核心需求,提出增强用户粘性的 5 个优化建议 @王一',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'优化现有 XX 标签体系,推送精准率提高至 40%,平均用户在线时长提升 20% @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'协同产品部门完成相关功能上线,日活跃用户规模达到 500 万水平,用户流失率下降 10%',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'实现 XX 产品用户量与用户活跃度的提升,为营收增长提供保障',type:0,tool:'',list:[
{type:3,content:'',
content1:'',
content2:'改进 XX 产品客户评分最低的 3 项功能,',
content3:'减少负反馈比例至 10%,客户留存率提升至 60% ',
content4:'@王一 @王二',
tool:'关键结果明确清晰,可衡量'
},
{type:0,content:'上线 XX 活动,鼓励老用户回归,活跃客户数达到 500 万 @王一',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'上线拉新相关的 XX 活动,吸引潜在消费者,新增注册客户数达 10 万 @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'优化 XX 产品的奖励回馈机制,使得用户在产品界面的停留时长上升 10% @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
{title:'提升 XX 产品的市场知名度',type:0,tool:'',list:[
{type:0,content:'与 XX 渠道达成新的合作关系,粉丝数量提升 10% @王一 @王二',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'发布 10 篇阅读量 5w+ 的高质量公关文章,话题讨论参与人数达 100 万 @王一',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
{type:0,content:'通过联动等活动,提升微博、微信、头条号等主流媒体的话题活跃度 20% @王一',
content1:'',
content2:'',
content3:'',
content4:'',
tool:''
},
]},
]},
],
Selectlist:[],
index:0,
}
},
created() {
this.Selectlist = this.list[0].list
},
methods: {
closeSaveForm() {
this.$emit('close')
this.dialog = false
},
}
}
</script>
<style scoped>
*{
margin: 0;
padding: 0;
}
a {
color: #3370ff;
}
.WritingAssistant-tabContent-1nYI5{
padding: 24px 24px 0;
height: calc(100% - 120px);
overflow-y: auto;
position: relative;
}
.WritingGuide-section-1XCZt{
margin-bottom: 32px;
}
.svgstyle{
margin-right: 5px;
padding-top: 2px;
}
h3 {
font-size: 16px;
line-height: 24px;
color: #1f2329;
font-weight: 500;
}
h4 {
font-size: 14px;
}
.WritingGuide-title-3wBKZ{
color: #1f2329;
margin-bottom: 12px;
}
.WritingGuide-block-3NjvJ{
margin-bottom: 12px;
}
.WritingGuide-subtitle-6D5zl {
margin-bottom: 12px;
line-height: 22px;
color: #1f2329;
font-size: 14px;
font-weight: 500;
}
.WritingGuide-block-3NjvJ {
background-color: #f5f6f7;
border-radius: 4px;
padding: 16px;
}
.AnnotatedSentence-annotatedWord-3YcNj {
/*padding-bottom: 2px;*/
/*padding-top: 3px;*/
border-bottom: 1px dashed #8f959e;
cursor: pointer;
}
.AnnotatedSentence-annotatedWord-3YcNj:hover{
color: #3370ff;
border-bottom: 1px dashed #3370ff;
}
.discenter{
display: flex;
flex-direction: row;
align-items: center;
cursor: pointer;
line-height: 22px;
}
.WritingGuide-item-3QnrI:not(:last-child) {
margin-bottom: 8px;
margin-top: 12px;
}
.WritingGuide-item-3QnrI {
color: #646a73;
line-height: 22px;
position: relative;
/*display: flex;*/
/*flex-direction: row;*/
/*align-items: flex-start;*/
/*flex-wrap: wrap;*/
}
.WritingGuide-otherPrinciple-2AhOv li {
position: relative;
list-style: none;
padding-left: 14px;
font-size: 14px;
line-height: 22px;
word-break: break-word;
}
.WritingGuide-otherPrinciple-2AhOv li:before {
content: " ";
display: block;
position: absolute;
left: 2px;
top: 9px;
width: 4px;
height: 4px;
border-radius: 2px;
background-color: #8f959e;
}
.BestCase-tagContainer-1k1dW {
display: flex;
flex-wrap: wrap;
margin-right: -10px;
margin-bottom: 12px;
}
.BestCase-tag-206SU {
border-radius: 20px;
padding: 1px 8px;
background-color: rgba(31,35,41,.08);
color: #373c43;
font-size: 14px;
line-height: 22px;
margin-right: 10px;
margin-bottom: 10px;
cursor: pointer;
}
.BestCase-focused-2aQSy {
background-color: #3370ff;
color: #fff;
}
.BestCase-object-24od- {
background-color: #f5f6f7;
border-radius: 8px;
padding: 16px 24px 16px 46px;
position: relative;
}
.BestCase-title-2vD62 {
color: #1f2329;
font-size: 16px;
line-height: 24px;
}
.BestCase-flag-1mIPx {
background-image: url(data:image/png;base64,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);
background-size: cover;
width: 24px;
height: 24px;
position: absolute;
left: 12px;
}
.BestCase-kr-kB1n6 {
margin-top: 14px;
padding-left: 18px;
color: #646a73;
font-size: 14px;
line-height: 22px;
position: relative;
}
.BestCase-kr-kB1n6:before {
content: "";
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background-color: #3370ff;
top: 8px;
left: 0;
}
.BestCase-object-24od-+.BestCase-object-24od- {
margin-top: 16px;
}
</style>
<style>
.remindOne {
border: 1px solid rgba(187, 191, 196, .3);
border-radius: 4px;
margin-bottom: 12px;
padding: 20px 24px 8px;
}
.Notifititle {
position: relative;
font-size: 16px;
line-height: 24px;
font-weight: 500;
color: #1f2329;
padding-left: 10px;
margin-bottom: 4px;
}
.Notifititle::before {
position: absolute;
left: 0;
top: 4px;
height: 16px;
width: 0;
content: "";
border-left: 2px solid #3370ff;
}
.Notificat-item {
padding: 16px 0;
border-bottom: 1px solid rgba(187, 191, 196, .2);
display: -ms-flexbox;
display: flex;
-ms-flex-align: center;
align-items: center;
}
.Notificat_Inner {
font-size: 14px;
line-height: 22px;
color: #1f2329;
margin-bottom: 2px;
}
.Notify_innerTwo {
font-size: 12px;
line-height: 18px;
color: #8f959e;
}
.Notify_Edit {
cursor: pointer;
color: #3370ff;
}
</style>
<template>
<div>
<div class="page-content">
<div class="remindOne">
<div class="Notifititle">提醒全体成员</div>
<div>
<div class="Notificat-item">
<div style="flex:1">
<div class="Notificat_Inner">填写 OKR(仅未填写的)</div>
<div class="Notify_innerTwo" v-if="dataList&&dataList.length>0">
提醒时间:周期开始后第 {{dataList[0].Days}} 个工作日 {{dataList[0].Time}}
<span class="Notify_Edit" @click="updateTime(dataList[0])">修改</span>
</div>
</div>
<div>
<template v-if="dataList&&dataList.length>0">
<q-toggle size="md" color="primary" @input="getEnable(1)" v-model="dataList[0].Enable" :false-value="2" :true-value="1" />
</template>
</div>
</div>
<div class="Notificat-item" style="border:0;">
<div style="flex:1">
<div class="Notificat_Inner">给 OKR 打分(仅未打分的)</div>
<div class="Notify_innerTwo" v-if="dataList&&dataList.length>0">
提醒时间:周期结束前第 {{dataList[1].Days}} 个工作日 {{dataList[1].Time}}
<span class="Notify_Edit" @click="updateTime(dataList[1])">修改</span>
</div>
</div>
<div>
<template v-if="dataList&&dataList.length>0">
<q-toggle size="md" color="primary" @input="getEnable(2)" v-model="dataList[1].Enable" :false-value="2" :true-value="1" />
</template>
</div>
</div>
</div>
</div>
<div class="remindOne">
<div class="Notifititle">提醒管理者</div>
<div>
<div class="Notificat-item">
<div style="flex:1">
<div class="Notificat_Inner">查看下级 OKR 填写情况(仅有下级未填写的)</div>
<div class="Notify_innerTwo" v-if="dataList&&dataList.length>0">
提醒时间:周期开始后第 {{dataList[2].Days}} 个工作日 {{dataList[2].Time}}
<span class="Notify_Edit" @click="updateTime(dataList[2])">修改</span>
</div>
</div>
<div>
<template v-if="dataList&&dataList.length>0">
<q-toggle size="md" color="primary" @input="getEnable(3)" v-model="dataList[2].Enable" :false-value="2" :true-value="1" />
</template>
</div>
</div>
<div class="Notificat-item" style="border:0;">
<div style="flex:1">
<div class="Notificat_Inner">查看下级 OKR 打分情况(仅有下级未打分的)</div>
<div class="Notify_innerTwo" v-if="dataList&&dataList.length>0">
提醒时间:周期结束前第 {{dataList[3].Days}} 个工作日 {{dataList[3].Time}}
<span class="Notify_Edit" @click="updateTime(dataList[3])">修改</span>
</div>
</div>
<div>
<template v-if="dataList&&dataList.length>0">
<q-toggle size="md" color="primary" @input="getEnable(4)" v-model="dataList[3].Enable" :false-value="2" :true-value="1" />
</template>
</div>
</div>
</div>
</div>
<remindtime-form v-if="isShowsetForm" @close="closeruleset" :save-obj="setObj" @success="refreshRule">
</remindtime-form>
</div>
</div>
</template>
<script>
import {
GetOKRRemindList,
SetOKRRemindEnable
} from '../../api/okr/index';
import remindtimeForm from '../../components/okr/remindtime-form';
export default {
meta: {
title: "提醒设置"
},
components: {
remindtimeForm
},
data() {
return {
dataList: [],
isShowsetForm:false,
setObj:{}
}
},
created() {},
mounted() {
this.getList();
},
methods: {
//获取数据
getList() {
GetOKRRemindList({}).then(res => {
if (res.Code == 1) {
this.dataList = res.Data;
}
})
},
//点击切换
getEnable(type){
let msg = {
Type:type
}
SetOKRRemindEnable(msg).then(res => {
if (res.Code == 1) {
this.getList();
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
timeout: 2000,
message: '修改成功!',
position: 'top'
})
}
})
},
//关闭弹窗
closeruleset(){
this.isShowsetForm=false;
},
//修改成功回调
refreshRule(){
this.getList();
},
//修改
updateTime(obj){
this.setObj=obj;
this.isShowsetForm=true;
}
}
}
</script>
<style>
.w400 {
width: 400px !important;
}
/* .el-select-dropdown__item{
min-width: 400px;
} */
.el-picker-panel{
z-index: 9999!important;
}
</style>
<template>
<q-dialog v-model="persistent" persistent content-class="bg-grey-1" transition-show="scale" transition-hide="scale">
<q-card style="max-width:600px;width:600px;" class="remind_Dialog">
<q-card-section>
<div class="text-h6">修改提醒时间</div>
</q-card-section>
<q-card-section class="q-pt-none scroll" style="max-height: 70vh">
<div class="row wrap">
<div class="col-12">
周期结束前第
<q-select class="q-pb-lg" style="width:400px;display:inline-block;" multiple filled stack-label use-input
use-chips option-value="Id" option-label="Name" v-model="daysOne" ref="ManagerId" :options="optionList"
:dense="false" emit-value map-options>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
未找到相关数据
</q-item-section>
</q-item>
</template>
</q-select>
个工作日
</div>
</div>
<div class="row wrap">
<div class="col-12" style="margin-bottom:50px;">
<span style="margin:0 5px 0 55px;">时间</span>
<el-time-select v-model="msg.Time" class="w400" :picker-options="{
start: '00:00',
step: '00:15',
end: '23:59'
}" placeholder="选择时间">
</el-time-select>
</div>
</div>
</q-card-section>
<q-card-actions align="right" class="bg-white">
<q-btn label="取消" flat color="grey-10" style="font-weight:400 !important" @click="closeRuleForm" />
<q-btn label="保存" color="accent q-px-md" style="font-weight:400 !important" @click="saveRule" />
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script>
import {
SetOKRRemindInfo
} from '../../api/okr/index'
export default {
props: {
saveObj: {
type: Object,
default: null,
}
},
data() {
return {
persistent: true,
msg: {
Id: 0,
Days: '',
Time: '',
Type: 1
},
optionList: [{
Id: 1,
Name: 1
}, {
Id: 2,
Name: 2
}, {
Id: 3,
Name: 3
}, {
Id: 4,
Name: 4
}, {
Id: 5,
Name: 5
}, {
Id: 6,
Name: 6
}, {
Id: 7,
Name: 7
}, {
Id: 8,
Name: 8
}, {
Id: 9,
Name: 9
}, {
Id: 10,
Name: 10
}, {
Id: 11,
Name: 11
}, {
Id: 12,
Name: 12
}, {
Id: 13,
Name: 13
}, {
Id: 14,
Name: 14
}, {
Id: 15,
Name: 15
}, {
Id: 16,
Name: 16
}, {
Id: 17,
Name: 17
}, {
Id: 18,
Name: 18
}, {
Id: 19,
Name: 19
}, {
Id: 20,
Name: 20
}],
daysOne: [],
}
},
computed: {},
mounted() {
console.log(this.saveObj,'saveObj');
this.msg.Id = this.saveObj.Id;
this.daysOne = this.saveObj.Days.split(',');
this.msg.Time = this.saveObj.Time;
this.msg.Type = this.saveObj.Type;
},
methods: {
//取消
closeRuleForm() {
this.$emit('close');
this.persistent = false
},
//保存信息
saveRule() {
if(this.daysOne&&this.daysOne.length>0){
this.msg.Days= this.daysOne.join(',');
}
SetOKRRemindInfo(this.msg).then(res => {
if (res.Code == 1) {
this.$emit('success');
this.closeRuleForm();
}
})
},
},
}
</script>
<template>
<div class="page-body">
<div class="page-search row items-center">
<div class="col row wrap q-mr-lg q-col-gutter-md">
<div class="col-3">
<q-input @change="research" clearable standout="bg-primary text-white" v-model="msg.RuleName" label="规则名称"
@clear="research" maxlength="20" />
</div>
</div>
</div>
<div class="page-content">
<q-table :pagination="msg" :loading="loading" no-data-label="暂无相关数据" flat class="sticky-column-table"
separator="none" :data="dataList" :columns="columns" row-key="name">
<template v-slot:top="props">
<div class="col-2 q-table__title">OKR规则模板</div>
<q-space />
<div class="page-option">
<q-btn color="accent" size="sm" class="q-mr-md" icon="add" @click="addModule(null)" label="新增模板" />
</div>
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="msg.PageIndex" color="primary" :max="pageCount"
:input="true" @input="changePage" />
</template>
<template v-slot:body-cell-optioned="props">
<q-td :props="props" style="width:200px;">
<q-btn flat size="xs" icon="edit" color="red" v-if="props.row.Enable==1" style="font-weight:400"
@click="getStart(props.row,2)" label="停用" />
<q-btn flat size="xs" icon="edit" color="secondary" v-if="props.row.Enable==2" style="font-weight:400"
@click="getStart(props.row,1)" label="启用" />
<q-btn flat size="xs" icon="edit" color="negative" style="font-weight:400" @click="delOkrModule(props.row)"
label="删除" />
<q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" @click="addModule(props.row)"
label="编辑" />
</q-btn>
</q-td>
</template>
</q-table>
<ruleseteditForm v-if="isShowsetForm" @close="closeruleset" :save-obj="ruleObj" @success="refreshRule">
</ruleseteditForm>
</div>
</div>
</template>
<script>
import {
GetOKRRulePageList,
SetOKRRuleState
} from '../../api/okr/index';
import ruleseteditForm from '../../components/okr/rulesetedit-form';
export default {
meta: {
title: "规则设置"
},
components: {
ruleseteditForm
},
data() {
return {
pageCount: 0,
msg: {
PageIndex: 1,
PageSize: 12,
rowsPerPage: 12,
RuleName: '', //规则名称
Enable: 0 //是否启用 1是 2否 0不限
},
loading: false,
isShowsetForm: false,
ruleObj: {}, //传入参数
columns: [{
name: 'RuleName',
label: '规则名称',
field: 'RuleName',
align: 'left'
},
{
name: 'DataBase',
label: '关联库',
field: 'DataBase',
align: 'left',
},
{
name: 'Table',
label: '关联表',
field: 'Table',
align: 'left',
},
{
name: 'Field',
label: '关键字段',
field: 'Field',
align: 'left'
},
{
name: 'Way',
label: '计算方式',
field: 'Way',
align: 'left'
},
{
name: 'Identity',
label: '身份字段',
field: 'Identity',
align: 'left'
},
{
name: 'Time',
label: '操作时间字段',
field: 'Time',
align: 'left'
},
{
name: 'Remark',
label: '规则备注',
field: 'Remark',
align: 'left'
},
{
name: 'optioned',
label: '操作',
field: 'QuestionId'
}
],
dataList: [],
}
},
created() {},
mounted() {
this.getList();
},
methods: {
changePage(val) {
this.msg.PageIndex = val;
this.getList();
},
//输入框改变
research() {
this.getList();
},
//获取数据
getList() {
GetOKRRulePageList(this.msg).then(res => {
if (res.Code == 1) {
this.dataList = res.Data.PageData;
this.pageCount = res.Data.PageCount;
}
})
},
//关闭弹窗
closeruleset() {
this.isShowsetForm = false;
},
//刷新列表
refreshRule() {
this.getList();
},
//1启用 2禁用 3删除
getStart(item, type) {
let msg = {
RuleId: item.Id,
Type: type
}
SetOKRRuleState(msg).then(res => {
if (res.Code == 1) {
this.getList();
}
})
},
//删除模板
delOkrModule(item) {
this.$q.dialog({
title: '提示信息',
message: '是否确定删除?',
cancel: true,
persistent: true,
ok: "确定",
cancel: "取消",
}).onOk(() => {
let msg = {
RuleId: item.Id,
Type: 3
}
SetOKRRuleState(msg).then(res => {
if (res.Code == 1) {
this.getList();
}
})
}).onCancel(() => {
});
},
//新增模板吧
addModule(obj) {
if (obj) {
this.ruleObj = obj
} else {
this.ruleObj = null
}
this.isShowsetForm = true
}
}
}
</script>
<style lang="sass">
@import url('~assets/css/table.sass')
</style>
<template>
<q-dialog v-model="persistent" persistent content-class="bg-grey-1" transition-show="scale" transition-hide="scale">
<q-card style="width: 800px;max-width:800px;">
<q-card-section>
<div class="text-h6">{{(saveObj&&saveObj.Id>0)?"修改OKR规则模板":"新增OKR规则模板"}}</div>
</q-card-section>
<q-card-section class="q-pt-none scroll" style="max-height: 70vh">
<div class="row wrap">
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="msg.RuleName" ref="RuleName"
class="col-6 q-pr-lg q-pb-lg" label="规则名称" :rules="[val => !!val || '请填写规则名称']" />
</div>
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="msg.DataBase" ref="DataBase"
class="col-6 q-pb-lg" label="关联数据库" :rules="[val => !!val || '请填写关联数据库']" />
</div>
</div>
<div class="row wrap">
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="msg.Table" ref="Table"
class="col-6 q-pr-lg q-pb-lg" label="关联表" :rules="[val => !!val || '请填写关联表']" />
</div>
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="msg.Field" ref="Field"
class="col-6 q-pb-lg" label="关联字段" :rules="[val => !!val || '请填写关联字段']"/>
</div>
</div>
<div class="row wrap">
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="msg.Identity" ref="Identity"
class="col-6 q-pr-lg q-pb-lg" label="身份字段" :rules="[val => !!val || '请填身份字段']" />
</div>
<div class="col-6">
<q-select filled stack-label option-value="Id" option-label="Name" v-model="msg.Way" ref="Way"
:options="EnumList" label="关机数据计算方式" :dense="false" :rules="[val => !!val || '请选择关机数据计算方式']" class="col-6 q-pb-lg" emit-value map-options />
</div>
</div>
<div class="row wrap">
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="msg.Time" ref="Time"
class="col-6 q-pr-lg q-pb-lg" label="操作周期字段" :rules="[val => !!val || '请填写操作周期字段']" />
</div>
<div class="col-6">
<q-input filled stack-label maxlength="20" :dense="false" v-model="msg.State" ref="State"
class="col-6 q-pb-lg" label="状态字段" :rules="[val => !!val || '请输入状态字段']" />
</div>
</div>
<div class="row wrap">
<div class="col-12">
<q-input filled stack-label maxlength="20" :dense="false" v-model="msg.Remark" ref="Remark"
class="col-6 q-pb-lg" label="规则备注" />
</div>
</div>
<div class="row wrap">
<div class="col-6">
<q-toggle size="md" label="是否启用" color="primary" :false-value="2" :true-value="1" v-model="msg.Enable" />
</div>
</div>
</q-card-section>
<q-card-actions align="right" class="bg-white">
<q-btn label="取消" flat color="grey-10" style="font-weight:400 !important" @click="closeRuleForm" />
<q-btn label="保存" color="accent q-px-md" style="font-weight:400 !important" @click="saveRule" />
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script>
import {
SetOKRRuleInfo,
GetRuleTypeEnumList
} from '../../api/okr/index'
export default {
props: {
saveObj: {
type: Object,
default: null
}
},
data() {
return {
msg: {
Id: 0,
RuleName: "", //规则名称
DataBase: '', //数据库
Table: '', //表名
Field: '', //统计字段
Way: '', //方式
State: '', //状态字段
Identity: '', //身份字段
Time: '', //操作时间
Remark: '', //备注
Enable: 1, //是否启用
},
persistent: true,
EnumList: [], //枚举数据
}
},
computed: {},
created() {},
mounted() {
if (this.saveObj && this.saveObj.Id > 0) {
this.msg.Id = this.saveObj.Id;
this.msg.RuleName = this.saveObj.RuleName;
this.msg.DataBase = this.saveObj.DataBase;
this.msg.Table = this.saveObj.Table;
this.msg.Field = this.saveObj.Field;
this.msg.Way = this.saveObj.Way;
this.msg.State = this.saveObj.State;
this.msg.Identity = this.saveObj.Identity;
this.msg.Time = this.saveObj.Time;
this.msg.Remark = this.saveObj.Remark;
this.msg.Enable = this.saveObj.Enable;
}
this.getRuleTypeEnumList();
},
methods: {
//保存信息
saveRule() {
this.$refs.RuleName.validate();
this.$refs.DataBase.validate();
this.$refs.Table.validate();
this.$refs.Field.validate();
this.$refs.State.validate();
this.$refs.Identity.validate();
this.$refs.Time.validate();
this.$refs.Way.validate();
if (!this.$refs.RuleName.hasError &&
!this.$refs.DataBase.hasError &&
!this.$refs.Table.hasError &&
!this.$refs.Field.hasError &&
!this.$refs.State.hasError &&
!this.$refs.Identity.hasError &&
!this.$refs.Time.hasError&&
!this.$refs.Way.hasError) {
SetOKRRuleInfo(this.msg).then(res => {
if (res.Code == 1) {
this.$emit('success');
this.closeRuleForm();
}
})
}
},
//获取规则方式枚举
getRuleTypeEnumList() {
GetRuleTypeEnumList({}).then(res => {
if (res.Code == 1) {
this.EnumList = res.Data;
}
})
},
//关闭窗口
closeRuleForm() {
this.$emit('close');
this.persistent = false
}
},
}
</script>
<style>
.scoreSetForm .scoreRemind {
display: flex;
justify-content: space-between;
align-items: center;
}
.scoreSetForm .scoreTitle {
color: #F72E52;
font-size: 12px;
}
.scoreSetForm .rule_list {
width: 100%;
height: auto;
}
.scoreSetForm .score_Top {
height: 30px;
background-color: #EEEEEF;
font-size: 12px;
padding: 5px 20px;
}
.scoreSetForm .score_Tname {
color: #2D2D2D;
font-weight: bold;
}
.scoreSetForm .score_IconList span {
display: inline-block;
margin-right: 20px;
color: #2961FE;
cursor: pointer;
}
.scoreSetForm .score_IconList span i {
margin-right: 5px;
}
.scoreSetForm .score_IconList span:last-child {
margin-right: 0;
}
.scoreSetForm .rule_InnerList {
min-height: 60px;
padding: 0 20px;
border-bottom: 1px solid #F4F4F4;
}
.scoreSetForm .rule_Item {
display: inline-block;
margin: 10px 30px 10px 0;
}
.scoreSetForm .rule_comback {
width: 60px;
height: 20px;
background-color: #EEEEEF;
color: #2D2D2D;
text-align: center;
line-height: 20px;
margin-top: 5px;
font-size: 12px;
}
.scoreSetForm .score_Num {
display: inline-block;
position: relative;
top: -26px;
}
.scoreSetForm .isDefaultColor{
color:#A1AAB2!important;
}
</style>
<template>
<div class="scoreSetForm">
<div class="scoreRemind" style="margin-bottom:20px;">
<div class="scoreTitle">
<i class="iconfont icon-tishi" style="position:relative;top:1px;"></i>
系统按照OKR规则默认采用0-1(0.1,0.2,0.3.....)的分数制度,若采用新的分数制度,必须满足0-1规则。否则,无法保存规则信息
</div>
<div>
<q-btn color="accent" size="sm" class="q-mr-md" icon="add" label="新增分数规则" @click="addScoreRull(null)" />
</div>
</div>
<div class="rule_list" v-for="(item,index) in dataList" :key="index">
<div class="scoreRemind score_Top">
<div class="score_Tname">{{item.Name}}</div>
<div class="score_IconList">
<span @click="setDefault(item)" v-if="item.IsDefault==2" class="isDefaultColor"><i class="iconfont icon-dagou"></i>默认</span>
<span @click="setDefault(item)" v-else><i class="iconfont icon-dagou"></i>默认</span>
<span @click="addScoreRull(item)"><i class="iconfont icon-edit"></i>编辑</span>
<span @click="delRuleList(item)"><i class="iconfont icon-shanchu"></i>删除</span>
</div>
</div>
<div class="rule_InnerList">
<div class="rule_Item" v-for="(subItem,subIndex) in item.DetailList" :key="subIndex">
<div class="score_Num" :style="{'color':subItem.Color}">分数{{subIndex+1}}</div>
<div style="display:inline-block;">
<div :style="{'color':subItem.Color}">{{subItem.Name}}</div>
<div class="rule_comback">{{subItem.ScoreMin}}-{{subItem.ScoreMax}}</div>
</div>
</div>
</div>
</div>
<scoreset-form v-if="isShowScoreSet" :save-obj="scoreObj" @close="closeScoreForm" @success="refreshPage">
</scoreset-form>
</div>
</template>
<script>
import {
GetOKRScoreConfigPageList,
SetOKRScoreConfigState,
} from '../../api/okr/index';
import scoresetForm from '../../components/okr/scoreset-form';
export default {
meta: {
title: ""
},
components: {
scoresetForm
},
data() {
return {
msg: {
PageIndex: 1,
PageSize: 12,
Name: ''
},
isShowScoreSet: false,
scoreObj: {},
dataList: [],
}
},
mounted() {
this.getList();
},
methods: {
//获取okr配置信息
getList() {
GetOKRScoreConfigPageList(this.msg).then(res => {
if (res.Code == 1) {
this.dataList = res.Data.PageData;
}
})
},
//新增分数规则
addScoreRull(obj) {
if (obj) {
this.scoreObj = obj;
} else {
this.scoreObj = null;
}
this.isShowScoreSet = true;
},
//关闭流程设置
closeScoreForm() {
this.isShowScoreSet = false;
},
refreshPage() {
this.getList();
},
//删除分数规则
delRuleList(item) {
this.$q.dialog({
title: '提示信息',
message: '是否确定删除?',
cancel: true,
persistent: true,
ok: "确定",
cancel: "取消",
}).onOk(() => {
let msg = {
ScoreId: item.Id,
Type: 2
}
SetOKRScoreConfigState(msg).then(res => {
if (res.Code == 1) {
this.getList();
}
})
}).onCancel(() => {
});
},
//设为默认
setDefault(item) {
let msg = {
ScoreId: item.Id,
Type: 1
}
SetOKRScoreConfigState(msg).then(res => {
if (res.Code == 1) {
this.getList();
}
})
}
}
}
</script>
<style>
.scoresetForm .scoreForm_List {
width: 100%;
min-height: 80px;
background-color: #F7F7F7;
padding: 15px;
}
.scoresetForm .score_MyNum {
margin-bottom: 10px;
display: flex;
justify-content: space-between;
align-items: center;
}
.scoresetForm .addScoreBtn {
width: 100%;
height: 40px;
border: 1px dashed #2961FE;
text-align: center;
line-height: 40px;
margin-top: 20px;
color: #2961FE;
cursor: pointer;
}
.scoresetForm .scoreIlist:hover {
color: red;
}
.scoresetForm .scoreContent {
max-height: 450px;
}
</style>
<template>
<q-dialog v-model="persistent" persistent content-class="bg-grey-1" transition-show="scale" transition-hide="scale">
<q-card style="width: 700px;max-width:700px;" class="scoresetForm">
<q-card-section>
<div class="text-h6">{{(saveObj&&saveObj.Id>0)?"修改分数规则":"新增分数规则"}}</div>
</q-card-section>
<q-card-section class="q-pt-none scroll" style="max-height: 70vh">
<div class="row wrap scoreContent">
<div class="col-12">
<q-input filled stack-label maxlength="20" :dense="false" v-model="msg.Name" ref="Name"
class="col-12 q-pb-lg" label="规则名称" :rules="[val => !!val || '请填写规则名称']" />
</div>
<div class="col-12">
<div class="scoreForm_List" v-for="(item,index) in msg.DetailList" :key="index" style="margin-bottom:10px;">
<div class="score_MyNum">
<div>分数{{index+1}}</div>
<div style="cursor:pointer;">
<i class="iconfont icon-shanchu scoreIlist" @click="delDeailList(index)"></i>
</div>
</div>
<div>
<el-input style="width:300px;display:inline-block;" v-model="item.Name" placeholder="分数名称"></el-input>
<el-input style="width:90px;display:inline-block;margin-left:20px;"
@keyup.native="checkPrice(item,'ScoreMin')" v-model="item.ScoreMin" placeholder="最小分数"></el-input>
<el-input style="width:90px;display:inline-block;margin-left:20px;"
@keyup.native="checkPrice(item,'ScoreMax')" v-model="item.ScoreMax" placeholder="最大分数"></el-input>
<el-select :ref="'colorSelect'+index" placeholder="" v-model="item.Color"
style="width: 70px;display:inline-block;margin-left:20px;" @change="handleChange(item.Color,index)">
<el-option v-for="item in colorList" :key="item" label=" " :value="item"
v-html="'<div style=background-color:'+ item+';width:' +'25px'+';height:'+'25px'+';border-radius:'+'50%'+'></div>'">
</el-option>
</el-select>
</div>
</div>
</div>
<div class="addScoreBtn" @click="addScoreList()">+新增分数</div>
</div>
</q-card-section>
<q-card-actions align="right" class="bg-white">
<q-btn label="取消" flat color="grey-10" style="font-weight:400 !important" @click="closeScoreForm" />
<q-btn label="保存" color="accent q-px-md" style="font-weight:400 !important" @click="saveScore" />
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script>
import {
SetOKRScoreConfigInfo
} from '../../api/okr/index'
export default {
props: {
saveObj: {
type: Object,
default: null
}
},
data() {
return {
msg: {
Id: 0,
Name: '', //规则名称
DetailList: [{
Name: '', //分数名称
ScoreMin: '', //最小分数
ScoreMax: '', //最大分数
Color: '' //颜色
}],
},
myColor: '',
colorList: ["#F72E52", "#FA9595", "#ED3AC5", "#F28C1D", "#8175FB", "#FEB528", "#2961FE", "#3FC4FF", "#51BDA5",
"#08D220"
],
persistent: true
}
},
computed: {},
created() {
// if (this.color && this.color.length > 0) {
// this.myColor = this.color;
// this.setSelectColor(this.color)
// }
},
mounted() {
if (this.saveObj && this.saveObj.Id > 0) {
this.msg.Id = this.saveObj.Id;
this.msg.Name = this.saveObj.Name;
this.msg.DetailList = this.saveObj.DetailList;
this.msg.DetailList.forEach((x, index) => {
this.setSelectColor(x.Color, index);
})
}
},
methods: {
//设置颜色选择框中颜色
setSelectColor(color, index) {
let str = `colorSelect${index}`;
this.$nextTick(() => {
let dom = this.$refs[str][0];
if (dom) {
dom = dom.$el.children[0];
let inputDom = dom.querySelectorAll(".el-input__inner");
let icon = dom.querySelectorAll(".el-input__icon");
inputDom[0].style["background-color"] = color;
icon[0].style["color"] = "black";
}
})
},
//关闭天窗
closeScoreForm() {
this.$emit('close');
this.persistent = false;
},
handleChange(val, index) {
this.setSelectColor(val, index);
//触发update事件更新父组件绑定值
this.$emit('update', val);
},
//保存
saveScore() {
for (let i = 0; i < this.msg.DetailList.length; i++) {
if (this.msg.DetailList[i].Name == '') {
this.$q.notify({
type: 'negative',
position: "top",
message: `请填写第${i+1}分数名称`
})
return;
}
if (this.msg.DetailList[i].ScoreMin == '') {
this.$q.notify({
type: 'negative',
position: "top",
message: `请填写第${i+1}最小分数`
})
return;
}
if (this.msg.DetailList[i].ScoreMax == '') {
this.$q.notify({
type: 'negative',
position: "top",
message: `请填写第${i+1}最大分数`
})
return;
}
}
SetOKRScoreConfigInfo(this.msg).then(res => {
if (res.Code == 1) {
this.$emit('success');
this.closeScoreForm();
}
})
},
//新增分数
addScoreList() {
let obj = {
Name: '', //分数名称
ScoreMin: '', //最小分数
ScoreMax: '', //最大分数
Color: '' //颜色
}
this.msg.DetailList.push(obj);
},
//删除分数
delDeailList(index) {
this.msg.DetailList.splice(index, 1);
}
},
}
</script>
...@@ -5,8 +5,11 @@ ...@@ -5,8 +5,11 @@
<div class="text-h6">{{(questionBankObj&&questionBankObj.BankId>0)?"修改题库":"创建题库"}}</div> <div class="text-h6">{{(questionBankObj&&questionBankObj.BankId>0)?"修改题库":"创建题库"}}</div>
</q-card-section> </q-card-section>
<q-card-section class="q-pt-none scroll" style="max-height: 70vh"> <q-card-section class="q-pt-none scroll" style="max-height: 70vh">
<q-input filled stack-label :dense="false" class="col-6 q-pb-lg" ref="BankName" v-model="msg.BankName" label="请输入题库名称" <q-input filled stack-label :dense="false" class="col-6 q-pb-lg" ref="BankNo" v-model="msg.BankNo"
maxlength="20" :rules="[val => !!val || '请输入题库名称']" /> label="请输入题库序号" maxlength="20" :rules="[val => !!val || '请输入题库序号']" />
<q-input filled stack-label :dense="false" class="col-6 q-pb-lg" ref="BankName" v-model="msg.BankName"
label="请输入题库名称" maxlength="20" :rules="[val => !!val || '请输入题库名称']" />
</q-card-section> </q-card-section>
<q-card-actions align="right" class="bg-white"> <q-card-actions align="right" class="bg-white">
<q-btn label="取消" flat color="grey-10" style="font-weight:400 !important" @click="closeQuestionForm" /> <q-btn label="取消" flat color="grey-10" style="font-weight:400 !important" @click="closeQuestionForm" />
...@@ -25,7 +28,7 @@ ...@@ -25,7 +28,7 @@
props: { props: {
questionBankObj: { questionBankObj: {
type: Object, type: Object,
default:null default: null
} }
}, },
components: { components: {
...@@ -35,6 +38,7 @@ ...@@ -35,6 +38,7 @@
return { return {
msg: { msg: {
BankId: 0, BankId: 0,
BankNo: "", //题库序号
BankName: '', //题库名称 BankName: '', //题库名称
}, },
persistent: true persistent: true
...@@ -43,7 +47,7 @@ ...@@ -43,7 +47,7 @@
computed: {}, computed: {},
created() {}, created() {},
mounted() { mounted() {
this.initQuestionBank(); this.initQuestionBank();
}, },
methods: { methods: {
initQuestionBank() { initQuestionBank() {
...@@ -53,20 +57,22 @@ ...@@ -53,20 +57,22 @@
}).then(res => { }).then(res => {
if (res.Code == 1) { if (res.Code == 1) {
this.msg.BankId = res.Data.BankId; this.msg.BankId = res.Data.BankId;
this.msg.BankNo = res.Data.BankNo;
this.msg.BankName = res.Data.BankName; this.msg.BankName = res.Data.BankName;
} }
}) })
} else { } else {
this.msg.BankId = 0; this.msg.BankId = 0;
this.msg.BankNo = "";
this.msg.BankName = ""; this.msg.BankName = "";
} }
}, },
//创建 //创建
saveQuestion() { saveQuestion() {
this.$refs.BankName.validate() this.$refs.BankName.validate()
if(!this.$refs.BankName.hasError){ if (!this.$refs.BankName.hasError) {
SetQuestionBank(this.msg).then(res => { SetQuestionBank(this.msg).then(res => {
if (res.Code==1) { if (res.Code == 1) {
this.$emit('success'); this.$emit('success');
this.closeQuestionForm(); this.closeQuestionForm();
} }
......
...@@ -54,7 +54,25 @@ ...@@ -54,7 +54,25 @@
<q-space /> <q-space />
<div class="page-option"> <div class="page-option">
<q-btn color="accent" size="sm" class="q-mr-md" icon="add" label="新增题目" @click="EditQuestion(null)" /> <q-btn color="accent" size="sm" class="q-mr-md" icon="add" label="新增题目" @click="EditQuestion(null)" />
<!-- <q-btn color="accent" size="sm" class="q-mr-md" icon="add" label="批量设置考级程度" @click="SetBatchLevelType" /> --> <q-btn color="accent" size="sm" class="q-mr-md" icon="add" label="批量设置" title="批量设置考级程度"
@click="isShowEdit=true">
<q-popup-proxy>
<q-banner v-if="isShowEdit">
<div class="calenderDialog">
<div style="margin:10px 0 15px 0;">设置考级程度</div>
<q-select standout="bg-primary text-white" option-value="Id" option-label="Name"
v-model="levelTypeMsg.LevelType" :options="questionLevalTypeList" emit-value map-options
label="考级程度" />
<q-card-actions align="right" class="bg-white">
<q-btn label="取消" flat color="grey-10" @click="isShowEdit=false"
style="font-weight:400 !important" />
<q-btn label="确认" color="accent q-px-md" style="font-weight:400 !important"
@click="SetBatchLevelType()" />
</q-card-actions>
</div>
</q-banner>
</q-popup-proxy>
</q-btn>
<q-btn-dropdown color="accent" label="批量导入" size="sm" class="q-mr-md" style="margin-left:5px;"> <q-btn-dropdown color="accent" label="批量导入" size="sm" class="q-mr-md" style="margin-left:5px;">
<q-list> <q-list>
<q-item clickable v-close-popup> <q-item clickable v-close-popup>
...@@ -113,7 +131,9 @@ ...@@ -113,7 +131,9 @@
queryDifficultyType, queryDifficultyType,
queryQuestionCategory, queryQuestionCategory,
setQuestionSort, setQuestionSort,
CopyQuestion CopyQuestion,
queryQuestionLevelType,
saveBatchQuestionLevel
} from '../../api/question/question'; } from '../../api/question/question';
import questionForm from '../question/question-form'; import questionForm from '../question/question-form';
import questionUpload from '../question/question-upload'; import questionUpload from '../question/question-upload';
...@@ -210,6 +230,11 @@ ...@@ -210,6 +230,11 @@
isShowImportUpload: false, //是否显示导入模板 isShowImportUpload: false, //是否显示导入模板
questionCategoryList: [], //问题分类 questionCategoryList: [], //问题分类
selectedQuestion: [], //选中的数组 selectedQuestion: [], //选中的数组
isShowEdit: false, //是否显示弹窗
questionLevalTypeList: [], //问题考级程度列表
levelTypeMsg: {
LevelType: 0,
}
} }
}, },
created() { created() {
...@@ -222,11 +247,24 @@ ...@@ -222,11 +247,24 @@
this.getQuestionType(); this.getQuestionType();
this.getDifficultyType(); this.getDifficultyType();
this.getQuestionCategory(); this.getQuestionCategory();
this.getQuestionLevelType();
}, },
mounted() { mounted() {
this.getQuestionList(); this.getQuestionList();
}, },
methods: { methods: {
//获取问题考级程度
getQuestionLevelType() {
queryQuestionLevelType().then(res => {
var tempData = res.Data;
var obj = {
Name: '请选择',
Id: 0
}
tempData.unshift(obj);
this.questionLevalTypeList = tempData;
})
},
//获取问题大类 //获取问题大类
getQuestionCategory() { getQuestionCategory() {
queryQuestionCategory().then(res => { queryQuestionCategory().then(res => {
...@@ -261,9 +299,29 @@ ...@@ -261,9 +299,29 @@
}, },
//批量设置考级程度 //批量设置考级程度
SetBatchLevelType() { SetBatchLevelType() {
console.log("selectedQuestion", this.selectedQuestion);
if (this.selectedQuestion && this.selectedQuestion.length > 0) { if (this.selectedQuestion && this.selectedQuestion.length > 0) {
var levelMsg = {
LevelType: this.levelTypeMsg.LevelType,
questionIds: [],
};
this.selectedQuestion.forEach(item => {
levelMsg.questionIds.push(item.QuestionId)
})
saveBatchQuestionLevel(levelMsg).then(res => {
if (res.Code == 1) {
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
timeout: 2000,
message: '设置成功!',
position: 'top'
})
this.getQuestionList();
this.isShowEdit = false;
this.selectedQuestion = [];
this.levelTypeMsg.LevelType = 0;
}
})
} else { } else {
this.$q.notify({ this.$q.notify({
icon: 'iconfont icon-chenggong', icon: 'iconfont icon-chenggong',
......
...@@ -33,12 +33,12 @@ ...@@ -33,12 +33,12 @@
<span style="width:10%">{{item.Age}}</span> <span style="width:10%">{{item.Age}}</span>
<span style="width:20%">{{item.Mobile}}</span> <span style="width:20%">{{item.Mobile}}</span>
<span style="width:20%"> <span style="width:20%">
<template v-if="item.ClassHours">已学:{{item.ClassHours}}课时</template> <template v-if="item.ClassHours">已学:{{item.ClassHours}}课时 </template>
</span> </span>
<span style="width:10%">{{item.GuestStateStr}}</span> <span style="width:10%">{{item.GuestStateStr}}</span>
<span style="width:20%;" class="guest_Status"> <span style="width:20%;" class="guest_Status">
<span v-if="item.GuestState==1" @click="clickItem(item,1)">申请</span> <span v-if="item.GuestState==1" @click="clickItem(item,1)">申请</span>
<span style="margin-left:10px;" v-if="item.AuditStatus==3" @click="clickItem(item,2)">重新申请</span> <span style="margin-left:10px;" v-if="item.GuestState==4" @click="clickItem(item,2)">重新申请</span>
<span style="margin-left:10px;" v-if="chooseItem&&chooseItem.Id==item.Id" @click="cancelApply">取消申请</span> <span style="margin-left:10px;" v-if="chooseItem&&chooseItem.Id==item.Id" @click="cancelApply">取消申请</span>
</span> </span>
</div> </div>
......
...@@ -292,7 +292,6 @@ ...@@ -292,7 +292,6 @@
methods:{ methods:{
getList() { getList() {
getClassLessPlan(this.msg).then(res => { getClassLessPlan(this.msg).then(res => {
console.log(res, '数据来了');
if (res.Code == 1) { if (res.Code == 1) {
this.data = res.Data this.data = res.Data
} }
......
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
<div class="page-search row items-center"> <div class="page-search row items-center">
<div class="col row wrap q-mr-lg q-col-gutter-md"> <div class="col row wrap q-mr-lg q-col-gutter-md">
<div class="col-3"> <div class="col-3">
<q-input @change="research" clearable standout="bg-primary text-white" v-model="msg.BankName" <q-input @change="research" clearable standout="bg-primary text-white" v-model="msg.BankName" label="输入关键字查找"
label="输入关键字查找" @clear="research" maxlength="20" /> @clear="research" maxlength="20" />
</div> </div>
</div> </div>
</div> </div>
...@@ -30,8 +30,7 @@ ...@@ -30,8 +30,7 @@
<div class="col-2 q-table__title">题库列表</div> <div class="col-2 q-table__title">题库列表</div>
<q-space /> <q-space />
<div class="page-option"> <div class="page-option">
<q-btn color="accent" size="sm" class="q-mr-md" icon="add" @click="EditQuestion(null)" <q-btn color="accent" size="sm" class="q-mr-md" icon="add" @click="EditQuestion(null)" label="创建新题库" />
label="创建新题库" />
</div> </div>
</template> </template>
<template v-slot:body-cell-BankId="props"> <template v-slot:body-cell-BankId="props">
...@@ -56,15 +55,18 @@ ...@@ -56,15 +55,18 @@
</template> </template>
<template v-slot:body-cell-optioned="props"> <template v-slot:body-cell-optioned="props">
<q-td :props="props" style="width:200px;"> <q-td :props="props" style="width:200px;">
<q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" @click="EditQuestion(props.row)" label="编辑" /> <q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" @click="EditQuestion(props.row)"
label="编辑" />
<q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" @click="goQuestionList(props.row)" <q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" @click="goQuestionList(props.row)"
label="管理题目" /> label="管理题目" />
<q-btn flat size="xs" icon="edit" color="negative" style="font-weight:400" @click="deleteQuestionBank(props.row)" label="删除" /> <q-btn flat size="xs" icon="edit" color="negative" style="font-weight:400"
@click="deleteQuestionBank(props.row)" label="删除" />
</q-btn> </q-btn>
</q-td> </q-td>
</template> </template>
</q-table> </q-table>
<questionbank-form v-if="isShowQuestionBankForm" :questionBankObj="questionBankObj" @close="closeQuestionBank" @success="refreshQuestion"> <questionbank-form v-if="isShowQuestionBankForm" :questionBankObj="questionBankObj" @close="closeQuestionBank"
@success="refreshQuestion">
</questionbank-form> </questionbank-form>
</div> </div>
</div> </div>
...@@ -93,20 +95,25 @@ ...@@ -93,20 +95,25 @@
}, },
loading: false, loading: false,
isShowQuestionBankForm: false, isShowQuestionBankForm: false,
questionBankObj:null, //传入参数 questionBankObj: null, //传入参数
columns: [{ columns: [{
name: 'BankId', name: 'RowNum',
label: '号', label: '号',
field: 'BankId', field: 'RowNum',
align: 'left' align: 'left'
}, },
{
name: 'BankNo',
label: '题库序号',
field: 'BankNo',
align: 'left',
},
{ {
name: 'BankName', name: 'BankName',
label: '题库名称', label: '题库名称',
field: 'BankName', field: 'BankName',
align: 'left', align: 'left',
}, },
{ {
name: 'CreateByName', name: 'CreateByName',
label: '创建人', label: '创建人',
...@@ -159,13 +166,13 @@ ...@@ -159,13 +166,13 @@
this.getQuestionBankPage(); this.getQuestionBankPage();
}, },
//编辑题库 //编辑题库
EditQuestion(obj){ EditQuestion(obj) {
if(obj){ if (obj) {
this.questionBankObj = obj this.questionBankObj = obj
}else{ } else {
this.questionBankObj = null this.questionBankObj = null
} }
this.isShowQuestionBankForm=true this.isShowQuestionBankForm = true
}, },
//删除问题 //删除问题
deleteQuestionBank(item) { deleteQuestionBank(item) {
......
...@@ -108,9 +108,15 @@ ...@@ -108,9 +108,15 @@
label: '类型', label: '类型',
align: 'left' align: 'left'
}, },
{
name:'DeductionHour',
label:'基础课时',
field:'DeductionHour',
align:'left'
},
{ {
name: 'CourseHour', name: 'CourseHour',
label: '课时', label: '带班课时',
field: 'CourseHour', field: 'CourseHour',
align: 'left' align: 'left'
}, },
...@@ -138,6 +144,14 @@ ...@@ -138,6 +144,14 @@
field: 'TeacherName', field: 'TeacherName',
align: 'left' align: 'left'
}, },
{
name: 'DeductionHour',
field: 'DeductionHour',
required: true,
label: '基础课时',
align: 'left',
},
{ {
name: 'CourseHour', name: 'CourseHour',
field: 'CourseHour', field: 'CourseHour',
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
} }
._addChuNa_tit{color: gray;margin-bottom: 10px;} ._addChuNa_tit{color: gray;margin-bottom: 10px;}
._addChuNa_tit span{ color:#333333} ._addChuNa_tit span{ color:#333333}
</style> </style>
<template> <template>
<div class='flexOne page_CompanyAccDetail'> <div class='flexOne page_CompanyAccDetail'>
......
...@@ -63,7 +63,6 @@ ...@@ -63,7 +63,6 @@
font-size: 12px; font-size: 12px;
color: #c94052; color: #c94052;
} }
</style> </style>
<template> <template>
<div class='flexOne page_CompanyAccDetail'> <div class='flexOne page_CompanyAccDetail'>
......
<style>
</style>
<template>
<div class="page-body">
<q-tabs style="margin-bottom:20px;" v-model="tabCheck" @input="tabChange()" narrow-indicator dense align="left"
class="text-primary">
<q-tab :ripple="false" name="first" label="规则设置" />
<q-tab :ripple="false" name="second" label="基础设置" />
<q-tab :ripple="false" name="third" label="提醒设置" />
<q-tab :ripple="false" name="fourth" label="分数规则" />
</q-tabs>
<ruleset-form v-if="tabCheck=='first'"></ruleset-form>
<baseset-form v-if="tabCheck=='second'"></baseset-form>
<remind-form v-if="tabCheck=='third'"></remind-form>
<score-form v-if="tabCheck=='fourth'"></score-form>
</div>
</template>
<script>
import rulesetForm from '../../components/okr/ruleset-form';
import basesetForm from '../../components/okr/baseset-form';
import remindForm from '../../components/okr/remind-form';
import scoreForm from '../../components/okr/score-form';
export default {
meta: {
title: "OKR设置"
},
components: {
rulesetForm,
basesetForm,
remindForm,
scoreForm
},
data() {
return {
tabCheck: 'first',
}
},
mounted() {
},
methods: {
tabChange() {
},
}
}
</script>
<style lang="sass">
@import url('~assets/css/table.sass')
</style>
...@@ -92,6 +92,11 @@ const routes = [{ ...@@ -92,6 +92,11 @@ const routes = [{
component: () => component: () =>
import("pages/system/processSet.vue") import("pages/system/processSet.vue")
}, },
{
path: "/system/okrmanage", //OKR设置
component: () =>
import("pages/system/okrmanage.vue")
},
{ {
path: "/course/catagory", //课程分类 path: "/course/catagory", //课程分类
component: () => component: () =>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment