Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -344,7 +344,7 @@ const deleteSingleFile = (row, type) => {
|
|||||||
if (type === 1) {
|
if (type === 1) {
|
||||||
singleFile.value = null
|
singleFile.value = null
|
||||||
} else {
|
} else {
|
||||||
props.otherFileList.splice(props.otherFileList.findIndex((item) => item.id === row.fileId), 1);
|
props.otherFileList.splice(props.otherFileList.findIndex((item) => item.fileId === row.fileId), 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog custom-class="custom-dialog" class="border" :border="false" closeFree width="1000px" style="height: 676px"
|
<el-dialog custom-class="custom-dialog" class="border" :border="false" width="1000px" style="height: 676px"
|
||||||
:title="title" :visible.sync="visible" v-model="visible" append-to-body :close-on-click-modal="true"
|
:title="title" :show-close="false" :visible.sync="visible" v-model="visible" append-to-body :close-on-click-modal="true" >
|
||||||
:destroy-on-close="true">
|
|
||||||
<div class="picker">
|
<div class="picker">
|
||||||
<div class="candidate" v-loading="loading">
|
<div class="candidate" v-loading="loading">
|
||||||
<el-input v-model="filterText" @change="getList()"
|
<el-input v-model="filterText" @change="getList()"
|
||||||
@@ -10,7 +9,6 @@
|
|||||||
<el-button @click="getList()">搜索</el-button>
|
<el-button @click="getList()">搜索</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
|
|
||||||
<fvCheckbox style="margin-left: 10px" :options="checkOptions" v-model="checkList" @change="checkBoxChange"/>
|
<fvCheckbox style="margin-left: 10px" :options="checkOptions" v-model="checkList" @change="checkBoxChange"/>
|
||||||
<!-- 人员选择 -->
|
<!-- 人员选择 -->
|
||||||
<el-empty :image-size="100" description="似乎没有数据" v-show="dataList.length === 0"/>
|
<el-empty :image-size="100" description="似乎没有数据" v-show="dataList.length === 0"/>
|
||||||
@@ -68,10 +66,10 @@ const checkOptions = ref([
|
|||||||
label: isExpand.value,
|
label: isExpand.value,
|
||||||
value: '1'
|
value: '1'
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
label: '父子联动',
|
// label: '父子联动',
|
||||||
value: '2'
|
// value: '2'
|
||||||
},
|
// },
|
||||||
])
|
])
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
value: {
|
value: {
|
||||||
@@ -107,13 +105,13 @@ const defaultProps = {
|
|||||||
children: "children",
|
children: "children",
|
||||||
disabled: "disabled",
|
disabled: "disabled",
|
||||||
};
|
};
|
||||||
const emit = defineEmits();
|
const emit = defineEmits(['update:modelValue'])
|
||||||
const _value = computed({
|
const _value = computed({
|
||||||
get() {
|
get() {
|
||||||
return props.value;
|
return props.value;
|
||||||
},
|
},
|
||||||
set(val) {
|
set(value) {
|
||||||
emit("input", val);
|
emit('update:modelValue', value)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -157,14 +155,8 @@ const filterNode = (value, data) => {
|
|||||||
const show = () => {
|
const show = () => {
|
||||||
//用于弹开部门选择
|
//用于弹开部门选择
|
||||||
visible.value = true;
|
visible.value = true;
|
||||||
// console.log('_value.value', _value.value, selectList.value)
|
|
||||||
// if(selectList.value.length==0){
|
|
||||||
// selectList.value=[]
|
|
||||||
// defaultChecked.value =[]
|
|
||||||
// }else {
|
|
||||||
selectList.value = _value.value
|
selectList.value = _value.value
|
||||||
defaultChecked.value = _value.value.map(item => item.value)
|
defaultChecked.value = _value.value.map(item => item.value)
|
||||||
// }
|
|
||||||
getList()
|
getList()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ const handleDelete = (row) => {
|
|||||||
type: res.code === 1000 ? 'success' : 'error'
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
})
|
})
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
_value.value.splice(_value.value.findIndex((item) => item.id === row.fileId), 1);
|
_value.value.splice(_value.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,7 +181,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
<div class="oper-page-btn" v-if="data.state==='5'">
|
<div class="oper-page-btn" v-perm="['annual:plan:approve']" v-if="data.state==='5'">
|
||||||
<el-button type="danger" @click="handleRejectPlan">驳回年度计划</el-button>
|
<el-button type="danger" @click="handleRejectPlan">驳回年度计划</el-button>
|
||||||
<el-button color="#DED0B2" @click="handleAgreePlan">通过年度计划</el-button>
|
<el-button color="#DED0B2" @click="handleAgreePlan">通过年度计划</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -272,6 +272,9 @@ const handleRejectPlan = async () => {
|
|||||||
type: res.code === 1000 ? 'success' : 'error'
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
})
|
})
|
||||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||||
|
router.push({
|
||||||
|
name: 'Summary'
|
||||||
|
})
|
||||||
}
|
}
|
||||||
const handleAgreePlan = async () => {
|
const handleAgreePlan = async () => {
|
||||||
const params = {
|
const params = {
|
||||||
@@ -287,13 +290,16 @@ const handleAgreePlan = async () => {
|
|||||||
type: res.code === 1000 ? 'success' : 'error'
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
})
|
})
|
||||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||||
|
router.push({
|
||||||
|
name: 'Summary'
|
||||||
|
})
|
||||||
}
|
}
|
||||||
const filterDict = (data, value) => {
|
const filterDict = (data, value) => {
|
||||||
if (data === undefined || value === undefined) return;
|
if (data === undefined || value === undefined) return;
|
||||||
let label = ''
|
let label = ''
|
||||||
let result = []
|
let result = []
|
||||||
if (JSON.parse(value) instanceof Array) {
|
if (value instanceof Array) {
|
||||||
JSON.parse(value).forEach(item1 => {
|
value.forEach(item1 => {
|
||||||
data.find(item => {
|
data.find(item => {
|
||||||
if (item.value == item1) {
|
if (item.value == item1) {
|
||||||
result.push(item.label)
|
result.push(item.label)
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ const handleSearch = () => {
|
|||||||
}
|
}
|
||||||
const handleReset=()=>{
|
const handleReset=()=>{
|
||||||
attachment.fileName=''
|
attachment.fileName=''
|
||||||
attachment.tag=''
|
attachment.tag=null
|
||||||
emit('search', {})
|
emit('search', {})
|
||||||
}
|
}
|
||||||
const handleUpload = () => {
|
const handleUpload = () => {
|
||||||
|
|||||||
@@ -323,9 +323,9 @@ watchEffect(() => {
|
|||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
}
|
}
|
||||||
.is-active {
|
.is-active {
|
||||||
color: #BEA266;
|
|
||||||
}
|
|
||||||
.is-end {
|
|
||||||
color: #67c23a;
|
color: #67c23a;
|
||||||
}
|
}
|
||||||
|
.is-end {
|
||||||
|
color: #BEA266;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<span class="sys-name">科技创新项目管理平台</span>
|
||||||
<div class="toggle" @click="toggleClick">
|
<div class="toggle" @click="toggleClick">
|
||||||
<component :is="siderbarStore.getSiderBarStatus() ? 'Fold' : 'Expand'" class="icon"></component>
|
<component :is="siderbarStore.getSiderBarStatus() ? 'Fold' : 'Expand'" class="icon"></component>
|
||||||
</div>
|
</div>
|
||||||
@@ -13,6 +14,10 @@ const toggleClick = () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
.sys-name {
|
||||||
|
padding-left: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
.toggle{
|
.toggle{
|
||||||
line-height: 65px;
|
line-height: 65px;
|
||||||
border-top-left-radius: 10px;
|
border-top-left-radius: 10px;
|
||||||
|
|||||||
@@ -17,7 +17,9 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<svg-icon :name="item.icon"/>
|
<el-icon>
|
||||||
|
<svg-icon :name="item.icon" class="menu-item-icon"/>
|
||||||
|
</el-icon>
|
||||||
<span>{{ item.title }}</span>
|
<span>{{ item.title }}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -60,3 +62,10 @@ const checkMenuItem = (item) => {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<!-- <style lang="scss" scoped>
|
||||||
|
.menu-item-icon {
|
||||||
|
width: 18px !important;
|
||||||
|
height: 18px !important;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
</style> -->
|
||||||
@@ -145,6 +145,56 @@ const router = createRouter({
|
|||||||
breadcrumb: false
|
breadcrumb: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// 项目详情
|
||||||
|
{
|
||||||
|
path: '/project/management/implementation/implementation/detail',
|
||||||
|
name: 'Implementation/detail',
|
||||||
|
component: () => import('@/views/project-management/implementation/detail.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '项目详情',
|
||||||
|
breadcrumb: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 需求征集详情
|
||||||
|
{
|
||||||
|
path: '/project/demand/requirement/requirement/detail',
|
||||||
|
name: 'Requirement/detail',
|
||||||
|
component: () => import('@/views/project-demand/requirement/detail.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '需求征集-详情',
|
||||||
|
breadcrumb: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 需求汇总详情
|
||||||
|
{
|
||||||
|
path: '/project/demand/summary/summary/detail',
|
||||||
|
name: 'Summary/detail',
|
||||||
|
component: () => import('@/views/project-demand/summary/detail.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '需求汇总-详情',
|
||||||
|
breadcrumb: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 专项资金详情
|
||||||
|
{
|
||||||
|
path: '/special/fund/fund/detail',
|
||||||
|
name: 'Fund/detail',
|
||||||
|
component: () => import('@/views/special-fund/detail.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '专项资金-详情',
|
||||||
|
breadcrumb: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 费用分摊详情
|
||||||
|
{
|
||||||
|
path: '/expense/management/expense/share/share/detail',
|
||||||
|
name: 'Share/detail',
|
||||||
|
component: () => import('@/views/expense-management/share/detail.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '费用分摊-详情',
|
||||||
|
breadcrumb: false
|
||||||
|
}
|
||||||
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ const searchConfig = reactive([
|
|||||||
props: {
|
props: {
|
||||||
placeholder: '请选择时间',
|
placeholder: '请选择时间',
|
||||||
clearable: true,
|
clearable: true,
|
||||||
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
type:'month',
|
||||||
|
format: 'YYYY-MM',
|
||||||
|
valueFormat:'YYYY-MM',
|
||||||
},
|
},
|
||||||
colProps: {}
|
colProps: {}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,9 +4,12 @@
|
|||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="年度计划名称" prop="annualPlanName">
|
<el-form-item label="年度计划名称" prop="annualPlanName">
|
||||||
<!-- <el-input v-model="formData.annualPlanName" placeholder="请输入年度计划名称" clearable>-->
|
<div v-if="isEdit">
|
||||||
<!-- </el-input>-->
|
<el-input v-model="formData.annualPlanName" placeholder="请输入年度计划名称" clearable>
|
||||||
<span>{{ formData.annualPlanName }}</span>
|
</el-input>
|
||||||
|
<el-button color="#DED0B2" style="margin-left: 10px" @click="editName">提交</el-button>
|
||||||
|
</div>
|
||||||
|
<span v-else>{{ formData.annualPlanName }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
@@ -18,13 +21,16 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
<div class="query-btn">
|
<div class="query-btn">
|
||||||
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>
|
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>
|
||||||
|
<el-button color="#DED0B2" v-perm="['annual:plan:edit']" style="float: right;margin: 0 10px 10px 0"
|
||||||
|
@click="editBtn">编辑
|
||||||
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-table ref="table" :data="formData.projectList" border :header-cell-style="{background:'#f5f7fa'}">
|
<el-table ref="table" :data="formData.projectList" border :header-cell-style="{background:'#f5f7fa'}">
|
||||||
<el-table-column label="四川省国有资产经营投资管理有限责任公司科技创新项目年度计划表" align="center">
|
<el-table-column label="四川省国有资产经营投资管理有限责任公司科技创新项目年度计划表" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-table-column type="index" label="序号" align="center" width="60"/>
|
<el-table-column type="index" label="序号" align="center" width="60"/>
|
||||||
<el-table-column prop="projectName" label="项目名称" align="center"/>
|
<el-table-column prop="projectName" label="项目名称" align="center" width="100"/>
|
||||||
<el-table-column prop="time" label="起始时间" align="center" min-width="120px">
|
<el-table-column prop="time" label="起始时间" align="center" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ scope.row.startTime + ' 至 ' + scope.row.endTime }}
|
{{ scope.row.startTime + ' 至 ' + scope.row.endTime }}
|
||||||
</template>
|
</template>
|
||||||
@@ -37,7 +43,7 @@
|
|||||||
<div v-else>--</div>
|
<div v-else>--</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="departmentName" label="承办部门" align="center"/>
|
<el-table-column prop="departmentName" label="承办部门" align="center" width="90"/>
|
||||||
<el-table-column prop="investmentType" label="出资类型" align="center">
|
<el-table-column prop="investmentType" label="出资类型" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.investmentType !== null">
|
<div v-if="scope.row.investmentType !== null">
|
||||||
@@ -46,7 +52,7 @@
|
|||||||
<div v-else>--</div>
|
<div v-else>--</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="projectImpact" label="项目影响" align="center">
|
<el-table-column prop="projectImpact" label="项目影响" align="center" width="90">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.projectImpact !== null">
|
<div v-if="scope.row.projectImpact !== null">
|
||||||
<Tag dictType="project_impact" :value="scope.row.projectImpact"/>
|
<Tag dictType="project_impact" :value="scope.row.projectImpact"/>
|
||||||
@@ -54,7 +60,7 @@
|
|||||||
<div v-else>--</div>
|
<div v-else>--</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="businessSegment" label="所属业务板块" align="center">
|
<el-table-column prop="businessSegment" label="所属业务板块" align="center" width="110">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.businessSegment !== null">
|
<div v-if="scope.row.businessSegment !== null">
|
||||||
<Tag dictType="business_segment" :value="scope.row.businessSegment"/>
|
<Tag dictType="business_segment" :value="scope.row.businessSegment"/>
|
||||||
@@ -65,10 +71,7 @@
|
|||||||
<el-table-column prop="resultForm" label="预期成果形式" align="center" min-width="100px">
|
<el-table-column prop="resultForm" label="预期成果形式" align="center" min-width="100px">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.resultForm !== null">
|
<div v-if="scope.row.resultForm !== null">
|
||||||
<el-tag effect="plain">{{
|
<Tag style="margin-top: 3px" dictType="result_form" v-for="item in scope.row.resultForm" :value="item"/>
|
||||||
filterDict(cacheStore.getDict('result_form'), scope.row.resultForm)
|
|
||||||
}}
|
|
||||||
</el-tag>
|
|
||||||
</div>
|
</div>
|
||||||
<div v-else>--</div>
|
<div v-else>--</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -97,6 +100,17 @@
|
|||||||
<div v-else>--</div>
|
<div v-else>--</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column prop="prospectiveIntellectualProperty" label="预期知识产权" align="center" width="190">
|
||||||
|
<template #default="scope">
|
||||||
|
<div style="text-align: left">
|
||||||
|
发明专利({{ scope.row.inventionPatent ? scope.row.inventionPatent : 0 }})项,<br>
|
||||||
|
实用新型专利({{ scope.row.newPatent ? scope.row.newPatent : 0 }})项,<br>
|
||||||
|
软件著作权({{ scope.row.softwareCopyright ? scope.row.softwareCopyright : 0 }})项,<br>
|
||||||
|
著作权({{ scope.row.copyright ? scope.row.copyright : 0 }})项,<br>
|
||||||
|
其他({{ scope.row.other ? scope.row.other : 0 }})项,
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column prop="intellectualProperty" label="知识产权状况" align="center">
|
<el-table-column prop="intellectualProperty" label="知识产权状况" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.intellectualProperty !== null">
|
<div v-if="scope.row.intellectualProperty !== null">
|
||||||
@@ -124,7 +138,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import {toThousands} from '@/utils/changePrice.js'
|
import {toThousands} from '@/utils/changePrice.js'
|
||||||
import {ElNotification} from "element-plus";
|
import {ElNotification} from "element-plus";
|
||||||
import {getPlan} from "@/api/project-demand/summary";
|
import {getPlan, editPlan} from "@/api/project-demand/summary";
|
||||||
import {useCacheStore} from '@/stores/cache.js'
|
import {useCacheStore} from '@/stores/cache.js'
|
||||||
import {exportExcel} from "@/utils/export-excel";
|
import {exportExcel} from "@/utils/export-excel";
|
||||||
|
|
||||||
@@ -133,6 +147,7 @@ const loading = ref(false)
|
|||||||
const formData = ref({})
|
const formData = ref({})
|
||||||
const table = ref()
|
const table = ref()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
const isEdit = ref(false)
|
||||||
const exportTable = () => {
|
const exportTable = () => {
|
||||||
const $e = table.value.$el
|
const $e = table.value.$el
|
||||||
let $table = $e.querySelector('.el-table__fixed')
|
let $table = $e.querySelector('.el-table__fixed')
|
||||||
@@ -141,12 +156,31 @@ const exportTable = () => {
|
|||||||
}
|
}
|
||||||
exportExcel($table, (5 + (Object.keys(formData.value.projectList[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目年度计划表", 2)
|
exportExcel($table, (5 + (Object.keys(formData.value.projectList[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目年度计划表", 2)
|
||||||
}
|
}
|
||||||
|
const editName = () => {
|
||||||
|
let param = {
|
||||||
|
annualPlanId: route.query.annualPlanId,
|
||||||
|
annualPlanName: formData.value.annualPlanName
|
||||||
|
}
|
||||||
|
editPlan(param).then(res => {
|
||||||
|
ElNotification({
|
||||||
|
title: '提示',
|
||||||
|
message: res.msg,
|
||||||
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
|
})
|
||||||
|
if (res.code === 1000) {
|
||||||
|
isEdit.value = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const editBtn = () => {
|
||||||
|
isEdit.value = true
|
||||||
|
}
|
||||||
const filterDict = (data, value) => {
|
const filterDict = (data, value) => {
|
||||||
if (data === undefined || value === undefined) return;
|
if (data === undefined || value === undefined) return;
|
||||||
let label = ''
|
let label = ''
|
||||||
let result = []
|
let result = []
|
||||||
if (JSON.parse(value) instanceof Array) {
|
if (value instanceof Array) {
|
||||||
JSON.parse(value).forEach(item1 => {
|
value.forEach(item1 => {
|
||||||
data.find(item => {
|
data.find(item => {
|
||||||
if (item.value == item1) {
|
if (item.value == item1) {
|
||||||
result.push(item.label)
|
result.push(item.label)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<baseTitle title="年度计划"></baseTitle>
|
||||||
<!-- <fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>-->
|
<!-- <fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>-->
|
||||||
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"></fvTable>
|
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick" ></fvTable>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
|
|||||||
@@ -104,6 +104,7 @@
|
|||||||
<el-button color="#DED0B2" v-else @click="handleResubmit">重新提交</el-button>
|
<el-button color="#DED0B2" v-else @click="handleResubmit">重新提交</el-button>
|
||||||
<el-button @click="handleBack">返回</el-button>
|
<el-button @click="handleBack">返回</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<company-picker :multiple="true" ref="companyRef" title="请选择征集公司" @ok="selected"
|
<company-picker :multiple="true" ref="companyRef" title="请选择征集公司" @ok="selected"
|
||||||
v-model:value="selectedCompanyList"/>
|
v-model:value="selectedCompanyList"/>
|
||||||
</div>
|
</div>
|
||||||
@@ -128,7 +129,6 @@ import {getSubCompOpt} from '@/api/user/user.js'
|
|||||||
import {useTagsView} from '@/stores/tagsview.js'
|
import {useTagsView} from '@/stores/tagsview.js'
|
||||||
import {getFundOption} from "@/api/special-fund";
|
import {getFundOption} from "@/api/special-fund";
|
||||||
import CompanyPicker from "@/components/DetailComponent/CompanyPicker.vue";
|
import CompanyPicker from "@/components/DetailComponent/CompanyPicker.vue";
|
||||||
import {matterTree} from "@/utils/matterTree";
|
|
||||||
|
|
||||||
import {useCacheStore} from '@/stores/cache.js'
|
import {useCacheStore} from '@/stores/cache.js'
|
||||||
|
|
||||||
@@ -408,22 +408,30 @@ const handleResubmit = () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
const matterTree = (array,data, id) => {
|
||||||
|
if (id) {
|
||||||
|
data.forEach(item => {
|
||||||
|
if (item.value == id) {
|
||||||
|
let obj={
|
||||||
|
label:item.label,
|
||||||
|
value:item.value
|
||||||
|
}
|
||||||
|
array.push(obj);
|
||||||
|
}
|
||||||
|
if (item.children && item.children.length > 0) {
|
||||||
|
matterTree(array,item.children,id)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
}
|
||||||
const getCompanyOptionItem = (val) => {
|
const getCompanyOptionItem = (val) => {
|
||||||
let newObj = {}
|
|
||||||
let newArray = []
|
|
||||||
if (val !== undefined) {
|
if (val !== undefined) {
|
||||||
val.forEach(item => {
|
val.forEach(item => {
|
||||||
matterTree(companyNameArray.value, companyOption.value, item)
|
matterTree(companyNameArray.value, companyOption.value, item)
|
||||||
})
|
})
|
||||||
companyNameArray.value.forEach(companyItem => {
|
|
||||||
newObj = {
|
|
||||||
label: companyItem
|
|
||||||
}
|
|
||||||
newArray.push(newObj)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
return newArray;
|
return companyNameArray.value;
|
||||||
}
|
}
|
||||||
const getDetailInfo = async () => {
|
const getDetailInfo = async () => {
|
||||||
getFormInfo(route.query.id).then(res => {
|
getFormInfo(route.query.id).then(res => {
|
||||||
@@ -457,7 +465,7 @@ const handleDelete = (row) => {
|
|||||||
type: res.code === 1000 ? 'success' : 'error'
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
})
|
})
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
formData.value.fileList.splice(formData.value.fileList.findIndex((item) => item.id === row.fileId), 1);
|
formData.value.fileList.splice(formData.value.fileList.findIndex((item) => item.fileId === row.fileId), 1);
|
||||||
// showTable.value = formData.value.fileList.length !== 0;
|
// showTable.value = formData.value.fileList.length !== 0;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -415,14 +415,6 @@ const handleSubmit = debounce(async (instance) => {
|
|||||||
if (formData.value.singleFile !== undefined) {
|
if (formData.value.singleFile !== undefined) {
|
||||||
formData.value.singleFile = getFileParam(formData.value.singleFile)
|
formData.value.singleFile = getFileParam(formData.value.singleFile)
|
||||||
}
|
}
|
||||||
formData.value.resultForm=JSON.stringify(formData.value.resultForm)
|
|
||||||
let params = {
|
|
||||||
...formData.value,
|
|
||||||
deploymentId: deploymentId.value,
|
|
||||||
fileList: otherFiles,
|
|
||||||
requirementId: route.query.id ? route.query.id : '-1'
|
|
||||||
}
|
|
||||||
console.log('params', params)
|
|
||||||
if (!attachment.value.isSingleFile) {
|
if (!attachment.value.isSingleFile) {
|
||||||
attachment.value.validate()
|
attachment.value.validate()
|
||||||
ElNotification({
|
ElNotification({
|
||||||
@@ -432,8 +424,17 @@ const handleSubmit = debounce(async (instance) => {
|
|||||||
})
|
})
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
// formData.value.resultForm=JSON.stringify(formData.value.resultForm)
|
||||||
attachment.value.clearValidate()
|
attachment.value.clearValidate()
|
||||||
}
|
}
|
||||||
|
let params = {
|
||||||
|
...formData.value,
|
||||||
|
deploymentId: deploymentId.value,
|
||||||
|
fileList: otherFiles,
|
||||||
|
requirementId: route.query.id ? route.query.id : '-1'
|
||||||
|
}
|
||||||
|
console.log('params', params)
|
||||||
|
|
||||||
let res = await requirementReported(params)
|
let res = await requirementReported(params)
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
@@ -464,17 +465,17 @@ const handleResubmit = debounce(() => {
|
|||||||
})
|
})
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
// formData.value.resultForm=JSON.stringify(formData.value.resultForm)
|
||||||
attachment.value.clearValidate()
|
attachment.value.clearValidate()
|
||||||
}
|
}
|
||||||
if (formData.value.isSpecialFund && formData.value.specialFund === null) {
|
if (formData.value.isSpecialFund && formData.value.specialFund === null) {
|
||||||
formData.value.specialFund = getFundName(formData.value.specialFundId)
|
formData.value.specialFund = getFundName(formData.value.specialFundId)
|
||||||
}
|
}
|
||||||
formData.value.resultForm=JSON.stringify(formData.value.resultForm)
|
|
||||||
let params = {
|
let params = {
|
||||||
...formData.value,
|
...formData.value,
|
||||||
deploymentId: deploymentId.value,
|
deploymentId: deploymentId.value,
|
||||||
fileList: otherFiles,
|
fileList: otherFiles,
|
||||||
requirementId: route.query.requirementId ? route.query.requirementId : '-1'
|
requirementId: route.query.id ? route.query.id : '-1'
|
||||||
}
|
}
|
||||||
// console.log('重新提交params', params, formData.value.specialFund, formData.value.specialFundId)
|
// console.log('重新提交params', params, formData.value.specialFund, formData.value.specialFundId)
|
||||||
resubmitReported(params).then(res => {
|
resubmitReported(params).then(res => {
|
||||||
@@ -502,7 +503,7 @@ const getDetailInfo = async () => {
|
|||||||
})
|
})
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
res.data.formData.specialFundId = res.data.formData.specialFundId === 0 ? null : res.data.formData.specialFundId
|
res.data.formData.specialFundId = res.data.formData.specialFundId === 0 ? null : res.data.formData.specialFundId
|
||||||
res.data.formData.resultForm = JSON.parse(res.data.formData.resultForm)
|
// res.data.formData.resultForm = JSON.parse(res.data.formData.resultForm)
|
||||||
formData.value = res.data.formData
|
formData.value = res.data.formData
|
||||||
loading.value = false
|
loading.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,6 +146,7 @@ const auths = {
|
|||||||
edit: ['mosr:collect:resubmit'],
|
edit: ['mosr:collect:resubmit'],
|
||||||
detail: ['mosr:collect:info'],
|
detail: ['mosr:collect:info'],
|
||||||
report: ['mosr:collect:reported'],
|
report: ['mosr:collect:reported'],
|
||||||
|
planAdd: ['annual:plan:add'],
|
||||||
}
|
}
|
||||||
const tableConfig = reactive({
|
const tableConfig = reactive({
|
||||||
columns: [
|
columns: [
|
||||||
@@ -269,7 +270,7 @@ const tableConfig = reactive({
|
|||||||
params: {},
|
params: {},
|
||||||
btns: [
|
btns: [
|
||||||
{name: '新增上报', key: 'add', color: '#DED0B2', auth: auths.report},
|
{name: '新增上报', key: 'add', color: '#DED0B2', auth: auths.report},
|
||||||
{name: '创建年度计划', key: 'export', color: '#DED0B2', auth: ''},
|
{name: '创建年度计划', key: 'export', color: '#DED0B2', auth: auths.planAdd},
|
||||||
// {name: '经费预算生成', key: 'preMonty', auth: ''},
|
// {name: '经费预算生成', key: 'preMonty', auth: ''},
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
@@ -298,7 +299,6 @@ const selectionChange = (data) => {
|
|||||||
projectSelectList.value = data
|
projectSelectList.value = data
|
||||||
}
|
}
|
||||||
const handleExport = () => {
|
const handleExport = () => {
|
||||||
console.log('projectSelectList.value', projectSelectList.value)
|
|
||||||
let projectIds = []
|
let projectIds = []
|
||||||
projectSelectList.value.map(item => {
|
projectSelectList.value.map(item => {
|
||||||
projectIds.push(item.projectId)
|
projectIds.push(item.projectId)
|
||||||
@@ -309,7 +309,12 @@ const handleExport = () => {
|
|||||||
}
|
}
|
||||||
addPlan(params).then(res => {
|
addPlan(params).then(res => {
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
|
router.push({
|
||||||
|
name: 'Plan/detail',
|
||||||
|
query: {
|
||||||
|
annualPlanId: res.data
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -337,7 +342,7 @@ const handleEdit = (row) => {
|
|||||||
router.push({
|
router.push({
|
||||||
name: 'Summary/edit',
|
name: 'Summary/edit',
|
||||||
query: {
|
query: {
|
||||||
requirementId: row.requirementId,
|
id: row.requirementId,
|
||||||
projectId: row.projectId
|
projectId: row.projectId
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,6 +1,20 @@
|
|||||||
<template>
|
<template>
|
||||||
<view style="overflow-y: scroll">
|
<view style="overflow-y: scroll">
|
||||||
<baseTitle title="基础信息"></baseTitle>
|
<baseTitle title="基础信息"></baseTitle>
|
||||||
|
<el-form :model="basicData">
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item prop="requirementName" label="征集名称" label-width="122">
|
||||||
|
<span>{{basicData.requirementName}}</span>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item prop="projectName" label="项目名称" label-width="130">
|
||||||
|
<span>{{basicData.projectName}}</span>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form>
|
||||||
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e"></fvForm>
|
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e"></fvForm>
|
||||||
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>
|
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>
|
||||||
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick" @selectionChange="selectionChange">
|
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick" @selectionChange="selectionChange">
|
||||||
@@ -20,37 +34,9 @@ import {searchUpdateLedgerData,exportExcel} from "@/api/project-manage";
|
|||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const formArray = ref([
|
const basicData=ref({})
|
||||||
{
|
const tableData = ref({})
|
||||||
label: '征集名称',
|
|
||||||
prop: 'requirementName',
|
|
||||||
colProps: {
|
|
||||||
span: 12
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '项目名称',
|
|
||||||
prop: 'projectName',
|
|
||||||
colProps: {
|
|
||||||
span: 12
|
|
||||||
}
|
|
||||||
}
|
|
||||||
])
|
|
||||||
const formDataArray = ref([
|
const formDataArray = ref([
|
||||||
{
|
|
||||||
label: '征集名称',
|
|
||||||
prop: 'requirementName',
|
|
||||||
colProps: {
|
|
||||||
span: 8
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '项目名称',
|
|
||||||
prop: 'projectName',
|
|
||||||
colProps: {
|
|
||||||
span: 8
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: '项目负责人',
|
label: '项目负责人',
|
||||||
prop: 'projectChargePersonName',
|
prop: 'projectChargePersonName',
|
||||||
@@ -102,13 +88,8 @@ const formDataArray = ref([
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
const tableData = ref({})
|
|
||||||
const schema = computed(() => {
|
const schema = computed(() => {
|
||||||
// if (JSON.stringify(tableData.value) !== '{}') {
|
|
||||||
return formDataArray.value
|
return formDataArray.value
|
||||||
// } else {
|
|
||||||
// return formArray.value
|
|
||||||
// }
|
|
||||||
})
|
})
|
||||||
const baseForm = ref()
|
const baseForm = ref()
|
||||||
const tableIns = ref()
|
const tableIns = ref()
|
||||||
@@ -259,8 +240,7 @@ const handleUpdateTable = () => {
|
|||||||
const getBaseInfo = async () => {
|
const getBaseInfo = async () => {
|
||||||
try {
|
try {
|
||||||
const {code, data} = await getBaseInfoApi(route.query.id)
|
const {code, data} = await getBaseInfoApi(route.query.id)
|
||||||
baseForm.value.setValues(data)
|
basicData.value=data
|
||||||
await init()
|
|
||||||
} catch {
|
} catch {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -279,6 +259,7 @@ const init = async () => {
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
getBaseInfo()
|
getBaseInfo()
|
||||||
|
init()
|
||||||
const headBtnClick = (key) => {
|
const headBtnClick = (key) => {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case 'add':
|
case 'add':
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
<el-form :model="tableForm" ref="form">
|
<el-form :model="tableForm" ref="form">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item prop="projectName" label="项目名称">
|
<el-form-item prop="projectName" label="项目名称" label-width="150">
|
||||||
<span>{{ tableForm.projectName }}</span>
|
<span>{{ tableForm.projectName }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item prop="projectChargePerson" label="项目负责人">
|
<el-form-item prop="projectChargePerson" label="项目负责人" label-width="150">
|
||||||
<el-button color="#DED0B2" @click="showPersonnelPicker" style="margin-right: 10px">
|
<el-button color="#DED0B2" @click="showPersonnelPicker" style="margin-right: 10px">
|
||||||
{{ tableForm.projectChargePersonName ? '更改' : '请选择项目负责人' }}
|
{{ tableForm.projectChargePersonName ? '更改' : '请选择项目负责人' }}
|
||||||
</el-button>
|
</el-button>
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item prop="startTime" label="项目开始时间">
|
<el-form-item prop="startTime" label="项目开始时间" label-width="150">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="tableForm.startTime"
|
v-model="tableForm.startTime"
|
||||||
type="date"
|
type="date"
|
||||||
@@ -42,13 +42,13 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item prop="projectDevelopmentWay" label="项目开展方式" style="width: 100%">
|
<el-form-item prop="projectDevelopmentWay" label="项目开展方式" style="width: 100%" label-width="150">
|
||||||
<el-input v-model="tableForm.projectDevelopmentWay" placeholder="请输入项目开展方式" clearable>
|
<el-input v-model="tableForm.projectDevelopmentWay" placeholder="请输入项目开展方式" clearable>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item prop="projectBudgetDescription" label="项目预算" style="width: 100%">
|
<el-form-item prop="projectBudgetDescription" label="项目预算" style="width: 100%" label-width="150">
|
||||||
<el-input v-model="tableForm.projectBudgetDescription" placeholder="请输入项目预算" clearable>
|
<el-input v-model="tableForm.projectBudgetDescription" placeholder="请输入项目预算" clearable>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ const handleDelete = (row) => {
|
|||||||
type: res.code === 1000 ? 'success' : 'error'
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
})
|
})
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
fileList.value.splice(fileList.value.findIndex((item) => item.id === row.fileId), 1);
|
fileList.value.splice(fileList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -323,9 +323,9 @@ watchEffect(() => {
|
|||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
}
|
}
|
||||||
.is-active {
|
.is-active {
|
||||||
color: #BEA266;
|
|
||||||
}
|
|
||||||
.is-end {
|
|
||||||
color: #67c23a;
|
color: #67c23a;
|
||||||
}
|
}
|
||||||
|
.is-end {
|
||||||
|
color: #BEA266;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -135,8 +135,8 @@ const handleDelete = (row) => {
|
|||||||
type: res.code === 1000 ? 'success' : 'error'
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
})
|
})
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
formData.value.files.splice(formData.value.files.findIndex((item) => item.id === row.fileId), 1);
|
formData.value.files.splice(formData.value.files.findIndex((item) => item.fileId === row.fileId), 1);
|
||||||
showTable.value = formData.value.files.length !== 0;
|
// showTable.value = formData.value.files.length !== 0;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,10 +123,10 @@ const tableConfig = reactive({
|
|||||||
let btn = []
|
let btn = []
|
||||||
let buttons = new Set(Array.from(row.buttons))
|
let buttons = new Set(Array.from(row.buttons))
|
||||||
if (buttons.has("details")) {
|
if (buttons.has("details")) {
|
||||||
btn.push({label: '详情', prem: ['mosr:collect:info'], func: () => handleDetail(row), type: 'primary'})
|
btn.push({label: '详情', prem: ['special:fund:info'], func: () => handleDetail(row), type: 'primary'})
|
||||||
}
|
}
|
||||||
if (buttons.has("edit")) {
|
if (buttons.has("edit")) {
|
||||||
btn.push({label: '编辑', prem: ['mosr:collect:resubmit'], func: () => handleEdit(row), type: 'primary'})
|
btn.push({label: '编辑', prem: ['special:fund:edit'], func: () => handleEdit(row), type: 'primary'})
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<div style={{width: '100%'}}>
|
<div style={{width: '100%'}}>
|
||||||
@@ -145,7 +145,6 @@ const tableConfig = reactive({
|
|||||||
{
|
{
|
||||||
buttons.has("delete") ?
|
buttons.has("delete") ?
|
||||||
<popover-delete name={row.name} type={'专项资金'} btnType={'danger'}
|
<popover-delete name={row.name} type={'专项资金'} btnType={'danger'}
|
||||||
perm={['mosr:requirement:del']}
|
|
||||||
onDelete={() => handleDelete(row)}/>
|
onDelete={() => handleDelete(row)}/>
|
||||||
: ''
|
: ''
|
||||||
}
|
}
|
||||||
@@ -157,7 +156,7 @@ const tableConfig = reactive({
|
|||||||
api: '/workflow/mosr/special/fund',
|
api: '/workflow/mosr/special/fund',
|
||||||
params: {},
|
params: {},
|
||||||
btns: [
|
btns: [
|
||||||
{name: '新增', key: 'add', color: '#DED0B2', auth: ''},
|
{name: '新增', key: 'add', color: '#DED0B2', auth: ['special:fund:add']},
|
||||||
// {name: '导出', key: '_export', color: '#DED0B2', auth: ''},
|
// {name: '导出', key: '_export', color: '#DED0B2', auth: ''},
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user