master
xy 3 years ago
parent 56da388794
commit ca1fbcfd90

@ -0,0 +1,33 @@
import request from '@/utils/request'
export function index(params) {
return request({
method: 'get',
url: '/api/admin/plan_evaluate/index',
params
})
}
export function show(params) {
return request({
method: 'get',
url: '/api/admin/plan_evaluate/show',
params
})
}
export function save(data) {
return request({
method: 'post',
url: '/api/admin/plan_evaluate/save',
data
})
}
export function destroy(params) {
return request({
method: 'get',
url: '/api/admin/plan_evaluate/destroy',
params
})
}

@ -0,0 +1,33 @@
import request from '@/utils/request'
export function index(params) {
return request({
method: "get",
url: "/api/admin/target/index",
params
})
}
export function show(params) {
return request({
method: "get",
url: "/api/admin/target/show",
params
})
}
export function save(data) {
return request({
method: "post",
url: "/api/admin/target/save",
data
})
}
export function destroy(params) {
return request({
method: "get",
url: "/api/admin/target/destroy",
params
})
}

@ -0,0 +1,33 @@
import request from '@/utils/request';
export function index(params) {
return request({
method: 'get',
url: '/api/admin/admin_expand/index',
params
})
}
export function save(data) {
return request({
method: 'post',
url: '/api/admin/admin_expand/save',
data
})
}
export function show(params) {
return request({
method: 'get',
url: '/api/admin/admin_expand/show',
params
})
}
export function destroy(params) {
return request({
method: 'get',
url: '/api/admin/admin_expand/destroy',
params
})
}

