You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

390 lines
19 KiB

<template>
<div class="customer-css">
<!-- 查询条件 -->
<el-form :inline="true" label-position="top" class="pi-search-form">
<el-form-item label="任务单号">
<el-input v-model="searchData.requestNo" style="width:140px" @keyup.enter.native="getList" />
</el-form-item>
<el-form-item>
<span style="cursor: pointer" slot="label" @click="getBaseList(501)"><a href="#">供应商编码</a></span>
<el-input v-model="searchData.supplierNo" style="width: 130px"></el-input>
</el-form-item>
<el-form-item label="供应商名称">
<el-input v-model="searchData.supplierName" style="width:200px" @keyup.enter.native="getList" />
</el-form-item>
<el-form-item label="创建者">
<el-input v-model="searchData.createBy" style="width:140px" @keyup.enter.native="getList" />
</el-form-item>
<el-form-item label="预计完成时间">
<el-date-picker v-model="searchData.wantedCompleteDateStart" type="date" placeholder="Start Date"
value-format="yyyy-MM-dd"
style="width:140px" />
-
<el-date-picker v-model="searchData.wantedCompleteDateEnd" type="date" placeholder="End Date"
value-format="yyyy-MM-dd"
style="width:140px" />
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker v-model="searchData.createDateStart" type="date" placeholder="Start Date"
value-format="yyyy-MM-dd HH:mm:ss"
style="width:140px" />
-
<el-date-picker v-model="searchData.createDateEnd" type="date" placeholder="End Date"
value-format="yyyy-MM-dd HH:mm:ss"
style="width:140px" />
</el-form-item>
<el-form-item label="状态">
<el-select v-model="searchData.statusList" multiple collapse-tags clearable style="width:150px" placeholder="All">
<el-option
v-for="item in reviewStatusOptions"
:key="item.value"
:label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" class="customer-bun-min" @click="getList">查询</el-button>
</el-form-item>
</el-form>
<!-- 列表 -->
<el-table :data="dataList" :height="requestTableHeight - 100" border highlight-current-row v-loading="loading"
@row-click="rowClick" @current-change="handleMainCurrentChange" ref="mainTable" style="width:100%;margin-bottom:8px">
<el-table-column fixed="right" label="操作" width="80" header-align="center" align="center">
<template slot-scope="scope">
<a v-if="canOperate(scope.row)" class="customer-a" @click.stop="openReviewDialog(scope.row)">审核</a>
</template>
</el-table-column>
<el-table-column prop="requestNo" label="任务单号" min-width="120" header-align="center" align="left" />
<el-table-column prop="supplierNo" label="供应商编码" width="120" header-align="center" align="left" />
<el-table-column prop="supplierName" label="供应商名称" min-width="200" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="wantedCompleteDate" label="预计完成时间" width="160" header-align="center" align="center" />
<el-table-column prop="status" label="状态" width="90" header-align="center" align="center" />
<el-table-column prop="reviewBy" label="审核人" min-width="90" header-align="center" align="left" />
<el-table-column prop="reviewDate" label="审核时间" width="130" header-align="center" align="center" />
<el-table-column prop="approveBy" label="批准人" min-width="90" header-align="center" align="left" />
<el-table-column prop="approveDate" label="批准时间" width="130" header-align="center" align="center" />
<el-table-column prop="comments" label="备注" min-width="160" header-align="center" align="left" />
<el-table-column prop="createBy" label="创建者" min-width="100" header-align="center" align="left" />
<el-table-column prop="createDate" label="创建时间" width="130" header-align="center" align="center" />
</el-table>
<el-pagination style="margin-top:0" @size-change="sizeChangeHandle" @current-change="currentChangeHandle"
:current-page="pageIndex" :page-sizes="[20,50,100,200,500]" :page-size="pageSize" :total="totalPage"
layout="total, sizes, prev, pager, next, jumper" />
<!-- 指标 + Progress -->
<el-row :gutter="10" style="margin-top:12px">
<el-col :span="16">
<div class="sub-panel-header">
<span style="font-size:16px">考核单</span>
</div>
<el-table :data="indicatorList" size="mini" border :height="indicatorTableHeight" highlight-current-row
ref="indicatorTable" v-loading="indicatorLoading" @row-click="selectIndicatorRow">
<el-table-column prop="indicatorCode" label="指标代码" min-width="120" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="indicatorDesc" label="指标描述" min-width="220" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="category" label="指标分类" width="110" header-align="center" align="center" />
<el-table-column prop="ownerRole" label="负责部门" width="110" header-align="center" align="center" />
<el-table-column prop="maxScore" label="最高分" width="110" header-align="center" align="right" />
<el-table-column prop="score" label="分数" width="90" header-align="center" align="right" />
</el-table>
</el-col>
<el-col :span="8">
<div class="sub-panel-header">
<span style="font-size:16px">进度 <span v-if="viewIndicatorCode"></span></span>
</div>
<el-table :data="progressList" size="mini" border :height="indicatorTableHeight" v-loading="progressLoading">
<el-table-column prop="departmentName" label="部门" min-width="90" header-align="center"
align="left" />
<el-table-column prop="owner" label="负责人" min-width="80" header-align="center" align="left" />
<el-table-column prop="userDisplay" label="负责人名称" min-width="90" header-align="center" align="left" />
<el-table-column prop="completedFlag" label="已完成" width="60" header-align="center" align="center">
</el-table-column>
<el-table-column prop="completedDate" label="完成时间" min-width="140" header-align="center"
align="center" />
</el-table>
</el-col>
</el-row>
<!-- Review 弹窗 -->
<el-dialog title="审核" :visible.sync="reviewDialogVisible" width="374px" top="8vh" :close-on-click-modal="false"
v-drag>
<el-form :inline="true" label-position="top" class="create-top-form">
<el-form-item
label="任务单号"><el-input v-model="reviewForm.requestNo" disabled style="width: 120px"/></el-form-item>
<el-form-item label="审核人"><el-input v-model="reviewForm.createBy" disabled style="width: 120px"/></el-form-item>
</el-form>
<el-form :inline="true" label-position="top" size="mini" class="create-top-form">
<el-form-item label="供应商编号"><el-input v-model="reviewForm.supplierNo" disabled style="width: 120px"/></el-form-item>
<el-form-item label="供应商名称"><el-input v-model="reviewForm.supplierName" disabled
style="width: 210px"/></el-form-item>
</el-form>
<el-form :inline="true" label-position="top" size="mini" class="create-top-form">
<el-form-item label="备注" :required="true">
<el-input type="textarea" :rows="2" v-model="reviewForm.comments" style="width: 343px" />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" :loading="reviewSaving" @click="saveReview">审核</el-button>
<el-button type="danger" :loading="voidSaving" @click="voidReview">作废</el-button>
<el-button @click="reviewDialogVisible=false">取消</el-button>
</span>
</el-dialog>
<Chooselist ref="baseList" @getBaseData="getBaseData"></Chooselist>
</div>
</template>
<script>
import { searchEvaluateRequestList, getEvaluateRequestIndicators, getEvaluateRequestIndicatorProgress } from '@/api/supplierPerformance/myPerformanceEvaluateRequest.js'
import { updateEvaluateRequestReviewOrApprove } from '@/api/supplierPerformance/myPerformanceEvaluateRequest'
import {
PERF_REVIEW_STATUS_OPTIONS,
PERF_REVIEW_STATUS_DEFAULT
} from './supplierPerformanceStatusOptions.js'
import Chooselist from '@/views/modules/common/Chooselist_eam'
export default {
components: {
Chooselist,
},
name: 'PerformanceEvaluateRequestReview',
data() {
return {
height: 500,
loading: false,
dataList: [],
pageIndex: 1,
pageSize: 20,
totalPage: 0,
reviewStatusOptions: PERF_REVIEW_STATUS_OPTIONS,
searchData: {
site: this.$store.state.user.site,
username: this.$store.state.user.name,
requestNo: '',
supplierNo: '',
supplierName: '',
createBy: '',
wantedCompleteDateStart: '',
wantedCompleteDateEnd: '',
createDateStart: '',
createDateEnd: '',
statusList: ['已完成']
},
currentRequest: {},
indicatorList: [],
indicatorLoading: false,
reviewDialogVisible: false,
reviewSaving: false,
voidSaving: false,
reviewForm: { id:'', requestNo:'', supplierNo:'', supplierName:'', createBy:'', comments:'' },
viewIndicatorCode: '',
progressList: [],
progressLoading: false,
progressRequestKey: '',
}
},
computed: {
requestTableHeight() { return this.height - 360 < 260 ? 260 : this.height - 360 },
indicatorTableHeight() { return 300 }
},
mounted() { this.calcHeight(); window.addEventListener('resize', this.calcHeight); this.getList() },
beforeDestroy() { window.removeEventListener('resize', this.calcHeight) },
methods: {
getBaseList (val) {
this.tagNo = val
this.$nextTick(() => {
let strVal = ''
let conSql = '' if (val === 501) { strVal = this.searchData.supplierNo || '' conSql = " and site = '" + this.$store.state.user.site + "'" } this.$refs.baseList.init(val, strVal, conSql) }) }, getBaseData (val) { if (this.tagNo === 501) { const supplierNoVal = val.SupplierID || val.supplierID || val.supplierId || '' this.searchData.supplierNo = supplierNoVal } }, calcHeight() { this.$nextTick(()=> { this.height = window.innerHeight - 40 }) }, clearSubDetails() { this.currentRequest = {} this.indicatorList = [] this.viewIndicatorCode = '' this.progressList = [] this.progressRequestKey = '' this.$nextTick(() => { if (this.$refs.mainTable) this.$refs.mainTable.setCurrentRow(null) if (this.$refs.indicatorTable) this.$refs.indicatorTable.setCurrentRow(null) }) }, getList() { this.loading = true if (this.searchData.statusList.length === 0) this.searchData.statusList = [...PERF_REVIEW_STATUS_DEFAULT] const params = { ...this.searchData, statusList: this.searchData.statusList , page: this.pageIndex, limit: this.pageSize, selectType: 1 } searchEvaluateRequestList(params).then(({data})=> { if (data && (data.code===0||data.code==='0')) { if (data.page) { this.dataList = data.page.list || [] this.pageIndex = data.page.currPage || params.page this.pageSize = data.page.pageSize || params.limit this.totalPage = data.page.totalCount || 0 if (this.dataList.length > 0) { this.$nextTick(() => { this.$refs.mainTable.setCurrentRow(this.dataList[0]) this.rowClick(this.dataList[0]) }) } else { this.clearSubDetails() } } else { this.dataList = data.rows || [] this.totalPage = data.total || this.dataList.length if (this.dataList.length === 0) this.clearSubDetails() } } else { this.dataList = [] this.totalPage = 0 this.clearSubDetails() } }).catch(() => { this.dataList = [] this.totalPage = 0 this.clearSubDetails() }) .finally(()=> { this.loading=false }) }, sizeChangeHandle(v){ this.pageSize=v; this.pageIndex=1; this.getList() }, currentChangeHandle(v){ this.pageIndex=v; this.getList() }, handleMainCurrentChange(row) { if (!row) this.clearSubDetails() }, rowClick(row) { if (!row) { this.clearSubDetails() return } this.currentRequest = row this.viewIndicatorCode = '' this.progressList = [] this.loadIndicators() }, loadIndicators() { if (!this.currentRequest.requestNo) { this.indicatorList = [] this.viewIndicatorCode = '' this.progressList = [] return } this.indicatorLoading = true this.indicatorList = [] this.viewIndicatorCode = '' this.progressList = [] const p = { requestId: this.currentRequest.id, requestNo: this.currentRequest.requestNo, site: this.$store.state.user.site } getEvaluateRequestIndicators(p).then(({ data }) => { if (data && (data.code === 0 || data.code === '0')) { this.indicatorList = data.list || [] this.$nextTick(() => { if (this.indicatorList.length > 0) { this.$refs.indicatorTable.setCurrentRow(this.indicatorList[0]) this.selectIndicatorRow(this.indicatorList[0]) } else { this.viewIndicatorCode = '' this.progressList = [] this.$refs.indicatorTable && this.$refs.indicatorTable.setCurrentRow(null) } }) } else { this.indicatorList = [] this.viewIndicatorCode = '' this.progressList = [] } }).catch(() => { this.indicatorList = [] this.viewIndicatorCode = '' this.progressList = [] }).finally(() => { this.indicatorLoading = false }) }, selectIndicatorRow(row) { if (!row) { this.viewIndicatorCode = '' this.progressList = [] return } this.viewIndicatorCode = row.indicatorCode this.progressList = [] this.loadProgress() }, loadProgress() { if (!this.viewIndicatorCode || !this.currentRequest.requestNo) { this.progressList = [] return } const requestKey = `${this.currentRequest.id || ''}_${this.currentRequest.requestNo}_${this.viewIndicatorCode}` this.progressRequestKey = requestKey this.progressLoading = true const p = { requestId: this.currentRequest.id, requestNo: this.currentRequest.requestNo, site: this.$store.state.user.site } getEvaluateRequestIndicatorProgress(p).then(({ data }) => { if (this.progressRequestKey !== requestKey) return if (data && (data.code === 0 || data.code === '0')) { this.progressList = data.list || [] } else { this.progressList = [] } }).catch(() => { if (this.progressRequestKey !== requestKey) return this.progressList = [] }).finally(() => { this.progressLoading = false }) }, canOperate(row){ if(!row) return false; const s=(row.status||'').trim(); return s==='已完成'; }, openReviewDialog(row){ this.reviewForm = { id:row.id, requestNo:row.requestNo, supplierNo:row.supplierNo, supplierName:row.supplierName, createBy:row.createBy, comments: row.reviewComments || '' } this.reviewDialogVisible = true }, saveReview(){ if (this.reviewSaving || this.voidSaving) return const c = (this.reviewForm.comments||'').trim() if(!c){ this.$message.warning('Comments不能为空'); return } this.reviewSaving = true const payload = { site:this.$store.state.user.site, id:this.reviewForm.id, requestNo:this.reviewForm.requestNo, comments:c, updateBy:this.$store.state.user.name, updateType: 1 } updateEvaluateRequestReviewOrApprove(payload).then(({data})=> { if (data && (data.code===0||data.code==='0')) { this.$message.success('审核成功'); this.reviewDialogVisible=false; this.getList() } else { this.$message.error((data&&data.msg)||'审核失败') } }).catch(e=> this.$message.error('审核失败: '+ e.message)).finally(()=> { this.reviewSaving=false }) }, voidReview() { if (this.reviewSaving || this.voidSaving) return this.$confirm('是否作废该绩效审核单?', '提示', { type: 'warning' }).then(() => { this.voidSaving = true const payload = { site: this.$store.state.user.site, id: this.reviewForm.id, requestNo: this.reviewForm.requestNo, updateBy: this.$store.state.user.name, updateType: 4 } updateEvaluateRequestReviewOrApprove(payload).then(({ data }) => { if (data && (data.code === 0 || data.code === '0')) { this.$message.success('作废成功') this.reviewDialogVisible = false this.getList() } else { this.$message.error((data && data.msg) || '作废失败') } }).catch(e => this.$message.error('作废失败: ' + e.message)).finally(() => { this.voidSaving = false }) }).catch(() => {}) } } } </script> <style scoped> .pi-search-form { margin-top:0; } .sub-panel-header { display:flex; align-items:center; justify-content:space-between; font-weight:600; padding:4px 6px; background:#f5f7fa; border:1px solid #ebeef5; border-bottom:none; } </style>