|
|
@@ -0,0 +1,2616 @@
|
|
|
+<template>
|
|
|
+ <div :class="[{ bg_fff: skeletonLoad }]">
|
|
|
+ <van-nav-bar :title="detailsTIt" left-arrow @click-left="routerBak">
|
|
|
+ <div v-if="!isDetails" slot="right" @click="handleClick()" style="color: #fff;">筛选<van-icon name="list-switch" /></div>
|
|
|
+ </van-nav-bar>
|
|
|
+ <div v-if="isDisabled && !graded" class="upDownList flex-box flex-d-center">
|
|
|
+ <div class="uDownBut font-flex-word" style="" v-for="(item, index) in headuDown" :key="index" @click="uDownCli(item)">
|
|
|
+ <span v-if="!item.id" style="color: #a2a2a2;">已无待办</span>
|
|
|
+ <span v-else>
|
|
|
+ <span v-if="item.keys == 1">{{ item.keys2 }}</span>
|
|
|
+ {{ item.keys1 }}:{{ item.name }}
|
|
|
+ <span v-if="item.keys == 2">{{ item.keys2 }}</span>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <template v-if="isDetails">
|
|
|
+ <VanSkeleton :skeLoad="skeletonLoad">
|
|
|
+ <div class="overall">
|
|
|
+ <scroller :isNeed="isNeed">
|
|
|
+ <div :style="isDisabled ? 'padding-bottom: 3rem;' : 'padding-bottom: 2rem;'">
|
|
|
+ <header>
|
|
|
+ <div class="flex-box-ce" style="position: relative;">
|
|
|
+ <userImage
|
|
|
+ class="about-me__avatar"
|
|
|
+ :id="Information.id"
|
|
|
+ :img_url="Information.img_url"
|
|
|
+ :user_name="Information.name"
|
|
|
+ fontSize=".28"
|
|
|
+ width=".75rem"
|
|
|
+ height=".75rem"
|
|
|
+ style="margin-top:.1rem;"
|
|
|
+ ></userImage>
|
|
|
+ <div style="padding:.1rem 0 0 .25rem; box-sizing: border-box;">
|
|
|
+ <span style="font-size:.28rem;color:black;">{{ Information.name }}</span>
|
|
|
+ <span v-if="okrs && okrs.length > 0" class="okr-tips" @click="goMyTarget">查看okr</span>
|
|
|
+ <br />
|
|
|
+ <span class="font-flex-word" style="width: 4.4rem;display:inline-block;" v-if="Information.employee_detail && Information.employee_detail.dept_list.length>0">
|
|
|
+ <span class="pdHeadDept" v-for="(arr, att) in Information.employee_detail.dept_list" :key="att">
|
|
|
+ {{ arr.dept_name }}
|
|
|
+ <span v-if="Information.employee_detail.dept_list.length - att > 1">,</span>
|
|
|
+ </span>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <img v-if="has_finish" class="guidang" src="static/images/guidang.png" />
|
|
|
+ </div>
|
|
|
+ <div v-if="titList.length > 0" style="border-top:1px solid #e0e0e0; padding: .25rem 0 0rem 0; margin: .25rem 0 0 0;" class="">
|
|
|
+ <van-row v-for="(list, arr) in titList" :key="arr" style="font-size:.29rem;padding:.1rem 0;" v-if="list.prop">
|
|
|
+ <van-col span="5" style="color:#757575;">{{ list.lab }}:</van-col>
|
|
|
+ <van-col span="19">
|
|
|
+ <div v-if="typeof list.prop == 'object'">
|
|
|
+ <div v-for="(data, sit) in list.prop" :key="sit">{{ data }}</div>
|
|
|
+ </div>
|
|
|
+ <span v-else v-html="list.prop" class="orange"></span>
|
|
|
+ </van-col>
|
|
|
+ </van-row>
|
|
|
+ </div>
|
|
|
+ </header>
|
|
|
+ <div>
|
|
|
+ <div class="modTit flex-box flex-d-center">
|
|
|
+ <span>绩效流程</span>
|
|
|
+ <van-checkbox icon-size=".28rem" v-model="checked" shape="square">查看更多</van-checkbox>
|
|
|
+ </div>
|
|
|
+ <div class="flexPopover" ref="refarrow">
|
|
|
+ <div class="flex_one flex-box flex-d-center" v-if="perfstepFlow[flexIndex - 1]" @click="flexDialog = true">
|
|
|
+ <div class="font-flex-word">
|
|
|
+ <span>{{ flexIndex }}. {{ perfstepFlow[flexIndex - 1].remark }}</span>
|
|
|
+ <span v-if="perfstepFlow[flexIndex - 1].target.length > 0">
|
|
|
+ <span v-for="(item, index) in perfstepFlow[flexIndex - 1].target" :key="index">
|
|
|
+ {{ item.employee_name }}
|
|
|
+ <span v-if="perfstepFlow[flexIndex - 1].target.length - index > 1">,</span>
|
|
|
+ </span>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <div><van-icon name="arrow-down" /></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 执行中 -->
|
|
|
+ <div v-for="(item, index) in inExecution" :key="index">
|
|
|
+ <div class="modTit">{{ item.theDimension }}</div>
|
|
|
+ <div class="modCont">
|
|
|
+ <div v-if="!item.totalScore" style="padding-bottom: .1rem;" class="flex-box flex-d-center">
|
|
|
+ <span style="font-size: .33rem;font-weight: bold;color: #303133;">
|
|
|
+ <span>{{ item.name }}</span>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <span v-for="(list, arr) in item.tabList" :key="arr" class="tab-List" v-if="list.prop">{{ list.prop }}</span>
|
|
|
+ <div v-if="initData(item.per_remark)" class="stanif">
|
|
|
+ <div class="stanTit">考核标准</div>
|
|
|
+ <div class="standara"><span class="standarapad line-feed" v-html="item.per_remark"></span></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 详情信息 -->
|
|
|
+ <div>
|
|
|
+ <div v-for="(list, arr) in item.details" :key="arr" class="flex-box" style="font-size:.29rem;padding:.1rem 0;" v-if="list.prop && list.prop != '0'">
|
|
|
+ <div style="color:#757575;">{{ list.lab }}:</div>
|
|
|
+ <div style="padding-left: 0.2rem;" class="flex-1">
|
|
|
+ <pre v-if="list.lab == '备注'" class="pre">{{ list.prop }}</pre>
|
|
|
+ <div v-else-if="list.lab == '结果值附件'">
|
|
|
+ <div class="flex-box-ce" style="margin: 10px 0;" v-if="list.prop.images.length>0">
|
|
|
+ <van-image @click="openImg(list.prop.images,imgIndex)" v-for="(e,imgIndex) in list.prop.images" :key="imgIndex" style="border-radius: 3px;margin-right: 10px;" width="70" height="70" :src="e.url"/>
|
|
|
+ </div>
|
|
|
+ <div class="flex-box-v" v-if="list.prop.append.length>0">
|
|
|
+ <div class="color_blue" style="margin-bottom:5px;" @click="downWgt(e.url,e.name)" v-for="(e,imgIndex) in list.prop.append" :key="imgIndex">{{e.name}}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-else-if="list.lab == '结果值'" class="orange">{{ list.prop }}</div>
|
|
|
+ <div v-else>{{ list.prop }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 评分结果 -->
|
|
|
+ <div>
|
|
|
+ <van-row v-for="(list, arr) in item.scoreList" :key="arr" v-if="list.prop && isShowOneself(list)">
|
|
|
+ <van-col span="24" style="color:#757575; font-size:.29rem;padding:.1rem 0;">
|
|
|
+ <template v-if="list.pointShow">
|
|
|
+ <span>{{ list.lab }}</span>
|
|
|
+ <span class="orange">评分:</span>
|
|
|
+ <span>{{ list.prop }}</span>
|
|
|
+ <span v-if="list.level" style="margin-left: .1rem;color: #26a2ff;">{{ list.level }}</span>
|
|
|
+ </template>
|
|
|
+ </van-col>
|
|
|
+ <van-col span="24">
|
|
|
+ <div class="flex-box" style="font-size:.29rem;padding:.1rem 0;" v-if="list.remark && list.textShow">
|
|
|
+ <span style="padding-right: 0.2rem;color:#757575;">说明:</span>
|
|
|
+ <pre class="pre2 flex-1">{{ list.remark }}</pre>
|
|
|
+ </div>
|
|
|
+ </van-col>
|
|
|
+ </van-row>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="flex-box-ce">
|
|
|
+ <span v-if="item.schedule && item.schedule.length > 0" style="font-size: .28rem;padding-right:.2rem;color:#1d96ff;" @click="openPlanPath(item, 'action')">
|
|
|
+ 执行计划({{ item.schedule.length }})
|
|
|
+ </span>
|
|
|
+ <span v-if="item.mamage_record && item.mamage_record.length > 0" style="font-size:.26rem; color:rgb(29, 150, 255);" @click="openPlanPath(item, 'admnin')">
|
|
|
+ 管理记录({{ item.mamage_record.length }})
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <div v-if="item.update_time" style="border-top: 1px solid #f1f1f1;margin-top: 0.2rem;">
|
|
|
+ <div v-if="returnStr(item.update_time).indexOf('今天')>=0" class="orange" style="font-size: 0.28rem;padding-top: 0.2rem;" >{{returnStr(item.update_time)}}</div>
|
|
|
+ <div v-else-if="returnStr(item.update_time).indexOf('昨天')>=0" class="color_green" style="font-size: 0.28rem;padding-top: 0.2rem;" >{{returnStr(item.update_time)}}</div>
|
|
|
+ <div v-else-if="returnStr(item.update_time).indexOf('前天')>=0" style="font-size: 0.28rem;padding-top: 0.2rem;" >{{returnStr(item.update_time)}}</div>
|
|
|
+ <div v-else style="font-size: 0.28rem;padding-top: 0.2rem;" >{{returnStr(item.update_time)}}</div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 评分 -->
|
|
|
+ <div style="margin:.2rem 0;" v-if="graded">
|
|
|
+ <div v-if="item.auto_score||item.auto_score===0" class="flex-box-ce" style="font-size: 0.28rem;">
|
|
|
+ <div class="flex-1" @click="showE(item)"><span>系统评分</span><van-icon name="question-o" style="position: relative;top: 2px;" />:<span class="color_blue">{{item.auto_score}}</span></div>
|
|
|
+ <div class="blue" style="text-decoration:underline" @click="copyPoin(item)">使用系统评分</div>
|
|
|
+ </div>
|
|
|
+ <div v-if="(ruleScore == 1 && !item.totalScore) || (ruleScore == 2 && item.totalScore)">
|
|
|
+ <van-cell-group>
|
|
|
+ <van-field
|
|
|
+ label="评分"
|
|
|
+ v-model="item.resultval"
|
|
|
+ type="number"
|
|
|
+ placeholder="请输入评分"
|
|
|
+ @focus="isShowPoint = false"
|
|
|
+ style="border: 1px solid rgb(226 226 226);border-radius: 5px;"
|
|
|
+ @blur="watresultval(item.resultval, item.totalScore ? item.totalScore : false)"
|
|
|
+ @input="[sgradeInp(item), (item.resultval = item.resultval.match(/\d+(\.\d{0,2})?/) ? item.resultval.match(/\d+(\.\d{0,2})?/)[0] : '')]"
|
|
|
+ />
|
|
|
+ </van-cell-group>
|
|
|
+ </div>
|
|
|
+ <div v-if="(ruleScore == 1 && !item.totalScore) || (ruleScore == 2 && item.totalScore)">
|
|
|
+ <van-cell-group>
|
|
|
+ <van-field
|
|
|
+ v-model="item.remarks"
|
|
|
+ label="评分说明"
|
|
|
+ rows="3"
|
|
|
+ type="textarea"
|
|
|
+ @focus="isShowPoint = false"
|
|
|
+ @blur="isShowPoint = true"
|
|
|
+ maxlength="50"
|
|
|
+ autosize
|
|
|
+ placeholder="请输入"
|
|
|
+ show-word-limit
|
|
|
+ style="border: 1px solid rgb(226 226 226);border-radius: 5px;"
|
|
|
+ />
|
|
|
+ </van-cell-group>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 记录 -->
|
|
|
+ <div v-if="recordList.length > 0">
|
|
|
+ <div class="modTit">记录</div>
|
|
|
+ <div class="modCont" style="">
|
|
|
+ <div
|
|
|
+ v-for="(item, index) in recordList"
|
|
|
+ :key="index"
|
|
|
+ :style="index != recordList.length - 1 ? 'min-height: 1rem;' : ''"
|
|
|
+ style="position: relative;padding-bottom: .2rem;"
|
|
|
+ >
|
|
|
+ <van-row gutter="10">
|
|
|
+ <van-col span="15">
|
|
|
+ <div style="display:flex;">
|
|
|
+ <userImage class="about-me__avatar" :id="item.employee_id" :user_name="item.name" fontSize=".24" width="0.5rem" height="0.5rem" font_min></userImage>
|
|
|
+ <span style="font-size:.255rem;padding: .06rem 0 0 .07rem;" class="font-flex-word">{{ item.name }}</span>
|
|
|
+ </div>
|
|
|
+ <div v-if="index != recordList.length - 1" class="bian"></div>
|
|
|
+ </van-col>
|
|
|
+ <van-col span="9" style="font-size:.24rem;color:#ababab;padding:.06rem 0 0 0;">{{ item.time }}</van-col>
|
|
|
+ </van-row>
|
|
|
+ <van-row>
|
|
|
+ <van-col offset="2" span="" style="font-size:.255rem;padding-top:.06rem;white-space:normal;">
|
|
|
+ <div style="color:#3bab62;"># {{ item.remark }} #</div>
|
|
|
+ <div style="color:#ababab;width: 100%;word-break:break-all;" v-if="item.content">{{ item.content }}</div>
|
|
|
+ </van-col>
|
|
|
+ </van-row>
|
|
|
+ </div>
|
|
|
+ <span style="font-size: .26rem;color: #5699ff;" @click="unfold" v-if="recordList.length <= 3 && recordAllList.length > 3">全部记录</span>
|
|
|
+ <span style="font-size: .26rem;color: #5699ff;" @click="packUp" v-if="recordList.length > 3">收起</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="padding-bottom: 1.5rem;"></div>
|
|
|
+ </scroller>
|
|
|
+ </div>
|
|
|
+ </VanSkeleton>
|
|
|
+ <template v-if="!has_finish">
|
|
|
+ <!-- 执行计划 -->
|
|
|
+ <div class="sidebar flex-box-ce" v-if="actionButShow && !graded" @click="openTrackPath('action')">
|
|
|
+ <van-icon name="plus" size=".32rem" />
|
|
|
+ <icon name="delivery_of_program" class="isdeliveryRecord_icon" />
|
|
|
+ 执行计划
|
|
|
+ </div>
|
|
|
+ <!-- 管理记录 -->
|
|
|
+ <div class="managementRecord flex-box-ce" v-if="recordsManagement && !graded" @click="openTrackPath('admnin')">
|
|
|
+ <van-icon name="plus" size=".32rem" />
|
|
|
+ <icon name="management_record" class="isdeliveryRecord_icon" />
|
|
|
+ 管理记录
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="footerBut" :class="{ isIos: isIos }">
|
|
|
+ <div v-if="!graded">
|
|
|
+ <div class="footweight">指标总权重:{{ weight }}</div>
|
|
|
+ <div class="footfoot flex-box flex-dv-center" v-if="transferBut || feedbackBut || gradeButShow || examineButShow || resultButShow || targetConfirmed">
|
|
|
+ <div class="footcol" v-if="revocationShow" @click="openCx">
|
|
|
+ <icon name="withdraw" style="width: 0.5rem;height: 0.5rem;"></icon>
|
|
|
+ <div style="font-size: .24rem;">撤销</div>
|
|
|
+ </div>
|
|
|
+ <!-- 结果值编辑 -->
|
|
|
+ <div class="footcol" v-if="resultButShow2" @click="enteringResult">
|
|
|
+ <icon name="withdraw" style="width: 0.5rem;height: 0.5rem;"></icon>
|
|
|
+ <div style="font-size: .24rem;">{{resultStr}}</div>
|
|
|
+ </div>
|
|
|
+ <div class="footcol" v-if="transferBut" @click="openSelectUser">
|
|
|
+ <icon name="careOf" style="width: 0.5rem;height: 0.5rem;"></icon>
|
|
|
+ <div style="font-size: .24rem;">转交</div>
|
|
|
+ </div>
|
|
|
+ <div class="footcol" v-if="feedbackBut" @click="communicate">
|
|
|
+ <icon name="messagejx" style="width: 0.5rem;height: 0.5rem;"></icon>
|
|
|
+ <div style="font-size: .24rem;">沟通</div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="footBut" v-if="gradeButShow || examineButShow || resultButShow || targetConfirmed">
|
|
|
+ <!-- 评分 -->
|
|
|
+ <button v-if="gradeButShow" class="gradefootcolButok" @click="gradeClick">评分</button>
|
|
|
+ <!-- 审批 -->
|
|
|
+ <button v-if="examineButShow && isAction" style="" class="footcolButno" @click="gradeTurn">驳回</button>
|
|
|
+ <button v-if="examineButShow" :class="isAction ? 'footcolButok' : 'gradefootcolButok'" @click="gradeOk">同意</button>
|
|
|
+ <!-- 目标确认 -->
|
|
|
+ <template v-if="targetConfirmed">
|
|
|
+ <button style="" class="footcolButno" @click="gradeTurn">驳回</button>
|
|
|
+ <button class="gradefootcolButok" @click="gradeOk">同意</button>
|
|
|
+ </template>
|
|
|
+ <!-- 结果值录入 -->
|
|
|
+ <button v-if="resultButShow" class="gradefootcolButok" @click="enteringResult">{{resultStr}}</button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-else>
|
|
|
+ <template v-if="isShowPoint">
|
|
|
+ <div class="footweight">我评的总分:{{ gradeval }}</div>
|
|
|
+ <van-row class="footfoot">
|
|
|
+ <van-col span="14" class="footcol" @click="scorerveok(0)">
|
|
|
+ <icon name="save" style="width: 0.5rem;height: 0.5rem;"></icon>
|
|
|
+ <div style="font-size: .24rem;color:#8a8a8a;">暂存</div>
|
|
|
+ </van-col>
|
|
|
+ <van-col span="10" class="footBut">
|
|
|
+ <button style="" class="footcolButno" @click="scorerveno">取消</button>
|
|
|
+ <button class="footcolButok" @click="scorerveok(1)">提交</button>
|
|
|
+ </van-col>
|
|
|
+ </van-row>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ <resultValueEntryMb v-else ref="result-mb" :peIds="pe_ids" :isUpdate="isUpdate"></resultValueEntryMb>
|
|
|
+
|
|
|
+ <van-dialog v-model="isShowE" :show-cancel-button="false">
|
|
|
+ <div style="padding: 10px;font-size: 0.28rem;">
|
|
|
+ <div class="flex-box-ce" style="margin-bottom: 10px;">按以下公式和数据自动计算评分
|
|
|
+ </div>
|
|
|
+ <div v-html="eData.expressionStr" style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;"></div>
|
|
|
+ <div class="flex-box-ce" style="margin-top: 10px;">
|
|
|
+ <div class="orange" style="margin-right: 20px;">结果值:{{eData.result}}</div>
|
|
|
+ <div class="orange">目标值:{{eData.target}}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </van-dialog>
|
|
|
+
|
|
|
+ <van-popup
|
|
|
+ :duration="0.2"
|
|
|
+ :get-container="getContainer"
|
|
|
+ :overlay="false"
|
|
|
+ v-model="communication"
|
|
|
+ position="bottom"
|
|
|
+ :style="'height:' + com_height"
|
|
|
+ class="employee_selector_popup"
|
|
|
+ >
|
|
|
+ <van-nav-bar :title="detailsTIt" left-text="" left-arrow @click-left="communication = false" />
|
|
|
+ <div style="height:.2rem;background-color:#f5f7fa;"></div>
|
|
|
+ <div v-if="popupknowFrom == 1">
|
|
|
+ <van-cell title="驳回到" is-link :value="rejectval" @click="openBh()" />
|
|
|
+ <van-cell v-if="rejectProp" title="驳回到指定成员" is-link :value="rejectval1" @click="rejectdlg1 = true" />
|
|
|
+ <div style="height:.2rem;background-color:#f5f7fa;"></div>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <van-field
|
|
|
+ v-model="commFeedback"
|
|
|
+ rows="6"
|
|
|
+ autosize
|
|
|
+ type="textarea"
|
|
|
+ :placeholder="
|
|
|
+ popupknowFrom == 0
|
|
|
+ ? '请输入沟通反馈(必填)'
|
|
|
+ : popupknowFrom == 1
|
|
|
+ ? '请输入驳回内容(必填)'
|
|
|
+ : popupknowFrom == 2
|
|
|
+ ? '请输入审批说明(选填)'
|
|
|
+ : popupknowFrom == 3
|
|
|
+ ? '请输入目标确认说明(选填)'
|
|
|
+ : popupknowFrom == 4
|
|
|
+ ? '请输入撤销理由(选填)'
|
|
|
+ : ''
|
|
|
+ "
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="commButt">
|
|
|
+ <div class="aite" v-if="popupknowFrom == 0">
|
|
|
+ <span @click="selectUser = true" style="color: #4498ef;">@</span>
|
|
|
+ <span style="font-size: .25rem;text-align:left;">
|
|
|
+ <span class="font-flex-word" style="max-width: 5.8rem;display:inline-block;">
|
|
|
+ <span v-for="(item, index) in emtags" :key="index">
|
|
|
+ {{ item.name }}
|
|
|
+ <span v-if="emtags.length - index > 1">,</span>
|
|
|
+ </span>
|
|
|
+ </span>
|
|
|
+ <span v-if="emtags.length > 3">等{{ emtags.length }}人</span>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <button class="commButtno" @click="commcliButon">取消</button>
|
|
|
+ <button class="commButtok" @click="commcliButok">确定</button>
|
|
|
+ </div>
|
|
|
+ </van-popup>
|
|
|
+
|
|
|
+ <van-dialog v-model="rejectdlg" title="" width="300" :show-confirm-button="false" closeOnClickOverlay>
|
|
|
+ <van-radio-group v-model="selectpradio">
|
|
|
+ <div v-for="(item, index) in rejectList" :key="index">
|
|
|
+ <van-radio :name="index" @click="clickreject(item)" style="margin:.3rem 0 .3rem .4rem;font-size:.26rem" icon-size="16px">
|
|
|
+ <span>{{ index + 1 }} .</span>
|
|
|
+ <span>{{ item.name }}</span>
|
|
|
+ </van-radio>
|
|
|
+ </div>
|
|
|
+ </van-radio-group>
|
|
|
+ </van-dialog>
|
|
|
+
|
|
|
+ <van-dialog v-model="rejectdlg1" title="" width="300" :show-confirm-button="false" closeOnClickOverlay>
|
|
|
+ <van-radio-group v-model="selectpradio1">
|
|
|
+ <div v-for="(item, index) in rejectList1" :key="index">
|
|
|
+ <van-radio :name="index" @click="clickreject1(item)" style="margin:.3rem 0 .3rem .4rem;font-size:.26rem" icon-size="16px">
|
|
|
+ <span style="margin-left: .25rem">{{ item.employee_name }}</span>
|
|
|
+ </van-radio>
|
|
|
+ </div>
|
|
|
+ </van-radio-group>
|
|
|
+ </van-dialog>
|
|
|
+
|
|
|
+ <van-dialog v-model="selectZj" title="" width="300" :show-confirm-button="false" closeOnClickOverlay>
|
|
|
+ <div style="text-align: center;font-size: 0.24rem;padding: 0.2rem 0;">请选择被转交人员</div>
|
|
|
+ <van-radio-group v-model="zjId">
|
|
|
+ <div v-for="(item, index) in careOfPeopleId" :key="index">
|
|
|
+ <van-radio :name="item.employee_id" :label="item.employee_id" style="margin:.3rem 0 .3rem .4rem;font-size:.26rem" icon-size="16px">
|
|
|
+ <span style="margin-left: .25rem">{{ item.employee_name }}</span>
|
|
|
+ </van-radio>
|
|
|
+ </div>
|
|
|
+ </van-radio-group>
|
|
|
+ </van-dialog>
|
|
|
+
|
|
|
+ <van-dialog v-model="flexDialog" title="" width="350" :show-confirm-button="false" closeOnClickOverlay>
|
|
|
+ <div class="flexDiaWb">
|
|
|
+ <div v-for="(item, index) in perfstepFlow" :key="index" class="flexDiaLL flex-box" :style="perfstepFlow.length - 1 == index ? 'padding: 0;' : ''">
|
|
|
+ <span class="fdz">
|
|
|
+ <div class="fdYuan fdYuan1" v-if="item.status == 2"><van-icon name="success" /></div>
|
|
|
+ <div class="fdYuan fdYuan2" v-else-if="item.status == 1"><van-icon name="play" size=".38rem" /></div>
|
|
|
+ <div class="fdYuan fdYuan3" v-else></div>
|
|
|
+ <div class="fdShu" :class="{ fdShu1: item.status == 2 }" v-if="!(perfstepFlow.length - 1 == index)"></div>
|
|
|
+ </span>
|
|
|
+ <span class="fdy" :class="{ fdyBlue: item.status == 1 }" style="position: relative;top:2px">
|
|
|
+ <span style="height: 100%;padding-right:.15rem;">{{ index + 1 }}.</span>
|
|
|
+ <div>
|
|
|
+ {{ item.remark }}
|
|
|
+ <span v-if="item.target.length > 0">
|
|
|
+ <span v-for="(item2, index2) in item.target" :key="index2">
|
|
|
+ {{ item2.employee_name }}
|
|
|
+ <span v-if="item.target.length - index2 > 1">,</span>
|
|
|
+ </span>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </van-dialog>
|
|
|
+ <!-- 沟通反馈 -->
|
|
|
+ <EmployeeSelector
|
|
|
+ title="选择@人员"
|
|
|
+ :visible.sync="selectUser"
|
|
|
+ @confirm="confirmCreator"
|
|
|
+ :can_select_dept="false"
|
|
|
+ :dept_multi="false"
|
|
|
+ :append_body="true"
|
|
|
+ :isShowDepts="false"
|
|
|
+ />
|
|
|
+ <!-- 转交 -->
|
|
|
+ <EmployeeSelector
|
|
|
+ :title="'选择转交人员'"
|
|
|
+ :multi="false"
|
|
|
+ ref="selector"
|
|
|
+ :can_select_dept="false"
|
|
|
+ :dept_multi="false"
|
|
|
+ @confirm="confirm"
|
|
|
+ :visible.sync="show_dept_selector"
|
|
|
+ :append_body="true"
|
|
|
+ :isShowDepts="false"
|
|
|
+ ></EmployeeSelector>
|
|
|
+
|
|
|
+ <van-popup v-model="isPoint" :close-on-click-overlay="false" style="border-radius: 0.15rem; background: #fff0;">
|
|
|
+ <div class="buyPopupBody" style="width: 90vw;">
|
|
|
+ <div class="buyPopupContent" style="position: relative;background: white;padding: 0 5vw 5vw 5vw;border-radius: 0.15rem;">
|
|
|
+ <div
|
|
|
+ class="buyPopupTitle"
|
|
|
+ style="background: #1a89fa;
|
|
|
+ text-align: center;
|
|
|
+ border-radius: 0.1rem;
|
|
|
+ font-weight: normal;
|
|
|
+ font-size: 0.36rem;
|
|
|
+ height: 0.8rem;
|
|
|
+ line-height: 0.8rem;
|
|
|
+ color: #fff;"
|
|
|
+ >
|
|
|
+ 请确认您的评分
|
|
|
+ </div>
|
|
|
+ <div style="max-height: 500px;overflow-y: auto;font-size: 0.32rem;margin: 0.28rem 0;border: 1px solid #e4e4e4;border-bottom: none;">
|
|
|
+ <div class="flex-box-ce" style="background:#ECF5FF;border-bottom: 1px solid #e4e4e4;">
|
|
|
+ <div class="flex-4" style="border-right: 1px solid #e4e4e4;padding: 10px 5px;">
|
|
|
+ 指标(<span style="color:#ff9600;">每项指标评分</span>)
|
|
|
+ </div>
|
|
|
+ <div class="flex-1" style="padding: 10px 5px;">评分</div>
|
|
|
+ </div>
|
|
|
+ <div v-for="(item, index) in pointList" :key="index" class="flex-box-ce" style="border-bottom: 1px solid #e4e4e4;">
|
|
|
+ <div class="flex-4" style="border-right: 1px solid #e4e4e4;padding: 10px 5px;">{{ item.name }}</div>
|
|
|
+ <div class="flex-1" style="padding: 10px 5px;">{{ item.score }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <van-row gutter="20">
|
|
|
+ <van-col span="12"><van-button block @click="isPoint = false">返回修改</van-button></van-col>
|
|
|
+ <van-col span="12"><van-button block type="info" @click="score">确认提交</van-button></van-col>
|
|
|
+ </van-row>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </van-popup>
|
|
|
+ <!-- 展示 执行 管理 记录 -->
|
|
|
+ <van-action-sheet v-model="isShowText" :closeable="false" duration=".35">
|
|
|
+ <div class="vassheet">
|
|
|
+ <div class="vasHead">
|
|
|
+ <van-icon name="cross" size=".3rem" @click.stop="isShowText = false" />
|
|
|
+ <span>{{ logText }}</span>
|
|
|
+ </div>
|
|
|
+ <div style="padding:0.15rem 0.15rem 0 0.15rem;font-size:.32rem;background-color: rgb(245, 245, 245);">{{ apDetails.name }}</div>
|
|
|
+ <div v-for="(item, index) in logList" :key="index" class="apdList flex-box" :class="{ apdListMarTop: index == 0 }">
|
|
|
+ <div style="margin: .24rem 0 0 .2rem;position: relative;">
|
|
|
+ <div class="apdDian"></div>
|
|
|
+ <div class="apdHeadBoeder" :class="{ apdborderNO: index == logList.length - 1 || logList.length <= 1 }"></div>
|
|
|
+ </div>
|
|
|
+ <div class="apdData" :class="{ apdborderNO: logList.length == index + 1 }">
|
|
|
+ <div>
|
|
|
+ <b class="line-feed" style="font-size:.3rem;color:block;">{{ item.title }}</b>
|
|
|
+ <br />
|
|
|
+ <span style="font-size:.24rem;color:#b7b7b7;">
|
|
|
+ {{ item.date }}
|
|
|
+ <span v-if="logText == '管理记录' && $getEmployeeMapItem(item.employee_id)"> 记录人:{{ $getEmployeeMapItem(item.employee_id).name }}</span>
|
|
|
+ </span>
|
|
|
+ <br />
|
|
|
+ <span class="line-feed" style="font-size:.25rem;color:#505050;" v-html="item.remark"></span>
|
|
|
+ </div>
|
|
|
+ <template v-if="item.images">
|
|
|
+ <div class="flex-box-ce" style="margin: 10px 0;" v-if="item.images.length > 0">
|
|
|
+ <van-image @click="openImg(item.images, index2)" v-for="(e, index2) in item.images" :key="index2" style="border-radius: 3px;margin-right: 10px;" width="100" height="100" :src="e.url" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-if="item.append_name">
|
|
|
+ <div class="color_blue" style="margin: 10px 0;font-size: 0.28rem;" @click="downWgt(item.append,item.append_name)">{{item.append_name}}</div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </van-action-sheet>
|
|
|
+
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+<script>
|
|
|
+import Vue from 'vue';
|
|
|
+import moment from 'moment';
|
|
|
+import { Checkbox, CheckboxGroup, ActionSheet, ImagePreview } from 'vant';
|
|
|
+Vue.use(Checkbox)
|
|
|
+ .use(CheckboxGroup)
|
|
|
+ .use(ActionSheet)
|
|
|
+ .use(ImagePreview);
|
|
|
+import VanSkeleton from '@/performance/components/public/VanSkeleton';
|
|
|
+import resultValueEntryMb from '@/performance/components/actionplan/resultValueEntryMb';
|
|
|
+import EmployeeSelector from '@/components/EmployeeSelector';
|
|
|
+import {getExpressionStr} from '@/performance/utils/auth'
|
|
|
+
|
|
|
+export default {
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ isShowE:false,
|
|
|
+ eData:{
|
|
|
+ expressionStr:'',
|
|
|
+ result:'',
|
|
|
+ target:''
|
|
|
+ },
|
|
|
+
|
|
|
+ isDetails:true,
|
|
|
+ pe_ids:'',
|
|
|
+
|
|
|
+ day: moment().format('YYYY-MM-DD'),
|
|
|
+ isNeed: !this.$getCache('isAndroid'),
|
|
|
+ detailsTIt: '', // 顶部title
|
|
|
+ skeletonLoad: true, // 骨架屏
|
|
|
+ employeeID: this.$route.query.id, // 绩效记录ID
|
|
|
+ assID: this.$route.query.assId, // 考核包ID
|
|
|
+ staffID: this.$route.query.staffId, // 员工ID
|
|
|
+
|
|
|
+ perfstepFlow: [], // 步骤
|
|
|
+ smdsinsFlow: 0, // 当前绩效流程所在位置
|
|
|
+ flowNow: {}, // 当前节点
|
|
|
+
|
|
|
+ thecurrentFlow: '', // 当前节点
|
|
|
+ ruleScore: 1, // 1-指标均要评分 2-评分总结
|
|
|
+ mandatoryScore: false, // 指标说明是否必填
|
|
|
+
|
|
|
+ weight: '',
|
|
|
+
|
|
|
+ userInfo: this.$userInfo(), // 当前角色
|
|
|
+
|
|
|
+ apList: [], // 执行计划数据
|
|
|
+ planIndex: [], // 执行计划的下标,当点击表格查看时用到
|
|
|
+
|
|
|
+ // 按钮显示隐藏
|
|
|
+ targetConfirmed: false, // 目标确认
|
|
|
+ gradeButShow: false, // 评分
|
|
|
+ examineButShow: false, // 审批
|
|
|
+ isAction: false, // 审批驳回
|
|
|
+ resultButShow: false, // 结果值录入
|
|
|
+ resultButShow2:false,// 结果值编辑
|
|
|
+ actionButShow: false, // 执行计划
|
|
|
+ recordsManagement: false, // 管理记录
|
|
|
+ feedbackBut: false, // 沟通反馈按钮
|
|
|
+
|
|
|
+ transferBut: false, // 转交按钮
|
|
|
+ careOfPeopleId: [], // 转交的 -- 转出ID
|
|
|
+ selectZj: false,
|
|
|
+ zjId: 0, // 转交用户ID
|
|
|
+
|
|
|
+ revocationShow: false, //是否可以撤销
|
|
|
+ revocationNodeId: 1, //撤销节点ID
|
|
|
+
|
|
|
+ recordList: [], // 记录列表
|
|
|
+ recordAllList: [], // 记录列表
|
|
|
+
|
|
|
+ selectUser: false, // 沟通反馈@
|
|
|
+ emtags: [], // 沟通反馈@选中人员
|
|
|
+
|
|
|
+ selectpradio: '',
|
|
|
+ selectpradio1: '',
|
|
|
+ rejectList: [],
|
|
|
+ rejectList1: [],
|
|
|
+ rejectdlg: false, // 驳回选项弹窗
|
|
|
+ rejectval: '', // 驳回选中内容
|
|
|
+
|
|
|
+ rejectData: {}, // 驳回数据
|
|
|
+
|
|
|
+ rejectProp: false, // 驳回--选人
|
|
|
+ rejectdlg1: false, // 驳回选人选项弹窗
|
|
|
+ rejectval1: '', // 驳回选人选中内容
|
|
|
+
|
|
|
+ popupknowFrom: 0, // 0:沟通反馈,1:驳回,2审批,3目标确认,4.撤销
|
|
|
+ gradeval: 0, // 评分总分
|
|
|
+ graded: false, // 评分模块开关
|
|
|
+ commFeedback: '', // 沟通弹窗反馈
|
|
|
+ communication: false, // 沟通弹窗
|
|
|
+ show_dept_selector: false, // 转交选人
|
|
|
+
|
|
|
+ isIos: this.$getCache('iPhone'),
|
|
|
+ Information: {
|
|
|
+ // 顶部员工信息
|
|
|
+ name: '',
|
|
|
+ employee_detail:{dept_list:[]},
|
|
|
+ },
|
|
|
+
|
|
|
+ // 执行中
|
|
|
+ inExecution: [],
|
|
|
+ scoreInfo: [], // 各个节点的人评的总分
|
|
|
+ titList: [],
|
|
|
+ bootBool: false, // 防止多次请求
|
|
|
+ isCs: false, // 是否抄送人进入(抄送人能看到全部评分内容)
|
|
|
+ com_height: '100%',
|
|
|
+
|
|
|
+ isDisabled: false, //是否显示上下一条
|
|
|
+ headuDown: [],
|
|
|
+ pendingList: [],
|
|
|
+ page: 1,
|
|
|
+ isJz: true,
|
|
|
+ activeName: '', //待办带进来的节点类型
|
|
|
+
|
|
|
+ checked: false, //只看自己评分
|
|
|
+ recordMemberIds: [],
|
|
|
+
|
|
|
+ flexDialog: false,
|
|
|
+ flexIndex: 0,
|
|
|
+ has_finish: 0, //是否归档 0否 1是
|
|
|
+
|
|
|
+ // 评分确认列表
|
|
|
+ pointList: [],
|
|
|
+ pointData: {},
|
|
|
+ isPoint: false,
|
|
|
+
|
|
|
+ isShowPoint: true,
|
|
|
+ publicity: 0,
|
|
|
+
|
|
|
+ isShowText: false,
|
|
|
+ isUpdate:false,
|
|
|
+ logText: '执行计划',
|
|
|
+ logList: [],
|
|
|
+ apDetails: {},
|
|
|
+ resultStr:'录入结果值',
|
|
|
+ okrs: [], // 已关联的OKR
|
|
|
+ };
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ isShowOneself() {
|
|
|
+ return function(value) {
|
|
|
+ if(this.titList.length > 0){
|
|
|
+ return true;
|
|
|
+ }else if (!this.checked) {
|
|
|
+ if (value.employee_id == this.userInfo.id) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ },
|
|
|
+ components: { EmployeeSelector, VanSkeleton,resultValueEntryMb },
|
|
|
+ watch: {
|
|
|
+ zjId(val) {
|
|
|
+ if (val) {
|
|
|
+ this.selectZj = false;
|
|
|
+ this.show_dept_selector = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ handleClick() {
|
|
|
+ this.$refs["result-mb"].isFilterShow = true;
|
|
|
+ },
|
|
|
+ goMyTarget() {
|
|
|
+ this.$router.push({name: 'myTarget', query: {ids: JSON.stringify(this.okrs)}});
|
|
|
+ },
|
|
|
+ copyPoin(item){
|
|
|
+ if(item.auto_score<0||item.auto_score===0){
|
|
|
+ item.resultval='0';
|
|
|
+ }else{
|
|
|
+ item.resultval=item.auto_score
|
|
|
+ }
|
|
|
+ },
|
|
|
+ showE(item){
|
|
|
+ this.eData={
|
|
|
+ expressionStr:item.expressionStr,
|
|
|
+ result:item.result,
|
|
|
+ target:item.target
|
|
|
+ };
|
|
|
+ this.isShowE=true;
|
|
|
+ },
|
|
|
+ downWgt (url,name) {
|
|
|
+ let self = this
|
|
|
+ if(!window.plus){
|
|
|
+ window.open(url, '_blank');
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ let dtask=plus.downloader.createDownload(encodeURI(url),{filename:'_doc/update/'},
|
|
|
+ function (d, status) {
|
|
|
+ if (status == 200) {
|
|
|
+ plus.runtime.openFile(d.filename,{},(err)=>{
|
|
|
+ // console.log(JSON.stringify(err))
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ self.$toast.clear()
|
|
|
+ Notify({ type: 'danger', message: '下载失败,请稍后重试', duration: 1000 })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ )
|
|
|
+ dtask.start();
|
|
|
+ },
|
|
|
+ returnStr(time){
|
|
|
+ let date=`${time}000`
|
|
|
+ let res = moment(Number(date)).format('YYYY/MM/DD HH:mm');
|
|
|
+ return this.fnTime(res);
|
|
|
+ },
|
|
|
+ fnTime( time ){
|
|
|
+ let staer=time.slice(0,11);
|
|
|
+ let ptime = new Date(time).getTime()
|
|
|
+ const twentyFourHours = 24 * 60 * 60 * 1000;
|
|
|
+ const fortyEightHours = 24 * 60 * 60 * 1000 * 2;
|
|
|
+ const today = moment().format('YYYY/MM/DD');
|
|
|
+
|
|
|
+ const todayTime = new Date(today).getTime();
|
|
|
+ const yesterdayTime = new Date(todayTime - twentyFourHours).getTime();
|
|
|
+ const lastYesterdayTime = new Date(todayTime - fortyEightHours).getTime();
|
|
|
+
|
|
|
+ if( ptime >= todayTime ){
|
|
|
+ return '今天 '+time.split(' ')[1]+' 更新了执行计划';
|
|
|
+ }
|
|
|
+ else if( ptime < todayTime && yesterdayTime <= ptime ){
|
|
|
+ return '昨天 '+time.split(' ')[1]+' 更新了执行计划';
|
|
|
+ }
|
|
|
+ else if( ptime < yesterdayTime && lastYesterdayTime <= ptime ){
|
|
|
+ return '前天 '+time.split(' ')[1]+' 更新了执行计划';
|
|
|
+ }else if(this.dateSum(this.day,staer)>30){
|
|
|
+ return '近30天无计划更新';
|
|
|
+ } else{
|
|
|
+ return time+' 更新了执行计划';
|
|
|
+ }
|
|
|
+ },
|
|
|
+ dateSum(sDate1, sDate2){ //sDate1和sDate2是2008-12-13格式
|
|
|
+ var aDate, oDate1, oDate2, iDays
|
|
|
+ aDate = sDate1.split("-")
|
|
|
+ oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0]) //转换为12-13-2008格式
|
|
|
+ aDate = sDate2.split("-")
|
|
|
+ oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
|
|
|
+ iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 /24) //把相差的毫秒数转换为天数
|
|
|
+ return iDays
|
|
|
+ },
|
|
|
+ openImg(imgs, index) {
|
|
|
+ let imgArr = imgs.map(item => {
|
|
|
+ return item.url;
|
|
|
+ });
|
|
|
+ ImagePreview({
|
|
|
+ images: imgArr,
|
|
|
+ startPosition: index
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 获取待办数据
|
|
|
+ getAgency() {
|
|
|
+ if (!this.isJz) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ this.page = this.page + 1;
|
|
|
+ this.$axiosUser('get', '/api/pro/per/package/msg/agency', { node_type: this.activeName, status: 0, page: this.page, page_size: 10 },'v2').then(res => {
|
|
|
+ let list = res.data.data.list;
|
|
|
+ let pendingList = [];
|
|
|
+ list.forEach(item => {
|
|
|
+ if(item.node_type==4){
|
|
|
+ let userInfo = this.$getEmployeeMapItem(item.first_employee_id);
|
|
|
+ item.userInfo = userInfo;
|
|
|
+ let name=item.content.split(',')[0]
|
|
|
+ pendingList.push({ name: userInfo.name, employeeID: '结果', package_name: name,package_id:item.package_id,pe_ids:item.pe_ids, });
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ if (item.remark.employee_id) {
|
|
|
+ //被考核人
|
|
|
+ let userInfo = this.$getEmployeeMapItem(item.remark.employee_id);
|
|
|
+ item.userInfo = userInfo;
|
|
|
+ pendingList.push({ name: userInfo.name, img_url: userInfo.img_url, employeeID: item.remark.packageEmployee_id, package_name: item.remark.package_name });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (list.length < 10) {
|
|
|
+ this.isJz = false;
|
|
|
+ }
|
|
|
+ this.pendingList.push(...pendingList);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ openBh() {
|
|
|
+ if (this.rejectList.length == 0) {
|
|
|
+ this.$toast.fail('没有可驳回节点');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ this.rejectdlg = true;
|
|
|
+ },
|
|
|
+ openSelectUser() {
|
|
|
+ if (this.careOfPeopleId.length == 1) {
|
|
|
+ this.show_dept_selector = true;
|
|
|
+ } else {
|
|
|
+ this.selectZj = true;
|
|
|
+ this.zjId = 0;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ getContainer() {
|
|
|
+ return document.body;
|
|
|
+ },
|
|
|
+ // 返回上一页
|
|
|
+ routerBak() {
|
|
|
+ this.$route_back();
|
|
|
+ },
|
|
|
+ employeeDet() {
|
|
|
+ let params = {};
|
|
|
+ if (this.$route.query.id) {
|
|
|
+ params.id = this.employeeID;
|
|
|
+ } else if (this.$route.query.assId && this.$route.query.staffId) {
|
|
|
+ params.package_id = this.$route.query.assId;
|
|
|
+ params.employee_id = this.$route.query.staffId;
|
|
|
+ }
|
|
|
+ this.skeletonLoad = true;
|
|
|
+ this.$axiosUser('get', '/api/pro/per/package/employee/info', params).then(res => {
|
|
|
+ if (res.data.code == 1) {
|
|
|
+ let data = res.data.data;
|
|
|
+ this.okrs = data.okrs || [];
|
|
|
+ this.has_finish = data.has_finish;
|
|
|
+ if (this.pendingList.length > 0) {
|
|
|
+ this.setUpD();
|
|
|
+ }
|
|
|
+ this.recordMemberIds = data.record_member_ids || [];
|
|
|
+ this.empDetList = data;
|
|
|
+ this.employeeID = data.id; // 考核记录id
|
|
|
+
|
|
|
+ this.Information =this.$getEmployeeMapItem(data.employee_id); // 考核人员信息
|
|
|
+ console.log(this.Information)
|
|
|
+ this.perfstepFlow = data.flow; // 流程
|
|
|
+ this.apList = JSON.stringify(data.dimension);
|
|
|
+ this.scoreInfo = data.score_info; // 各个节点的人评的总分
|
|
|
+ this.feedbackBut = data.config.assessment.feedback == '1'; // 沟通反馈是否启用
|
|
|
+ this.resultButShow = false; // 录入结果值
|
|
|
+ this.resultButShow2 = false; // 录入结果值
|
|
|
+ this.gradeButShow = false; // 评分按钮
|
|
|
+ this.examineButShow = false; // 审批按钮
|
|
|
+ this.transferBut = false; // 转交按钮
|
|
|
+ this.targetConfirmed = false; // 目标确认
|
|
|
+ this.publicity = data.publicity;
|
|
|
+ this.actionButShow = false; // 执行计划按钮
|
|
|
+ this.recordsManagement = false; // 管理记录按钮
|
|
|
+ this.revocationShow = false;
|
|
|
+ this.buttonIf2(); //判断管理记录/执行计划按钮是否显示
|
|
|
+ this.smdsinsFlow = 0;
|
|
|
+ this.flexIndex = 0;
|
|
|
+
|
|
|
+ let executor = {}; // 与当前登录账号相同的执行人
|
|
|
+ let review = {}; // 与当前登录账号相同的审批人
|
|
|
+ let isReview=false;//判断账号是否审批人中一位
|
|
|
+ let targetUserList=[];//结果值录入人 ,用来显示结果值录入人
|
|
|
+ data.flow.forEach((item, index) => {
|
|
|
+ if (item.code == 'execution') {
|
|
|
+ // 查找 已开始或已结束的执行节点中有无当前账号
|
|
|
+ if (item.status != 0) {
|
|
|
+ item.target.forEach(tar => {
|
|
|
+ if (tar.employee_id == this.userInfo.id) {
|
|
|
+ executor = tar; // 存入与当前登录账号相同的执行人
|
|
|
+ executor.newCode = 'employee'; // 保存执行人节点code
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (item.code == 'review') {
|
|
|
+ // 查找 已开始或已结束的审批节点中有无当前账号
|
|
|
+ if (item.status != 0) {
|
|
|
+ item.target.forEach(tar => {
|
|
|
+ if (tar.employee_id == this.userInfo.id) {
|
|
|
+ isReview=true;
|
|
|
+ review = tar; // 存入与当前登录账号相同的审批人
|
|
|
+ review.newCode = 'reviewer'; // 保存审批人节点code
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (item.code=='result_value'){//获取结果值录入人集合
|
|
|
+ targetUserList=item.target
|
|
|
+ }
|
|
|
+ this.buttonIf(item);
|
|
|
+
|
|
|
+ if (item.status == 1) {
|
|
|
+ if (item.code != 'cc') {
|
|
|
+ this.isRevocation(item, data.flow[index - 1]);
|
|
|
+ }
|
|
|
+ data.flow.push({ id: data.flow.length + 1, remark: '结束', status: 0, target: [] });
|
|
|
+ this.flowNow = item;
|
|
|
+ this.smdsinsFlow = item.id;
|
|
|
+ this.flexIndex = index + 1;
|
|
|
+ //结果值录入按钮
|
|
|
+ if(item.code=='result_value'||item.code=='score_supervisor'||item.code=='special_scorer'){
|
|
|
+ this.isresultBtn(item)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (this.flexIndex == 0) {
|
|
|
+ data.flow.push({ id: data.flow.length + 1, remark: '结束', status: 2, target: [] });
|
|
|
+ this.flexIndex = data.flow.length;
|
|
|
+ }
|
|
|
+ if (this.smdsinsFlow == 0) {
|
|
|
+ // 如果当前节点id为0,代表此考核详情已完毕,把最后一个节点作为当前节点
|
|
|
+ this.smdsinsFlow =data.flow[data.flow.length - 1].remark=='结束'? data.flow[data.flow.length - 2].id:data.flow[data.flow.length - 1].id;
|
|
|
+ let cs =data.flow[data.flow.length - 1].remark=='结束'? data.flow[data.flow.length - 2]:data.flow[data.flow.length - 1];
|
|
|
+ cs.target.some(item => {
|
|
|
+ if (item.employee_id == this.userInfo.id) {
|
|
|
+ this.isCs = true;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // 整合表格格式
|
|
|
+ let dimension = data.dimension;
|
|
|
+ let dimeTab = [];
|
|
|
+ let weight = 0; // 权重统计
|
|
|
+ // poiSco 评分权限
|
|
|
+ // poicom 说明权限
|
|
|
+ let poiSco = data.config.assessment.point_scope; // 评分可见权限
|
|
|
+ let poicom = data.config.assessment.point_comment; // 说明可见权限
|
|
|
+ dimension.forEach((item, keys) => {
|
|
|
+ item.index.forEach((arr, index) => {
|
|
|
+ weight += Number(arr.weight);
|
|
|
+ arr.theDimension = item.name + '(' + Number(index + 1) + ')';
|
|
|
+ arr.dimension_weight = item.dimension_weight; // 维度权重
|
|
|
+ arr.score_infos = [];
|
|
|
+ arr.planIndex = [keys, index]; // 当打开执行计划时的下标
|
|
|
+ arr.tabList = [
|
|
|
+ {
|
|
|
+ lab: '指标类型',
|
|
|
+ prop: this.indexType(this.initData(arr.type))
|
|
|
+ },
|
|
|
+ {
|
|
|
+ lab: '指标权重(%)',
|
|
|
+ prop: this.initData(arr.weight) ? '指标权重:' + this.initData(arr.weight) + '%' : null
|
|
|
+ }
|
|
|
+ ];
|
|
|
+ let isFile=true;
|
|
|
+ if(arr.result_file.append.length==0&&arr.result_file.images.length==0){
|
|
|
+ isFile=false;
|
|
|
+ }
|
|
|
+ // 写入每个指标的结果值录入人
|
|
|
+ let resultUserName=''
|
|
|
+ targetUserList.forEach(target=>{
|
|
|
+ target.list.forEach(target2=>{
|
|
|
+ if(target2.index_id==arr.id){
|
|
|
+ resultUserName = target.employee_name; //结果值
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ let tar ='';
|
|
|
+ if(arr.result!==null&&arr.result!==''&&arr.result!=0){
|
|
|
+ tar=arr.result + arr.unit+`(${resultUserName})`
|
|
|
+ }
|
|
|
+ // if(arr.type==1){
|
|
|
+ arr.details = [
|
|
|
+ { lab: '目标值', prop: arr.target+''+arr.unit},
|
|
|
+ { lab: '结果值', prop: tar },
|
|
|
+ { lab: '结果值附件', prop:isFile?arr.result_file:''},
|
|
|
+ { lab: '加扣分上限', prop: this.initData(arr.point_limit) },
|
|
|
+ { lab: '备注', prop: this.initData(arr.remark) }
|
|
|
+ ];
|
|
|
+ // }else{
|
|
|
+ // arr.details = [
|
|
|
+ // { lab: '目标值', prop: arr.target+''+arr.unit},
|
|
|
+ // { lab: '结果值附件', prop:isFile?arr.result_file:''},
|
|
|
+ // { lab: '加扣分上限', prop: this.initData(arr.point_limit) },
|
|
|
+ // { lab: '备注', prop: this.initData(arr.remark) }
|
|
|
+ // ];
|
|
|
+ // }
|
|
|
+
|
|
|
+ // 权限区分
|
|
|
+ arr.scoreList = [];
|
|
|
+ arr.score_info.forEach((list, auto) => {
|
|
|
+ if (list.id <= this.smdsinsFlow) {
|
|
|
+ // smdsinsFlow为当前节点id。。数据-id <= 当前节点id . :筛选出当前节点及之前的评分节点的数据
|
|
|
+ list.employees.forEach(emplo => {
|
|
|
+ if (emplo.employee_id == this.userInfo.id && list.id == this.smdsinsFlow) {
|
|
|
+ arr.resultval = emplo.point;
|
|
|
+ arr.remarks = emplo.remark;
|
|
|
+ arr.employee_id = emplo.employee_id;
|
|
|
+ arr.flowId = list.id;
|
|
|
+ }
|
|
|
+ // 获取code
|
|
|
+ data.flow.forEach(codes => {
|
|
|
+ if (codes.id == list.id) {
|
|
|
+ if (codes.code == 'review') {
|
|
|
+ // 审批
|
|
|
+ emplo.newCode = 'reviewer';
|
|
|
+ } else if (codes.code == 'execution') {
|
|
|
+ // 执行中
|
|
|
+ emplo.newCode = 'employee';
|
|
|
+ } else if (codes.code == 'score_supervisor') {
|
|
|
+ // 指定上级
|
|
|
+ emplo.newCode = 'manager';
|
|
|
+ } else if (codes.code == 'special_scorer') {
|
|
|
+ // 特定上级
|
|
|
+ emplo.newCode = 'special';
|
|
|
+ }
|
|
|
+ codes.target.some(tar => {
|
|
|
+ //找到每个评分人获取评分状态
|
|
|
+ if (tar.employee_id == emplo.employee_id) {
|
|
|
+ emplo.status = tar.status;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // item为评分数据,数据内只有两个节点:指定(score_supervisor,权限名:manager) 特定上级(special_scorer,权限名:special)
|
|
|
+ // executor 执行人中的当前登陆账号
|
|
|
+ // review 审批人中的当前登陆账号
|
|
|
+ if (executor.employee_id) {
|
|
|
+ // 若有数据,那么当前登录账号必定在执行人中并且执行节点正在执行或已结束(哪怕正在执行也无所谓,前方已经过滤评分数据,会得到[])
|
|
|
+ if (poiSco[executor.newCode] == '2') {
|
|
|
+ // 已有数据并且为2 ‘查看所有的’ ,那就可以将所有的评分权限都改为 ‘2’
|
|
|
+ for (let i in poiSco) {
|
|
|
+ poiSco[i] = '2';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (poicom[executor.newCode] == '2') {
|
|
|
+ // 说明同上
|
|
|
+ for (let i in poicom) {
|
|
|
+ poicom[i] = '2';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (review.employee_id) {
|
|
|
+ // 审批节点--同上 (审批节点默认为2,可以直接全部变成2)
|
|
|
+ if (poiSco[review.newCode] == '2') {
|
|
|
+ for (let i in poiSco) {
|
|
|
+ poiSco[i] = '2';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (poicom[review.newCode] == '2') {
|
|
|
+ // 说明同上
|
|
|
+ for (let i in poicom) {
|
|
|
+ poicom[i] = '2';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (item.employee_id == executor.employee_id) {
|
|
|
+ // 判断当前评分数据是否 与 执行节点的当前帐号一致
|
|
|
+ if (poiSco[executor.newCode] == '2') {
|
|
|
+ // 如果一致并且执行节点为‘2’即查看所有,那么就修改当前 评分数据 的权限也为‘2’
|
|
|
+ poiSco[item.newCode] = '2';
|
|
|
+ }
|
|
|
+ if (poicom[executor.newCode] == '2') {
|
|
|
+ // 执行中的 -- 说明权限-同上
|
|
|
+ poicom[item.newCode] = '2';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (item.employee_id == review.employee_id) {
|
|
|
+ // 判断当前评分数据是否 与 审批节点的当前帐号一致
|
|
|
+ if (poiSco[review.newCode] == '2') {
|
|
|
+ poiSco[item.newCode] = '2';
|
|
|
+ }
|
|
|
+ if (poicom[review.newCode] == '2') {
|
|
|
+ // 审批的 -- 说明权限-同上
|
|
|
+ poicom[item.newCode] = '2';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let scoredata = {
|
|
|
+ // 评分&&说明
|
|
|
+ lab: emplo.title,
|
|
|
+ prop: emplo.point,
|
|
|
+ newCode: emplo.newCode,
|
|
|
+ employee_id: emplo.employee_id,
|
|
|
+ level: emplo.level,
|
|
|
+ remark: emplo.remark,
|
|
|
+ knowFrom: 0,
|
|
|
+ status: emplo.status
|
|
|
+ };
|
|
|
+
|
|
|
+ arr.scoreList.push(scoredata);
|
|
|
+ // 单项总分显示
|
|
|
+ if (this.retrunFs(list.id, emplo).length > 0&&!emplo.point) { //单项指标评分不显示总分,只评总分显示,要去掉,请把!emplo.point判断去掉
|
|
|
+ arr.scoreList.push(...this.retrunFs(list.id, emplo));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ dimeTab.push(arr);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ this.weight = weight + '%';
|
|
|
+ let poiSOk = false; // 评分--为true时所有评分可看
|
|
|
+ let poiCOk = false; // 说明--为true时所有说明可看
|
|
|
+ dimeTab.forEach(arr => {
|
|
|
+ arr.scoreList.forEach(item => {
|
|
|
+ // 判断评分
|
|
|
+ if (poiSco[item.newCode] == '1' && item.employee_id == this.userInfo.id) {
|
|
|
+ item.pointShow = true; //是否显示评分
|
|
|
+ } else if (poiSco[item.newCode] == '2') {
|
|
|
+ // 当前 评分 数据权限等于2时并且(当前数据id为登陆账号 或 执行中权限等于2(代表当前登陆账号为执行中的一员) 或 审批权限等于2(代表当前登陆账号为审批中的一员)) 时,所有评分都可见
|
|
|
+ if (item.employee_id == this.userInfo.id || poiSco[executor.newCode] == '2' || poiSco[review.newCode] == '2') {
|
|
|
+ poiSOk = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 判断说明
|
|
|
+ if (poicom[item.newCode] == '1' && item.employee_id == this.userInfo.id) {
|
|
|
+ item.textShow = true; //是否显示说明
|
|
|
+ } else if (poicom[item.newCode] == '2') {
|
|
|
+ if (item.employee_id == this.userInfo.id || poicom[executor.newCode] == '2' || poicom[review.newCode] == '2') {
|
|
|
+ poiCOk = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ dimeTab.forEach(arr => {
|
|
|
+ let points = []; //最终显示评分
|
|
|
+ arr.scoreList.forEach(item => {
|
|
|
+
|
|
|
+ if (poiSOk || this.$getRole(1) || this.isCs) {
|
|
|
+ item.pointShow = true;
|
|
|
+ }
|
|
|
+ if (poiCOk || this.$getRole(1) || this.isCs) {
|
|
|
+ item.textShow = true;
|
|
|
+ }
|
|
|
+ if (item.status != 2 && item.id != this.smdsinsFlow) {
|
|
|
+ // delete duplicat[index]
|
|
|
+ } else {
|
|
|
+ points.push(item);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ arr.scoreList = points;
|
|
|
+ });
|
|
|
+ this.inExecution = dimeTab;
|
|
|
+ this.pdLc(); //流程结束后的判断
|
|
|
+ let titDatas = [];
|
|
|
+ if (!this.flowNow.code || this.flowNow.code == 'review') { //是审批节点或者流程结束,(流程结束flowNow为空)
|
|
|
+ if(data.publicity == 1||this.$getRole(1)||isReview){//结果是否公示,是否主次管理员,是否是审批人
|
|
|
+ if (this.initData(data.final_point)) {
|
|
|
+ titDatas.push({ lab: '考核结果', prop: data.final_point });
|
|
|
+ }
|
|
|
+ if (this.initData(data.final_level)) {
|
|
|
+ titDatas.push({ lab: '绩效等级', prop: data.final_level });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.titList = titDatas; // 顶部数据
|
|
|
+ this.recordList = [];
|
|
|
+ // 记录
|
|
|
+ let record = res.data.data.record;
|
|
|
+ record.forEach((item, index) => {
|
|
|
+ item.name = this.$getEmployeeMapItem(item.employee_id).name;
|
|
|
+ if (index < 3) {
|
|
|
+ this.recordList.push(item);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.recordAllList = record;
|
|
|
+ this.skeletonLoad = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ openCx() {
|
|
|
+ this.popupknowFrom = 4;
|
|
|
+ this.commFeedback = '';
|
|
|
+ this.communication = true;
|
|
|
+ },
|
|
|
+ // 判断是否显示撤销按钮
|
|
|
+ isRevocation(dqItem, upItem) {
|
|
|
+ // 当前只需要评分节点需要撤回
|
|
|
+ //当前节点包含自己并且其他任意一人未完成的显示按钮
|
|
|
+ if (dqItem.code == 'score_supervisor' || dqItem.code == 'special_scorer') {
|
|
|
+ dqItem.target.some((item, index) => {
|
|
|
+ if (item.employee_id == this.userInfo.id && item.status == 2) {
|
|
|
+ dqItem.target.some((item2, index2) => {
|
|
|
+ if (item2.status == 1) {
|
|
|
+ this.revocationNodeId = dqItem.id;
|
|
|
+ this.revocationShow = true;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ let is = true; //判断当前节点人员是否有完成的
|
|
|
+ //上一节点中包含登录者并且是完成的状态显示按钮
|
|
|
+ if (upItem) {
|
|
|
+ dqItem.target.some((item, index) => {
|
|
|
+ if (item.status == 2) {
|
|
|
+ is = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (upItem.code == 'score_supervisor' || upItem.code == 'special_scorer') {
|
|
|
+ upItem.target.some((item, index) => {
|
|
|
+ if (item.employee_id == this.userInfo.id && item.status == 2 && is) {
|
|
|
+ this.revocationNodeId = upItem.id;
|
|
|
+ this.revocationShow = true;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ pdLc() {
|
|
|
+ let flow = JSON.parse(JSON.stringify(this.perfstepFlow)).reverse(); //反转流程,找第一个评分节点
|
|
|
+ //流程结束,但是最后一个“评分”节点里有自己显示撤销
|
|
|
+ if (this.publicity == 1) {
|
|
|
+ flow.some(item => {
|
|
|
+ if (item.code == 'review' || item.code == 'cc') {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (item.code == 'score_supervisor' || item.code == 'special_scorer') {
|
|
|
+ item.target.some(e => {
|
|
|
+ if (e.employee_id == this.userInfo.id && e.status == 2) {
|
|
|
+ this.revocationNodeId = item.id;
|
|
|
+ this.revocationShow = true;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //获取指定人员上级列表
|
|
|
+ getSuperiors(employee_id){
|
|
|
+ return this.$axiosUser('get', 'api/pro/employee/superior', {employee_id:employee_id,platform:'3'}).then(res=>{
|
|
|
+ return res.data.data.list
|
|
|
+ })
|
|
|
+ },
|
|
|
+ async buttonIf2() {
|
|
|
+ if (this.Information.id == this.$userInfo().id) {
|
|
|
+ this.actionButShow = true;
|
|
|
+ }
|
|
|
+ // 指定管理记录人是否包含自己
|
|
|
+ this.recordMemberIds.some(item => {
|
|
|
+ if (item == this.$userInfo().id) {
|
|
|
+ this.recordsManagement = true;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let superior_list=await this.getSuperiors(this.Information.id);
|
|
|
+ superior_list.some(item => {
|
|
|
+ // 判断被考核人的上级是否包含登录者
|
|
|
+ if (item.id == this.$userInfo().id) {
|
|
|
+ this.recordsManagement = true;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (this.$getPermis(3)) {
|
|
|
+ // 如果是子管理员并且管理范围权限为“全公司”
|
|
|
+ this.recordsManagement = true;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //判断是否显示结果值
|
|
|
+ isresultBtn(item){
|
|
|
+ //结果值录入按钮
|
|
|
+ let flow=this.perfstepFlow;
|
|
|
+ if (item.code == 'result_value') {
|
|
|
+ item.target.forEach(tar => {
|
|
|
+ if (tar.employee_id == this.userInfo.id) {
|
|
|
+ this.resultButShow = true;
|
|
|
+ this.resultStr=tar.status==2? '调整结果值':'录入结果值'
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return true;
|
|
|
+ }else{
|
|
|
+ let is=false
|
|
|
+ flow.some(obj=>{
|
|
|
+ if (obj.code == 'result_value') {
|
|
|
+ obj.target.forEach(tar => {
|
|
|
+ if (tar.employee_id == this.userInfo.id) {
|
|
|
+ is = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if(obj.code=='score_supervisor'||obj.code=='special_scorer'){
|
|
|
+ let isUpdate=true;
|
|
|
+ if(obj.target.length>0){
|
|
|
+ obj.target.forEach(e=>{
|
|
|
+ if(e.status==2){
|
|
|
+ isUpdate=false
|
|
|
+ }
|
|
|
+ })
|
|
|
+ if(isUpdate&&is){
|
|
|
+ this.resultButShow2 = true;
|
|
|
+ this.resultStr='调整结果值';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ buttonIf(item) {
|
|
|
+ // 按钮控制
|
|
|
+ if (item.status == 1) {
|
|
|
+ // 目标确认
|
|
|
+ if (item.code == 'confirm') {
|
|
|
+ item.target.forEach(tar => {
|
|
|
+ if (tar.employee_id == this.userInfo.id && tar.status == 1) {
|
|
|
+ this.targetConfirmed = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // 评分按钮
|
|
|
+ if (item.code == 'score_self' || item.code == 'score_mutual' || item.code == 'score_supervisor' || item.code == 'special_scorer') {
|
|
|
+ item.target.forEach(tar => {
|
|
|
+ if (tar.employee_id == this.userInfo.id && tar.status == 1) {
|
|
|
+ this.gradeButShow = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // 结果值录入按钮
|
|
|
+ if (item.code == 'result_value') {
|
|
|
+ item.target.forEach(tar => {
|
|
|
+ if (tar.employee_id == this.userInfo.id) {
|
|
|
+ this.resultButShow = true;
|
|
|
+ this.resultStr=tar.status==2? '调整结果值':'录入结果值'
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // 审批按钮
|
|
|
+ if (item.code == 'review') {
|
|
|
+ let reviewif = false;
|
|
|
+ item.target.forEach(tar => {
|
|
|
+ if (tar.employee_id == this.userInfo.id && tar.status == 1) {
|
|
|
+ reviewif = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.examineButShow = !!reviewif;
|
|
|
+ this.isAction = item.action.indexOf('refuse') >= 0;
|
|
|
+ }
|
|
|
+ this.careOfPeopleId = [];
|
|
|
+ // 当是结果值录入,上级评分,指定人评分,审批时显示转交按钮
|
|
|
+ if (
|
|
|
+ item.code == 'target' ||
|
|
|
+ item.code == 'score_supervisor' ||
|
|
|
+ item.code == 'special_scorer' ||
|
|
|
+ item.code == 'result_value' ||
|
|
|
+ item.code == 'review' ||
|
|
|
+ item.code == 'confirm'
|
|
|
+ ) {
|
|
|
+ item.target.forEach(add => {
|
|
|
+ if ((add.employee_id == this.userInfo.id || this.$getRole(1)) && add.status == 1) {
|
|
|
+ if (item.code == 'review' || item.code == 'confirm') {
|
|
|
+ if (item.action.indexOf('transfer') >= 0 || this.$getRole(1)) {
|
|
|
+ this.careOfPeopleId.push(add);
|
|
|
+ this.transferBut = true;
|
|
|
+ }
|
|
|
+ } else if (item.code == 'score_supervisor') {
|
|
|
+ if (item.transfer || this.$getRole(1)) {
|
|
|
+ this.careOfPeopleId.push(add);
|
|
|
+ this.transferBut = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.careOfPeopleId.push(add);
|
|
|
+ this.transferBut = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 返回节点评分是只评总分的
|
|
|
+ retrunFs(eid, e) {
|
|
|
+ let arr = [];
|
|
|
+ this.scoreInfo.forEach(item => {
|
|
|
+ if (item.id == eid) {
|
|
|
+ item.employees.forEach(u => {
|
|
|
+ if (u.point && u.employee_id == e.employee_id) {
|
|
|
+ let scoredata = {
|
|
|
+ // 评分
|
|
|
+ lab: e.title,
|
|
|
+ prop: u.point + '(总分)',
|
|
|
+ newCode: e.newCode,
|
|
|
+ knowFrom: 0,
|
|
|
+ employee_id: e.employee_id,
|
|
|
+ level: '',
|
|
|
+ remark: u.comment,
|
|
|
+ status: 2
|
|
|
+ };
|
|
|
+ arr.push(scoredata);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return arr;
|
|
|
+ },
|
|
|
+ // 数据初始化,没有值或者空数组的显示-
|
|
|
+ initData(str) {
|
|
|
+ if (str == null) {
|
|
|
+ return str || null;
|
|
|
+ }
|
|
|
+ if (typeof str === 'object') {
|
|
|
+ return str.length > 0 ? str : null;
|
|
|
+ } else {
|
|
|
+ return str || null;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ indexType(item) {
|
|
|
+ return item == 1 ? '量化指标' : item == 2 ? '非量化指标' : item == 3 ? '额外加分项' : item == 4 ? '额外扣分项' : '';
|
|
|
+ },
|
|
|
+ // 评分-文本框失去焦点时触发
|
|
|
+ watresultval(val, totalScore) {
|
|
|
+ if (totalScore) {
|
|
|
+ this.gradeval = this.fomatFloat(val, 2);
|
|
|
+ } else {
|
|
|
+ let tPoints = [];
|
|
|
+ this.inExecution.forEach(item => {
|
|
|
+ if (item.resultval) {
|
|
|
+ tPoints.push({
|
|
|
+ score: item.resultval, // 分值
|
|
|
+ d_weight: item.dimension_weight, // 维度权重
|
|
|
+ weight: item.weight, // 指标权重
|
|
|
+ type: item.type // 所属指标种类 1-量化指标 2-行为价值观指标 3-额外加分项 4-额外扣分项
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.gradeval = this.fomatFloat(this.totalPointsCount(tPoints), 2);
|
|
|
+ }
|
|
|
+ this.isShowPoint = true;
|
|
|
+ },
|
|
|
+ // 计算总分
|
|
|
+ totalPointsCount(data) {
|
|
|
+ let ct = this.empDetList.calc_type; // 1-加和计算 2-加权计算
|
|
|
+ let cd = this.empDetList.calc_dimension; // 是否维度权重参与计算 1-是 0-否
|
|
|
+ let num = 0;
|
|
|
+ data.forEach(item => {
|
|
|
+ if (item.score) {
|
|
|
+ if (item.type == 3) {
|
|
|
+ // 3-额外加分项
|
|
|
+ num += Number(item.score);
|
|
|
+ } else if (item.type == 4) {
|
|
|
+ // 4-额外扣分项 不计算
|
|
|
+ num -= Number(item.score);
|
|
|
+ } else {
|
|
|
+ if (ct == 1 && cd == 0) {
|
|
|
+ // 加和
|
|
|
+ num += Number(item.score);
|
|
|
+ } else if (ct == 1 && cd == 1) {
|
|
|
+ // 加和--维度权重参与计算
|
|
|
+ num += Number(item.score) * Number(item.d_weight / 100);
|
|
|
+ } else if (ct == 2 && cd == 0) {
|
|
|
+ // 加权
|
|
|
+ num += Number(item.score) * Number(item.weight / 100);
|
|
|
+ } else if (ct == 2 && cd == 1) {
|
|
|
+ // 加权--维度权重参与计算
|
|
|
+ num += Number(item.score) * Number(item.d_weight / 100) * Number(item.weight / 100);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return num;
|
|
|
+ },
|
|
|
+ fomatFloat(src, pos) {
|
|
|
+ return Math.round(src * Math.pow(10, pos)) / Math.pow(10, pos);
|
|
|
+ },
|
|
|
+ // e当前行 ,item用于判断当前输入是否超过评分上限
|
|
|
+ sgradeInp(item) {
|
|
|
+ if (item) {
|
|
|
+ if (item.type == 3 || item.type == 4) {
|
|
|
+ if (item.point_limit) {
|
|
|
+ if (item.resultval > Number(item.point_limit)) {
|
|
|
+ this.$toast.fail('评分超过上限');
|
|
|
+ item.resultval = '';
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ gradeClick() {
|
|
|
+ // 评分
|
|
|
+ this.graded = true;
|
|
|
+ let dnsion = [];
|
|
|
+ this.inExecution.forEach(item => {
|
|
|
+ if (item.employee_id == this.userInfo.id && item.flowId == this.smdsinsFlow) {
|
|
|
+ dnsion.push(item);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let totalScore = {
|
|
|
+ theDimension: '总分',
|
|
|
+ wdLeg: 0,
|
|
|
+ totalScore: true
|
|
|
+ };
|
|
|
+ this.perfstepFlow.forEach(item => {
|
|
|
+ if (item.code == 'score_supervisor' && item.status == 1) {
|
|
|
+ this.ruleScore = item.rule == 2 ? 2 : 1; // 1-指标均要评分 2-评分总结
|
|
|
+ this.thecurrentFlow = 'score_supervisor';
|
|
|
+ totalScore.codeId = item.id;
|
|
|
+ } else if (item.code == 'special_scorer' && item.status == 1) {
|
|
|
+ this.ruleScore = 1;
|
|
|
+ }
|
|
|
+ if ((item.code == 'score_supervisor' && item.status == 1) || (item.code == 'special_scorer' && item.status == 1)) {
|
|
|
+ // 上级评分,特定评分 评分人必填项
|
|
|
+ item.action.forEach(arr => {
|
|
|
+ this.mandatoryScore = arr == 'comment'; // 指标说明是否必填
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 总分
|
|
|
+ this.scoreInfo.forEach(item => {
|
|
|
+ item.employees.forEach(arr => {
|
|
|
+ if (arr.employee_id == this.userInfo.id) {
|
|
|
+ this.gradeval = arr.point ? arr.point : 0;
|
|
|
+ if (item.id == totalScore.codeId && this.ruleScore == 2) {
|
|
|
+ totalScore.resultval = arr.point;
|
|
|
+ totalScore.remarks = arr.comment ? arr.comment : '';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ let dimenList = [];
|
|
|
+ let users = []; // 当前节点的自己的信息
|
|
|
+ this.perfstepFlow.forEach(item => {
|
|
|
+ // 根据流程当前节点,找节点的人员中的登陆者
|
|
|
+ if (item.status == 1) {
|
|
|
+ item.target.some(arr => {
|
|
|
+ if (arr.employee_id == this.userInfo.id) {
|
|
|
+ arr.flowStatusId = item.id; // 当前节点的ID
|
|
|
+ users = arr;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ users.list.forEach(att => {
|
|
|
+ // 获取当前节点审批人员中的登陆者
|
|
|
+ dnsion.forEach(add => {
|
|
|
+ if (att.index_id == add.id && att.dimension_key == add.planIndex[0] && att.index_key == add.planIndex[1]) {
|
|
|
+ add.dimension_key = att.dimension_key; // 维度索引
|
|
|
+ add.index_key = att.index_key; // 指标索引
|
|
|
+ if(add.type==1){
|
|
|
+ add.expressionStr=getExpressionStr(add.expression)
|
|
|
+ }else{
|
|
|
+ add.expressionStr=''
|
|
|
+ }
|
|
|
+ add.score_infos.forEach(user => {
|
|
|
+ // 显示的文案,找到当前登录人
|
|
|
+ if (user.id == users.flowStatusId) {
|
|
|
+ if (user.employee_id == this.userInfo.id) {
|
|
|
+ this.scoreTab.title = user.title;
|
|
|
+ this.scoreTab.explain = user.title.split(':')[0] + '说明';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ dimenList.push(add);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ this.scoreInfo.forEach(item => {
|
|
|
+ item.employees.forEach(arr => {
|
|
|
+ if (arr.employee_id == this.userInfo.id) {
|
|
|
+ this.gradeval = arr.point ? arr.point : 0;
|
|
|
+ if (item.id == totalScore.codeId && this.ruleScore == 2) {
|
|
|
+ totalScore.resultval = arr.point;
|
|
|
+ totalScore.remarks = arr.comment ? arr.comment : '';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ this.perfstepFlow.forEach(item => {
|
|
|
+ if (item.code == 'score_supervisor' && item.status == 1 && this.ruleScore == 2) {
|
|
|
+ dimenList.push(totalScore);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.inExecution = dimenList;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ scoreClone() {
|
|
|
+ this.graded = false;
|
|
|
+ this.skeletonLoad = true;
|
|
|
+ this.employeeDet();
|
|
|
+ },
|
|
|
+ // 评分取消
|
|
|
+ scorerveno() {
|
|
|
+ this.$dialog
|
|
|
+ .confirm({
|
|
|
+ title: '暂存',
|
|
|
+ message: '是否暂存当前页面内容?'
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ this.scorerveok(0);
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ this.scoreClone();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ scorerveok(num) {
|
|
|
+ let data = {
|
|
|
+ id: this.employeeID, // 个人考核包ID
|
|
|
+ is_submit: num, // 是否提交 0否(暂存) 1 是
|
|
|
+ node_id: this.smdsinsFlow // 当前节点
|
|
|
+ };
|
|
|
+ let point_info = []; // 各项评分数据
|
|
|
+ let sumData = {
|
|
|
+ // 总分数据
|
|
|
+ total_score: '',
|
|
|
+ total_score_comment: ''
|
|
|
+ };
|
|
|
+ this.inExecution.forEach(item => {
|
|
|
+ let resultInfo = {};
|
|
|
+ if (this.ruleScore == 1 && !item.totalScore) {
|
|
|
+ // 各项评分
|
|
|
+ resultInfo = {
|
|
|
+ // 评分信息--只评总分不需要
|
|
|
+ score: item.resultval ? item.resultval : '', // 单项目结果值
|
|
|
+ score_remark: item.remarks,
|
|
|
+ dimension_key: item.dimension_key, // 维度索引
|
|
|
+ index_key: item.index_key, // 指标索引
|
|
|
+ index_id: item.id, // 指标ID
|
|
|
+ name: item.name,
|
|
|
+ // 用于计算分数
|
|
|
+ d_weight: item.dimension_weight, // 维度权重
|
|
|
+ weight: item.weight, // 指标权重
|
|
|
+ type: item.type // 所属指标种类 1-量化指标 2-行为价值观指标 3-额外加分项 4-额外扣分项
|
|
|
+ };
|
|
|
+ point_info.push(resultInfo);
|
|
|
+ } else {
|
|
|
+ // 等于2:只评总分
|
|
|
+ if (item.totalScore) {
|
|
|
+ sumData = {
|
|
|
+ total_score: item.resultval ? item.resultval : '',
|
|
|
+ total_score_comment: item.remarks
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let isMust = true,
|
|
|
+ isExplain = true; // isMust验证评分,isExplain验证说明
|
|
|
+ if (num == 1) {
|
|
|
+ // 提交验证必填
|
|
|
+ if (this.ruleScore == 1) {
|
|
|
+ // 各项评分
|
|
|
+ point_info.forEach(item => {
|
|
|
+ if (this.mandatoryScore) {
|
|
|
+ // 评分说明必填
|
|
|
+ if (!item.score_remark) {
|
|
|
+ isExplain = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (item.score===null||item.score===undefined||item.score==='') {
|
|
|
+ isMust = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (!isMust) {
|
|
|
+ this.$toast('请输入所有评分');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!isExplain) {
|
|
|
+ this.$toast('请输入所有评分说明');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 总分
|
|
|
+ if (!sumData.total_score) {
|
|
|
+ this.$toast('请输入评分总分');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (this.mandatoryScore) {
|
|
|
+ if (!sumData.total_score_comment) {
|
|
|
+ this.$toast('请输入总分说明');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (this.ruleScore == 1) {
|
|
|
+ data.total_score = this.fomatFloat(this.totalPointsCount(point_info), 2); // 计算的个人评出的总分(保留小数后两位)
|
|
|
+ } else {
|
|
|
+ data.total_score = this.fomatFloat(sumData.total_score, 2); // 计算的个人评出的总分(保留小数后两位)
|
|
|
+ data.total_score_comment = sumData.total_score_comment;
|
|
|
+ }
|
|
|
+ data.point_info = JSON.stringify(point_info); // 评分信息 -- 填所有评分时必须的字段(传入某指标的分数、说明、维度索引、制表索引、指标ID)
|
|
|
+ if (this.bootBool) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let pointList = JSON.parse(JSON.stringify(point_info));
|
|
|
+ pointList.push({
|
|
|
+ name: '总分',
|
|
|
+ score: data.total_score,
|
|
|
+ score_remark: data.total_score_comment
|
|
|
+ });
|
|
|
+ this.pointList = pointList;
|
|
|
+ this.pointData = data;
|
|
|
+ if (this.ruleScore == 1) {
|
|
|
+ //只评总分不需要弹窗
|
|
|
+ this.isPoint = true;
|
|
|
+ } else {
|
|
|
+ this.score();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ score() {
|
|
|
+ this.$axiosUser('post', '/api/pro/per/package/submit_score', this.pointData).then(res => {
|
|
|
+ this.$toast.success('提交成功');
|
|
|
+ this.bootBool = false;
|
|
|
+ this.isPoint = false;
|
|
|
+ this.graded = false;
|
|
|
+ this.employeeDet();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ gradeTurn() {
|
|
|
+ this.rejectval = '';
|
|
|
+ this.rejectval1 = '';
|
|
|
+ this.selectpradio = '';
|
|
|
+ this.selectpradio1 = '';
|
|
|
+ this.rejectProp = false;
|
|
|
+ this.rejectData = {};
|
|
|
+ let list = [];
|
|
|
+ this.perfstepFlow.forEach((item, index) => {
|
|
|
+ if (item.status == 2 && item.code != 'execution' && item.code != 'cc' && item.target.length != 0) {
|
|
|
+ let arr = {};
|
|
|
+ arr.id = item.id;
|
|
|
+ arr.name = item.remark;
|
|
|
+ item.target.forEach((att, aoo) => {
|
|
|
+ arr.name += att.employee_name;
|
|
|
+ arr.name += item.target.length - aoo > 1 ? ',' : '';
|
|
|
+ });
|
|
|
+ arr.staff = item.target;
|
|
|
+ list.push(arr);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.rejectList = list;
|
|
|
+ this.popupknowFrom = 1;
|
|
|
+ this.commFeedback = '';
|
|
|
+ this.communication = true;
|
|
|
+ },
|
|
|
+ // 审批同意
|
|
|
+ gradeOk() {
|
|
|
+ if (this.flowNow.code == 'confirm') {
|
|
|
+ // 驳回
|
|
|
+ this.popupknowFrom = 3;
|
|
|
+ } else if (this.flowNow.code == 'review') {
|
|
|
+ // 审批
|
|
|
+ this.popupknowFrom = 2;
|
|
|
+ }
|
|
|
+ this.commFeedback = '';
|
|
|
+ this.communication = true;
|
|
|
+ },
|
|
|
+ // 选人
|
|
|
+ confirm(data) {
|
|
|
+ let item = data.employee[0];
|
|
|
+ let employeeId = this.careOfPeopleId.length == 1 ? this.careOfPeopleId[0].employee_id : this.zjId;
|
|
|
+ this.$dialog.confirm({ title: '转交', message: '确认转交:' + item.name + '?' }).then(() => {
|
|
|
+ let data = {
|
|
|
+ id: this.employeeID, // 个人考核记录ID
|
|
|
+ node_id: this.flowNow.id, // 节点ID
|
|
|
+ to_employee_id: item.id, // 接收用户ID
|
|
|
+ from_employee_id: employeeId // 转出用户ID
|
|
|
+ };
|
|
|
+ this.$axiosUser('post', '/api/pro/per/package/transfer', data).then(res => {
|
|
|
+ if (res.data.code == 1) {
|
|
|
+ this.$toast.success('转交成功');
|
|
|
+ this.employeeDet();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 打开执行计划
|
|
|
+ openPlan(index) {
|
|
|
+ this.planIndex = index;
|
|
|
+ this.openTrackPath('action');
|
|
|
+ },
|
|
|
+ // 打开管理记录
|
|
|
+ openTrack(index) {
|
|
|
+ this.planIndex = index;
|
|
|
+ this.openTrackPath('admnin');
|
|
|
+ },
|
|
|
+
|
|
|
+ // 管理记录||执行计划
|
|
|
+ openTrackPath(add) {
|
|
|
+ let data = {
|
|
|
+ know: add,
|
|
|
+ apList: this.apList,
|
|
|
+ packId: this.employeeID,
|
|
|
+ assessID: this.Information.id,
|
|
|
+ planIndex: this.planIndex,
|
|
|
+ recordMemberIds: this.recordMemberIds
|
|
|
+ };
|
|
|
+ this.$setCache('actionplanList', data);
|
|
|
+ this.$router.push({ name: 'actionplanList' });
|
|
|
+ },
|
|
|
+ // 指标详情
|
|
|
+ openPlanPath(apList, add) {
|
|
|
+ this.logList = add == 'action' ? apList.schedule : apList.mamage_record;
|
|
|
+ this.logText = add == 'action' ? '执行计划' : '管理记录';
|
|
|
+ this.apDetails = apList;
|
|
|
+ this.isShowText = true;
|
|
|
+ },
|
|
|
+ unfold() {
|
|
|
+ // 展开记录
|
|
|
+ this.recordList = this.recordAllList;
|
|
|
+ },
|
|
|
+ packUp() {
|
|
|
+ // 收起记录
|
|
|
+ let listtre = [];
|
|
|
+ this.recordAllList.forEach((item, index) => {
|
|
|
+ if (index < 3) {
|
|
|
+ listtre.push(item);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.recordList = listtre;
|
|
|
+ },
|
|
|
+ communicate() {
|
|
|
+ this.popupknowFrom = 0;
|
|
|
+ this.commFeedback = '';
|
|
|
+ this.communication = true;
|
|
|
+ },
|
|
|
+ turndown() {
|
|
|
+ // 驳回
|
|
|
+ this.popupknowFrom = 1;
|
|
|
+ this.commFeedback = '';
|
|
|
+ this.communication = true;
|
|
|
+ },
|
|
|
+ enteringResult() {
|
|
|
+ // 录入结果值
|
|
|
+ this.$router.push({
|
|
|
+ name: 'resultValueEntry',
|
|
|
+ query: { id: this.employeeID, packageName: this.detailsTIt,resultStr:this.resultStr }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ commcliButon() {
|
|
|
+ // 沟通弹窗取消按钮
|
|
|
+ this.communication = false;
|
|
|
+ },
|
|
|
+ commcliButok() {
|
|
|
+ // 沟通弹窗确定按钮
|
|
|
+ if (this.popupknowFrom == 0) {
|
|
|
+ // 沟通
|
|
|
+ if (!this.commFeedback) {
|
|
|
+ this.$toast('请输入沟通内容');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ let target_id = this.emtags.map(item => {
|
|
|
+ return item.id;
|
|
|
+ });
|
|
|
+ this.$axiosUser('post', '/api/pro/per/package/negotiation', {
|
|
|
+ id: this.employeeID,
|
|
|
+ content: this.commFeedback,
|
|
|
+ target_id: JSON.stringify(target_id)
|
|
|
+ }).then(res => {
|
|
|
+ this.$toast.success('已沟通');
|
|
|
+ this.employeeDet();
|
|
|
+ this.communication = false;
|
|
|
+ });
|
|
|
+ } else if (this.popupknowFrom == 1) {
|
|
|
+ // 驳回
|
|
|
+ this.agree0Prop(0); // 审批驳回、目标确认驳回
|
|
|
+ } else if (this.popupknowFrom == 2 || this.popupknowFrom == 3) {
|
|
|
+ this.agree0Prop(1); // 审批同意、目标确认同意
|
|
|
+ } else if (this.popupknowFrom == 4) {
|
|
|
+ this.revocation();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 撤销
|
|
|
+ revocation() {
|
|
|
+ let params = {
|
|
|
+ id: this.employeeID,
|
|
|
+ node_id: this.revocationNodeId,
|
|
|
+ comment: this.commFeedback
|
|
|
+ };
|
|
|
+ this.$axiosUser('post', '/api/pro/per/package/revoke', params)
|
|
|
+ .then(res => {
|
|
|
+ if (res.data.code == 1) {
|
|
|
+ this.$toast.success('撤销成功');
|
|
|
+ this.employeeDet();
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ this.communication = false;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ agree0Prop(num) {
|
|
|
+ let data = {
|
|
|
+ id: this.employeeID, // 个人考核包ID
|
|
|
+ agree: num, // 同意1 驳回0
|
|
|
+ c_node_id: this.flowNow.id // 当前节点ID
|
|
|
+ };
|
|
|
+ if (num == 0) {
|
|
|
+ if (!this.commFeedback) {
|
|
|
+ this.$toast('请输入驳回内容');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!this.rejectData.node_id) {
|
|
|
+ this.$toast('请选择驳回节点!');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!this.rejectData.employee_id) {
|
|
|
+ this.$toast('至少选择一名重置人员!');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ data.employee_id = JSON.stringify(this.rejectData.employee_id);
|
|
|
+ data.node_id = this.rejectData.node_id;
|
|
|
+ }
|
|
|
+ if (this.commFeedback) {
|
|
|
+ data.comment = this.commFeedback; // 审核意见
|
|
|
+ }
|
|
|
+ this.$axiosUser('post', '/api/pro/per/package/review', data).then(res => {
|
|
|
+ this.$toast.success('提交成功');
|
|
|
+ this.employeeDet();
|
|
|
+ this.communication = false;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ confirmCreator(data) {
|
|
|
+ this.emtags = data.employee;
|
|
|
+ },
|
|
|
+ clickreject(item) {
|
|
|
+ this.rejectList1 = [];
|
|
|
+ this.rejectData = {};
|
|
|
+ this.rejectval = item.name;
|
|
|
+ if (item.staff.length > 1) {
|
|
|
+ this.rejectList1.push({ employee_id: 0, employee_name: '全部人员' });
|
|
|
+ item.staff.forEach(item => {
|
|
|
+ if (item.status == 2) {
|
|
|
+ this.rejectList1.push(item);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.rejectProp = true;
|
|
|
+ } else {
|
|
|
+ this.rejectData.employee_id = [item.staff[0].employee_id];
|
|
|
+ this.rejectProp = false;
|
|
|
+ }
|
|
|
+ this.rejectData.node_id = item.id;
|
|
|
+ this.rejectdlg = false;
|
|
|
+ },
|
|
|
+ clickreject1(item) {
|
|
|
+ this.rejectval1 = item.employee_name;
|
|
|
+ if (item.employee_id == 0) {
|
|
|
+ let arr = [];
|
|
|
+ this.rejectList1.forEach(aoo => {
|
|
|
+ if (aoo.employee_id && aoo.employee_id != 0) {
|
|
|
+ arr.push(aoo.employee_id);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.rejectData.employee_id = arr;
|
|
|
+ } else {
|
|
|
+ this.rejectData.employee_id = [item.employee_id];
|
|
|
+ }
|
|
|
+ this.rejectdlg1 = false;
|
|
|
+ },
|
|
|
+ setUpD() {
|
|
|
+ this.headuDown[0] = {};
|
|
|
+ this.headuDown[1] = {};
|
|
|
+ let pendingList = this.pendingList;
|
|
|
+ pendingList.some((item, index) => {
|
|
|
+ if (this.employeeID == item.employeeID) {
|
|
|
+ this.detailsTIt = item.package_name;
|
|
|
+ this.$route.query.id = item.employeeID;
|
|
|
+ if (pendingList[index - 1]) {
|
|
|
+ this.headuDown[0] = {
|
|
|
+ keys: 1,
|
|
|
+ keys1: '上一个',
|
|
|
+ keys2: '<',
|
|
|
+ name: pendingList[index - 1].name,
|
|
|
+ id: pendingList[index - 1].employeeID,
|
|
|
+ package_id:pendingList[index - 1].package_id,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (pendingList[index + 1]) {
|
|
|
+ this.headuDown[1] = {
|
|
|
+ keys: 2,
|
|
|
+ keys1: '下一个',
|
|
|
+ keys2: '>',
|
|
|
+ name: pendingList[index + 1].name,
|
|
|
+ id: pendingList[index + 1].employeeID,
|
|
|
+ package_id:pendingList[index + 1].package_id,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (index == pendingList.length - 2 && pendingList.length >= 10) {//如果当点击到待办人员的倒数第二个,加载剩余的
|
|
|
+ this.getAgency();
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ uDownCli(data) {
|
|
|
+ if (data.id=='结果') {
|
|
|
+ this.isDetails=false;
|
|
|
+ this.headuDown[0] = {};
|
|
|
+ this.headuDown[1] = {};
|
|
|
+ let pendingList = this.pendingList;
|
|
|
+ pendingList.some((item, index) => {
|
|
|
+ if (item.package_id&&item.package_id ==data.package_id) {
|
|
|
+ this.pe_ids=JSON.stringify(item.pe_ids);
|
|
|
+ this.detailsTIt = item.package_name;
|
|
|
+ if (pendingList[index - 1]) {
|
|
|
+ this.headuDown[0] = {
|
|
|
+ keys: 1,
|
|
|
+ keys1: '上一个',
|
|
|
+ keys2: '<',
|
|
|
+ name: pendingList[index - 1].name,
|
|
|
+ id: pendingList[index - 1].employeeID,
|
|
|
+ package_id:pendingList[index - 1].package_id,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (pendingList[index + 1]) {
|
|
|
+ this.headuDown[1] = {
|
|
|
+ keys: 2,
|
|
|
+ keys1: '下一个',
|
|
|
+ keys2: '>',
|
|
|
+ name: pendingList[index + 1].name,
|
|
|
+ id: pendingList[index + 1].employeeID,
|
|
|
+ package_id:pendingList[index + 1].package_id,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (index == pendingList.length - 2 && pendingList.length >= 10) {//如果当点击到待办人员的倒数第二个,加载剩余的
|
|
|
+ this.getAgency();
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }else{
|
|
|
+ if(data.id){
|
|
|
+ this.$route.query.id = data.id;
|
|
|
+ this.isDetails=true;
|
|
|
+ this.employeeID = data.id;
|
|
|
+ this.skeletonLoad = true;
|
|
|
+ this.employeeDet();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ // 沟通,跳转
|
|
|
+ if (document.documentElement.style.height) {
|
|
|
+ this.com_height = document.documentElement.style.height;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ activated() {
|
|
|
+ // 是否显示上下人
|
|
|
+ if (this.$route.query.pendingList && this.$route.query.pendingList.length != 0) {
|
|
|
+ this.pendingList = JSON.parse(this.$route.query.pendingList);
|
|
|
+ this.isDisabled = true;
|
|
|
+ this.activeName = this.$route.query.activeName;
|
|
|
+ this.page = this.$route.query.page || 1;
|
|
|
+ } else {
|
|
|
+ this.isDisabled = false;
|
|
|
+ this.activeName = '';
|
|
|
+ }
|
|
|
+ this.skeletonLoad = true;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.detailsTIt = this.$route.query.Tit;
|
|
|
+ });
|
|
|
+ if(this.$route.query.pe_ids){//结果值点击进来
|
|
|
+ this.isDetails=false;
|
|
|
+ this.headuDown[0] = {};
|
|
|
+ this.headuDown[1] = {};
|
|
|
+ let pendingList = JSON.parse(this.$route.query.pendingList);
|
|
|
+ pendingList.some((item, index) => {
|
|
|
+ if (item.package_id&&item.package_id ==this.$route.query.package_id) {
|
|
|
+ this.pe_ids=this.$route.query.pe_ids;
|
|
|
+ this.isUpdate=this.$route.query.isUpdate? true:false;
|
|
|
+ if (pendingList[index - 1]) {
|
|
|
+ this.headuDown[0] = {
|
|
|
+ keys: 1,
|
|
|
+ keys1: '上一个',
|
|
|
+ keys2: '<',
|
|
|
+ name: pendingList[index - 1].name,
|
|
|
+ id: pendingList[index - 1].employeeID,
|
|
|
+ package_id:pendingList[index - 1].package_id,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (pendingList[index + 1]) {
|
|
|
+ this.headuDown[1] = {
|
|
|
+ keys: 2,
|
|
|
+ keys1: '下一个',
|
|
|
+ keys2: '>',
|
|
|
+ name: pendingList[index + 1].name,
|
|
|
+ id: pendingList[index + 1].employeeID,
|
|
|
+ package_id:pendingList[index + 1].package_id,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (index == pendingList.length - 2 && pendingList.length >= 10) {//如果当点击到待办人员的倒数第二个,加载剩余的
|
|
|
+ this.getAgency();
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }else{
|
|
|
+ this.employeeDet();
|
|
|
+ }
|
|
|
+ if (this.$route.query.paths && this.$route.query.data) {
|
|
|
+ let data = JSON.parse(this.$route.query.data);
|
|
|
+ this.$axiosUser('post', '/api/pro/per/package/msg/cc', data).then(res => {});
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="less">
|
|
|
+ .okr-tips {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ right: 0;
|
|
|
+ height: 0.38rem;
|
|
|
+ font-size: 0.27rem;
|
|
|
+ padding: 0.1rem 0.25rem;
|
|
|
+ border-top-left-radius: 0.05rem;
|
|
|
+ border-bottom-left-radius: 0.05rem;
|
|
|
+ display: -webkit-box;
|
|
|
+ display: -ms-flexbox;
|
|
|
+ display: flex;
|
|
|
+ color: #26a2ff;
|
|
|
+ background-color: #ecf5ff;
|
|
|
+ }
|
|
|
+
|
|
|
+.apdList {
|
|
|
+ background-color: #fff;
|
|
|
+}
|
|
|
+.apdData {
|
|
|
+ width: 88%;
|
|
|
+ padding: 0.1rem 0;
|
|
|
+ margin: 0 0.3rem 0 0.2rem;
|
|
|
+ border-bottom: 1px solid rgb(240, 240, 240);
|
|
|
+}
|
|
|
+.apdDian {
|
|
|
+ position: relative;
|
|
|
+ width: 0.25rem;
|
|
|
+ height: 0.25rem;
|
|
|
+ border-radius: 50%;
|
|
|
+ background-color: #d4d4d4;
|
|
|
+}
|
|
|
+.apdHeadBoeder {
|
|
|
+ position: absolute;
|
|
|
+ left: 0.11rem;
|
|
|
+ height: 100%;
|
|
|
+ width: 0.02rem;
|
|
|
+ border-left: 0.02rem solid #d4d4d4;
|
|
|
+}
|
|
|
+.apdborderNO {
|
|
|
+ border: 0 !important;
|
|
|
+}
|
|
|
+.apdListMarTop {
|
|
|
+ margin: 0.15rem 0 0rem 0;
|
|
|
+ background-color: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.vassheet {
|
|
|
+ margin-bottom: 1rem;
|
|
|
+ min-height: 6rem;
|
|
|
+ .vasHead {
|
|
|
+ background-color: #fff;
|
|
|
+ text-align: center;
|
|
|
+ padding: 0.2rem;
|
|
|
+ i {
|
|
|
+ right: 0.3rem;
|
|
|
+ top: 0.32rem;
|
|
|
+ position: absolute;
|
|
|
+ }
|
|
|
+ i ::active{
|
|
|
+ content:"";
|
|
|
+ position:absolute;
|
|
|
+ top:-10px;
|
|
|
+ right:-10px;
|
|
|
+ bottom:-10px;
|
|
|
+ left:-10px;
|
|
|
+ }
|
|
|
+ span {
|
|
|
+ font-size: 0.32rem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .pullUpdel {
|
|
|
+ margin: 0.15rem 0 6rem 0;
|
|
|
+ padding: 0.25rem;
|
|
|
+ background-color: #ffffff;
|
|
|
+ .intro {
|
|
|
+ span {
|
|
|
+ display: inline-block;
|
|
|
+ padding: 0.05rem 0;
|
|
|
+ }
|
|
|
+ .introcol {
|
|
|
+ color: rgb(171, 171, 171);
|
|
|
+ }
|
|
|
+ .intropad {
|
|
|
+ padding: 0.1rem 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.guidang {
|
|
|
+ width: 60px;
|
|
|
+ animation: example 1s;
|
|
|
+ height: 35px;
|
|
|
+ margin-left: 10px;
|
|
|
+}
|
|
|
+@keyframes example {
|
|
|
+ from {
|
|
|
+ transform: scale(1.4);
|
|
|
+ }
|
|
|
+ to {
|
|
|
+ transform: scale(1);
|
|
|
+ }
|
|
|
+}
|
|
|
+/deep/ .upDownList {
|
|
|
+ z-index: 1;
|
|
|
+ padding: 0.2rem 0;
|
|
|
+ box-shadow: 0 0.05rem 0.15rem 0.01rem #efefef;
|
|
|
+ position: relative;
|
|
|
+ background-color: #fff;
|
|
|
+ .uDownBut {
|
|
|
+ border: 0.02rem solid #e4e4e4;
|
|
|
+ font-size: 0.26rem;
|
|
|
+ width: 2.3rem;
|
|
|
+ padding: 0.1rem 0.1rem;
|
|
|
+ margin: 0 0.3rem;
|
|
|
+ color: #378df9e8;
|
|
|
+ text-align: center;
|
|
|
+ border-radius: 0.05rem;
|
|
|
+ }
|
|
|
+}
|
|
|
+.pre {
|
|
|
+ margin: 0 !important;
|
|
|
+ font-family: 微软雅黑;
|
|
|
+ white-space: pre-wrap; /*css-3*/
|
|
|
+ white-space: -moz-pre-wrap; /*Mozilla,since1999*/
|
|
|
+ white-space: -pre-wrap; /*Opera4-6*/
|
|
|
+ white-space: -o-pre-wrap; /*Opera7*/
|
|
|
+ word-wrap: break-word; /*InternetExplorer5.5+*/
|
|
|
+ background-color: #f6f6f6;
|
|
|
+ padding: 0.1rem 0.2rem;
|
|
|
+}
|
|
|
+.pre2 {
|
|
|
+ margin: 0 !important;
|
|
|
+ font-family: 微软雅黑;
|
|
|
+ white-space: pre-wrap; /*css-3*/
|
|
|
+ white-space: -moz-pre-wrap; /*Mozilla,since1999*/
|
|
|
+ white-space: -pre-wrap; /*Opera4-6*/
|
|
|
+ white-space: -o-pre-wrap; /*Opera7*/
|
|
|
+ word-wrap: break-word; /*InternetExplorer5.5+*/
|
|
|
+}
|
|
|
+.bian::after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ width: 1px;
|
|
|
+ top: 0.5rem;
|
|
|
+ left: 0.21rem;
|
|
|
+ bottom: 0;
|
|
|
+ border-right: 1px dashed #ccc;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+.isIos {
|
|
|
+ padding-bottom: 0.4rem !important;
|
|
|
+}
|
|
|
+/deep/ .overall {
|
|
|
+ // width: 100%;
|
|
|
+ // width: 7.49rem;
|
|
|
+ height: calc(100% - 1.92rem) !important;
|
|
|
+ position: relative;
|
|
|
+ overflow-y: scroll;
|
|
|
+ // overflow-y: auto;
|
|
|
+ // overflow-x: hidden;
|
|
|
+ // display: inline-block;
|
|
|
+}
|
|
|
+header {
|
|
|
+ font-size: 0.31rem;
|
|
|
+ background-color: #fff;
|
|
|
+ padding: 0.3rem 0 0.3rem 0.3rem;
|
|
|
+ font-size: 0.3rem;
|
|
|
+ z-index: 1;
|
|
|
+ box-sizing: border-box;
|
|
|
+ .pdHeadDept {
|
|
|
+ color: rgb(117, 117, 117);
|
|
|
+ padding-top: 0.03rem;
|
|
|
+ font-size: 0.25rem;
|
|
|
+ }
|
|
|
+}
|
|
|
+.backlog_list_tit {
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ padding: 0.2rem 0 0.2rem 0.2rem;
|
|
|
+ font-size: 0.28rem;
|
|
|
+}
|
|
|
+.backlog_list {
|
|
|
+ padding: 0.32rem 0.45rem;
|
|
|
+ span {
|
|
|
+ padding-left: 0.25rem;
|
|
|
+ font-size: 0.29rem;
|
|
|
+ }
|
|
|
+}
|
|
|
+.arrow::-webkit-scrollbar,
|
|
|
+.overall::-webkit-scrollbar {
|
|
|
+ //隐藏滚动条
|
|
|
+ width: 0px;
|
|
|
+ height: 0px;
|
|
|
+}
|
|
|
+.arrow {
|
|
|
+ position: relative;
|
|
|
+ width: 7.17rem;
|
|
|
+ overflow-x: auto;
|
|
|
+ white-space: nowrap;
|
|
|
+ padding-right: 1rem;
|
|
|
+ div {
|
|
|
+ position: relative;
|
|
|
+ display: inline-block;
|
|
|
+ margin-right: 0.12rem;
|
|
|
+ box-shadow: 0 0.06rem 0.1rem -0.07rem #828282;
|
|
|
+ .diamondo {
|
|
|
+ background-color: #e8e8e8;
|
|
|
+ max-height: 0.42rem;
|
|
|
+ font-size: 0.26rem;
|
|
|
+ border-top-left-radius: 0.04rem;
|
|
|
+ border-bottom-left-radius: 0.04rem;
|
|
|
+ padding: 0.13rem 0.2rem 0.1rem 0.5rem;
|
|
|
+ display: inline-block;
|
|
|
+ i {
|
|
|
+ color: rgb(43, 117, 255);
|
|
|
+ // position: absolute;
|
|
|
+ margin-left: 0.12rem;
|
|
|
+ }
|
|
|
+ .arrowdetails {
|
|
|
+ max-width: 4.5rem;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+ display: inline-block;
|
|
|
+ }
|
|
|
+ .arrowdetails1 {
|
|
|
+ padding-left: 0.25rem;
|
|
|
+ }
|
|
|
+ .flowPadd {
|
|
|
+ padding-right: 0.2rem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .diamondo1 {
|
|
|
+ padding: 0.13rem 0.2rem 0.1rem 0.3rem;
|
|
|
+ }
|
|
|
+
|
|
|
+ .diamondTzj,
|
|
|
+ .diamondTyj {
|
|
|
+ border-width: 0.33rem;
|
|
|
+ border-style: solid;
|
|
|
+ border-color: transparent transparent transparent #ffffff;
|
|
|
+ display: inline-block;
|
|
|
+ position: absolute;
|
|
|
+ }
|
|
|
+ .diamondTyj {
|
|
|
+ border-color: transparent transparent transparent #e8e8e8;
|
|
|
+ z-index: 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .active {
|
|
|
+ .diamondo {
|
|
|
+ background-color: #ccdffb;
|
|
|
+ color: #1d96ff;
|
|
|
+ }
|
|
|
+ .diamondTzj {
|
|
|
+ }
|
|
|
+ .diamondTyj {
|
|
|
+ border-color: transparent transparent transparent#ccdffb;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.managementRecord,
|
|
|
+.sidebar {
|
|
|
+ height: 0.38rem;
|
|
|
+ position: fixed;
|
|
|
+ right: 0px;
|
|
|
+ font-size: 0.27rem;
|
|
|
+ padding: 0.1rem 0.25rem;
|
|
|
+ border-top-left-radius: 0.05rem;
|
|
|
+ border-bottom-left-radius: 0.05rem;
|
|
|
+ display: flex;
|
|
|
+ color: #26a2ff;
|
|
|
+ background-color: #ecf5ff;
|
|
|
+ i {
|
|
|
+ // margin: 0.05rem 0.15rem 0 0;
|
|
|
+ margin-right: 0.15rem;
|
|
|
+ color: #26a2ff;
|
|
|
+ }
|
|
|
+}
|
|
|
+.managementRecord {
|
|
|
+ top: 66%;
|
|
|
+}
|
|
|
+.sidebar {
|
|
|
+ top: 71%;
|
|
|
+}
|
|
|
+.isdeliveryRecord_icon {
|
|
|
+ width: 0.28rem;
|
|
|
+ padding-right: 0.15rem;
|
|
|
+}
|
|
|
+/deep/ .footerBut {
|
|
|
+ position: fixed;
|
|
|
+ left: 0px;
|
|
|
+ bottom: 0px;
|
|
|
+ width: 100%;
|
|
|
+ background-color: #ffffff;
|
|
|
+ z-index: 999;
|
|
|
+ .footweight {
|
|
|
+ padding: 0.15rem 0 0.15rem 0.3rem;
|
|
|
+ background-color: #deeeff;
|
|
|
+ font-size: 0.27rem;
|
|
|
+ color: #1d96ff;
|
|
|
+ }
|
|
|
+ .footfoot {
|
|
|
+ padding: 0.1rem;
|
|
|
+ .footcol {
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
+ .footcolBut {
|
|
|
+ border: 0;
|
|
|
+ width: 2rem;
|
|
|
+ height: 0.8rem;
|
|
|
+ font-size: 0.28rem;
|
|
|
+ color: #fff;
|
|
|
+ background-color: #42a8ff;
|
|
|
+ border-radius: 3px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .footBut {
|
|
|
+ display: flex;
|
|
|
+ }
|
|
|
+ .gradefootcolButok {
|
|
|
+ width: 2.8rem;
|
|
|
+ height: 0.8rem;
|
|
|
+ font-size: 0.28rem;
|
|
|
+ border: 0;
|
|
|
+ color: #fff;
|
|
|
+ background-color: #42a8ff;
|
|
|
+ border-radius: 3px;
|
|
|
+ }
|
|
|
+ .footcolButno,
|
|
|
+ .footcolButok {
|
|
|
+ width: 1.4rem;
|
|
|
+ height: 0.8rem;
|
|
|
+ font-size: 0.28rem;
|
|
|
+ }
|
|
|
+ .footcolButno {
|
|
|
+ border: 1px solid #42a8ff;
|
|
|
+ color: #2f9eff;
|
|
|
+ background-color: #ffffff;
|
|
|
+ border-top-left-radius: 3px;
|
|
|
+ border-bottom-left-radius: 3px;
|
|
|
+ }
|
|
|
+ .footcolButok {
|
|
|
+ border: 0;
|
|
|
+ color: #fff;
|
|
|
+ background-color: #42a8ff;
|
|
|
+ border-top-right-radius: 3px;
|
|
|
+ border-bottom-right-radius: 3px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.commButt {
|
|
|
+ position: fixed;
|
|
|
+ left: 0px;
|
|
|
+ bottom: 0px;
|
|
|
+ width: 100%;
|
|
|
+ background-color: #ffffff;
|
|
|
+ z-index: 999;
|
|
|
+ text-align: center;
|
|
|
+ border-top: 1px solid #dedede;
|
|
|
+ .commButtno {
|
|
|
+ border-radius: 0.1rem;
|
|
|
+ width: 3.2rem;
|
|
|
+ height: 0.9rem;
|
|
|
+ border: 0;
|
|
|
+ font-size: 0.3rem;
|
|
|
+ color: #464646;
|
|
|
+ background-color: #f3f3f3;
|
|
|
+ text-align: center;
|
|
|
+ margin: 0.2rem 0.07rem;
|
|
|
+ line-height: 0.9rem;
|
|
|
+ border: 1px solid #d6d6d6;
|
|
|
+ }
|
|
|
+ .commButtok {
|
|
|
+ border-radius: 0.1rem;
|
|
|
+ width: 3.2rem;
|
|
|
+ height: 0.9rem;
|
|
|
+ border: 0;
|
|
|
+ font-size: 0.3rem;
|
|
|
+ color: #fff;
|
|
|
+ background-color: #4498ef;
|
|
|
+ text-align: center;
|
|
|
+ margin: 0.2rem 0.07rem;
|
|
|
+ line-height: 0.9rem;
|
|
|
+ border: 1px solid #36a2ff;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.modTit {
|
|
|
+ background-color: #efefef;
|
|
|
+ padding: 0.27rem 0.3rem 0.15rem;
|
|
|
+ font-size: 0.28rem;
|
|
|
+ color: #8a8a8a;
|
|
|
+}
|
|
|
+.modCont {
|
|
|
+ padding: 0.3rem;
|
|
|
+ background-color: #fff;
|
|
|
+}
|
|
|
+.stanif {
|
|
|
+ .stanTit {
|
|
|
+ font-size: 0.26rem;
|
|
|
+ color: #222;
|
|
|
+ margin: 0.2rem 0 0.08rem 0;
|
|
|
+ }
|
|
|
+ .standara {
|
|
|
+ border: 1px solid #efefef;
|
|
|
+ border-radius: 5px;
|
|
|
+ .standarapad {
|
|
|
+ display: inline-block;
|
|
|
+ padding: 0.2rem;
|
|
|
+ font-size: 0.27rem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.tab-List {
|
|
|
+ display: inline-block;
|
|
|
+ padding: 0.05rem 0.15rem;
|
|
|
+ background-color: #fdf6ec;
|
|
|
+ color: #ff9600;
|
|
|
+ font-size: 0.25rem;
|
|
|
+ margin-right: 0.1rem;
|
|
|
+ border-radius: 0.01rem;
|
|
|
+}
|
|
|
+.flexPopover {
|
|
|
+ padding: 0.25rem;
|
|
|
+ background-color: #fff;
|
|
|
+ .flex_one {
|
|
|
+ width: 100%;
|
|
|
+ height: 0.8rem;
|
|
|
+ font-size: 0.3rem;
|
|
|
+ border-radius: 1px;
|
|
|
+ background-color: #26a2ff;
|
|
|
+ color: #fff;
|
|
|
+ align-items: center;
|
|
|
+ div:nth-child(1) {
|
|
|
+ max-width: 80%;
|
|
|
+ padding: 0 0 0 0.2rem;
|
|
|
+ }
|
|
|
+ div:nth-child(2) {
|
|
|
+ padding: 0 0.2rem 0 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+.aite {
|
|
|
+ padding: 0.2rem;
|
|
|
+ font-size: 0.36rem;
|
|
|
+ cursor: pointer;
|
|
|
+ position: absolute;
|
|
|
+ top: -0.8rem;
|
|
|
+ // width: 40px;
|
|
|
+}
|
|
|
+
|
|
|
+.employee_selector_popup {
|
|
|
+ height: 100%;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.flexDiaWb {
|
|
|
+ max-height: 7rem;
|
|
|
+ overflow-y: auto;
|
|
|
+ overflow-x: hidden;
|
|
|
+ margin: 0.4rem 0;
|
|
|
+ padding: 0 0.2rem 0 0.3rem;
|
|
|
+ .flexDiaLL {
|
|
|
+ padding: 0 0 0.5rem 0;
|
|
|
+ position: relative;
|
|
|
+ .fdz {
|
|
|
+ display: flex;
|
|
|
+ .fdYuan {
|
|
|
+ width: 0.45rem;
|
|
|
+ height: 0.45rem;
|
|
|
+ border-radius: 50%;
|
|
|
+ z-index: 1;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ }
|
|
|
+ .fdYuan1 {
|
|
|
+ background-color: rgb(80, 168, 255);
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ .fdYuan2 {
|
|
|
+ background-color: rgb(80, 168, 255);
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ .fdYuan3 {
|
|
|
+ background-color: #ccc;
|
|
|
+ }
|
|
|
+ .fdShu {
|
|
|
+ width: 0.02rem;
|
|
|
+ height: 100%;
|
|
|
+ background-color: #ccc;
|
|
|
+ /* text-align: center; */
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0.22rem;
|
|
|
+ }
|
|
|
+ /deep/ .fdShu1 {
|
|
|
+ background-color: rgb(80, 168, 255);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .fdy {
|
|
|
+ display: flex;
|
|
|
+ // flex-wrap: wrap;
|
|
|
+ padding-left: 0.2rem;
|
|
|
+ font-size: 0.3rem;
|
|
|
+ }
|
|
|
+ .fdyBlue {
|
|
|
+ color: #0099ff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|