@ -16,6 +16,14 @@ export default {
type:Number,
default:18
},
expandRowKeys:{
type: Array,
default: ()=>[]
},
rowKey:{
type:[String,Function],
default:'id'
},
cellStyle:{
type:Function,
default:()=>{}
@ -102,6 +110,12 @@ export default {
cellClick(row, column, cell){
this.$emit('cellClick',row, column, cell)
},
selectAllClick(selection){
this.$emit('select-all',selection)
},
selectChange(selection){
this.$emit('selection-change',selection)
},
createIndexRow(){
return <el-table-column type="index" align="center" fixed="left"></el-table-column>
},
@ -123,10 +137,10 @@ export default {
mounted() {
},
render(h) {
let {summaryMethod,cellClick,btnWidth,selectClick,height,createIndexRow,tableStyle,treeProps,showSummary,showHeader,$scopedSlots,showIndex,defaultExpandAll,headerCellStyle,headerRowStyle,rowStyle,cellStyle,indent,tableHeight,tableItem,list,deleteClick,editorClick,rowClick,objectSpanMethod} = this
let {rowKey,expandRowKeys,selectChange,selectAllClick,summaryMethod,cellClick,btnWidth,selectClick,height,createIndexRow,tableStyle,treeProps,showSummary,showHeader,$scopedSlots,showIndex,defaultExpandAll,headerCellStyle,headerRowStyle,rowStyle,cellStyle,indent,tableHeight,tableItem,list,deleteClick,editorClick,rowClick,objectSpanMethod} = this
return (
<div class="table-tree">
{ tableItem && tableItem.length>0 ?
<div className="table-tree" style={{ 'position': 'relative' }}>
{tableItem && tableItem.length > 0 ?
(<el-table
ref="table"
span-method={objectSpanMethod}
@ -139,103 +153,120 @@ export default {
cell-style={cellStyle}
indent={indent}
data={list}
expand-row-keys={expandRowKeys}
height={height ?? tableHeight}
class="v-table"
className="v-table"
style={tableStyle}
row-key="id"
border
row-key={rowKey}
border={true}
default-expand-all={defaultExpandAll}
tree-props={treeProps}
fit={true}
on={{['select']:selectClick,['cell-click']:cellClick,['row-click']:rowClick}}>
{
//
showIndex ? createIndexRow() : ''
}
on={{
['select']: selectClick,
['cell-click']: cellClick,
['select-all']: selectAllClick,
['selection-change']: selectChange,
['expand-change']: (row, expanded) => this.$emit('expand-change', { row, expanded })
}}
>
{
tableItem.map((item,index)=>{
//
if(item.customFn){
return (
<el-table-column
align={item.align ?? 'center'}
sortable={item.sortable ?? true}
width={item.width ?? 'auto'}
min-width={item.minWidth ?? item.width}
header-align={item.headerAlign ?? 'center'}
label={item.label}
prop={item.prop}
scopedSlots={{
default( scope ){
return item.customFn(scope.row)
}
}}>
</el-table-column>
)
}
else if(item.multiHd){
//
return (
<el-table-column
header-align={item.headerAlign ?? 'center'}
label={item.label}>
{item.multiHd.map((item1,index1)=>{
if(item1.customFn){
return (
<el-table-column
align={item1.align ?? 'center'}
header-align={item1.headerAlign ?? 'center'}
label={item1.label}
width={item1.width ?? 'auto'}
min-width={item1.minWidth ?? item1.width}
sortable={item1.sortable ?? true}
scopedSlots={{
default( scope ){
return item1.customFn(scope.row)
}
}}>
</el-table-column>
)
}else{
return (
<el-table-column
fixed={item1.fixed ?? false}
align={item1.align ?? 'center'}
header-align={item1.headerAlign ?? 'center'}
prop={`${item.Fprop?item.Fprop+'.' : ''}${item1.prop}`}
label={item1.label}
width={item1.width ?? 'auto'}
min-width={item1.minWidth ?? item1.width}
sortable={item1.sortable ?? true}
type={item1.type ?? ''}
formatter={item1.formatter}>
</el-table-column>
)
}
})}
</el-table-column>
)
}
else{
//
return (
<el-table-column
fixed={item.fixed ?? false}
formatter={item.formatter}
width={item.width ?? 'auto'}
min-width={item.minWidth ?? item.width}
header-align={item.headerAlign ?? 'center'}
align={item.align ?? 'center'}
label={item.label}
prop={item.prop}
sortable={item.sortable ?? true}
type={item.type ?? ''}
selectable={item.selectable}>
</el-table-column>
)
}
})}
tableItem.map((item, index) => {
//
if (item.customFn) {
return (
<el-table-column
fixed={item.fixed ?? false}
render-header={item.renderHeader ?? undefined}
align={item.align ?? 'center'}
sortable={item.sortable ?? false}
width={item.width ?? 'auto'}
min-width={item.minWidth ?? item.width}
header-align={item.headerAlign ?? 'center'}
label={item.label}
prop={item.prop}
scopedSlots={{
default(scope) {
return item.customFn(scope.row, scope)
}
}}
>
</el-table-column>
)
} else if (item.multiHd) {
//
return (
<el-table-column
render-header={item.renderHeader ?? undefined}
header-align={item.headerAlign ?? 'center'}
label={item.label}
>
{item.multiHd.map((item1, index1) => {
if (item1.customFn) {
return (
<el-table-column
render-header={item1.renderHeader ?? undefined}
align={item1.align ?? 'center'}
header-align={item1.headerAlign ?? 'center'}
label={item1.label}
width={item1.width ?? 'auto'}
min-width={item1.minWidth ?? item1.width}
sortable={item1.sortable ?? false}
scopedSlots={{
default(scope) {
return item1.customFn(scope.row)
}
}}
>
</el-table-column>
)
} else {
return (
<el-table-column
render-header={item1.renderHeader ?? undefined}
fixed={item1.fixed ?? false}
align={item1.align ?? 'center'}
header-align={item1.headerAlign ?? 'center'}
prop={`${item.Fprop ? item.Fprop + '.' : ''}${item1.prop}`}
label={item1.label}
width={item1.width ?? 'auto'}
min-width={item1.minWidth ?? item1.width}
sortable={item1.sortable ?? false}
type={item1.type ?? ''}
formatter={item1.formatter}
>
</el-table-column>
)
}
})}
</el-table-column>
)
} else {
//
return (
<el-table-column
render-header={item.renderHeader ?? undefined}
fixed={item.fixed ?? false}
formatter={item.formatter}
width={item.width ?? 'auto'}
min-width={item.minWidth ?? item.width}
header-align={item.headerAlign ?? 'center'}
align={item.align ?? 'center'}
label={item.label}
prop={item.prop}
sortable={item.sortable ?? false}
type={item.type}
selectable={item.selectable}
scopedSlots={item.type === 'expand' ? {
default(props) {
return item.expandFn(props)
}
} : ''}
>
</el-table-column>
)
}
})}
{
$scopedSlots.btns ? $scopedSlots.btns() :
@ -245,19 +276,22 @@ export default {
width={btnWidth}
header-align="center"
scopedSlots={{
default( scope ){
default(scope) {
return (
<div>
<Poptip
transfer={true}
confirm
title="确认要删除吗"
on={{['on-ok']:()=>deleteClick(scope.row)}}>
on={{ ['on-ok']: () => deleteClick(scope.row) }}
>
<i-button
type="error"
size="small"
style="margin-left: 10px;"
ghost>删除</i-button>
ghost
>删除
</i-button>
</Poptip>
<i-button
@ -265,23 +299,26 @@ export default {
size="small"
style="margin-left: 10px;"
ghost
onClick={()=>editorClick(scope.row)}>编辑</i-button>
onClick={() => editorClick(scope.row)}
>编辑
</i-button>
</div>
)
}
}}>
</el-table-column>
)
}}
>
</el-table-column>)
}
</el-table>)
:
<el-table height={height ?? tableHeight}/> }
<el-table height={height ?? tableHeight}/>}
<el-backtop
target=".el-table__body-wrapper"
visibility-height={120}
bottom={68}
right={48}>
bottom={100}
right={36}
>
</el-backtop>
</div>
)

@ -48,6 +48,29 @@
box-sizing: content-box;
}
.el-table__body-wrapper{
z-index:2
}
//
.el-cascader-panel .el-radio {
width: 100%;
height: 100%;
z-index: 10;
position: absolute;
top: 10px;
right: 10px;
}
.el-cascader-panel .el-radio__input {
visibility: hidden;
}
.el-cascader-panel .el-cascader-node__postfix {
top: 10px;
}
.el-table__body-wrapper{
z-index:2

@ -0,0 +1,303 @@
<template>
<div>
<xy-dialog
ref="dialog"
:is-show.sync="isShow"
type="form"
:title="type === 'add' ? '新增计划评估' : '编辑计划评估'"
:form="form"
:rules="rules"
@submit="submit"
>
<template v-slot:plan_target_id>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
计划指标
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.plan_target_id"
clearable
placeholder="请选择计划指标"
style="width: 300px"
>
<el-option
v-for="item in plan_target_ids"
:key="item.id"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:result>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
自评结果
</div>
<div class="xy-table-item-content">
<el-input
type="textarea"
:autosize="{ minRows: 2 }"
v-model="form.result"
clearable
placeholder="请输入自评结果"
style="width: 300px"
></el-input>
</div>
</div>
</template>
<template v-slot:remark>
<div class="xy-table-item">
<div class="xy-table-item-label">备注 </div>
<div class="xy-table-item-content">
<el-input
type="textarea"
:autosize="{ minRows: 2 }"
v-model="form.remark"
clearable
placeholder="请输入备注"
style="width: 300px"
></el-input>
</div>
</div>
</template>
<template v-slot:file_ids>
<div class="xy-table-item">
<div class="xy-table-item-label">文件 </div>
<div class="xy-table-item-content">
<el-upload
style="width: 300px"
ref="upload"
multiple
:headers="{
'Authorization':'Bearer ' + getToken()
}"
:on-success="successHandle"
:before-upload="uploadBefore"
accept="application/x-rar-compressed,application/zip,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/pdf"
:action="action"
:file-list="fileList"
:auto-upload="false"
:on-remove="removeHande"
>
<el-button slot="trigger" size="small" type="primary"
>选取文件</el-button
>
<el-button
style="margin-left: 10px"
size="small"
type="success"
@click="$refs['upload'].submit()"
>开始上传</el-button
>
<div slot="tip" class="el-upload__tip">
支持文件格式.rar .zip .doc .docx .pdf
<br />单个文件不能超过500kb
</div>
</el-upload>
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import { show, save } from "@/api/achievements/evaluate";
import { getToken } from "@/utils/auth"
export default {
props: {
plan_target_ids: {
type: Array,
default: () => [],
},
},
data() {
return {
isShow: false,
id: "",
type: "",
action: process.env.VUE_APP_UPLOAD_API,
fileList: [],
form: {
type: "",
plan_target_id: "",
result: "",
remark: "",
file_ids: "",
},
rules: {
plan_target_id: [
{
required: true,
message: "请填写计划指标",
},
],
result: [
{
required: true,
message: "请填写自评结果",
},
],
},
};
},
methods: {
show() {
this.isShow = true;
},
hidden() {
this.isShow = false;
},
init() {
this.form = {
type: "",
plan_target_id: "",
result: "",
remark: "",
file_ids: "",
};
},
setForm(key = [], value = []) {
if (key instanceof Array) {
key.forEach((key, index) => {
this.form[key] = value[index] ?? "";
});
}
if (typeof key === "string") {
this.form[key] = value;
}
if (!key) {
this.init();
}
},
getToken,
//
successHandle(response, file, fileList) {
this.fileList = fileList;
},
removeHande(file, fileList) {
this.fileList = fileList;
},
uploadBefore(file) {
console.log(file);
if (file.size / 1000 > 500) {
this.$message({
type: "warning",
message: "上传文件大小超过500kb",
});
return false;
}
},
async getDetail() {
const res = await show({ id: this.id });
this.$integrateData(this.form, res);
},
submit() {
if (this.type === "add") {
if (this.form.hasOwnProperty("id")) {
delete this.form.id;
}
}
if (this.type === "editor") {
Object.defineProperty(this.form, "id", {
value: this.id,
enumerable: true,
configurable: true,
writable: true,
});
}
save(this.form).then((res) => {
this.$message({
type: "success",
message:
this.type === "add" ? "新增计划评估" : "编辑计划评估" + "成功",
});
this.isShow = false;
this.$emit("refresh");
});
},
},
watch: {
isShow(val) {
if (val) {
if (this.type === "editor") {
this.getDetail();
}
} else {
this.id = "";
this.type = "";
this.init();
this.$refs["dialog"].clearValidate();
delete this.form.id;
}
},
},
};
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
.img__delete {
transform: scale(0.8, 0.8);
position: absolute;
top: 4px;
right: 4px;
}
::v-deep .avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
::v-deep .avatar-uploader .el-upload:hover {
border-color: #fff;
}
::v-deep .el-upload--picture-card {
font-size: 28px;
color: #8c939d;
width: 80px !important;
height: 80px !important;
line-height: 80px !important;
text-align: center;
}
::v-deep .avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 80px !important;
height: 80px !important;
line-height: 80px !important;
text-align: center;
}
::v-deep .avatar {
width: 80px !important;
display: block;
border-radius: 6px;
}
::v-deep .el-input__inner {
text-align: left;
}
</style>

@ -0,0 +1,347 @@
<template>
<div>
<xy-dialog
ref="dialog"
:is-show.sync="isShow"
type="form"
:title="type === 'add' ? '新增绩效指标' : '编辑绩效指标'"
:form="form"
:rules="rules"
@submit="submit"
>
<template v-slot:target_type_id>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
一级指标
</div>
<div class="xy-table-item-content">
<el-select
value-key="id"
:value="typeFormat"
clearable
placeholder="请选择一级指标"
style="width: 300px"
@change="e => {
form.target_type_id = e.id;
target_type2s = e.children;
}"
>
<el-option
v-for="item in target_types"
:key="item.id"
:label="item.name"
:value="item"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:target_type2_id>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
二级指标
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.target_type2_id"
clearable
placeholder="请选择二级指标"
style="width: 300px"
>
<el-option
v-for="item in target_type2s"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:name>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
名称
</div>
<div class="xy-table-item-content">
<el-input
v-model="form.name"
clearable
placeholder="请输入名称"
style="width: 300px"
></el-input>
</div>
</div>
</template>
<template v-slot:unit_id>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
单位
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.unit_id"
clearable
placeholder="请选择单位"
style="width: 300px"
>
<el-option
v-for="item in unit_ids"
:key="item.id"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:symbol_id>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
计算符号
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.symbol_id"
clearable
placeholder="请选择计算符号"
style="width: 300px"
>
<el-option
v-for="item in symbol_ids"
:key="item.id"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:half_target>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
半年指标值
</div>
<div class="xy-table-item-content">
<el-input
v-model="form.half_target"
clearable
placeholder="请输入半年(程)指标值"
style="width: 300px"
></el-input>
</div>
</div>
</template>
<template v-slot:year_target>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
全年指标值
</div>
<div class="xy-table-item-content">
<el-input
v-model="form.year_target"
clearable
placeholder="请输入全年(程)指标值"
style="width: 300px"
></el-input>
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import { show, save } from "@/api/achievements/points";
export default {
props: {
target_types: {
type: Array,
default: () => [],
},
unit_ids: {
type: Array,
default: () => [],
},
symbol_ids: {
type: Array,
default: () => [],
},
},
data() {
return {
isShow: false,
id: "",
type: "",
target_type2s: [],
form: {
target_type_id: "",
target_type2_id: "",
name: "",
unit_id: "",
symbol_id: "",
half_target: "",
year_target: "",
},
rules: {
target_type_id: [
{
required: true,
message: "请填写一级指标",
},
],
target_type2_id: [
{
required: true,
message: "请填写二级指标",
},
],
name: [
{
required: true,
message: "请填写名称",
},
],
unit_id: [
{
required: true,
message: "请填写单位",
},
],
symbol_id: [
{
required: true,
message: "请填写计算符号",
},
],
half_target: [
{
required: true,
message: "请填写半年(程)指标值",
},
],
year_target: [
{
required: true,
message: "请填写全年(程)指标值",
},
],
},
};
},
methods: {
show() {
this.isShow = true;
},
hidden() {
this.isShow = false;
},
init() {
this.form = {
target_type_id: "",
target_type2_id: "",
name: "",
unit_id: "",
symbol_id: "",
half_target: "",
year_target: "",
};
},
setForm(key = [], value = []) {
if (key instanceof Array) {
key.forEach((key, index) => {
this.form[key] = value[index] ?? "";
});
}
if (typeof key === "string") {
this.form[key] = value;
}
if (!key) {
this.init();
}
},
async getDetail() {
const res = await show({ id: this.id });
this.$integrateData(this.form, res);
},
submit() {
if (this.type === "add") {
if (this.form.hasOwnProperty("id")) {
delete this.form.id;
}
}
if (this.type === "editor") {
Object.defineProperty(this.form, "id", {
value: this.id,
enumerable: true,
configurable: true,
writable: true,
});
}
save(this.form).then((res) => {
this.$message({
type: "success",
message:
this.type === "add" ? "新增绩效指标" : "编辑绩效指标" + "成功",
});
this.isShow = false;
this.$emit("refresh");
});
},
},
computed:{
typeFormat() {
return this.target_types.filter(item => item.id === this.form.target_type_id)[0]?.name || "";
}
},
watch: {
isShow(val) {
if (val) {
if (this.type === "editor") {
this.getDetail();
}
} else {
this.id = "";
this.type = "";
this.init();
this.$refs["dialog"].clearValidate();
delete this.form.id;
}
},
},
};
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
.xy-table-item-label{
width: 200px;
}
</style>

