443 lines
14 KiB
Vue
443 lines
14 KiB
Vue
<template>
|
||
<div class="detail-block" v-loading="loading">
|
||
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
|
||
<baseTitle title="预期知识产权"></baseTitle>
|
||
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px">
|
||
<!-- <el-col :span="6">-->
|
||
<!-- <el-form-item label="预期成果形式" prop="resultForm">-->
|
||
<!-- <span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>-->
|
||
<!-- </el-form-item>-->
|
||
<!-- </el-col>-->
|
||
<el-col :span="6">
|
||
<el-form-item label="知识产权归属" prop="intellectualProperty">
|
||
<span>{{
|
||
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
|
||
}}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="预估专利(项)" prop="newPatent">
|
||
<span>{{ localFormData.newPatent }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估软件著作权(项)" prop="softwareCopyright">
|
||
<span>{{ localFormData.softwareCopyright }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估技术标准(项)" prop="technicalNorms">
|
||
<span>{{ localFormData.technicalNorms }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估新产品(项)" prop="newProduct">
|
||
<span>{{ localFormData.newProduct }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估新工艺(项)" prop="newProcess">
|
||
<span>{{ localFormData.newProcess }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估新装置(项)" prop="newDevice">
|
||
<span>{{ localFormData.newDevice }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估新材料(项)" prop="newMaterials">
|
||
<span>{{ localFormData.newMaterials }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估计算机软件(项)" prop="computerSoftware">
|
||
<span>{{ localFormData.computerSoftware }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估论文论著(项)" prop="thesis">
|
||
<span>{{ localFormData.thesis }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估研究报告(项)" prop="researchReport">
|
||
<span>{{ localFormData.researchReport }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估商标(项)" prop="trademark">
|
||
<span>{{ localFormData.trademark }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
|
||
<el-col :span="6">
|
||
<el-form-item label="预估其他(项)" prop="other">
|
||
<span style="white-space: pre-wrap">{{ localFormData.other }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
|
||
<baseTitle title="项目描述"></baseTitle>
|
||
<el-row gutter="20" style="margin-left: 5px;margin-bottom: -18px;">
|
||
<el-col :span="24">
|
||
<el-form-item label="现有业务描述" prop="serviceDescription">
|
||
<span style="white-space: pre-wrap">{{ localFormData.serviceDescription }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="24">
|
||
<el-form-item label="建设目标描述" prop="contentDescription">
|
||
<span style="white-space: pre-wrap">{{ localFormData.contentDescription }}</span>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
|
||
<baseTitle title="需求上报申请书" style="margin-bottom: -3px;"></baseTitle>
|
||
<!-- <el-row gutter="20" style="margin-bottom: -15px;">-->
|
||
<!-- <el-col :span="24">-->
|
||
<!-- <single-file-component tag="需求上报" v-model:value="localFormData.singleFile" :processViewer="processViewer"/>-->
|
||
<!-- <!– <el-form-item>–>-->
|
||
<!-- <!– {{localFormData.singleFile}}–>-->
|
||
<!-- <!– <el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">–>-->
|
||
<!-- <!– {{ localFormData.singleFile?.originalFileName }}–>-->
|
||
<!-- <!– </el-button>–>-->
|
||
<!-- <!– </el-form-item>–>-->
|
||
<!-- </el-col>-->
|
||
<!-- </el-row>-->
|
||
<!--/* <baseTitle title="附件文件" style="margin-bottom: 0"></baseTitle>*/-->
|
||
<el-row gutter="20" style="margin-bottom: -18px;">
|
||
<el-col :span="24" class="file-table-style">
|
||
<file-component tag="需求上报"
|
||
v-model:value="localFormData.fileList" :processViewer="processViewer"
|
||
:file-list-show="fileListShow"/>
|
||
</el-col>
|
||
<el-col :span="24" style="margin-top: -15px">
|
||
<div v-if="data.taskId">
|
||
<baseTitle title="审核意见"></baseTitle>
|
||
<el-form-item prop="_value">
|
||
<el-input
|
||
v-model="_value"
|
||
:rows="3"
|
||
type="textarea"
|
||
placeholder="请输入审核意见"
|
||
/>
|
||
</el-form-item>
|
||
</div>
|
||
<div v-if="data.state==='5'" style="margin-bottom: 15px">
|
||
<baseTitle title="前置流程" v-if="localFormData.preProcess"></baseTitle>
|
||
<div style="display: flex;align-items: center;flex-wrap: wrap;">
|
||
<div v-for="(item,index) in localFormData.preProcess" :key="item.requestId">
|
||
<a :href="item.baseUrl" target="_blank"
|
||
style="color: #2a99ff;cursor: pointer">{{ item.requestName }}<span
|
||
v-if="index != localFormData.preProcess.length -1">,</span>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
||
<!-- <baseTitle title="前置流程"></baseTitle>-->
|
||
<!-- <select-pre-process :formData="localFormData"/>-->
|
||
<baseTitle title="审核意见"></baseTitle>
|
||
<el-form-item prop="_value">
|
||
<el-input
|
||
v-model="_value"
|
||
:rows="3"
|
||
type="textarea"
|
||
placeholder="请输入审核意见"
|
||
/>
|
||
</el-form-item>
|
||
</div>
|
||
</el-col>
|
||
</el-row>
|
||
<div class="approval-record">
|
||
<div class="approval-title" style="margin-top: -12px">
|
||
<baseTitle title="审批记录"></baseTitle>
|
||
<div class="diagram">
|
||
<div class="base-title">流程图</div>
|
||
<el-switch
|
||
v-model="changeDiagram"
|
||
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
||
/>
|
||
</div>
|
||
<el-button color="#DED0B2" style="margin-left: 10px"
|
||
@click="handleCarbonCopy()">立即抄送
|
||
</el-button>
|
||
</div>
|
||
<div class="process">
|
||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||
:operation-list="data.operationList"
|
||
:step="'report'"
|
||
:state="data.state"/>
|
||
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="summaryProcess"/>
|
||
</div>
|
||
</div>
|
||
</el-form>
|
||
<user-picker :multiple="true" ref="carbonCopyUserRef" title="请选择抄送人员"
|
||
v-model:value="carbonCopyUserList" @ok="carbonCopyUserPickerOk"
|
||
@cancelOrClear="carbonCopyUserPickerOk"/>
|
||
|
||
<div class="oper-page-btn" v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
||
<el-button type="danger" @click="handleRejectPlan">驳回年度计划</el-button>
|
||
<el-button color="#DED0B2" @click="handleAgreePlan">通过年度计划</el-button>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup lang="jsx">
|
||
import {toThousands} from '@/utils/changePrice.js'
|
||
import {downloadFile, deleteFile} from "@/api/project-demand";
|
||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||
import {useTagsView} from '@/stores/tagsview.js'
|
||
import {getFundOption} from "@/api/special-fund";
|
||
import {useCacheStore} from '@/stores/cache.js'
|
||
import {getSubCompOpt} from "@/api/user/user";
|
||
import FileComponent from "./FileComponent.vue";
|
||
import {ElNotification} from "element-plus";
|
||
import {approvePlan} from "@/api/project-demand/summary";
|
||
import SelectPreProcess from "@/components/SelectPreProcess.vue";
|
||
import {applyCcSend} from "@/api/expense-manage";
|
||
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
||
|
||
const emit = defineEmits(['update:value','ccSend'])
|
||
const tagsViewStore = useTagsView()
|
||
const cacheStore = useCacheStore()
|
||
const props = defineProps({
|
||
formData: {
|
||
type: Object,
|
||
default: {}
|
||
},
|
||
data: {
|
||
type: Object,
|
||
default: {
|
||
state: '1'
|
||
}
|
||
},
|
||
processViewer: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
fileListShow: {
|
||
type: String,
|
||
default: 'READ'
|
||
},
|
||
loading: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
value: {
|
||
type: String,
|
||
default: ''
|
||
}
|
||
})
|
||
const changeDiagram = ref(false)
|
||
const localFormData = ref({})
|
||
const route = useRoute()
|
||
const router = useRouter()
|
||
const fundOption = ref([])
|
||
const companyOption = ref([])
|
||
const dictName = ref({})
|
||
const carbonCopyUserList = ref([])
|
||
const carbonCopyUserRef = ref()
|
||
const rules = reactive({
|
||
auditOpinion: [{required: true, message: '请输入审核意见', trigger: 'blur'}],
|
||
})
|
||
const _value = computed({
|
||
get() {
|
||
return props.value;
|
||
},
|
||
set(val) {
|
||
emit("update:value", val);
|
||
}
|
||
})
|
||
const handleCarbonCopy = () => {
|
||
carbonCopyUserRef.value.showUserPicker()
|
||
}
|
||
const carbonCopyUserPickerOk = (userList) => {
|
||
carbonCopyUserList.value = userList.map(item => item.id)
|
||
console.log('localFormData.value', props.data)
|
||
console.log("🚀 ~ file:'carbonCopyUserList.value ", carbonCopyUserList.value)
|
||
|
||
addUser()
|
||
}
|
||
const addUser = async () => {
|
||
const res = await applyCcSend({
|
||
instanceId: props.data.processInstanceId,
|
||
projectId: route.query.projectId,
|
||
state: route.query.step,
|
||
userIds: carbonCopyUserList.value
|
||
})
|
||
console.log('res', res)
|
||
if (res.code === 1000) {
|
||
ElNotification({
|
||
title: '提示',
|
||
message: '抄送成功',
|
||
type: 'success'
|
||
})
|
||
emit('ccSend')
|
||
} else {
|
||
ElNotification({
|
||
title: '提示',
|
||
message: res.msg,
|
||
type: 'error'
|
||
})
|
||
}
|
||
}
|
||
const handleRejectPlan = async () => {
|
||
// const values = form.value.getValues()
|
||
// console.log('route',route.query.projectId)
|
||
if (!_value.value) {
|
||
ElNotification({
|
||
title: '提示',
|
||
message: '请填写审核意见',
|
||
type: 'warning'
|
||
})
|
||
return
|
||
}
|
||
const params = {
|
||
auditOpinion: _value.value,
|
||
projectId: parseInt(route.query.projectId),
|
||
state: false
|
||
}
|
||
// console.log('params', params)
|
||
const res = await approvePlan(params)
|
||
ElNotification({
|
||
title: '提示',
|
||
message: res.msg,
|
||
type: res.code === 1000 ? 'success' : 'error'
|
||
})
|
||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||
router.push({
|
||
name: 'Summary'
|
||
})
|
||
}
|
||
const handleAgreePlan = async () => {
|
||
if (!_value.value) {
|
||
ElNotification({
|
||
title: '提示',
|
||
message: '请填写审核意见',
|
||
type: 'warning'
|
||
})
|
||
return
|
||
}
|
||
const params = {
|
||
auditOpinion: _value.value,
|
||
projectId: parseInt(route.query.projectId),
|
||
preProcess: JSON.stringify(localFormData.value.preProcess),
|
||
state: true
|
||
}
|
||
|
||
const res = await approvePlan(params)
|
||
ElNotification({
|
||
title: '提示',
|
||
message: res.msg,
|
||
type: res.code === 1000 ? 'success' : 'error'
|
||
})
|
||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||
router.push({
|
||
name: 'Summary'
|
||
})
|
||
}
|
||
const filterDict = (data, value) => {
|
||
if (data === undefined || value === undefined) return;
|
||
let label = ''
|
||
let result = []
|
||
if (value instanceof Array) {
|
||
value.forEach(item1 => {
|
||
data.find(item => {
|
||
if (item.value == item1) {
|
||
result.push(item.label)
|
||
}
|
||
})
|
||
})
|
||
label = result.map(item => item).join(',')
|
||
} else {
|
||
if (data instanceof Array) {
|
||
data.find(item => {
|
||
if (item.value == value) {
|
||
label = item.label
|
||
}
|
||
})
|
||
}
|
||
}
|
||
return label
|
||
}
|
||
const getFundOptions = async () => {
|
||
const resFund = await getFundOption()
|
||
fundOption.value = resFund.data
|
||
const res = await getSubCompOpt()
|
||
companyOption.value = res.data
|
||
}
|
||
const changeName = (option, value) => {
|
||
let name = ''
|
||
option.forEach(item => {
|
||
if (item.value == value) {
|
||
name = item.label
|
||
}
|
||
})
|
||
return name
|
||
}
|
||
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()
|
||
})
|
||
}
|
||
|
||
watch(() => props.processViewer, (newVal) => {
|
||
props.processViewer = newVal
|
||
}, {deep: true})
|
||
|
||
watch(() => props.loading, (newVal) => {
|
||
props.loading = newVal
|
||
}, {deep: true})
|
||
|
||
watchEffect(() => {
|
||
props.formData.singleFile = [props.formData.singleFile]
|
||
return Object.keys(props.formData).length && (localFormData.value = props.formData)
|
||
})
|
||
|
||
getFundOptions()
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
.detail-block {
|
||
overflow-x: hidden;
|
||
overflow-y: auto;
|
||
padding-bottom: 0 !important;
|
||
}
|
||
|
||
.file-table-style {
|
||
:deep(.el-table__header) {
|
||
.is-leaf:first-child {
|
||
.cell {
|
||
margin-left: -25px !important;
|
||
}
|
||
}
|
||
}
|
||
|
||
:deep(.el-table__body) {
|
||
.el-table__cell:first-child {
|
||
.cell {
|
||
margin-left: -13px !important;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
</style>
|