Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -56,8 +56,8 @@ export const getUserDetail = (userId) => {
|
||||
// 操作
|
||||
export const operate = (data, type) => {
|
||||
// console.log(type ,'type');
|
||||
if(data.userId && type !== '0') return editUser(data)
|
||||
else if(type == '0') return editUserOA(data)
|
||||
if (data.userId && type !== '0') return editUser(data)
|
||||
else if (type == '0') return editUserOA(data)
|
||||
return addUser(data)
|
||||
}
|
||||
|
||||
@@ -186,16 +186,23 @@ export const unbindAllUserByPost = (postId) => {
|
||||
})
|
||||
}
|
||||
|
||||
export const bindAccount=(data)=>{
|
||||
export const bindAccount = (data) => {
|
||||
return request({
|
||||
url: '/admin/mosr/user/bind/account',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const getBindAccount=(userId)=>{
|
||||
export const getBindAccount = (userId) => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/bind/account/info/${userId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const checkMatrix = (userId) => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/matrix?userId=` + userId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
BIN
src/assets/kylogo.png
Normal file
BIN
src/assets/kylogo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 183 KiB |
@@ -2,7 +2,7 @@
|
||||
border-radius: 10px;
|
||||
}
|
||||
.logo {
|
||||
height: 106px;
|
||||
height: 65px;
|
||||
background-color: #BEA266;
|
||||
color: #ffffff;
|
||||
font-weight: bold;
|
||||
@@ -10,6 +10,13 @@
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
padding: 10px;
|
||||
& > img {
|
||||
object-fit: scale-down;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
.port-link{
|
||||
display: block;
|
||||
|
||||
@@ -82,6 +82,10 @@ const props = defineProps({
|
||||
labelPosition: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
tag: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(["getAttachment", "getOtherFile"])
|
||||
@@ -219,35 +223,36 @@ const isSingleFile = ref(false)
|
||||
const allFileList = ref([])
|
||||
const deleteFileVal = ref({})
|
||||
const singleFileList = ref([])
|
||||
if (props.formData.fileList !== null && props.formData.fileList?.length > 0) {
|
||||
allFileList.value = props.formData.fileList
|
||||
}
|
||||
// if (props.formData.fileList !== null && props.formData.fileList?.length > 0) {
|
||||
// allFileList.value = props.formData.fileList
|
||||
// }
|
||||
watch(() => props.showSingleTable, (newVal) => {
|
||||
props.showSingleTable = newVal
|
||||
}, {deep: true})
|
||||
watch(() => props.formData.fileList, (newVal) => {
|
||||
// console.log('newVal-fileList', newVal)
|
||||
console.log('newVal-fileList', newVal)
|
||||
if (props.preview) {
|
||||
newVal?.forEach(item => {
|
||||
allFileList.value.push(item)
|
||||
})
|
||||
}
|
||||
}, {deep: true})
|
||||
watch(() => props.otherFileList, (newVal) => {
|
||||
// console.log('newotherFileList', newVal)
|
||||
if (props.preview) {
|
||||
if (props.formData.fileList === null || props.formData.fileList?.length === 0) {
|
||||
allFileList.value = newVal
|
||||
} else {
|
||||
newVal?.forEach(item => {
|
||||
allFileList.value.push(item)
|
||||
})
|
||||
}
|
||||
} else {
|
||||
allFileList.value = newVal
|
||||
}
|
||||
}, {deep: true})
|
||||
|
||||
}, {immediate: true})
|
||||
// watch(() => props.otherFileList, (newVal) => {
|
||||
// props.otherFileList=newVal
|
||||
// if (props.preview) {
|
||||
// console.log('newotherFileList', newVal,props.preview,props.formData.fileList)
|
||||
// if (props.formData.fileList === null || props.formData.fileList?.length === 0) {
|
||||
// allFileList.value = newVal
|
||||
// } else {
|
||||
// console.log('props.otherFileList',props.otherFileList)
|
||||
// // props.otherFileList?.forEach(item => {
|
||||
// // allFileList.value.push(item)
|
||||
// // })
|
||||
// }
|
||||
// } else {
|
||||
// allFileList.value = newVal
|
||||
// }
|
||||
// }, {deep: true})
|
||||
watch(() => props.showTable, (newVal) => {
|
||||
props.showTable = newVal
|
||||
}, {deep: true})
|
||||
@@ -271,26 +276,42 @@ const handleDelete = (row, type) => {
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
if (type === 'single') {
|
||||
singleFileList.value.splice(singleFileList.value.findIndex((item) => item.id === row.fileId), 1);
|
||||
singleFileList.value.splice(singleFileList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
isSingleFile.value = false
|
||||
} else {
|
||||
allFileList.value.splice(allFileList.value.findIndex((item) => item.id === row.fileId), 1);
|
||||
allFileList.value.splice(allFileList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
const handleSingleDelete = (row) => {
|
||||
console.log('row',row)
|
||||
// console.log('row',row)
|
||||
// fileUploadRef.value.handleRemove(deleteFileVal.value.id)
|
||||
handleDelete(row, 'single')
|
||||
}
|
||||
const getAttachment = (val) => {
|
||||
console.log('getAttachment', val)
|
||||
// console.log('getAttachment', val)
|
||||
isSingleFile.value = true
|
||||
// deleteFileVal.value=val
|
||||
emit('getAttachment', val)
|
||||
}
|
||||
const compositeParam = (item) => {
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag:props.tag
|
||||
}
|
||||
}
|
||||
const getOtherFile = (val) => {
|
||||
if (props.preview) {
|
||||
allFileList.value.push(compositeParam(val))
|
||||
} else {
|
||||
allFileList.value = props.otherFileList
|
||||
}
|
||||
emit('getOtherFile', val)
|
||||
}
|
||||
const deleteAttachment = (val) => {
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
</el-row>
|
||||
</el-form>
|
||||
<AttachmentUpload ref="attachment" :label="getTitleName(title)+'附件'" :showTable="showTable"
|
||||
:otherFileList="otherFileList"
|
||||
:otherFileList="otherFileList" :tag="getTitleName(props.title)"
|
||||
@getAttachment="getAttachment" :singleList="singleList" :showSingleTable="showSingleTable"
|
||||
@getOtherFile="getOtherFile" :showFileList="true" :formData="localFormData"
|
||||
:preview="mode == 'resubmit'"/>
|
||||
@@ -213,13 +213,13 @@ const getPreProcessList = () => {
|
||||
searchArray.push(item)
|
||||
}
|
||||
})
|
||||
res.data.forEach((item) => {
|
||||
localFormData.value.preProcess.forEach((item1) => {
|
||||
if (item.requestId == item1.requestId) {
|
||||
preProcessTable.value.toggleRowSelection(item)
|
||||
}
|
||||
})
|
||||
})
|
||||
// res.data.forEach((item) => {
|
||||
// localFormData.value.preProcess.forEach((item1) => {
|
||||
// if (item.requestId == item1.requestId) {
|
||||
// preProcessTable.value.toggleRowSelection(item)
|
||||
// }
|
||||
// })
|
||||
// })
|
||||
total.value = searchArray.length
|
||||
currentList.value = searchArray
|
||||
preProcessList.value = currentList.value.slice(0, 10)
|
||||
|
||||
@@ -118,7 +118,7 @@ const schema = computed(() => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
prop: 'affiliatedCompany',
|
||||
colProps: {
|
||||
span: 12
|
||||
|
||||
@@ -227,10 +227,8 @@ const getList = async () => {
|
||||
} else {
|
||||
localData.list = data
|
||||
}
|
||||
if (data.total) {
|
||||
localData.total = data.total
|
||||
emits('getTotal', localData.total)
|
||||
}
|
||||
localData.total = data.total
|
||||
emits('getTotal', localData.total)
|
||||
localData.loading = false
|
||||
} else {
|
||||
ElNotification({
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<template>
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item v-for="(item, index) in breadcrumbList" :key="item.path">
|
||||
<span v-if="item.meta.noRedirect || index === breadcrumbList.length-1" class="no-redirect">
|
||||
<span v-if="item.meta.noRedirect || index === breadcrumbList.length-1" class="no-redirect font">
|
||||
{{ item.meta.title }}
|
||||
</span>
|
||||
<router-link v-else :to="item.redirect || item.path">
|
||||
<router-link class="font" v-else :to="item.redirect || item.path">
|
||||
{{ item.meta.title }}
|
||||
</router-link>
|
||||
</el-breadcrumb-item>
|
||||
@@ -47,3 +47,9 @@ const isDashboard = (meta) => {
|
||||
|
||||
getBreadcrumb()
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.font {
|
||||
// font-size: 18px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -15,6 +15,8 @@ const toggleClick = () => {
|
||||
<style lang="scss" scoped>
|
||||
.toggle{
|
||||
line-height: 65px;
|
||||
border-top-left-radius: 10px;
|
||||
border-bottom-left-radius: 10px;
|
||||
padding: 0 15px;
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<template>
|
||||
<div class="logo" ref="logo">
|
||||
<span v-if="!siderbarStore.isCollapse">科研管理平台</span>
|
||||
<img src="../../assets/kylogo.png" alt="">
|
||||
<!-- <span v-if="!siderbarStore.isCollapse">科研管理平台</span> -->
|
||||
<span v-if="!siderbarStore.isCollapse"></span>
|
||||
</div>
|
||||
<el-scrollbar :height="`calc(100vh - ${logoHeight}px)`" style="background-color: #ffffff">
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
export const matterTree = (array,data, id) => {
|
||||
if (id) {
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
if (data[i].value == id) {
|
||||
array.push(data[i].label);
|
||||
data.forEach(item => {
|
||||
if (item.value == id) {
|
||||
array.push(item.label);
|
||||
}
|
||||
if (data[i].children && data[i].children.length > 0) {
|
||||
matterTree(array,data[i].children,id)
|
||||
if (item.children && item.children.length > 0) {
|
||||
matterTree(array,item.children,id)
|
||||
}
|
||||
}
|
||||
})
|
||||
return array;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,7 +95,6 @@
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
<template #default="scope">
|
||||
<el-form-item prop="researchPersonnelId">
|
||||
{{ scope.row.researchPersonnel }}
|
||||
<el-button @click="showPersonnelPicker(scope.row,scope.$index)">
|
||||
<el-button color="#DED0B2" @click="showPersonnelPicker(scope.row,scope.$index)" style="margin-left: 10px">
|
||||
{{ scope.row.researchPersonnel ? '更改' : '请选择研发人员' }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
@@ -115,7 +115,7 @@
|
||||
<baseTitle title="审批记录" v-if="processDiagramViewer&& opentionData?.operationList"></baseTitle>
|
||||
<div v-else></div>
|
||||
<div style="display: flex;align-items: center;justify-content: flex-start;">
|
||||
<div class="base-title">流程图</div>
|
||||
<div class="base-title" style="margin-left: 10px;margin-right: 10px">流程图</div>
|
||||
<el-switch
|
||||
v-model="changeDiagram"
|
||||
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
||||
@@ -153,8 +153,6 @@ import {
|
||||
import {useProcessStore} from '@/stores/processStore.js';
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import {ref} from "vue";
|
||||
|
||||
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
||||
|
||||
const userList = ref([])
|
||||
@@ -208,7 +206,20 @@ const researchOptions = ref([])
|
||||
const showPersonnelPicker = (row, index) => {
|
||||
currentRow.value = row
|
||||
currentIndex.value = index
|
||||
userPicker.value.showUserPicker()
|
||||
if(row.companyName){
|
||||
let userObj = {
|
||||
id: row.researchPersonnelId,
|
||||
name: row.researchPersonnel,
|
||||
companyName: row.companyName,
|
||||
accountType: row.accountType,
|
||||
}
|
||||
userList.value=[userObj]
|
||||
}else if(!row.researchPersonnel){
|
||||
userList.value=[]
|
||||
}
|
||||
nextTick(() => {
|
||||
userPicker.value.showUserPicker()
|
||||
})
|
||||
}
|
||||
const selected = (select) => {
|
||||
if (!select || select.length === 0) {
|
||||
@@ -218,6 +229,8 @@ const selected = (select) => {
|
||||
if (index === currentIndex.value) {
|
||||
item.researchPersonnelId = select[0].id
|
||||
item.researchPersonnel = select[0].name
|
||||
item.companyName = select[0].companyName
|
||||
item.accountType = select[0].accountType
|
||||
}
|
||||
})
|
||||
userList.value=select
|
||||
@@ -260,6 +273,8 @@ const handleCopy = (row) => {
|
||||
let copyObj = {
|
||||
projectId: row.projectId,
|
||||
projectName: '',
|
||||
accountType: row.accountType,
|
||||
companyName: row.companyName,
|
||||
researchPersonnelId: row.researchPersonnelId,
|
||||
researchPersonnel: row.researchPersonnel,
|
||||
wagesPayable: row.wagesPayable,
|
||||
@@ -279,11 +294,12 @@ const handleSubmit = (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}
|
||||
let researchPersonnelId = ''
|
||||
formData.value.tableData.forEach(item => {
|
||||
@@ -307,7 +323,7 @@ const handleSubmit = (instance) => {
|
||||
usrAllocations: formData.value.tableData,
|
||||
deploymentId: processInstanceData.value.deploymentId,
|
||||
}
|
||||
console.log('params', params, formData.value.tableData)
|
||||
// console.log('params', params, formData.value.tableData)
|
||||
const {code, msg} = await addAllocation(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
@@ -326,14 +342,13 @@ const handleResubmit = (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}
|
||||
let newUsrAllocationsObj = {}
|
||||
let newUsrAllocationsObjArray = []
|
||||
let researchPersonnelId = ''
|
||||
formData.value.tableData.forEach(item => {
|
||||
item.allocationId = formData.value.allocationId
|
||||
@@ -342,19 +357,6 @@ const handleResubmit = (instance) => {
|
||||
if (item.performance == 0) {
|
||||
item.performance = null
|
||||
}
|
||||
newUsrAllocationsObj = {
|
||||
projectId: item.projectId,
|
||||
projectName: item.projectName,
|
||||
researchPersonnelId: item.researchPersonnelId,
|
||||
wagesPayable: item.wagesPayable,
|
||||
performance: item.performance,
|
||||
reserveFund: item.reserveFund,
|
||||
socialSecurity: item.socialSecurity,
|
||||
annuity: item.annuity,
|
||||
workday: item.workday,
|
||||
researchDuration: item.researchDuration,
|
||||
}
|
||||
newUsrAllocationsObjArray.push(newUsrAllocationsObj)
|
||||
})
|
||||
if (!researchPersonnelId) {
|
||||
ElNotification({
|
||||
@@ -368,9 +370,10 @@ const handleResubmit = (instance) => {
|
||||
allocationId: formData.value.allocationId,
|
||||
shareName: formData.value.shareName,
|
||||
apportionmentMonth: formData.value.apportionmentMonth,
|
||||
usrAllocations: newUsrAllocationsObjArray,
|
||||
usrAllocations:formData.value.tableData,
|
||||
deploymentId: processInstanceData.value.deploymentId,
|
||||
}
|
||||
// console.log('params', params, formData.value.tableData)
|
||||
const {code, msg} = await editAllocation(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
@@ -411,12 +414,6 @@ const getDetailList = async () => {
|
||||
if (code === 1000) {
|
||||
data.rows.forEach(item => {
|
||||
item.researchPersonnelId = Number(item.researchPersonnelId)
|
||||
let userObj = {
|
||||
id: item.researchPersonnelId,
|
||||
name: item.researchPersonnel,
|
||||
companyName: item.companyName,
|
||||
}
|
||||
userList.value.push(userObj)
|
||||
})
|
||||
formData.value.tableData = data.rows
|
||||
nextTick(() => {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div v-loading="loading" class="add-block">
|
||||
<baseTitle title="需求征集信息录入"></baseTitle>
|
||||
<el-form :model="formData" ref="demandForm" :rules="rules">
|
||||
<el-form :model="formData" ref="demandForm" :rules="rules">
|
||||
<el-row gutter="30">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="征集名称" prop="requirementName" label-width="96">
|
||||
@@ -42,7 +42,7 @@
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="专项资金名称" prop="specialFundId" v-if="formData.isSpecialFund">
|
||||
<el-select v-model="formData.specialFundId" placeholder="请选择专项资金名称" clearable filterable >
|
||||
<el-select v-model="formData.specialFundId" placeholder="请选择专项资金名称" clearable filterable>
|
||||
<el-option
|
||||
v-for="item in specialFundOption"
|
||||
:key="item.value"
|
||||
@@ -58,7 +58,10 @@
|
||||
<el-button color="#DED0B2" @click="showCompany">{{ selectedCompanyList.length === 0 ? '请选择征集公司' : '更改' }}
|
||||
</el-button>
|
||||
</div>
|
||||
<div v-if="route.query.id" :class="showExpendClass(showMoreCompany)">{{ getName(selectedCompanyList) }}</div>
|
||||
<div v-if="route.query.id" :class="showExpendClass(showMoreCompany)">{{
|
||||
getName(selectedCompanyList)
|
||||
}}
|
||||
</div>
|
||||
<div v-else :class="showExpendClass(showMoreCompany)">{{ getName(selectedCompanyList) }}</div>
|
||||
<div style="color: #2a99ff;text-align: center;width: 100%;font-size: 15px;cursor: pointer"
|
||||
@click="handleExpend">
|
||||
@@ -101,7 +104,7 @@
|
||||
<el-button color="#DED0B2" v-else @click="handleResubmit">重新提交</el-button>
|
||||
<el-button @click="handleBack">返回</el-button>
|
||||
</div>
|
||||
<company-picker :multiple="true" ref="companyRef" title="请选择所属公司" @ok="selected"
|
||||
<company-picker :multiple="true" ref="companyRef" title="请选择征集公司" @ok="selected"
|
||||
v-model:value="selectedCompanyList"/>
|
||||
</div>
|
||||
</template>
|
||||
@@ -165,7 +168,7 @@ const formPermMap = ref(new Map());
|
||||
const companyNameArray = ref([])
|
||||
const rules = reactive({
|
||||
requirementName: [{required: true, message: '请输入征集名称', trigger: 'blur'}],
|
||||
companyIds: [{required: true, message: '请选择所属公司', trigger: 'blur'}],
|
||||
companyIds: [{required: true, message: '请选择征集公司', trigger: 'blur'}],
|
||||
collectType: [{required: true, message: '请选择征集类型', trigger: 'blur'}],
|
||||
deadline: [{required: true, message: '请选择截止时间', trigger: 'blur'}],
|
||||
specialFundId: [{required: true, message: '请选择专项资金名称', trigger: 'blur'}],
|
||||
@@ -240,6 +243,7 @@ const showCompany = () => {
|
||||
}
|
||||
|
||||
const selected = (select) => {
|
||||
formData.value.companyIds=[]
|
||||
for (let val of select) {
|
||||
formData.value.companyIds.push(val.value)
|
||||
}
|
||||
@@ -337,7 +341,7 @@ const submitParam = (item) => {
|
||||
if (item.companyIds.length === 0) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请选择所属公司',
|
||||
message: '请选择征集公司',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
@@ -368,11 +372,12 @@ const handleSubmit = async (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}
|
||||
const {msg, code} = await addRequirement(submitParam(formData.value))
|
||||
ElNotification({
|
||||
@@ -410,16 +415,14 @@ const getCompanyOptionItem = (val) => {
|
||||
if (val !== undefined) {
|
||||
val.forEach(item => {
|
||||
matterTree(companyNameArray.value, companyOption.value, item)
|
||||
companyNameArray.value.forEach(companyItem => {
|
||||
newObj = {
|
||||
label: companyItem,
|
||||
value: item
|
||||
}
|
||||
newArray.push(newObj)
|
||||
})
|
||||
})
|
||||
companyNameArray.value.forEach(companyItem => {
|
||||
newObj = {
|
||||
label: companyItem
|
||||
}
|
||||
newArray.push(newObj)
|
||||
})
|
||||
}
|
||||
|
||||
return newArray;
|
||||
}
|
||||
const getDetailInfo = async () => {
|
||||
@@ -427,7 +430,7 @@ const getDetailInfo = async () => {
|
||||
if (res.code === 1000) {
|
||||
selectedCompanyList.value = getCompanyOptionItem(res.data.companyIds)
|
||||
formData.value = res.data
|
||||
if(res.data.fileList.length!==0){
|
||||
if (res.data.fileList.length !== 0) {
|
||||
showTable.value = false
|
||||
nextTick(() => {
|
||||
showTable.value = true
|
||||
@@ -455,7 +458,7 @@ const handleDelete = (row) => {
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
formData.value.fileList.splice(formData.value.fileList.findIndex((item) => item.id === row.fileId), 1);
|
||||
showTable.value = formData.value.fileList.length !== 0;
|
||||
// showTable.value = formData.value.fileList.length !== 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ const tableConfig = reactive({
|
||||
},
|
||||
{
|
||||
prop: 'companyName',
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (
|
||||
<div style={{width: '300px', textOverflow: 'ellipsis'}}>{row.companyName}</div>)
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="16" v-if="formData.isSpecialFund">
|
||||
<el-form-item label="其中申请公司总部科技创新专项资金(元)">
|
||||
<el-form-item label="其中申请公司总部科技创新专项资金(元)" prop="specialFundAmount">
|
||||
<el-input-number v-model="formData.specialFundAmount" placeholder="请输入专项资金" :controls="false"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@@ -234,7 +234,7 @@
|
||||
</el-form>
|
||||
<AttachmentUpload ref="attachment" label="需求申请书附件" :showTable="showTable" :otherFileList="otherFileList"
|
||||
@getAttachment="getAttachment" :singleList="singleList" :showSingleTable="showSingleTable"
|
||||
@getOtherFile="getOtherFile" :showFileList="true" :formData="formData"
|
||||
@getOtherFile="getOtherFile" :showFileList="true" :formData="formData" tag="需求上报"
|
||||
:preview="name === 'Summary/edit'"/>
|
||||
<div class="approval-record" style="margin-left: 70px">
|
||||
<div style="display: flex;align-items: center;justify-content: flex-start;">
|
||||
@@ -294,7 +294,7 @@ const formData = ref({
|
||||
|
||||
const rules = reactive({
|
||||
projectName: [{required: true, message: '请输入项目名称', trigger: 'blur'}],
|
||||
// specialFundId: [{required: true, message: '请选择专项资金', trigger: 'blur'}],
|
||||
specialFundId: [{required: true, message: '请选择专项资金', trigger: 'blur'}],
|
||||
startTime: [{required: true, message: '请选择开始时间', trigger: ['blur', 'change']}],
|
||||
endTime: [{required: true, message: '请选择结束时间', trigger: ['blur', 'change']}],
|
||||
rdSubject: [{required: true, message: '请选择研发主体', trigger: ['blur', 'change']}],
|
||||
@@ -401,11 +401,12 @@ const handleSubmit = debounce(async (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid, fields) => {
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}
|
||||
let otherFiles = []
|
||||
otherFileList.value.forEach(item => {
|
||||
@@ -473,7 +474,7 @@ const handleResubmit = debounce(() => {
|
||||
...formData.value,
|
||||
deploymentId: deploymentId.value,
|
||||
fileList: otherFiles,
|
||||
requirementId: route.query.id ? route.query.id : '-1'
|
||||
requirementId: route.query.requirementId ? route.query.requirementId : '-1'
|
||||
}
|
||||
// console.log('重新提交params', params, formData.value.specialFund, formData.value.specialFundId)
|
||||
resubmitReported(params).then(res => {
|
||||
|
||||
@@ -304,7 +304,7 @@ const handleEdit = (row) => {
|
||||
router.push({
|
||||
name: 'Summary/edit',
|
||||
query: {
|
||||
// requirementId: row.requirementId,
|
||||
requirementId: row.requirementId,
|
||||
projectId: row.projectId
|
||||
}
|
||||
})
|
||||
|
||||
@@ -48,7 +48,7 @@ const schema = computed(() => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
prop: 'affiliatedCompany',
|
||||
colProps: {
|
||||
span: 12
|
||||
|
||||
@@ -1,263 +0,0 @@
|
||||
<template>
|
||||
<div class="apply-block">
|
||||
<baseTitle title="项目结项"></baseTitle>
|
||||
<AttachmentUpload ref="attachment" label="项目结项附件" :showTable="showTable" :otherFileList="otherFileList"
|
||||
@getAttachment="getAttachment"
|
||||
@getOtherFile="getOtherFile" :showFileList="true" :formData="formData"
|
||||
:preview="name === 'Filing/edit'"/>
|
||||
<div class="approval-record">
|
||||
<baseTitle title="流程"></baseTitle>
|
||||
<process-diagram-viewer mode="view" v-if="processDiagramViewer"/>
|
||||
</div>
|
||||
<div class="oper-page-btn">
|
||||
<el-button color="#DED0B2" v-if="name==='Filing/conclusion'" @click="handleSubmit">提交</el-button>
|
||||
<el-button color="#DED0B2" v-else @click="handleResubmit">重新提交</el-button>
|
||||
<el-button @click="handleBack">返回</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
||||
import {downloadFile} from "@/api/project-demand";
|
||||
import {ElNotification} from "element-plus";
|
||||
import {useProcessStore} from '@/stores/processStore.js';
|
||||
import {
|
||||
getProjectConclusionProcess,
|
||||
projectConclusion,
|
||||
getConclusionDetail,
|
||||
resubmitConclusion
|
||||
} from "@/api/project-manage";
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const tagsViewStore = useTagsView()
|
||||
const formData = ref({})
|
||||
|
||||
const attachment = ref()
|
||||
const name = ref(router.currentRoute.value.name)
|
||||
const loading = ref(false)
|
||||
const file = ref({})
|
||||
const deploymentId = ref()
|
||||
const showTable = ref(true)
|
||||
const otherFileList = ref([])
|
||||
const processInstanceData = ref()
|
||||
const processDiagramViewer = ref(true)
|
||||
const processStore = useProcessStore()
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<div>
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
const handleBack = () => {
|
||||
history.back()
|
||||
}
|
||||
const compositeParam = (item) => {
|
||||
let tag = ''
|
||||
if (name.value === 'Filing/conclusion' || name.value === 'Filing/edit') {
|
||||
tag = '项目结项'
|
||||
}
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: false,
|
||||
tag: tag
|
||||
}
|
||||
}
|
||||
const getAttachment = (val) => {
|
||||
console.log('上传文件getAttachment', val)
|
||||
formData.value.singleFile = compositeParam(val)
|
||||
}
|
||||
const getOtherFile = (val) => {
|
||||
console.log('上传文件getOtherFile', val)
|
||||
showTable.value = false
|
||||
let fileObj = compositeParam(val)
|
||||
otherFileList.value.push(fileObj)
|
||||
nextTick(() => {
|
||||
showTable.value = true
|
||||
})
|
||||
}
|
||||
|
||||
const getFileParam = (item) => {
|
||||
return {
|
||||
fileId: item.fileId,
|
||||
tag: item.tag
|
||||
}
|
||||
}
|
||||
const handleSubmit = async () => {
|
||||
let files = []
|
||||
otherFileList.value.forEach(item => {
|
||||
files.push(getFileParam(item))
|
||||
})
|
||||
if (formData.value.singleFile !== undefined) {
|
||||
formData.value.singleFile = getFileParam(formData.value.singleFile)
|
||||
}
|
||||
let params = {
|
||||
deploymentId: deploymentId.value,
|
||||
requirementId: route.query.id,
|
||||
fileList: files,
|
||||
singleFile: formData.value.singleFile,
|
||||
projectId: route.query.projectId,
|
||||
}
|
||||
if (!attachment.value.isSingleFile) {
|
||||
attachment.value.validate()
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请上传附件',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
} else {
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
console.log('params', params)
|
||||
let res = await projectConclusion(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
await router.push({
|
||||
name: 'Filing'
|
||||
})
|
||||
}
|
||||
}
|
||||
const handleResubmit = () => {
|
||||
let otherFiles = []
|
||||
if (name.value === 'Filing/edit') {
|
||||
attachment.value.allFileList?.forEach(item => {
|
||||
otherFiles.push(getFileParam(item))
|
||||
})
|
||||
}
|
||||
if (attachment.value.singleFile==null) {
|
||||
attachment.value.validate()
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请上传附件',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
} else{
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
let params = {
|
||||
deploymentId: deploymentId.value,
|
||||
requirementId: route.query.id,
|
||||
fileList: otherFiles,
|
||||
singleFile: attachment.value.singleFile,
|
||||
projectId: route.query.projectId,
|
||||
}
|
||||
console.log('重新提交params', params)
|
||||
resubmitConclusion(params).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
router.push({
|
||||
name: 'Filing'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
const getDetailInfo = async () => {
|
||||
getConclusionDetail(route.query.projectId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
formData.value = res.data.formData
|
||||
loading.value = false
|
||||
}
|
||||
})
|
||||
}
|
||||
const init = () => {
|
||||
getProjectConclusionProcess().then(res => {
|
||||
processDiagramViewer.value = false
|
||||
if (res.code === 1000) {
|
||||
let data = res.data
|
||||
deploymentId.value = data.deploymentId
|
||||
processInstanceData.value = data
|
||||
processStore.setDesign(data)
|
||||
processStore.runningList.value = data.runningList;
|
||||
processStore.endList.value = data.endList;
|
||||
processStore.noTakeList.value = data.noTakeList;
|
||||
processStore.refuseList.value = data.refuseList;
|
||||
processStore.passList.value = data.passList;
|
||||
nextTick(() => {
|
||||
processDiagramViewer.value = true
|
||||
})
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
onMounted(async () => {
|
||||
await init()
|
||||
if (name.value === 'Filing/edit') {
|
||||
loading.value = true
|
||||
await getDetailInfo()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
@@ -144,7 +144,7 @@ const tableConfig = reactive({
|
||||
},
|
||||
{
|
||||
prop: 'affiliatedCompany',
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
|
||||
@@ -54,7 +54,7 @@ const schema = computed(() => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
prop: 'affiliatedCompany',
|
||||
colProps: {
|
||||
span: 12
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
<template>
|
||||
<baseTitle title="基础信息"></baseTitle>
|
||||
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e"></fvForm>
|
||||
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>
|
||||
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick" @selectionChange="selectionChange">
|
||||
<template #empty>
|
||||
<el-empty description="暂无数据"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
<view style="overflow-y: scroll">
|
||||
<baseTitle title="基础信息"></baseTitle>
|
||||
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e"></fvForm>
|
||||
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>
|
||||
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick" @selectionChange="selectionChange">
|
||||
<template #empty>
|
||||
<el-empty description="暂无数据"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</view>
|
||||
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
@@ -326,5 +329,7 @@ const search = (val) => {
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
:deep(.el-table--fit){
|
||||
min-height: 400px!important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -64,7 +64,7 @@ const schema = computed(() => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
prop: 'affiliatedCompany',
|
||||
colProps: {
|
||||
span: 12
|
||||
|
||||
@@ -1,237 +0,0 @@
|
||||
<template>
|
||||
<div class="apply-block">
|
||||
<el-form :model="formData" ref="applyForm" label-width="auto" :rules="rules">
|
||||
<baseTitle title="项目验收"></baseTitle>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="前置流程">
|
||||
<el-input v-model="formData.requirementName" clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<AttachmentUpload ref="attachment" label="项目验收附件" :showTable="showTable" :otherFileList="otherFileList"
|
||||
@getAttachment="getAttachment"
|
||||
@getOtherFile="getOtherFile" :showFileList="true" :formData="formData"
|
||||
:preview="name === 'Implementation/edit'"/>
|
||||
<div class="approval-record">
|
||||
<baseTitle title="流程"></baseTitle>
|
||||
<process-diagram-viewer mode="view" v-if="processDiagramViewer"/>
|
||||
</div>
|
||||
<div class="oper-page-btn">
|
||||
<el-button color="#DED0B2" v-if="name==='Implementation/check'" @click="handleSubmit(applyForm)">提交</el-button>
|
||||
<el-button color="#DED0B2" v-else @click="handleResubmit(applyForm)">重新提交</el-button>
|
||||
<el-button @click="handleBack">返回</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
||||
import {getProjectCheckProcess, projectCheck, getCheckDetail, resubmitCheck} from "@/api/project-manage";
|
||||
import {ElNotification} from "element-plus";
|
||||
import {useProcessStore} from '@/stores/processStore.js';
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
|
||||
const tagsViewStore = useTagsView()
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const attachment = ref()
|
||||
const name = ref(router.currentRoute.value.name)
|
||||
const loading = ref(false)
|
||||
const formData = ref({})
|
||||
const applyForm = ref()
|
||||
const deploymentId = ref()
|
||||
const showTable = ref(true)
|
||||
const otherFileList = ref([])
|
||||
const processInstanceData = ref()
|
||||
const processDiagramViewer = ref(true)
|
||||
const processStore = useProcessStore()
|
||||
const handleBack = () => {
|
||||
history.back()
|
||||
}
|
||||
const compositeParam = (item) => {
|
||||
let tag = ''
|
||||
if (name.value === 'Implementation/check' || name.value === 'Implementation/edit') {
|
||||
tag = '项目验收'
|
||||
}
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: false,
|
||||
tag: tag
|
||||
}
|
||||
}
|
||||
const getAttachment = (val) => {
|
||||
console.log('上传文件getAttachment', val)
|
||||
formData.value.singleFile = compositeParam(val)
|
||||
}
|
||||
const getOtherFile = (val) => {
|
||||
console.log('上传文件getOtherFile', val)
|
||||
showTable.value = false
|
||||
let fileObj = compositeParam(val)
|
||||
otherFileList.value.push(fileObj)
|
||||
nextTick(() => {
|
||||
showTable.value = true
|
||||
})
|
||||
}
|
||||
|
||||
const getFileParam = (item) => {
|
||||
return {
|
||||
fileId: item.fileId,
|
||||
tag: item.tag
|
||||
}
|
||||
}
|
||||
const handleSubmit = (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
let files = []
|
||||
otherFileList.value.forEach(item => {
|
||||
files.push(getFileParam(item))
|
||||
})
|
||||
if (formData.value.singleFile !== undefined) {
|
||||
formData.value.singleFile = getFileParam(formData.value.singleFile)
|
||||
}
|
||||
let params = {
|
||||
deploymentId: deploymentId.value,
|
||||
requirementId: route.query.id,
|
||||
fileList: files,
|
||||
singleFile: formData.value.singleFile,
|
||||
projectId: route.query.projectId,
|
||||
}
|
||||
if (!attachment.value.isSingleFile) {
|
||||
attachment.value.validate()
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请上传附件',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
} else {
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
console.log('params-提交', params)
|
||||
let res = await projectCheck(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
await router.push({
|
||||
name: 'Implementation'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleResubmit = (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
let otherFiles = []
|
||||
if (name.value === 'Implementation/edit') {
|
||||
attachment.value.allFileList?.forEach(item => {
|
||||
otherFiles.push(getFileParam(item))
|
||||
})
|
||||
}
|
||||
if (attachment.value.singleFile==null) {
|
||||
attachment.value.validate()
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请上传附件',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
} else{
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
let params = {
|
||||
deploymentId: deploymentId.value,
|
||||
requirementId: route.query.id,
|
||||
fileList: otherFiles,
|
||||
singleFile: attachment.value.singleFile,
|
||||
projectId: route.query.projectId,
|
||||
}
|
||||
console.log('重新提交params', params)
|
||||
resubmitCheck(params).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
router.push({
|
||||
name: 'Implementation'
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
const getDetailInfo = async () => {
|
||||
getCheckDetail(route.query.projectId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
formData.value = res.data.formData
|
||||
loading.value = false
|
||||
}
|
||||
})
|
||||
}
|
||||
const init = () => {
|
||||
getProjectCheckProcess(route.query.projectId).then(res => {
|
||||
processDiagramViewer.value = false
|
||||
if (res.code === 1000) {
|
||||
let data = res.data
|
||||
deploymentId.value = data.deploymentId
|
||||
processInstanceData.value = data
|
||||
processStore.setDesign(data)
|
||||
processStore.runningList.value = data.runningList;
|
||||
processStore.endList.value = data.endList;
|
||||
processStore.noTakeList.value = data.noTakeList;
|
||||
processStore.refuseList.value = data.refuseList;
|
||||
processStore.passList.value = data.passList;
|
||||
nextTick(() => {
|
||||
processDiagramViewer.value = true
|
||||
})
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
onMounted(async () => {
|
||||
await init()
|
||||
if (name.value === 'Implementation/edit') {
|
||||
loading.value = true
|
||||
await getDetailInfo()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
@@ -147,7 +147,7 @@ const tableConfig = reactive({
|
||||
},
|
||||
{
|
||||
prop: 'affiliatedCompany',
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<user-picker :multiple="true" ref="userPicker" title="请选择抄送人员" v-model:value="userList" @ok="selected"/>
|
||||
<AttachmentUpload ref="attachment" label="阶段变更附件" :showTable="showTable" :otherFileList="otherFileList"
|
||||
@getAttachment="getAttachment" :singleList="singleList" :showSingleTable="showSingleTable"
|
||||
@getOtherFile="getOtherFile" :showFileList="true" :formData="formData"
|
||||
@getOtherFile="getOtherFile" :showFileList="true" :formData="formData" tag="阶段变更"
|
||||
:preview="name === 'Phase/edit'"/>
|
||||
<div class="approval-record" style="margin-left: 68px">
|
||||
<div style="display: flex;align-items: center;justify-content: flex-start;">
|
||||
@@ -83,7 +83,7 @@ const schema = computed(() => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
prop: 'affiliatedCompany',
|
||||
colProps: {
|
||||
span: 12
|
||||
@@ -163,7 +163,8 @@ const selected = (select) => {
|
||||
let userInfo = {
|
||||
id: val.id,
|
||||
name: val.name,
|
||||
avatar: val.avatar,
|
||||
companyName: val.companyName,
|
||||
accountType: val.accountType,
|
||||
}
|
||||
userInfoList.push(userInfo)
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ const schema = computed(() => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
prop: 'affiliatedCompany',
|
||||
colProps: {
|
||||
span: 12
|
||||
|
||||
@@ -38,7 +38,7 @@ const schema = computed(() => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
prop: 'affiliatedCompany',
|
||||
colProps: {
|
||||
span: 12
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<el-col :span="24">
|
||||
<el-form-item prop="projectChargePerson" label="项目负责人">
|
||||
{{ tableForm.projectChargePersonName }}
|
||||
<el-button @click="showPersonnelPicker">
|
||||
<el-button color="#DED0B2" @click="showPersonnelPicker" style="margin-left: 10px">
|
||||
{{ tableForm.projectChargePersonName ? '更改' : '请选择项目负责人' }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
@@ -114,6 +114,8 @@ const selected = (select) => {
|
||||
for (const selectElement of select) {
|
||||
tableForm.value.projectChargePerson = selectElement.id
|
||||
tableForm.value.projectChargePersonName = selectElement.name
|
||||
tableForm.value.companyName = selectElement.companyName
|
||||
tableForm.value.accountType = selectElement.accountType
|
||||
}
|
||||
userList.value = select
|
||||
}
|
||||
@@ -154,12 +156,15 @@ getBaseInfo()
|
||||
const init = async () => {
|
||||
const {code, msg, data} = await searchUpdateLedgerData(route.query.id)
|
||||
tableForm.value = data
|
||||
let userObj = {
|
||||
id: data.projectChargePerson,
|
||||
name: data.projectChargePersonName,
|
||||
companyName: data.companyName,
|
||||
if(data.projectChargePersonName){
|
||||
let userObj = {
|
||||
id: data.projectChargePerson,
|
||||
name: data.projectChargePersonName,
|
||||
companyName: data.companyName,
|
||||
accountType: data.accountType,
|
||||
}
|
||||
userList.value.push(userObj)
|
||||
}
|
||||
userList.value.push(userObj)
|
||||
if (code !== 1000) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
|
||||
@@ -38,6 +38,7 @@ import {useTagsView} from '@/stores/tagsview.js'
|
||||
import {uploadFileList} from "@/api/project-manage/attachment";
|
||||
import {computed, ref} from "vue";
|
||||
import {getBaseInfoApi} from "@/components/steps/api";
|
||||
import {downloadFile,deleteFile} from "@/api/project-demand";
|
||||
|
||||
const tagsViewStore = useTagsView()
|
||||
const route = useRoute()
|
||||
@@ -68,7 +69,7 @@ const schema = computed(() => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
prop: 'affiliatedCompany',
|
||||
colProps: {
|
||||
span: 12
|
||||
@@ -110,10 +111,14 @@ const tableConfig = reactive({
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<div>
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
perm={['mosr:requirement:del']}
|
||||
onDelete={() => handleDelete(row)}/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -126,6 +131,28 @@ const name = ref(router.currentRoute.value.name)
|
||||
const rules = reactive({
|
||||
tagName: [{required: true, message: '请输入标签名称', trigger: ['blur', 'change']}],
|
||||
})
|
||||
const handleDelete = (row) => {
|
||||
deleteFile(row.fileId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
fileList.value.splice(fileList.value.findIndex((item) => item.id === row.fileId), 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
const getBaseInfo = async () => {
|
||||
try {
|
||||
const {code, data} = await getBaseInfoApi(route.query.id)
|
||||
@@ -183,11 +210,12 @@ const handleSubmit = async (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}
|
||||
let params = {
|
||||
fileList: fileList.value,
|
||||
|
||||
@@ -117,7 +117,7 @@ const schema = computed(() => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
prop: 'affiliatedCompany',
|
||||
colProps: {
|
||||
span: 12
|
||||
@@ -173,11 +173,12 @@ const handleSubmit = (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}
|
||||
instance.clearValidate()
|
||||
tableForm.tableData.forEach(item => {
|
||||
|
||||
@@ -1,276 +0,0 @@
|
||||
<template>
|
||||
<div class="apply-block">
|
||||
<el-form :model="formData" ref="applyForm" label-width="auto" :rules="rules">
|
||||
<baseTitle title="项目立项"></baseTitle>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="前置流程">
|
||||
<el-input v-model="formData.requirementName" clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<AttachmentUpload ref="attachment" label="项目立项附件" :showTable="showTable" :otherFileList="otherFileList"
|
||||
@getAttachment="getAttachment"
|
||||
@getOtherFile="getOtherFile" :showFileList="true" :formData="formData"
|
||||
:preview="name === 'Initiation/edit'"/>
|
||||
<div class="approval-record">
|
||||
<baseTitle title="流程"></baseTitle>
|
||||
<process-diagram-viewer mode="view" v-if="processDiagramViewer"/>
|
||||
</div>
|
||||
<div class="oper-page-btn">
|
||||
<el-button color="#DED0B2" v-if="name==='Initiation/apply'" @click="handleSubmit(applyForm)">提交</el-button>
|
||||
<el-button color="#DED0B2" v-else @click="handleResubmit">重新提交</el-button>
|
||||
<el-button @click="handleBack">返回</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
import {ElNotification} from "element-plus";
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
||||
import {getApplyProcess, projectApply, resubmitApply, getApplyDetail} from "@/api/project-manage";
|
||||
import {useProcessStore} from '@/stores/processStore.js';
|
||||
import {downloadFile} from "@/api/project-demand";
|
||||
|
||||
const tagsViewStore = useTagsView()
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const formData = ref({})
|
||||
const rules = reactive({
|
||||
attachment: [{required: true, message: '请上传项目立项附件', trigger: 'blur'}],
|
||||
})
|
||||
const processStore = useProcessStore()
|
||||
const deploymentId = ref()
|
||||
const attachment = ref()
|
||||
const applyForm = ref()
|
||||
const showTable = ref(true)
|
||||
const otherFileList = ref([])
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const loading = ref(false)
|
||||
const processInstanceData = ref()
|
||||
const processDiagramViewer = ref(true)
|
||||
const name = ref(router.currentRoute.value.name)
|
||||
const handleBack = () => {
|
||||
history.back()
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
const compositeParam = (item) => {
|
||||
let tag = ''
|
||||
if (name.value === 'Initiation/apply' || name.value === 'Initiation/edit') {
|
||||
tag = '项目立项'
|
||||
}
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: false,
|
||||
tag: tag
|
||||
}
|
||||
}
|
||||
const getAttachment = (val) => {
|
||||
console.log('上传文件getAttachment', val)
|
||||
formData.value.singleFile = compositeParam(val)
|
||||
}
|
||||
const getOtherFile = (val) => {
|
||||
console.log('上传文件getOtherFile', val)
|
||||
showTable.value = false
|
||||
let fileObj = compositeParam(val)
|
||||
otherFileList.value.push(fileObj)
|
||||
nextTick(() => {
|
||||
showTable.value = true
|
||||
})
|
||||
}
|
||||
const getFileParam = (item) => {
|
||||
return {
|
||||
fileId: item.fileId,
|
||||
tag: item.tag
|
||||
}
|
||||
}
|
||||
const handleSubmit = (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
let files = []
|
||||
otherFileList.value.forEach(item => {
|
||||
files.push(getFileParam(item))
|
||||
})
|
||||
if (formData.value.singleFile !== undefined) {
|
||||
formData.value.singleFile = getFileParam(formData.value.singleFile)
|
||||
}
|
||||
let params = {
|
||||
deploymentId: deploymentId.value,
|
||||
requirementId: route.query.id,
|
||||
fileList: files,
|
||||
singleFile: formData.value.singleFile,
|
||||
projectId: route.query.projectId,
|
||||
}
|
||||
if (!attachment.value.isSingleFile) {
|
||||
attachment.value.validate()
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请上传附件',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
} else {
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
console.log('params', params)
|
||||
let res = await projectApply(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
await router.push({
|
||||
name: 'Initiation'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleResubmit = async () => {
|
||||
let files = []
|
||||
if (name.value === 'Initiation/edit') {
|
||||
attachment.value.allFileList.forEach(item => {
|
||||
files.push(getFileParam(item))
|
||||
})
|
||||
}
|
||||
if (attachment.value.singleFile==null) {
|
||||
attachment.value.validate()
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请上传附件',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
} else{
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
let params = {
|
||||
deploymentId: deploymentId.value,
|
||||
requirementId: route.query.id,
|
||||
fileList: files,
|
||||
singleFile: attachment.value.singleFile,
|
||||
projectId: route.query.projectId,
|
||||
}
|
||||
console.log('params', params, attachment.value.isSingleFile)
|
||||
let res = await resubmitApply(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
await router.push({
|
||||
name: 'Initiation'
|
||||
})
|
||||
}
|
||||
}
|
||||
const getDetailInfo = async () => {
|
||||
getApplyDetail(route.query.projectId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
formData.value = res.data.formData
|
||||
loading.value = false
|
||||
}
|
||||
})
|
||||
}
|
||||
const init = () => {
|
||||
getApplyProcess(route.query.projectId).then(res => {
|
||||
processDiagramViewer.value = false
|
||||
if (res.code === 1000) {
|
||||
let data = res.data
|
||||
deploymentId.value = data.deploymentId
|
||||
processInstanceData.value = data
|
||||
processStore.setDesign(data)
|
||||
processStore.runningList.value = data.runningList;
|
||||
processStore.endList.value = data.endList;
|
||||
processStore.noTakeList.value = data.noTakeList;
|
||||
processStore.refuseList.value = data.refuseList;
|
||||
processStore.passList.value = data.passList;
|
||||
nextTick(() => {
|
||||
processDiagramViewer.value = true
|
||||
})
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
init()
|
||||
onMounted(async () => {
|
||||
await init()
|
||||
if (name.value === 'Initiation/edit') {
|
||||
loading.value = true
|
||||
await getDetailInfo()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
@@ -141,7 +141,7 @@ const tableConfig = reactive({
|
||||
},
|
||||
{
|
||||
prop: 'affiliatedCompany',
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" v-if="type==='singleDetail'">
|
||||
<el-form-item label="所属公司">
|
||||
<el-form-item label="征集公司">
|
||||
<span :class="showExpendClass(showMoreCompany,formData.companyIds)">{{
|
||||
getCompanyName(formData.companyIds)
|
||||
}}</span>
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
</el-row>
|
||||
</el-form>
|
||||
<AttachmentUpload ref="attachment" :label="getTitleName(title)+'附件'" :showTable="showTable"
|
||||
:otherFileList="otherFileList"
|
||||
:otherFileList="otherFileList" :tag="getTitleName(props.title)"
|
||||
@getAttachment="getAttachment" :labelPosition="'top'"
|
||||
@getOtherFile="getOtherFile" :showFileList="true" :formData="localFormData"
|
||||
:preview="mode == 'resubmit'"/>
|
||||
|
||||
@@ -119,7 +119,7 @@ const schema = computed(() => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '所属公司',
|
||||
label: '征集公司',
|
||||
prop: 'affiliatedCompany',
|
||||
colProps: {
|
||||
span: 24
|
||||
|
||||
@@ -189,11 +189,12 @@ const handleSubmit = async (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}
|
||||
const {msg, code} = await addFund(submitParam(formData.value))
|
||||
ElNotification({
|
||||
|
||||
@@ -18,14 +18,13 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getList" :icon="Search">搜索</el-button>
|
||||
<el-button color="#DED0B2" @click="getList" :icon="Search">搜索</el-button>
|
||||
<el-button @click="handleReset" :icon="Refresh">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="query-btn">
|
||||
<el-button type="primary" v-perm="['admin:config:add']" @click="handleAdd" :icon="Plus" plain>新增</el-button>
|
||||
<el-button color="#DED0B2" v-perm="['admin:config:add']" @click="handleAdd" >新增</el-button>
|
||||
<el-button type="danger" v-perm="['admin:config:del']" @click="handleMoreDelete(configIds,configNameList)"
|
||||
:icon="Delete" plain
|
||||
:disabled="disabled">删除
|
||||
</el-button>
|
||||
<!-- <el-button type="warning" v-perm="['admin:config:export']" @click="handleExport" :icon="Download" plain>导出-->
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
<el-input v-model="queryParams.departmentName" placeholder="请输入部门名称" clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getList" :icon="Search">搜索</el-button>
|
||||
<el-button type="primary" @click="handleReset(queryInstance)" :icon="Refresh">重置</el-button>
|
||||
<el-button color="#DED0B2" @click="getList" :icon="Search">搜索</el-button>
|
||||
<el-button @click="handleReset(queryInstance)" :icon="Refresh">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="table-header-btn">
|
||||
<el-button type="info" @click="handleExpand" :icon="Sort">{{ isExpand ? '全部收起' : '全部展开' }}</el-button>
|
||||
<el-button color="#DED0B2" @click="handleExpand" :icon="Sort">{{ isExpand ? '全部收起' : '全部展开' }}</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
:data="list"
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getList">搜索</el-button>
|
||||
<el-button type="primary" @click="handleReset(queryInstance)">重置</el-button>
|
||||
<el-button color="#DED0B2" @click="getList">搜索</el-button>
|
||||
<el-button @click="handleReset(queryInstance)">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="table-header-btn">
|
||||
<el-button type="primary" @click="handleAdd" :icon="Plus" v-perm="['admin:menu:add']">新增</el-button>
|
||||
<el-button type="info" @click="handleExpand" :icon="Sort">{{ isExpand ? '全部收起' : '全部展开' }}</el-button>
|
||||
<el-button color="#DED0B2" @click="handleAdd" v-perm="['admin:menu:add']">新增</el-button>
|
||||
<el-button type="" color="#DED0B2" @click="handleExpand" :icon="Sort">{{ isExpand ? '全部收起' : '全部展开' }}</el-button>
|
||||
</div>
|
||||
|
||||
<el-table :data="list" ref="tableTree" :default-expand-all="isExpand"
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
/>
|
||||
</div>
|
||||
<div class="oper-page-btn">
|
||||
<el-button type="primary" @click="handleSubmit">提交</el-button>
|
||||
<el-button type="primary" @click="handleBack">返回</el-button>
|
||||
<el-button color="#DED0B2" @click="handleSubmit">提交</el-button>
|
||||
<el-button @click="handleBack">返回</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -186,7 +186,7 @@ const tableConfig = reactive({
|
||||
}
|
||||
],
|
||||
api: '/admin/role',
|
||||
btns: [{name: '新增', key: 'add', auth: auths.add, type: 'primary'}],
|
||||
btns: [{name: '新增', key: 'add', auth: auths.add, color:"#DED0B2"}],
|
||||
params: {}
|
||||
})
|
||||
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
<el-input v-model="queryParams.companyName" placeholder="请输入子公司简称" clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getList" :icon="Search">搜索</el-button>
|
||||
<el-button type="primary" @click="handleReset(queryInstance)" :icon="Refresh">重置</el-button>
|
||||
<el-button color="#DED0B2" @click="getList" :icon="Search">搜索</el-button>
|
||||
<el-button @click="handleReset(queryInstance)" :icon="Refresh">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="table-header-btn">
|
||||
<el-button type="info" @click="handleExpand" :icon="Sort">{{ isExpand ? '全部收起' : '全部展开' }}</el-button>
|
||||
<el-button color="#DED0B2" @click="handleExpand" :icon="Sort">{{ isExpand ? '全部收起' : '全部展开' }}</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
:data="list"
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
<baseTitle :title="'用户信息录入'"></baseTitle>
|
||||
<fvForm :schema="schame" @getInstance="getInstance" :rules="rules"></fvForm>
|
||||
<div class="oper-page-btn">
|
||||
<el-button type="primary" @click="handleSubmit">提交</el-button>
|
||||
<el-button type="primary" @click="handleBack">返回</el-button>
|
||||
<el-button color="#DED0B2" @click="handleSubmit">提交</el-button>
|
||||
<el-button @click="handleBack">返回</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -246,4 +246,4 @@ onMounted(async ()=>{
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -167,7 +167,7 @@ const tableConfig = reactive({
|
||||
api: '/admin/mosr/user',
|
||||
params: {},
|
||||
btns: [
|
||||
{name: '新增', type: 'primary', auth: ['admin:user:add'], key: 'add'}
|
||||
{name: '新增', color:"#DED0B2", auth: ['admin:user:add'], key: 'add'}
|
||||
]
|
||||
})
|
||||
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
<div class="layout">
|
||||
<div class="layout-left">
|
||||
<div class="query-btn">
|
||||
<el-button type="primary" v-perm="['dict:type:add']" @click="handleAddType" :icon="Plus" plain>新增</el-button>
|
||||
<el-button color="#DED0B2" v-perm="['dict:type:add']" @click="handleAddType" plain >新增</el-button>
|
||||
<!-- <el-button type="warning" v-perm="['dict:type:export']" @click="handleExport" :icon="Download" plain>导出-->
|
||||
<!-- </el-button>-->
|
||||
<el-button type="primary" :icon="Edit" v-perm="['dict:type:edit']"
|
||||
<el-button type="primary" v-perm="['dict:type:edit']"
|
||||
@click.stop="handleEditType" plain>修改
|
||||
</el-button>
|
||||
<el-button type="danger" :icon="Delete" v-perm="['dict:type:del']"
|
||||
<el-button type="danger" v-perm="['dict:type:del']"
|
||||
@click.stop="handleDeleteType" :disabled="disabledDelete" plain>删除
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -40,7 +40,7 @@
|
||||
</div>
|
||||
<div class="layout-right" style="margin-top: 15px;">
|
||||
<div class="query-btn">
|
||||
<el-button type="primary" v-perm="['dict:data:add']" @click="handleAddData" :icon="Plus" plain>新增</el-button>
|
||||
<el-button type="primary" v-perm="['dict:data:add']" @click="handleAddData" plain>新增</el-button>
|
||||
</div>
|
||||
<el-form :model="queryData">
|
||||
<el-form-item prop="dictLabel">
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<template>
|
||||
<div class="scale">
|
||||
<el-button icon="Plus" size="mini" @click.stop="scale += 10" :disabled="scale >= 150" circle></el-button>
|
||||
<span>{{ scale }}%</span>
|
||||
<el-button icon="Minus" size="mini" @click.stop="scale -= 10" :disabled="scale <= 40" circle></el-button>
|
||||
<span>{{ scale }}%</span>
|
||||
<el-button icon="Plus" size="mini" @click.stop="scale += 10" :disabled="scale >= 150" circle></el-button>
|
||||
</div>
|
||||
<div :style="'transform: scale('+ scale / 100 +');'">
|
||||
<div id="processTree">
|
||||
<process-tree ref="processTree" mode="design" id-name="processTree" @selectedNode="nodeSelected"/>
|
||||
</div>
|
||||
<div :style="'transform: scale('+ scale / 100 +');margin-top: 100px;'">
|
||||
<div id="processTree">
|
||||
<process-tree ref="processTree" mode="design" id-name="processTree" @selectedNode="nodeSelected"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<el-drawer :title="selectedNode.name" v-model="showConfig"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div v-if="processData.processDefinitionKey">
|
||||
<p>
|
||||
流程名称: {{ processData.deploymentName }}
|
||||
<p style="margin-top: 10px">
|
||||
流程名称 : {{ processData.deploymentName }}
|
||||
</p>
|
||||
</div>
|
||||
<div v-if="!processData.processDefinitionKey">
|
||||
@@ -31,7 +31,9 @@ const processData = computed(() => {
|
||||
const validate = () => {
|
||||
return []
|
||||
}
|
||||
|
||||
onActivated(()=>{
|
||||
init()
|
||||
})
|
||||
const init = () => {
|
||||
getTypeOption().then(res => {
|
||||
optionList.value = res.data
|
||||
|
||||
@@ -70,8 +70,9 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {ElMessageBox} from "element-plus";
|
||||
import {ElMessageBox, ElNotification} from "element-plus";
|
||||
import {getMosrUser} from "@/api/workflow/process-user";
|
||||
import {checkMatrix} from "../../../../api/user/user";
|
||||
|
||||
const props = defineProps({
|
||||
value: {
|
||||
@@ -92,6 +93,10 @@ const props = defineProps({
|
||||
setNullToSelectList: {
|
||||
default: false,
|
||||
type: Boolean
|
||||
},
|
||||
checkMatrix: {
|
||||
default: false,
|
||||
type: Boolean
|
||||
}
|
||||
});
|
||||
const radio = ref(0);
|
||||
@@ -279,9 +284,26 @@ const clearSelected = () => {
|
||||
};
|
||||
const selectConfirm = () => {
|
||||
//确定按钮
|
||||
emit("ok", selectList.value);
|
||||
dataList.value = []
|
||||
visible.value = false;
|
||||
if (props.checkMatrix){
|
||||
checkMatrix(selectList.value[0].id).then(res=>{
|
||||
console.log(res)
|
||||
if (res.code === 2000){
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}else {
|
||||
emit("ok", selectList.value);
|
||||
dataList.value = []
|
||||
visible.value = false;
|
||||
}
|
||||
})
|
||||
}else {
|
||||
emit("ok", selectList.value);
|
||||
dataList.value = []
|
||||
visible.value = false;
|
||||
}
|
||||
};
|
||||
defineExpose({
|
||||
showUserPicker
|
||||
|
||||
@@ -4,12 +4,18 @@
|
||||
<el-radio-group v-model="nodeProps.assignedType">
|
||||
<el-radio v-for="item in approvalTypes" :label="item.type" :key="item.type">{{ item.name }}</el-radio>
|
||||
</el-radio-group>
|
||||
<div v-if="nodeProps.assignedType === 'ASSIGN_USER'">
|
||||
|
||||
<!-- <div v-else>-->
|
||||
<!-- <span class="item-desc">发起人自己作为审批人进行审批</span>-->
|
||||
<!-- </div>-->
|
||||
</el-form-item>
|
||||
<el-form-item style="margin-top: -18px">
|
||||
<div v-if="nodeProps.assignedType === 'ASSIGN_USER'" >
|
||||
<el-button size="mini" icon="Plus" type="primary" @click="showSysRolePicker" round>
|
||||
选择人员
|
||||
</el-button>
|
||||
<user-picker title="请选择人员" :multiple="false" ref="sysRolePicker" :v-model="assignedUser" @ok="selectedUser"/>
|
||||
<!-- <ellipsis :row="3" :user-info="assignedUser"/>-->
|
||||
<user-picker :check-matrix="true" title="请选择人员" :multiple="false" ref="sysRolePicker" :v-model="assignedUser" @ok="selectedUser"/>
|
||||
<!-- <ellipsis :row="3" :user-info="assignedUser"/>-->
|
||||
<role-items v-model="assignedUser"/>
|
||||
</div>
|
||||
<div v-else-if="nodeProps.assignedType === 'SELF_SELECT'">
|
||||
@@ -56,38 +62,35 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<!-- <div v-else>-->
|
||||
<!-- <span class="item-desc">发起人自己作为审批人进行审批</span>-->
|
||||
</el-form-item>
|
||||
<!-- <el-divider></el-divider>-->
|
||||
<!-- <el-form-item label="审批人为空时" prop="text" class="line-mode">-->
|
||||
<!-- <el-radio-group v-model="nodeProps.nobody.handler">-->
|
||||
<!-- <el-radio label="TO_PASS">自动通过</el-radio>-->
|
||||
<!-- <el-radio label="TO_REFUSE">自动驳回</el-radio>-->
|
||||
<!-- <el-radio label="TO_ADMIN">转交审批管理员</el-radio>-->
|
||||
<!-- <el-radio label="TO_USER">转交到指定人员</el-radio>-->
|
||||
<!-- </el-radio-group>-->
|
||||
<!-- <div style="margin-top: 10px" v-if="nodeProps.nobody.handler === 'TO_USER'">-->
|
||||
<!-- <el-button size="mini" icon="Plus" type="primary" @click="showUserPicker()" round>-->
|
||||
<!-- 选择人员-->
|
||||
<!-- </el-button>-->
|
||||
<!-- <user-picker title="请指定用户" :multiple="false" ref="toUserPicker" :v-model="nobodyAssignedUser"-->
|
||||
<!-- @ok="selectNoSetUser"/>-->
|
||||
<!-- <ellipsis :row="3" :user-info="nobodyAssignedUser"/>-->
|
||||
<!-- </div>-->
|
||||
</el-form-item>
|
||||
<el-divider></el-divider>
|
||||
<el-form-item label="审批人为空时" prop="text" class="line-mode">
|
||||
<el-radio-group v-model="nodeProps.nobody.handler">
|
||||
<el-radio label="TO_PASS">自动通过</el-radio>
|
||||
<el-radio label="TO_REFUSE">自动驳回</el-radio>
|
||||
<el-radio label="TO_ADMIN">转交审批管理员</el-radio>
|
||||
<el-radio label="TO_USER">转交到指定人员</el-radio>
|
||||
</el-radio-group>
|
||||
<div style="margin-top: 10px" v-if="nodeProps.nobody.handler === 'TO_USER'">
|
||||
<el-button size="mini" icon="Plus" type="primary" @click="showUserPicker()" round>
|
||||
选择人员
|
||||
</el-button>
|
||||
<user-picker title="请指定用户" :multiple="false" ref="toUserPicker" :v-model="nobodyAssignedUser"
|
||||
@ok="selectNoSetUser"/>
|
||||
<ellipsis :row="3" :user-info="nobodyAssignedUser"/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<!-- </el-form-item>-->
|
||||
|
||||
<div v-if="showMode">
|
||||
<el-divider/>
|
||||
<el-form-item label="多人审批时审批方式" prop="text" class="approve-mode">
|
||||
<el-radio-group v-model="nodeProps.mode">
|
||||
<el-radio label="NEXT">会签 (按选择顺序审批,每个人必须同意)</el-radio>
|
||||
<el-radio label="AND">会签(可同时审批,每个人必须同意)</el-radio>
|
||||
<el-radio label="OR">或签(有一人同意即可)</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<!-- <div v-if="showMode">-->
|
||||
<!-- <el-divider/>-->
|
||||
<!-- <el-form-item label="多人审批时审批方式" prop="text" class="approve-mode">-->
|
||||
<!-- <el-radio-group v-model="nodeProps.mode">-->
|
||||
<!-- <el-radio label="NEXT">会签 (按选择顺序审批,每个人必须同意)</el-radio>-->
|
||||
<!-- <el-radio label="AND">会签(可同时审批,每个人必须同意)</el-radio>-->
|
||||
<!-- <el-radio label="OR">或签(有一人同意即可)</el-radio>-->
|
||||
<!-- </el-radio-group>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </div>-->
|
||||
|
||||
<el-divider>高级设置</el-divider>
|
||||
<!-- <el-form-item label="✍ 审批同意时是否需要签字" prop="text">-->
|
||||
@@ -99,32 +102,32 @@
|
||||
<el-form-item label="是否使用矩阵审批" prop="text">
|
||||
<el-switch inactive-text="不用" active-text="使用" v-model="nodeProps.matrixApproval"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item label="审批期限(为 0 则不生效)" prop="timeLimit">
|
||||
<el-input style="width: 180px;" placeholder="时长" type="number"
|
||||
v-model="nodeProps.timeLimit.timeout.value">
|
||||
<el-select style="width: 75px;" v-model="nodeProps.timeLimit.timeout.unit" slot="append" placeholder="请选择" filterable>
|
||||
<el-option label="天" value="D"></el-option>
|
||||
<el-option label="小时" value="H"></el-option>
|
||||
</el-select>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="审批期限超时后执行" prop="level" v-if="nodeProps.timeLimit.timeout.value > 0">
|
||||
<el-radio-group v-model="nodeProps.timeLimit.handler.type">
|
||||
<el-radio label="PASS">自动通过</el-radio>
|
||||
<el-radio label="REFUSE">自动驳回</el-radio>
|
||||
<el-radio label="NOTIFY">发送提醒</el-radio>
|
||||
</el-radio-group>
|
||||
<div v-if="nodeProps.timeLimit.handler.type === 'NOTIFY'">
|
||||
<div style="color:#409EEF; font-size: small">默认提醒当前审批人</div>
|
||||
<el-switch inactive-text="循环" active-text="一次" v-model="nodeProps.timeLimit.handler.notify.once"></el-switch>
|
||||
<span style="margin-left: 20px" v-if="!nodeProps.timeLimit.handler.notify.once">
|
||||
每隔
|
||||
<el-input-number :min="0" :max="10000" :step="1" size="mini"
|
||||
v-model="nodeProps.timeLimit.handler.notify.hour"/>
|
||||
小时提醒一次
|
||||
</span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="审批期限(为 0 则不生效)" prop="timeLimit">-->
|
||||
<!-- <el-input style="width: 180px;" placeholder="时长" type="number"-->
|
||||
<!-- v-model="nodeProps.timeLimit.timeout.value">-->
|
||||
<!-- <el-select style="width: 75px;" v-model="nodeProps.timeLimit.timeout.unit" slot="append" placeholder="请选择" filterable>-->
|
||||
<!-- <el-option label="天" value="D"></el-option>-->
|
||||
<!-- <el-option label="小时" value="H"></el-option>-->
|
||||
<!-- </el-select>-->
|
||||
<!-- </el-input>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- <el-form-item label="审批期限超时后执行" prop="level" v-if="nodeProps.timeLimit.timeout.value > 0">-->
|
||||
<!-- <el-radio-group v-model="nodeProps.timeLimit.handler.type">-->
|
||||
<!-- <el-radio label="PASS">自动通过</el-radio>-->
|
||||
<!-- <el-radio label="REFUSE">自动驳回</el-radio>-->
|
||||
<!-- <el-radio label="NOTIFY">发送提醒</el-radio>-->
|
||||
<!-- </el-radio-group>-->
|
||||
<!-- <div v-if="nodeProps.timeLimit.handler.type === 'NOTIFY'">-->
|
||||
<!-- <div style="color:#409EEF; font-size: small">默认提醒当前审批人</div>-->
|
||||
<!-- <el-switch inactive-text="循环" active-text="一次" v-model="nodeProps.timeLimit.handler.notify.once"></el-switch>-->
|
||||
<!-- <span style="margin-left: 20px" v-if="!nodeProps.timeLimit.handler.notify.once">-->
|
||||
<!-- 每隔-->
|
||||
<!-- <el-input-number :min="0" :max="10000" :step="1" size="mini"-->
|
||||
<!-- v-model="nodeProps.timeLimit.handler.notify.hour"/>-->
|
||||
<!-- 小时提醒一次-->
|
||||
<!-- </span>-->
|
||||
<!-- </div>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- <el-form-item label="🙅 如果审批被驳回 👇">-->
|
||||
<!-- <el-radio-group v-model="nodeProps.refuse.type">-->
|
||||
<!-- <el-radio label="TO_INITIAL">重新开始流程</el-radio>-->
|
||||
@@ -223,6 +226,8 @@ import RolePicker from '../common/RolePicker.vue'
|
||||
import Ellipsis from '../common/Ellipsis.vue'
|
||||
import RoleItems from "../common/RoleItems.vue";
|
||||
import {computed, defineProps} from 'vue'
|
||||
import {checkMatrix} from "../../../../api/user/user";
|
||||
import {ElNotification} from "element-plus";
|
||||
|
||||
const processStore = useProcessStore()
|
||||
|
||||
|
||||
@@ -15,9 +15,9 @@
|
||||
<!-- </el-select>-->
|
||||
<!-- </el-form-item>-->
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="getList" :icon="Search">搜索</el-button>
|
||||
<el-button type="primary" @click="handleAdd" :icon="Plus">新增</el-button>
|
||||
<el-button type="primary" @click="handleReset" :icon="Refresh" plain>重置</el-button>
|
||||
<el-button color="#DED0B2" @click="getList" :icon="Refresh">搜索</el-button>
|
||||
<el-button color="#DED0B2" @click="handleAdd" :icon="Plus">新增</el-button>
|
||||
<el-button @click="handleReset" :icon="Refresh" >重置</el-button>
|
||||
<!-- <el-button type="primary" @click="handleExport" :icon="Download" plain>导出-->
|
||||
<!-- </el-button>-->
|
||||
</el-form-item>
|
||||
|
||||
Reference in New Issue
Block a user