@ -24,7 +24,7 @@
style="width: 300px"
:show-all-levels="false"
v-model="form.pid"
:options="pids"
:options="pidFormat"
:props="{ value: 'id', label: 'name', checkStrictly: true }"
@change="pidCascaderHandler"
></el-cascader>
@ -87,7 +87,10 @@
import { show, save } from "@/api/achievements/types";
export default {
props: {
pids:Array
pids:{
type: Array,
default:() => []
}
},
data() {
return {
@ -95,7 +98,7 @@ export default {
id: "",
type: "",
cascaderId_pid: "",
cascaderId_pid: 0,
form: {
pid: "",
@ -134,6 +137,20 @@ export default {
sort: "",
};
},
setForm(key = [], value = []) {
if(key instanceof Array) {
key.forEach((key,index) => {
this.form[key] = value[index] ?? "";
})
}
if(typeof key === "string"){
this.form[key] = value
}
if(!key){
this.init()
}
},
pidCascaderHandler(e) {
if (e.length > 0) {
this.form.pid = e.at(-1);
@ -171,6 +188,17 @@ export default {
});
},
},
computed: {
pidFormat() {
return [
{
id: 0,
name: "根结点",
children: this.pids
}
]
}
},
watch: {
isShow(val) {
if (val) {
@ -185,9 +213,6 @@ export default {
delete this.form.id;
}
},
pids() {
++this.cascaderId_pid;
},
},
};
</script>

@ -0,0 +1,184 @@
<template>
<div style="padding: 0 20px;">
<lx-header icon="md-apps" style="margin-bottom: 10px; border: 0px; margin-top: 15px" text="绩效指标类型">
<div slot="content"></div>
<slot>
<div class="selects">
<div>
<span style="padding: 0 6px;word-break: keep-all;">
关键字
</span>
<Input v-model="select.keyword" placeholder="请输入关键字" style="width: 180px"></Input>
</div>
<Button style="margin-left: 10px" type="primary"
@click="">重置
</Button>
<Button style="margin-left: 10px" type="primary" @click="select.page = 1,getList()">查询</Button>
</div>
</slot>
</lx-header>
<xy-table :list="list" :table-item="table" @delete="destroy" @editor="edit">
<template v-slot:btns>
<el-table-column label="操作" header-align="center" fixed="right" width="200">
<template v-slot:default="scope">
<Button type="primary"
size="small"
style="margin-left:4px;margin-bottom: 2px;"
@click="edit(scope.row,1)">年中评审</Button>
<Button type="error"
size="small"
style="margin-left:4px;margin-bottom: 2px;"
@click="edit(scope.row,2)">年终评审</Button>
<Button type="error"
size="small"
style="margin-left:4px;margin-bottom: 2px;"
@click="edit(scope.row,2)">查看</Button>
</template>
</el-table-column>
</template>
</xy-table>
<!-- <div style="display: flex;justify-content: flex-end;">-->
<!-- <Page :total="total" @on-change="" show-elevator show-sizer @on-page-size-change="" />-->
<!-- </div>-->
<addEvaluate ref="addEvaluate" @refresh="getList"></addEvaluate>
</div>
</template>
<script>
import { getBudget } from "@/api/budget/budget"
import { index,destroy } from "@/api/achievements/evaluate"
import { moneyFormatter, parseTime } from '@/utils'
import addEvaluate from '@/views/achievements/components/addEvaluate.vue'
import { getparameter } from '@/api/system/dictionary'
export default {
components:{
addEvaluate
},
data() {
return {
budgetTypes: [],
select:{
keyword: "",
page: 1,
page_size: 10
},
total: 0,
table: [{
label: "项目名称",
prop: 'name',
width: 200,
sortable: false,
fixed: 'left'
},
{
label: "预算类型",
prop: 'type',
width: 115,
formatter: (cell, data, value) => {
let res = this.types.filter(item => {
return item.id === value
})
return res[0]?.value || '未知'
}
},
{
label: "所属年份",
prop: 'year',
width: 105
},
{
label: "相关科室",
prop: 'plan_department.name',
width: 110
},
{
label: '年初预算金额(元)',
prop: 'money',
align: 'right',
width: 180,
formatter: (cell, data, value) => {
if (value == 0) return '--'
else
return moneyFormatter(value)
}
},
{
label: '调整后预算金额(元)',
prop: 'update_money',
align: 'right',
width: 200,
formatter: (cell, data, value) => {
return moneyFormatter(value)
}
},
{
label: "创建信息",
prop: 'created_at',
width: 160,
formatter: (cell, data, value) => {
return this.$moment(value).format('YYYY-MM-DD')
}
},
{
label: "描述",
minWidth: 300,
prop: 'content',
align: 'left',
sortable: false
},
],
list: [],
}
},
methods: {
async getBudgetTypes() {
const res = await getparameter({
number: 'money_way'
})
this.types = res.detail
},
async getList() {
const res = await getBudget(this.select)
this.list = res.list.data
},
edit(row,type) {
this.$refs["addEvaluate"].id = row.id;
this.$refs["addEvaluate"].setForm("type",type);
this.$refs["addEvaluate"].type = "add";
this.$refs["addEvaluate"].show();
},
destroy(row) {
destroy({
id: row.id
}).then(res => {
this.$message({
type: "success",
message: "删除成功"
})
this.getList();
})
}
},
computed: {
},
created() {
this.getBudgetTypes();
this.getList();
}
}
</script>
<style scoped lang="scss">
.selects{
display: flex;
align-items: center;
flex-wrap: wrap;
}
</style>

@ -0,0 +1,240 @@
<template>
<div style="padding: 0 20px;">
<lx-header icon="md-apps" style="margin-bottom: 10px; border: 0px; margin-top: 15px" text="绩效指标">
<div slot="content"></div>
<slot>
<div class="selects">
<div>
<span style="padding: 0 6px;word-break: keep-all;">
关键字
</span>
<Input v-model="select.keyword" placeholder="请输入关键字" style="width: 180px"></Input>
</div>
<Button style="margin-left: 10px" type="primary"
@click="">重置
</Button>
<Button style="margin-left: 10px" type="primary" @click="getList"></Button>
<Button style="margin-left: 10px" type="primary" @click="$refs['addPoint'].type = 'add',$refs['addPoint'].show()">新增</Button>
</div>
</slot>
</lx-header>
<xy-table :list="list"
:table-item="table"
:object-span-method="spanMethod"
@editor="row => {
$refs['addPoint'].id = row.id;
$refs['addPoint'].type = 'editor';
$refs['addPoint'].show();
}"
@delete="destroy">
</xy-table>
<div style="display: flex;justify-content: flex-end;">
<Page :total="total" @on-change="" show-elevator show-sizer @on-page-size-change="" />
</div>
<addPoint ref="addPoint" :target_types="types" :symbol_ids="symbols" :unit_ids="units" @refresh="getList"></addPoint>
</div>
</template>
<script>
import { index,destroy } from "@/api/achievements/points";
import { index as typesIndex } from "@/api/achievements/types";
import { getparameter } from "@/api/system/dictionary"
import addPoint from '@/views/achievements/components/addPoint.vue'
export default {
components:{
addPoint
},
data() {
return {
select:{
keyword: "",
page: 1,
page_size: 10
},
total: 0,
spanArr: [],
spanArr1: [],
pos1: 0,
pos: 0,
table: [
{
label: "一级指标名称",
prop: "target_type_detail.name",
width: 200
},
{
label: "二级指标名称",
prop: "target_type2_detail.name",
width: 200
},
{
label: "三级指标名称",
prop: "name",
width: 200
},
{
label: "计算符号",
prop: "symbol_detail.value",
width: 120
},
{
label: "半年(程)指标值",
prop: "half_target",
width: 180
},
{
label: "全年(程)指标值",
prop: "year_target",
width: 180
},
{
label: "单位",
prop: "unit_detail.value",
width: 120
}
],
list: [],
types: [],
symbols: [],
units: [],
}
},
methods: {
async getTypes() {
const res = await typesIndex({ show_tree:1 })
this.types = res || []
},
async getSymbols() {
const res = await getparameter( { number: "symbol" })
this.symbols = res.detail
},
async getUnits() {
const res = await getparameter({ number: "unit" })
this.units = res.detail
},
destroy(row){
destroy({ id: row.id }).then(res => {
this.$message({
type: "success",
message: "删除成功"
})
this.getList()
})
},
async getList() {
const res = await index(this.select)
this.list = res.data
console.log(this.list)
for(let i in this.list){
if(i === 0){
this.spanArr.push(1);
this.pos = 0;
this.spanArr1.push(1);
this.pos1 = 0;
}else{
if(this.list[i]?.target_type_detail?.name === this.list[i-1]?.target_type_detail?.name){
this.spanArr[this.pos] += 1;
this.spanArr.push(0)
}else{
this.spanArr.push(1);
this.pos = i;
}
if(this.list[i]?.target_type2_detail?.name === this.list[i-1]?.target_type2_detail?.name){
this.spanArr1[this.pos1] += 1;
this.spanArr1.push(0)
}else{
this.spanArr1.push(1);
this.pos1 = i;
}
}
}
// let arr = [];
// let getProp = (data,name) => {
// if(!name || !data){
// return false
// }
// let curProp = name.split('.')
// if(curProp.length === 1){
// return data[name]
// }else{
// let res = data
// for(let i = 0;i < curProp.length;i++){
// res = res[curProp[i]]
// }
// return res
// }
// }
// let x = 0;
// let y = 0;
// for(let i = 0;i < this.list.length;i++){
// arr[i] = []
// for(let j = 0;j < this.table.length;j++){
// if(!arr[i][j]){
// arr[i][j] = {
// rowspan: 1,
// colspan: 1
// }
// }
// if(getProp(this.list[i],this.table[j].prop) === getProp(this.list[i+1],this.table[j].prop)){
// arr[x][y].rowspan++
// arr[x][y+1] = {
// rowspan: 0,
// colspan: 0
// }
// }else{
// x = i
// y = j
// }
// }
// }
// this.spanArr = arr
// console.log(arr)
},
spanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0) {
const _row = this.spanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col
}
}
if (columnIndex === 1) {
const _row = this.spanArr1[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col
}
}
}
},
computed: {},
created() {
this.getTypes();
this.getSymbols();
this.getUnits();
this.getList();
}
}
</script>
<style scoped lang="scss">
.selects{
display: flex;
align-items: center;
flex-wrap: wrap;
}
</style>

@ -21,19 +21,42 @@
</slot>
</lx-header>
<xy-table :list="list" :table-item="table" >
<xy-table :list="list" :table-item="table" @delete="destroy" @editor="edit">
<template v-slot:btns>
<el-table-column label="操作" header-align="center" fixed="right" >
<template v-slot:default="scope">
<Button type="primary"
size="small"
ghost
@click="() => {
$refs['addTypes'].setForm('pid',scope.row.id);
$refs['addTypes'].type = 'add';
$refs['addTypes'].show();
}">下级</Button>
<Button type="primary"
size="small"
style="margin-left: 10px;"
ghost @click="edit(scope.row)">编辑</Button>
<Button type="error"
size="small"
style="margin-left: 10px;"
ghost
@click="destroy(scope.row)">删除</Button>
</template>
</el-table-column>
</template>
</xy-table>
<div style="display: flex;justify-content: flex-end;">
<Page :total="total" @on-change="" show-elevator show-sizer @on-page-size-change="" />
</div>
<!-- <div style="display: flex;justify-content: flex-end;">-->
<!-- <Page :total="total" @on-change="" show-elevator show-sizer @on-page-size-change="" />-->
<!-- </div>-->
<addTypes ref="addTypes" @refresh="getList"></addTypes>
<addTypes ref="addTypes" :pids="pids" @refresh="getList"></addTypes>
</div>
</template>
<script>
import { index } from "@/api/achievements/types"
import { index,destroy } from "@/api/achievements/types"
import addTypes from '@/views/achievements/components/addTypes.vue'
export default {
@ -45,32 +68,68 @@ export default {
select:{
keyword: "",
page: 1,
page_size: 10
page_size: 10,
show_tree: 1
},
total: 0,
table: [
{
label: "一级指标名称"
label: "名称",
prop: "name",
width: 200
},
{
label: "二级指标名称"
label: "备注",
prop: "remark",
minWidth: 220,
align: "left"
},
{
label: "三级指标名称"
label: "创建时间",
prop: "created_at",
width: 200
}
],
list: []
list: [],
pids: [],
}
},
methods: {
async getPids() {
const res = await index({show_tree: 1})
this.pids = res
},
async getList() {
const res = await index(this.select)
this.list = res.data
if(this.select.show_tree){
this.list = res
}else{
this.list = res.data
}
},
edit(row) {
this.$refs["addTypes"].id = row.id;
this.$refs["addTypes"].type = "editor";
this.$refs["addTypes"].show();
},
destroy(row) {
destroy({
id: row.id
}).then(res => {
this.$message({
type: "success",
message: "删除成功"
})
this.getList();
})
}
},
computed: {},
computed: {
},
created() {
this.getList()
this.getPids();
this.getList();
}
}
</script>

@ -15,56 +15,227 @@
<Button style="margin-left: 10px" type="primary"
@click="">重置
</Button>
<Button style="margin-left: 10px" type="primary" @click="">查询</Button>
<Button style="margin-left: 10px" type="primary" @click="getList"></Button>
<Button style="margin-left: 10px" type="primary" @click="$refs['addPoint'].type = 'add',$refs['addPoint'].show()">新增</Button>
</div>
</slot>
</lx-header>
<xy-table :list="list" :table-item="table" >
<xy-table :list="list"
:table-item="table"
:object-span-method="spanMethod"
@editor="row => {
$refs['addPoint'].id = row.id;
$refs['addPoint'].type = 'editor';
$refs['addPoint'].show();
}"
@delete="destroy">
</xy-table>
<div style="display: flex;justify-content: flex-end;">
<Page :total="total" @on-change="" show-elevator show-sizer @on-page-size-change="" />
</div>
<addPoint ref="addPoint" :target_types="types" :symbol_ids="symbols" :unit_ids="units" @refresh="getList"></addPoint>
</div>
</template>
<script>
import { index,destroy } from "@/api/achievements/points";
import { index as typesIndex } from "@/api/achievements/types";
import { getparameter } from "@/api/system/dictionary"
import addPoint from '@/views/achievements/components/addPoint.vue'
export default {
components:{
addPoint
},
data() {
return {
select:{
keyword: ""
keyword: "",
page: 1,
page_size: 10
},
total: 0,
spanArr: [],
spanArr1: [],
pos1: 0,
pos: 0,
table: [
{
label: "一级指标名称"
type: 'index',
width: 60
},
{
type: 'selection',
width: 80
},
{
label: "二级指标名称"
label: "一级指标名称",
prop: "target_type_detail.name",
width: 200
},
{
label: "三级指标名称"
label: "二级指标名称",
prop: "target_type2_detail.name",
width: 200
},
{
label: "计算符号"
label: "三级指标名称",
prop: "name",
width: 200
},
{
label: "半年(程)指标值"
label: "计算符号",
prop: "symbol_detail.value",
width: 120
},
{
label: "全年(程)指标值"
label: "半年(程)指标值",
prop: "half_target",
width: 180
},
{
label: "单位"
label: "全年(程)指标值",
prop: "year_target",
width: 180
},
{
label: "单位",
prop: "unit_detail.value",
width: 120
}
],
list: []
list: [],
types: [],
symbols: [],
units: [],
}
},
methods: {
async getTypes() {
const res = await typesIndex({ show_tree:1 })
this.types = res || []
},
async getSymbols() {
const res = await getparameter( { number: "symbol" })
this.symbols = res.detail
},
async getUnits() {
const res = await getparameter({ number: "unit" })
this.units = res.detail
},
destroy(row){
destroy({ id: row.id }).then(res => {
this.$message({
type: "success",
message: "删除成功"
})
this.getList()
})
},
async getList() {
const res = await index(this.select)
this.list = res.data
console.log(this.list)
for(let i in this.list){
if(i === 0){
this.spanArr.push(1);
this.pos = 0;
this.spanArr1.push(1);
this.pos1 = 0;
}else{
if(this.list[i]?.target_type_detail?.name === this.list[i-1]?.target_type_detail?.name){
this.spanArr[this.pos] += 1;
this.spanArr.push(0)
}else{
this.spanArr.push(1);
this.pos = i;
}
if(this.list[i]?.target_type2_detail?.name === this.list[i-1]?.target_type2_detail?.name){
this.spanArr1[this.pos1] += 1;
this.spanArr1.push(0)
}else{
this.spanArr1.push(1);
this.pos1 = i;
}
}
}
// let arr = [];
// let getProp = (data,name) => {
// if(!name || !data){
// return false
// }
// let curProp = name.split('.')
// if(curProp.length === 1){
// return data[name]
// }else{
// let res = data
// for(let i = 0;i < curProp.length;i++){
// res = res[curProp[i]]
// }
// return res
// }
// }
// let x = 0;
// let y = 0;
// for(let i = 0;i < this.list.length;i++){
// arr[i] = []
// for(let j = 0;j < this.table.length;j++){
// if(!arr[i][j]){
// arr[i][j] = {
// rowspan: 1,
// colspan: 1
// }
// }
// if(getProp(this.list[i],this.table[j].prop) === getProp(this.list[i+1],this.table[j].prop)){
// arr[x][y].rowspan++
// arr[x][y+1] = {
// rowspan: 0,
// colspan: 0
// }
// }else{
// x = i
// y = j
// }
// }
// }
// this.spanArr = arr
// console.log(arr)
},
spanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 2) {
const _row = this.spanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col
}
}
if (columnIndex === 3) {
const _row = this.spanArr1[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col
}
}
}
},
methods: {},
computed: {}
computed: {},
created() {
this.getTypes();
this.getSymbols();
this.getUnits();
this.getList();
}
}
</script>

@ -0,0 +1,17 @@
<template>
<div>
</div>
</template>
<script>
export default {
data() {
return {}
},
methods: {},
computed: {}
}
</script>
<style scoped lang="scss">
</style>

@ -7,7 +7,7 @@
title="详情"
class="contract-detail"
>
<template v-slot:normalContent>
<template v-slot:default>
<div class="base-info">
<div class="base-info-title">项目基本信息</div>
<div class="base-info-item">
@ -216,9 +216,6 @@
</div>
</template>
<template v-slot:footerContent>
<div></div>
</template>
</xy-dialog>
<detailContractSign

@ -34,6 +34,9 @@ module.exports = {
loaderOptions: { // 向 CSS 相关的 loader 传递选项
less: {
javascriptEnabled: true
},
sass:{
prependData: '@import "@/styles/index.scss";'
}
}
},

Loading…
Cancel
Save