Compare commits
72 Commits
zhangkaihu
...
prod
| Author | SHA1 | Date | |
|---|---|---|---|
| f053eb80cd | |||
| 29a7766635 | |||
| 8c20ecacab | |||
| 05ac715461 | |||
| cffe7d61e3 | |||
| dc4b33cf89 | |||
| 6b3e74fab9 | |||
| 25f1f40957 | |||
| 1ead008f53 | |||
| a76ab5adaf | |||
| f2ac70f9e3 | |||
| 0efd2a7db2 | |||
| 83c01575e6 | |||
| 5808145c01 | |||
| e1543e05b4 | |||
| d20b968307 | |||
| 7735d20021 | |||
| 831f017482 | |||
| 827978f7bd | |||
| b16893955d | |||
| 41830600bf | |||
| 76a5ebbeb9 | |||
| a26088a756 | |||
| 4229cb9d74 | |||
| a64715717b | |||
| f18ae8b1ee | |||
| 19c566cd0d | |||
| 3c459f4be2 | |||
| 1ad6e021a1 | |||
| 6cbc3f83e6 | |||
| 9560a964e7 | |||
| 94bd9930b6 | |||
| f2e80e4874 | |||
| 62e98b9e3f | |||
|
|
a620b248f4 | ||
|
|
e2e4d3226f | ||
|
|
af2788583f | ||
|
|
ba58089e94 | ||
|
|
88dcbf3196 | ||
| 9092b1e960 | |||
| 3ddd24cc70 | |||
| 1fb3345afe | |||
| d1fe0faad1 | |||
| 64d10a711d | |||
| 1d5e8a23ed | |||
| 2973bbe6a7 | |||
|
|
8974282b44 | ||
|
|
81705482a8 | ||
| 9cc8d337be | |||
| 973dc0f2e4 | |||
| db696ca389 | |||
| 64e2ff0647 | |||
| 53b0e4b240 | |||
| 17010a15a3 | |||
| f74743c00f | |||
| e14b6d676c | |||
| 3ecea87de8 | |||
| cb290acf09 | |||
| f6cabee345 | |||
| 8b03d62a75 | |||
| 1674d1acd0 | |||
| 41a455338f | |||
| 5b67f97021 | |||
| a451f7481e | |||
| 2400660b1f | |||
| 26e0009ebd | |||
| 34b0b88f07 | |||
| 37a3cd75a2 | |||
| 81d4002034 | |||
| 5c000cdba3 | |||
|
|
5dcdbe9ae1 | ||
|
|
bf2f28960f |
@@ -29,8 +29,9 @@ steps:
|
||||
- npm config set registry https://registry.npmmirror.com
|
||||
- set NODE_OPTIONS=--openssl-legacy-provider
|
||||
- npm install --legacy-peer-deps
|
||||
- npm install patch-package
|
||||
- npx patch-package
|
||||
- npm install codemirror
|
||||
# - npm install patch-package
|
||||
# - npx patch-package
|
||||
# - npm info unplugin-icons
|
||||
- npm list package-manager-detector
|
||||
# - npm install unplugin-icons@latest @antfu/install-pkg@latest package-manager-detector@latest
|
||||
|
||||
@@ -8,6 +8,7 @@ app_version=$DRONE_COMMIT
|
||||
echo ${app_version}
|
||||
# 打包编译docker镜像
|
||||
echo '----build image start----'
|
||||
echo ${group_name}/${app_name}
|
||||
docker build -t ${group_name}/${app_name} .
|
||||
echo '----build image success----'
|
||||
docker tag ${group_name}/${app_name} $REGISTRY/$REGISTRY_NAMESPACE/${app_name}:${app_version}
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
{
|
||||
"name": "mosr-web",
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"build": "vite build --config vite.config.mjs",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"overrides": {
|
||||
|
||||
@@ -71,7 +71,7 @@ export const uploadCollectAttachment= (data) => {
|
||||
data: data
|
||||
});
|
||||
};
|
||||
// 年度计划
|
||||
// 项目计划
|
||||
export const addPlan= (data) => {
|
||||
return request({
|
||||
url: '/workflow/annual/plan',
|
||||
@@ -107,10 +107,72 @@ export const approvePlan= (data) => {
|
||||
};
|
||||
|
||||
|
||||
export const getProjectOption = () => {
|
||||
export const getProjectOption = (projectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/master',
|
||||
method: "get"
|
||||
method: "get",
|
||||
params:{
|
||||
projectName:projectName
|
||||
}
|
||||
});
|
||||
};
|
||||
export const getMasterProjectNameOption = (masterProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/payment/master/option',
|
||||
method: "get",
|
||||
params:{
|
||||
masterProjectName:masterProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getSubprojectNameOption = (subProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/payment/sub/option',
|
||||
method: "get",
|
||||
params:{
|
||||
subProjectName:subProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getExpenseMasterProjectNameOption = (masterProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/rd/expense/master/option',
|
||||
method: "get",
|
||||
params:{
|
||||
masterProjectName:masterProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getExpenseSubprojectNameOption = (subProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/rd/expense/sub/option',
|
||||
method: "get",
|
||||
params:{
|
||||
subProjectName:subProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getCostMasterProjectNameOption = (masterProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/share/master/option',
|
||||
method: "get",
|
||||
params:{
|
||||
masterProjectName:masterProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getCostSubprojectNameOption = (subProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/share/sub/option',
|
||||
method: "get",
|
||||
params:{
|
||||
subProjectName:subProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -13,6 +13,9 @@ a {
|
||||
html, body, #app, .el-container, .el-aside, .el-main {
|
||||
height: 100%;
|
||||
}
|
||||
.el-date-editor--year{
|
||||
width: 100%!important;
|
||||
}
|
||||
|
||||
.el-breadcrumb__item {
|
||||
line-height: 65px;
|
||||
|
||||
@@ -426,6 +426,7 @@ const handleDelete = (row, type) => {
|
||||
allFileList.value.splice(allFileList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
isHaveOneFile.value = !(allFileList.value && allFileList.value?.length == 0);
|
||||
console.log('allFileList.value',allFileList.value)
|
||||
localStorage.setItem('deleteFileRow', JSON.stringify(row))
|
||||
if (localStorage.getItem('collectData')) {
|
||||
let collectData = JSON.parse(localStorage.getItem('collectData'))
|
||||
collectData.fileList = allFileList.value
|
||||
@@ -462,6 +463,7 @@ const getOtherFile = (val) => {
|
||||
} else {
|
||||
allFileList.value = _otherFileListValue.value
|
||||
}
|
||||
|
||||
isHaveOneFile.value = true
|
||||
emit('getOtherFile', val)
|
||||
}
|
||||
|
||||
@@ -609,7 +609,19 @@ const getTitleName = (type) => {
|
||||
}
|
||||
}
|
||||
const handleBack = () => {
|
||||
history.back()
|
||||
if (props.step === '20') {
|
||||
router.push({
|
||||
name: 'Initiation'
|
||||
})
|
||||
} else if (props.step === '40') {
|
||||
router.push({
|
||||
name: 'Implementation'
|
||||
})
|
||||
}else if(props.step === '50'){
|
||||
router.push({
|
||||
name: 'Filing'
|
||||
})
|
||||
}
|
||||
}
|
||||
const compositeParam = (item) => {
|
||||
return {
|
||||
|
||||
@@ -173,7 +173,8 @@ const handleDownload = (row) => {
|
||||
})
|
||||
}
|
||||
const deleteSingleFile = (row) => {
|
||||
console.log("🚀 ~ file: ", row)
|
||||
console.log("🚀 ~ file: ", row,otherAttachmentList.value)
|
||||
console.log("🚀 row.newFile ", row.newFile)
|
||||
deleteFile(row.fileId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
@@ -183,13 +184,14 @@ const deleteSingleFile = (row) => {
|
||||
if (res.code === 1000) {
|
||||
if (row.newFile) {
|
||||
const finalList = getLocalList().filter(item => item.fileId !== row.fileId);
|
||||
otherAttachmentList.value.splice(otherAttachmentList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
localStorage.setItem(`implementAllFileList-${route.query.projectId}`, JSON.stringify(finalList))
|
||||
} else {
|
||||
otherAttachmentList.value.splice(otherAttachmentList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
allFiles.value.splice(allFiles.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
}
|
||||
|
||||
getAttachmentList()
|
||||
activeName.value = 'all'
|
||||
// getAttachmentList()
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -188,8 +188,8 @@
|
||||
@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>
|
||||
<el-button type="danger" @click="handleRejectPlan">驳回项目计划</el-button>
|
||||
<el-button color="#DED0B2" @click="handleAgreePlan">通过项目计划</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -10,11 +10,11 @@
|
||||
:show-file-list="showFileList"
|
||||
:auto-upload="false"
|
||||
:before-upload="beforeUpload"
|
||||
:on-success="handleUploadSuccess"
|
||||
:on-error="uploadError"
|
||||
:before-remove="beforeRemove"
|
||||
:on-remove="handleRemove"
|
||||
>
|
||||
<!-- :on-success="handleUploadSuccess"-->
|
||||
<el-button color="#DED0B2" :loading="loading" :disabled="disabled">上传文件</el-button>
|
||||
</el-upload>
|
||||
</template>
|
||||
@@ -61,7 +61,7 @@ const props = defineProps({
|
||||
})
|
||||
const uploadRef = ref(null); // el-upload 的 ref
|
||||
const uploadPromises = ref([]); // 跟踪每个文件的上传状态
|
||||
const emit = defineEmits(["input", "beforeUpload","getFile", "delete"])
|
||||
const emit = defineEmits(["input", "beforeUpload", "getFile", "delete"])
|
||||
const fileList = ref([])
|
||||
const _value = computed({
|
||||
get() {
|
||||
@@ -87,14 +87,29 @@ const handleRemove = (file) => {
|
||||
|
||||
// 文件选择变化时触发
|
||||
const handleChange = (file, files) => {
|
||||
console.log(file, files,'files')
|
||||
const deleteFileRow = JSON.parse(localStorage.getItem('deleteFileRow'));
|
||||
console.log("🚀 ~ file:deleteFileRow ", deleteFileRow, uploadFile.value)
|
||||
let deleteIndex = null
|
||||
if (deleteFileRow) {
|
||||
deleteIndex = uploadFile.value.findIndex((item) => item.name === deleteFileRow.originalFileName && item.size === deleteFileRow.size)
|
||||
console.log("🚀 ~ file:deleteIndex ", deleteIndex)
|
||||
|
||||
if (deleteIndex != -1) {
|
||||
uploadFile.value.splice(deleteIndex, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
console.log(file, files, 'files')
|
||||
uploadIndex.value++
|
||||
uploadFile.value.push(file)
|
||||
console.log("🚀 ~ file:uploadFile.value ", uploadFile.value)
|
||||
localStorage.removeItem('deleteFileRow')
|
||||
};
|
||||
watch(() => uploadIndex.value, (newVal) => {
|
||||
console.log('newVal',newVal)
|
||||
console.log('newVal', newVal)
|
||||
startUpload(uploadFile.value); // 自动触发上传
|
||||
},{
|
||||
}, {
|
||||
deep: true
|
||||
})
|
||||
// 自定义上传逻辑
|
||||
@@ -117,7 +132,7 @@ const customUpload = async (options) => {
|
||||
|
||||
// 触发所有文件上传
|
||||
const startUpload = (files) => {
|
||||
uploadLoading.value= ElLoading.service({
|
||||
uploadLoading.value = ElLoading.service({
|
||||
fullscreen: true,
|
||||
text: '文件上传中...',
|
||||
})
|
||||
@@ -144,9 +159,10 @@ const startUpload = (files) => {
|
||||
})
|
||||
files = []; // 清空文件列表
|
||||
uploadRef.value.clearFiles(); // 清空上传组件
|
||||
uploadFile.value = [] // 清空文件列表
|
||||
nextTick(() => {
|
||||
uploadLoading.value.close()
|
||||
uploadLoading.value=null
|
||||
uploadLoading.value = null
|
||||
})
|
||||
})
|
||||
|
||||
@@ -157,6 +173,7 @@ const beforeUpload = () => {
|
||||
return true
|
||||
}
|
||||
const handleUploadSuccess = (res) => {
|
||||
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.code === 1000 ? '上传成功' : '上传失败',
|
||||
@@ -166,7 +183,7 @@ const handleUploadSuccess = (res) => {
|
||||
showTable.value = true
|
||||
let data = res.data
|
||||
fileList.value.push(data)
|
||||
emit("getFile", res.data)
|
||||
// emit("getFile", res.data)
|
||||
}
|
||||
const uploadError = () => {
|
||||
loading.value = false
|
||||
|
||||
@@ -30,12 +30,12 @@ const props = defineProps({
|
||||
},
|
||||
pageSize: {
|
||||
type: Number,
|
||||
default: 10,
|
||||
default: 20,
|
||||
},
|
||||
pageSizes: {
|
||||
type: Object,
|
||||
default(rawProps) {
|
||||
return [10, 15, 20, 30, 50]
|
||||
return [10, 15, 20, 30, 50,100]
|
||||
},
|
||||
},
|
||||
small: {
|
||||
@@ -58,7 +58,7 @@ const total = ref(0)
|
||||
//对应页数
|
||||
const currentPage = ref(1)
|
||||
//每页多少条
|
||||
const pageSize = ref(10)
|
||||
const pageSize = ref(20)
|
||||
//默认每页多少条的数组
|
||||
const pageSizes = ref([])
|
||||
//是否使用小型分页样式
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<template>
|
||||
<div class="fv-table-container">
|
||||
<el-button v-if="tableConfig.export && tableConfig.export.open&&changeExportPosition" @click="exportTable" color="#DED0B2"
|
||||
<el-button v-if="tableConfig.export && tableConfig.export.open&&changeExportPosition" @click="exportTable"
|
||||
color="#DED0B2"
|
||||
style="float: left;margin-right: 10px">导出
|
||||
</el-button>
|
||||
<!-- 表格头部按钮 -->
|
||||
@@ -18,7 +19,8 @@
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<el-button v-if="tableConfig.export && tableConfig.export.open&&!changeExportPosition" @click="exportTable" color="#DED0B2"
|
||||
<el-button v-if="tableConfig.export && tableConfig.export.open&&!changeExportPosition" @click="exportTable"
|
||||
color="#DED0B2"
|
||||
style="margin-bottom: 10px">导出
|
||||
</el-button>
|
||||
<!-- 列显示配置 -->
|
||||
@@ -93,7 +95,7 @@
|
||||
v-if="pagination"
|
||||
:current-page="localData.query.pageNum"
|
||||
:page-size="localData.query.pageSize"
|
||||
:page-sizes="[10, 20, 30, 40,50]"
|
||||
:page-sizes="[10, 20, 30, 40,50,100]"
|
||||
:total="localData.total"
|
||||
@changeSize="handleSizeChange"
|
||||
@goPage="handleCurrentChange"
|
||||
@@ -157,7 +159,7 @@ const exportTable = () => {
|
||||
const localData = reactive({
|
||||
list: [], // 表格数据
|
||||
query: {
|
||||
pageSize: 10,
|
||||
pageSize: 20,
|
||||
pageNum: 1
|
||||
},
|
||||
total: 0,
|
||||
@@ -227,7 +229,7 @@ const getList = async () => {
|
||||
if (api) {
|
||||
localData.loading = true
|
||||
try {
|
||||
const {code, data, msg} = await requestList(api, queryParmas).then(res=>{
|
||||
const {code, data, msg} = await requestList(api, queryParmas).then(res => {
|
||||
// console.log(res)
|
||||
return res
|
||||
})
|
||||
@@ -250,8 +252,8 @@ const getList = async () => {
|
||||
localData.loading = false
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("error",error)
|
||||
if (!error){
|
||||
console.log("error", error)
|
||||
if (!error) {
|
||||
return
|
||||
}
|
||||
ElNotification({
|
||||
@@ -347,7 +349,7 @@ onMounted(() => {
|
||||
|
||||
.fv-table {
|
||||
:deep(.el-tooltip) {
|
||||
width: 100% !important;
|
||||
//width: 100% !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
<template>
|
||||
<fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 15px"></fvSearchForm>
|
||||
<div style="float: left">
|
||||
<import-cost-excel @success="importTheExpenseLedger"/>
|
||||
<import-cost-excel @success="importTheExpenseLedger"/>
|
||||
</div>
|
||||
<fvTable ref="tableIns" class="tablte" :tableConfig="tableConfig" @headBtnClick="headBtnClick" :changeExportPosition="true">
|
||||
<fvTable ref="tableIns" class="tablte" :tableConfig="tableConfig" @headBtnClick="headBtnClick"
|
||||
:changeExportPosition="true">
|
||||
<template #empty>
|
||||
<el-empty description="暂无数据"/>
|
||||
</template>
|
||||
@@ -15,31 +16,81 @@ import {reactive, ref} from "vue";
|
||||
import {useRoute, useRouter} from "vue-router";
|
||||
import {costTemplateDownload, exportExcel, ledgerTemplateDownload} from "../../../api/project-manage";
|
||||
import ImportCostExcel from "@/components/ImportCostExcel.vue";
|
||||
import fvSelect from "@/fvcomponents/fvSelect/index.vue";
|
||||
import {
|
||||
getExpenseMasterProjectNameOption, getExpenseSubprojectNameOption,
|
||||
getMasterProjectNameOption,
|
||||
getSubprojectNameOption
|
||||
} from "@/api/project-demand/summary/index.js";
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const searchConfig = ref([
|
||||
|
||||
{
|
||||
label: '年份',
|
||||
prop: 'rdYear',
|
||||
component: 'el-date-picker',
|
||||
props: {
|
||||
placeholder: '请选择年份',
|
||||
clearable: true,
|
||||
type: 'year',
|
||||
format: 'YYYY',
|
||||
valueFormat: 'YYYY',
|
||||
},
|
||||
colProps: {}
|
||||
},
|
||||
{
|
||||
label: '月份',
|
||||
prop: 'rdMonth',
|
||||
component: 'el-date-picker',
|
||||
props: {
|
||||
placeholder: '请选择月份',
|
||||
clearable: true,
|
||||
type: 'month',
|
||||
format: 'M',
|
||||
valueFormat: 'M',
|
||||
},
|
||||
colProps: {}
|
||||
},
|
||||
{
|
||||
label: '主项目',
|
||||
prop: 'masterProjectName',
|
||||
component: 'el-input',
|
||||
component: shallowRef(fvSelect),
|
||||
props: {
|
||||
placeholder: '请输入主项目查询',
|
||||
placeholder: '请输入主项目',
|
||||
clearable: true,
|
||||
filterable: true,
|
||||
checkStrictly: true
|
||||
}
|
||||
options: [],
|
||||
remote: true,
|
||||
remoteMethod: async (val) => {
|
||||
console.log('val', val)
|
||||
searchConfig.value.find(item => item.prop == 'masterProjectName').props.options = JSON.parse(localStorage.getItem("masterProjectNameOption"))
|
||||
|
||||
if (val) {
|
||||
await getMasterProjectName(val)
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '子项目',
|
||||
prop: 'subProjectName',
|
||||
component: 'el-input',
|
||||
component: shallowRef(fvSelect),
|
||||
props: {
|
||||
placeholder: '请输入子项目查询',
|
||||
placeholder: '请输入子项目',
|
||||
clearable: true,
|
||||
filterable: true,
|
||||
checkStrictly: true
|
||||
}
|
||||
options: [],
|
||||
remote: true,
|
||||
remoteMethod: async (val) => {
|
||||
searchConfig.value.find(item => item.prop == 'subProjectName').props.options = JSON.parse(localStorage.getItem("subprojectNameOption"))
|
||||
|
||||
if (val) {
|
||||
await getSubprojectName(val)
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '会计凭证记载金额(元)',
|
||||
@@ -76,19 +127,7 @@ const searchConfig = ref([
|
||||
// },
|
||||
// colProps: {}
|
||||
// },
|
||||
// {
|
||||
// label: '归档时间',
|
||||
// prop: 'filingTime',
|
||||
// component: 'el-date-picker',
|
||||
// props: {
|
||||
// placeholder: '请选择归档时间',
|
||||
// clearable: true,
|
||||
// type:'date',
|
||||
// format: 'YYYY-MM-DD HH:mm',
|
||||
// valueFormat:'YYYY-MM-DD HH:mm',
|
||||
// },
|
||||
// colProps: {}
|
||||
// },
|
||||
|
||||
])
|
||||
const tableIns = ref()
|
||||
const tableConfig = reactive({
|
||||
@@ -197,13 +236,63 @@ const tableConfig = reactive({
|
||||
{name: '模板下载', key: 'down', color: '#DED0B2'},
|
||||
// {name: '导入', key: 'import', color: '#DED0B2'}
|
||||
],
|
||||
export:{
|
||||
open :true,
|
||||
fileName:`研发费用明细表`
|
||||
export: {
|
||||
open: true,
|
||||
fileName: `研发费用明细表`
|
||||
}
|
||||
})
|
||||
|
||||
const getMasterProjectName = async (val) => {
|
||||
const res = await getExpenseMasterProjectNameOption(val)
|
||||
if (res.code == 1000) {
|
||||
let optionObj = {}
|
||||
let optionsMap = new Map();
|
||||
res.data.forEach(item => {
|
||||
optionObj = {
|
||||
value: item.label,
|
||||
label: item.label
|
||||
}
|
||||
optionsMap.set(optionObj.value, optionObj);
|
||||
})
|
||||
if (!val) {
|
||||
localStorage.setItem('masterProjectNameOption', JSON.stringify(Array.from(optionsMap.values())))
|
||||
}
|
||||
// 将 Map 转换为数组
|
||||
searchConfig.value.find(item => item.prop == 'masterProjectName').props.options = Array.from(optionsMap.values())
|
||||
}
|
||||
}
|
||||
const getSubprojectName = async (val) => {
|
||||
const res = await getExpenseSubprojectNameOption(val)
|
||||
if (res.code == 1000) {
|
||||
let optionObj = {}
|
||||
let optionsMap = new Map();
|
||||
res.data.forEach(item => {
|
||||
optionObj = {
|
||||
value: item.label,
|
||||
label: item.label
|
||||
}
|
||||
optionsMap.set(optionObj.value, optionObj);
|
||||
})
|
||||
if (!val) {
|
||||
localStorage.setItem('subprojectNameOption', JSON.stringify(Array.from(optionsMap.values())))
|
||||
}
|
||||
// 将 Map 转换为数组
|
||||
searchConfig.value.find(item => item.prop == 'subProjectName').props.options = Array.from(optionsMap.values())
|
||||
}
|
||||
}
|
||||
getMasterProjectName()
|
||||
getSubprojectName()
|
||||
|
||||
const search = (val) => {
|
||||
tableConfig.params = {...val}
|
||||
// 去除 rdMonth 前置0
|
||||
|
||||
let param={
|
||||
...val
|
||||
}
|
||||
if (param.rdMonth) {
|
||||
param.rdMonth = parseInt(param.rdMonth, 10).toString();
|
||||
}
|
||||
tableConfig.params = {...param}
|
||||
tableIns.value.refresh()
|
||||
}
|
||||
|
||||
@@ -226,23 +315,23 @@ const exportTable = () => {
|
||||
exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表", 2)
|
||||
}
|
||||
//导入模板下载
|
||||
const handleImportTemplateDownload=()=>{
|
||||
const handleImportTemplateDownload = () => {
|
||||
costTemplateDownload().then(res => {
|
||||
let link = document.createElement('a')
|
||||
try {
|
||||
let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});
|
||||
let blob = new Blob([res.data], {type: 'application/vnd.ms-excel'});
|
||||
let _fileName = "研发费用明细表模板.xlsx"//文件名,中文无法解析的时候会显示 _(下划线),生产环境获取不到
|
||||
link.style.display='none';
|
||||
link.style.display = 'none';
|
||||
// 兼容不同浏览器的URL对象
|
||||
const url = window.URL || window.webkitURL || window.moxURL;
|
||||
link.href=url.createObjectURL(blob);
|
||||
link.setAttribute('download', _fileName.substring(_fileName.lastIndexOf('_')+1))
|
||||
link.href = url.createObjectURL(blob);
|
||||
link.setAttribute('download', _fileName.substring(_fileName.lastIndexOf('_') + 1))
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
url.revokeObjectURL(link.href);//销毁url对象
|
||||
}catch (e) {
|
||||
console.log('下载的文件出错',e)
|
||||
} catch (e) {
|
||||
console.log('下载的文件出错', e)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -251,9 +340,10 @@ const importTheExpenseLedger = () => {
|
||||
}
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-form-item__label-wrap){
|
||||
margin-left: 0!important;
|
||||
:deep(.el-form-item__label-wrap) {
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
|
||||
:deep(.el-table__header) {
|
||||
.is-leaf:first-child {
|
||||
.cell {
|
||||
@@ -269,7 +359,8 @@ const importTheExpenseLedger = () => {
|
||||
}
|
||||
}
|
||||
}
|
||||
:deep(.el-date-editor--month){
|
||||
|
||||
:deep(.el-date-editor--month) {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -11,32 +11,78 @@
|
||||
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
||||
import {toThousands} from '@/utils/changePrice.js'
|
||||
import { getSubCompOpt } from '@/api/user/user.js';
|
||||
import {
|
||||
getMasterProjectNameOption,
|
||||
getRequirementName,
|
||||
getSubprojectNameOption
|
||||
} from "@/api/project-demand/summary/index.js";
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const searchConfig = ref(
|
||||
[
|
||||
|
||||
{
|
||||
label: '年份',
|
||||
prop: 'paymentYear',
|
||||
component: 'el-date-picker',
|
||||
props: {
|
||||
placeholder: '请选择年份',
|
||||
clearable: true,
|
||||
type: 'year',
|
||||
format: 'YYYY',
|
||||
valueFormat: 'YYYY',
|
||||
},
|
||||
colProps: {}
|
||||
},
|
||||
{
|
||||
label: '月份',
|
||||
prop: 'paymentMonth',
|
||||
component: 'el-date-picker',
|
||||
props: {
|
||||
placeholder: '请选择月份',
|
||||
clearable: true,
|
||||
type: 'month',
|
||||
format: 'M',
|
||||
valueFormat: 'M',
|
||||
},
|
||||
colProps: {}
|
||||
},
|
||||
{
|
||||
label: '主项目',
|
||||
prop: 'masterProjectName',
|
||||
component: 'el-input',
|
||||
component: shallowRef(fvSelect),
|
||||
props: {
|
||||
placeholder: '请输入主项目查询',
|
||||
placeholder: '请输入主项目',
|
||||
clearable: true,
|
||||
filterable: true,
|
||||
checkStrictly: true
|
||||
}
|
||||
options: [],
|
||||
remote: true,
|
||||
remoteMethod:async (val)=>{
|
||||
console.log('val',val)
|
||||
searchConfig.value.find(item => item.prop == 'masterProjectName').props.options= JSON.parse(localStorage.getItem("masterProjectNameOption"))
|
||||
|
||||
if(val){
|
||||
await getMasterProjectName( val)
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '子项目',
|
||||
prop: 'subProjectName',
|
||||
component: 'el-input',
|
||||
component: shallowRef(fvSelect),
|
||||
props: {
|
||||
placeholder: '请输入子项目查询',
|
||||
placeholder: '请输入子项目',
|
||||
clearable: true,
|
||||
filterable: true,
|
||||
checkStrictly: true
|
||||
}
|
||||
options: [],
|
||||
remote: true,
|
||||
remoteMethod:async (val)=>{
|
||||
searchConfig.value.find(item => item.prop == 'subProjectName').props.options= JSON.parse(localStorage.getItem("subprojectNameOption"))
|
||||
if(val){
|
||||
await getSubprojectName(val)
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '项目类型',
|
||||
@@ -108,13 +154,13 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
width: 120,
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.projectType&&row.projectType !== null&&row.projectType!==undefined) {
|
||||
return (<Tag dictType={'project_type'} value={row.projectType}/>)
|
||||
} else {
|
||||
return '--'
|
||||
}
|
||||
}
|
||||
// currentRender: ({row, index}) => {
|
||||
// if (row.projectType&&row.projectType !== null&&row.projectType!==undefined) {
|
||||
// return (<Tag dictType={'project_type'} value={row.projectType}/>)
|
||||
// } else {
|
||||
// return '--'
|
||||
// }
|
||||
// }
|
||||
},
|
||||
{
|
||||
prop: 'rdType',
|
||||
@@ -198,8 +244,55 @@ const tableConfig = reactive({
|
||||
fileName:`科研项日现金支出明细表`
|
||||
}
|
||||
})
|
||||
|
||||
const getMasterProjectName =async (val) => {
|
||||
const res=await getMasterProjectNameOption(val)
|
||||
if(res.code==1000){
|
||||
let optionObj={}
|
||||
let optionsMap = new Map();
|
||||
res.data.forEach(item=>{
|
||||
optionObj={
|
||||
value:item.label,
|
||||
label:item.label
|
||||
}
|
||||
optionsMap.set(optionObj.value, optionObj);
|
||||
})
|
||||
if(!val){
|
||||
localStorage.setItem('masterProjectNameOption', JSON.stringify(Array.from(optionsMap.values())))
|
||||
}
|
||||
// 将 Map 转换为数组
|
||||
searchConfig.value.find(item => item.prop == 'masterProjectName').props.options = Array.from(optionsMap.values())
|
||||
}
|
||||
}
|
||||
const getSubprojectName =async (val) => {
|
||||
const res=await getSubprojectNameOption(val)
|
||||
if(res.code==1000){
|
||||
let optionObj={}
|
||||
let optionsMap = new Map();
|
||||
res.data.forEach(item=>{
|
||||
optionObj={
|
||||
value:item.label,
|
||||
label:item.label
|
||||
}
|
||||
optionsMap.set(optionObj.value, optionObj);
|
||||
})
|
||||
if(!val){
|
||||
localStorage.setItem('subprojectNameOption', JSON.stringify(Array.from(optionsMap.values())))
|
||||
}
|
||||
// 将 Map 转换为数组
|
||||
searchConfig.value.find(item => item.prop == 'subProjectName').props.options = Array.from(optionsMap.values())
|
||||
}
|
||||
}
|
||||
getMasterProjectName()
|
||||
getSubprojectName()
|
||||
const search = (val) => {
|
||||
tableConfig.params = {...val}
|
||||
let param={
|
||||
...val
|
||||
}
|
||||
if (param.paymentMonth) {
|
||||
param.paymentMonth = parseInt(param.paymentMonth, 10).toString();
|
||||
}
|
||||
tableConfig.params = {...param}
|
||||
tableIns.value.refresh()
|
||||
}
|
||||
const init = async () => {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<template>
|
||||
<fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 16px"></fvSearchForm>
|
||||
<fvSearchForm :searchConfig="searchConfig" @search="search" ></fvSearchForm>
|
||||
<!-- <el-button color="#DED0B2" style="float: left;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>-->
|
||||
|
||||
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick" style="margin-top: 15px" @selectionChange="selectionChange">
|
||||
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick" @selectionChange="selectionChange">
|
||||
<template #empty>
|
||||
<el-empty description="暂无数据"/>
|
||||
</template>
|
||||
@@ -16,19 +16,80 @@ import { getSubCompOpt } from '@/api/user/user.js';
|
||||
import {reactive, ref} from "vue";
|
||||
import {shareDetailExport, shareExportExcel} from "@/api/expense-manage";
|
||||
import {ElMessage} from "element-plus";
|
||||
import {
|
||||
getCostMasterProjectNameOption, getCostSubprojectNameOption,
|
||||
getMasterProjectNameOption,
|
||||
getSubprojectNameOption
|
||||
} from "@/api/project-demand/summary/index.js";
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const searchConfig = reactive([
|
||||
const searchConfig = ref([
|
||||
{
|
||||
label: '年份',
|
||||
prop: 'paymentYear',
|
||||
component: 'el-date-picker',
|
||||
props: {
|
||||
placeholder: '请选择年份',
|
||||
clearable: true,
|
||||
type: 'year',
|
||||
format: 'YYYY',
|
||||
valueFormat: 'YYYY',
|
||||
},
|
||||
colProps: {}
|
||||
},
|
||||
{
|
||||
label: '月份',
|
||||
prop: 'paymentMonth',
|
||||
component: 'el-date-picker',
|
||||
props: {
|
||||
placeholder: '请选择月份',
|
||||
clearable: true,
|
||||
type: 'month',
|
||||
format: 'M',
|
||||
valueFormat: 'M',
|
||||
},
|
||||
colProps: {}
|
||||
},
|
||||
{
|
||||
label: '主项目',
|
||||
prop: 'masterProjectName',
|
||||
component: shallowRef(fvSelect),
|
||||
props: {
|
||||
placeholder: '请输入主项目',
|
||||
clearable: true,
|
||||
filterable: true,
|
||||
options: [],
|
||||
remote: true,
|
||||
remoteMethod:async (val)=>{
|
||||
console.log('val',val)
|
||||
searchConfig.value.find(item => item.prop == 'masterProjectName').props.options= JSON.parse(localStorage.getItem("masterProjectNameOption"))
|
||||
|
||||
if(val){
|
||||
|
||||
await getMasterProjectName( val)
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '子项目',
|
||||
prop: 'subProjectName',
|
||||
component: 'el-input',
|
||||
component: shallowRef(fvSelect),
|
||||
props: {
|
||||
placeholder: '请输入子项目查询',
|
||||
placeholder: '请输入子项目',
|
||||
clearable: true,
|
||||
filterable: true,
|
||||
checkStrictly: true
|
||||
}
|
||||
options: [],
|
||||
remote: true,
|
||||
remoteMethod:async (val)=>{
|
||||
searchConfig.value.find(item => item.prop == 'subProjectName').props.options= JSON.parse(localStorage.getItem("subprojectNameOption"))
|
||||
|
||||
if(val){
|
||||
await getSubprojectName(val)
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
// {
|
||||
// label: '支付月份',
|
||||
@@ -146,10 +207,55 @@ const tableConfig = reactive({
|
||||
open :false,
|
||||
}
|
||||
})
|
||||
|
||||
const getMasterProjectName =async (val) => {
|
||||
const res=await getCostMasterProjectNameOption(val)
|
||||
if(res.code==1000){
|
||||
let optionObj={}
|
||||
let optionsMap = new Map();
|
||||
res.data.forEach(item=>{
|
||||
optionObj={
|
||||
value:item.label,
|
||||
label:item.label
|
||||
}
|
||||
optionsMap.set(optionObj.value, optionObj);
|
||||
})
|
||||
if(!val){
|
||||
localStorage.setItem('masterProjectNameOption', JSON.stringify(Array.from(optionsMap.values())))
|
||||
}
|
||||
// 将 Map 转换为数组
|
||||
searchConfig.value.find(item => item.prop == 'masterProjectName').props.options = Array.from(optionsMap.values())
|
||||
}
|
||||
}
|
||||
const getSubprojectName =async (val) => {
|
||||
const res=await getCostSubprojectNameOption(val)
|
||||
if(res.code==1000){
|
||||
let optionObj={}
|
||||
let optionsMap = new Map();
|
||||
res.data.forEach(item=>{
|
||||
optionObj={
|
||||
value:item.label,
|
||||
label:item.label
|
||||
}
|
||||
optionsMap.set(optionObj.value, optionObj);
|
||||
})
|
||||
if(!val){
|
||||
localStorage.setItem('subprojectNameOption', JSON.stringify(Array.from(optionsMap.values())))
|
||||
}
|
||||
// 将 Map 转换为数组
|
||||
searchConfig.value.find(item => item.prop == 'subProjectName').props.options = Array.from(optionsMap.values())
|
||||
}
|
||||
}
|
||||
getMasterProjectName()
|
||||
getSubprojectName()
|
||||
|
||||
const search = (val) => {
|
||||
tableConfig.params = {...val}
|
||||
let param={
|
||||
...val
|
||||
}
|
||||
if (param.paymentMonth) {
|
||||
param.paymentMonth = parseInt(param.paymentMonth, 10).toString();
|
||||
}
|
||||
tableConfig.params = {...param}
|
||||
tableIns.value.refresh()
|
||||
}
|
||||
const headBtnClick = (key) => {
|
||||
|
||||
@@ -26,13 +26,13 @@
|
||||
<div style="width: 31px"></div>
|
||||
</div>
|
||||
</template>
|
||||
<el-tab-pane :label="'待办('+(todoList?.length||0) +')'" name="first">
|
||||
<el-tab-pane :label="'待办('+(todoNum||0) +')'" name="first">
|
||||
<div class="todo-top">
|
||||
<div class="bell">
|
||||
<el-icon size="16" color="#F55815">
|
||||
<BellFilled/>
|
||||
</el-icon>
|
||||
<span>您有{{ todoList?.length || 0 }}条待办需要处理</span>
|
||||
<span>您有{{ todoNum || 0 }}条待办需要处理</span>
|
||||
</div>
|
||||
<div class="todo-more" @click="handleTodoList(1)">
|
||||
<span>查看更多</span>
|
||||
@@ -70,13 +70,13 @@
|
||||
</div>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane :label="'已办(' + (doneList?.length||0) + ')'" name="second">
|
||||
<el-tab-pane :label="'已办(' + (doneNum||0) + ')'" name="second">
|
||||
<div class="todo-top">
|
||||
<div class="bell">
|
||||
<el-icon size="16" color="#F55815">
|
||||
<BellFilled/>
|
||||
</el-icon>
|
||||
<span>您有{{ todoList.length }}条待办需要处理</span>
|
||||
<span>您有{{ todoNum }}条待办需要处理</span>
|
||||
</div>
|
||||
<div class="todo-more" @click="handleTodoList(2)">
|
||||
<span>查看更多</span>
|
||||
@@ -156,7 +156,7 @@
|
||||
<div class="title-block">
|
||||
<div class="title">
|
||||
<div class="tag"></div>
|
||||
<span>专项资金项目</span>
|
||||
<span>资金类型</span>
|
||||
</div>
|
||||
<div class="more" @click="goToSpecialFund">
|
||||
<span>更多</span>
|
||||
@@ -170,7 +170,7 @@
|
||||
<div id="fundPie" ref="fundPie"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fund-pie">专项资金项目统计图</div>
|
||||
<div class="fund-pie">资金类型统计图</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-col>
|
||||
@@ -180,7 +180,7 @@
|
||||
<div class="title-block">
|
||||
<div class="title">
|
||||
<div class="tag"></div>
|
||||
<span>研发投入资金</span>
|
||||
<span>研发投入</span>
|
||||
</div>
|
||||
<div class="more" @click="goToResearchFund">
|
||||
<span>更多</span>
|
||||
@@ -201,7 +201,7 @@
|
||||
/>
|
||||
</div>
|
||||
<div v-if="moneyData&&moneyData.length==0" style="margin-top: 30px">
|
||||
<el-empty image-size="135" description="暂无研发投入资金信息~"/>
|
||||
<el-empty image-size="135" description="暂无研发投入信息~"/>
|
||||
</div>
|
||||
<div class="money-block" v-else>
|
||||
<div class="money-container">
|
||||
@@ -219,7 +219,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="fund-pie" v-if="totalMoney" style="text-align: left;margin-left: 70px;margin-top: 10px">
|
||||
研发投入资金统计图
|
||||
研发投入统计图
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -359,6 +359,8 @@ const taskTabList = ref([
|
||||
}
|
||||
])
|
||||
const todoList = ref([])
|
||||
const doneNum = ref(0)
|
||||
const todoNum = ref(0)
|
||||
const noticeList = ref([])
|
||||
const rulesList = ref([])
|
||||
const helpDocList = ref([])
|
||||
@@ -631,7 +633,7 @@ const getTodoList = () => {
|
||||
getHomeTaskInfo().then(res => {
|
||||
if (res.code === 1000) {
|
||||
todoList.value = res.data.rows
|
||||
// todoNum.value=res.data.total
|
||||
todoNum.value = res.data.total > 99 ? '99+' : res.data.total
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
@@ -645,7 +647,7 @@ const getDoneList = () => {
|
||||
getDoneTaskInfo().then(res => {
|
||||
if (res.code === 1000) {
|
||||
doneList.value = res.data.rows
|
||||
// todoNum.value=res.data.total
|
||||
doneNum.value = res.data.total > 99 ? '99+' : res.data.total
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
<el-form :model="formData" style="margin-top: 18px">
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="年度计划名称" prop="annualPlanName">
|
||||
<el-form-item label="项目计划名称" prop="annualPlanName">
|
||||
<div v-if="isEdit">
|
||||
<el-input v-model="formData.annualPlanName" placeholder="请输入年度计划名称" clearable>
|
||||
<el-input v-model="formData.annualPlanName" placeholder="请输入项目计划名称" clearable>
|
||||
</el-input>
|
||||
<el-button color="#DED0B2" style="margin-left: 10px" @click="editName">提交</el-button>
|
||||
</div>
|
||||
@@ -22,7 +22,7 @@
|
||||
<div class="query-btn">
|
||||
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>
|
||||
<el-popover :visible="editVisible" placement="top" :width="160">
|
||||
<p>点击编辑可以修改年度计划名称!</p>
|
||||
<p>点击编辑可以修改项目计划名称!</p>
|
||||
<div style="text-align: right; margin: 0">
|
||||
<el-button size="small" color="#DED0B2" @click="editVisible = false">
|
||||
确认
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
</div>
|
||||
<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">
|
||||
<el-table-column type="index" label="序号" align="center" width="60"/>
|
||||
<el-table-column prop="projectName" label="项目名称" align="center" width="100"/>
|
||||
@@ -193,7 +193,7 @@ const exportTable = () => {
|
||||
if (!$table) {
|
||||
$table = $e
|
||||
}
|
||||
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 = {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div >
|
||||
<!-- <baseTitle title="年度计划" style="margin-left: -15px;margin-bottom: -2px"></baseTitle>-->
|
||||
<!-- <baseTitle title="项目计划" style="margin-left: -15px;margin-bottom: -2px"></baseTitle>-->
|
||||
<fvSearchForm :searchConfig="searchConfig" @search="search" style="margin-left: 16px;margin-bottom: -18px"></fvSearchForm>
|
||||
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"></fvTable>
|
||||
</div>
|
||||
@@ -15,11 +15,11 @@ const router = useRouter()
|
||||
const route = useRoute()
|
||||
const searchConfig = ref([
|
||||
{
|
||||
label: '年度计划名称',
|
||||
label: '项目计划名称',
|
||||
prop: 'annualPlanName',
|
||||
component: 'el-input',
|
||||
props: {
|
||||
placeholder: '请输入年度计划名称',
|
||||
placeholder: '请输入项目计划名称',
|
||||
clearable: true
|
||||
},
|
||||
}
|
||||
@@ -42,7 +42,7 @@ const tableConfig = reactive({
|
||||
},
|
||||
{
|
||||
prop: 'annualPlanName',
|
||||
label: '年度计划名称',
|
||||
label: '项目计划名称',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
|
||||
@@ -6,12 +6,14 @@
|
||||
<el-row gutter="30">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="征集名称" prop="requirementName">
|
||||
<el-input v-model="formData.requirementName" placeholder="请输入征集名称" clearable @change="changeRequirementData"></el-input>
|
||||
<el-input v-if="formData.state=='3'||routerName==='Requirement/add'" v-model="formData.requirementName" placeholder="请输入征集名称" clearable @change="changeRequirementData"></el-input>
|
||||
|
||||
<span v-else>{{ formData.requirementName }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6" style="margin-left: -40px">
|
||||
<el-form-item label="征集类型" prop="collectType">
|
||||
<el-select v-model="formData.collectType" placeholder="请选择征集类型" clearable filterable @change="changeRequirementData">
|
||||
<el-select v-if="formData.state=='3'||routerName==='Requirement/add'" v-model="formData.collectType" placeholder="请选择征集类型" clearable filterable @change="changeRequirementData" >
|
||||
<el-option
|
||||
v-for="item in cacheStore.getDict('collect_type')"
|
||||
:key="item.value"
|
||||
@@ -19,11 +21,12 @@
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
<span v-else>{{ formData.collectType }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6" style="margin-left: 10px">
|
||||
<el-form-item label="需求上报截止时间" prop="deadline">
|
||||
<el-config-provider>
|
||||
<el-config-provider v-if="formData.state=='3'||routerName==='Requirement/add'">
|
||||
<el-date-picker
|
||||
style="width: 100%"
|
||||
v-model="formData.deadline"
|
||||
@@ -33,19 +36,21 @@
|
||||
:disabled-date="disabledDate" @change="changeRequirementData"
|
||||
/>
|
||||
</el-config-provider>
|
||||
<span v-else>{{ formData.deadline }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6" style="margin-left: -20px">
|
||||
<el-form-item label="是否专项资金" prop="isSpecialFund">
|
||||
<el-select v-model="formData.isSpecialFund" placeholder="请选择是否专项资金" clearable filterable @change="changeRequirementData">
|
||||
<el-select v-if="formData.state=='3'||routerName==='Requirement/add'" v-model="formData.isSpecialFund" placeholder="请选择是否专项资金" clearable filterable @change="changeRequirementData">
|
||||
<el-option :value="true" label="是"></el-option>
|
||||
<el-option :value="false" label="否"></el-option>
|
||||
</el-select>
|
||||
<span v-else>{{ formData.isSpecialFund?' 是':' 否' }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="专项资金名称" prop="specialFundId" v-if="formData.isSpecialFund">
|
||||
<el-select v-model="formData.specialFundId" placeholder="请选择专项资金名称" clearable filterable @change="changeRequirementData">
|
||||
<el-select v-if="formData.state=='3'||routerName==='Requirement/add'" v-model="formData.specialFundId" placeholder="请选择专项资金名称" clearable filterable @change="changeRequirementData">
|
||||
<el-option
|
||||
v-for="item in specialFundOption"
|
||||
:key="item.value"
|
||||
@@ -53,16 +58,17 @@
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
<span v-else>{{ formData.specialFund }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6" v-if="formData.isSpecialFund">
|
||||
<el-col :span="6" v-if="formData.isSpecialFund&&(formData.state=='3'||routerName==='Requirement/add')">
|
||||
<!-- <el-form-item>-->
|
||||
<a @click="addSpecialFund" style="width: 116px;text-align: right;display: inline-block">新增专项资金</a>
|
||||
<!-- </el-form-item>-->
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="征集公司" :required="true" prop="" class="company-select">
|
||||
<div style="width: 100%">
|
||||
<div style="width: 100%" v-if="formData.state=='3'||routerName==='Requirement/add'">
|
||||
<el-button color="#DED0B2" @click="showCompany">{{ selectedCompanyList.length === 0 ? '请选择征集公司' : '更改' }}
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -75,19 +81,21 @@
|
||||
</el-col>
|
||||
<el-col :span="24" style="margin-bottom: -18px">
|
||||
<el-form-item label="征集说明" prop="" required>
|
||||
<el-input
|
||||
<el-input v-if="formData.state=='3'||routerName==='Requirement/add'"
|
||||
v-model="formData.collectExplain"
|
||||
style="width:100%;margin-right: 50px"
|
||||
:rows="5"
|
||||
type="textarea"
|
||||
placeholder="请输入征集说明" @change="changeRequirementData"
|
||||
/>
|
||||
<div v-else v-html="formData.collectExplain" style="white-space: pre-wrap;">
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<baseTitle title="附件文件" style="margin-right: 10px"></baseTitle>
|
||||
<file-upload v-if="checkFormPrem('fileList')" @getFile="getFile"/>
|
||||
<file-upload v-if="checkFormPrem('fileList')&&(formData.state=='3'||routerName==='Requirement/add')" @getFile="getFile"/>
|
||||
<div style="margin-right: 50px">
|
||||
<fvTable style="width: 100%;max-height: 160px;" height="160" v-if="showTable"
|
||||
:tableConfig="tableConfig" :data="formData.fileList"
|
||||
@@ -122,8 +130,8 @@
|
||||
<div style="width: 100%;height: 30px"></div>
|
||||
<div class="oper-page-btn">
|
||||
<el-button color="#DED0B2" v-if="routerName==='Requirement/add'" @click="handleSubmit(demandForm)">提交</el-button>
|
||||
<el-button color="#DED0B2" v-else @click="handleResubmit(demandForm)">重新提交</el-button>
|
||||
<el-button @click="handleBack">返回</el-button>
|
||||
<el-button color="#DED0B2" v-else-if="routerName==='Requirement/edit'&&formData.state=='3'" @click="handleResubmit(demandForm)">重新提交</el-button>
|
||||
<el-button @click="handleBack" v-if="formData.state=='3'||routerName==='Requirement/add'">返回</el-button>
|
||||
</div>
|
||||
<company-picker :multiple="true" ref="companyRef" title="请选择征集公司" @ok="sureSelectedCompany" @cancelOrClear="cancelSelectedCompany"
|
||||
v-model:value="selectedCompanyList"/>
|
||||
@@ -166,7 +174,6 @@ const opentionData = ref({})
|
||||
const showExpendText = ref('')
|
||||
const showMoreCompany = ref(false)
|
||||
const selectedCompanyList = ref([])
|
||||
// const companyList = ref([])
|
||||
const changeDiagram = ref(false)
|
||||
const tagsViewStore = useTagsView()
|
||||
const authStore = useAuthStore()
|
||||
@@ -180,6 +187,7 @@ const formData = ref({
|
||||
collectType: '科技创新与信息化系统建设',
|
||||
deadline: '',
|
||||
collectExplain: '',
|
||||
state: '',
|
||||
fileList: [],
|
||||
isSpecialFund: false
|
||||
})
|
||||
@@ -242,8 +250,10 @@ const tableConfig = reactive({
|
||||
return (
|
||||
<div>
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
onDelete={() => handleDelete(row)}/>
|
||||
{
|
||||
formData.value.state=='3'||routerName.value==='Requirement/add'? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
onDelete={() => handleDelete(row)}/>:''
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -568,7 +578,9 @@ const getDetailInfo = async () => {
|
||||
}
|
||||
|
||||
const handleBack = () => {
|
||||
history.back()
|
||||
router.push({
|
||||
name: 'Requirement'
|
||||
})
|
||||
}
|
||||
const handleDelete = (row) => {
|
||||
// deleteFile(row.fileId).then(res => {
|
||||
@@ -585,6 +597,38 @@ const handleDelete = (row) => {
|
||||
// });
|
||||
}
|
||||
|
||||
// 新增:动态修改标签和面包屑标题
|
||||
// watch(
|
||||
// () => formData.value.state,
|
||||
// async (state) => {
|
||||
// if (state === '3') {
|
||||
// console.log("🚀 ~ file:'32423 ")
|
||||
// const newTitle = '需求征集-编辑'
|
||||
// if (router.currentRoute.value.meta) {
|
||||
// router.currentRoute.value.meta.title = newTitle
|
||||
// }
|
||||
// tagsViewStore.visitedViews.forEach(view => {
|
||||
// if (view.path === router.currentRoute.value.path) {
|
||||
// view.meta.title = newTitle
|
||||
// }
|
||||
// })
|
||||
// tagsViewStore.visitedViews = [...tagsViewStore.visitedViews]
|
||||
// } else {
|
||||
// const defaultTitle = '需求征集-详情'
|
||||
// if (router.currentRoute.value.meta) {
|
||||
// router.currentRoute.value.meta.title = defaultTitle
|
||||
// }
|
||||
// tagsViewStore.visitedViews.forEach(view => {
|
||||
// if (view.path === router.currentRoute.value.path) {
|
||||
// view.meta.title = defaultTitle
|
||||
// }
|
||||
// })
|
||||
// tagsViewStore.visitedViews = [...tagsViewStore.visitedViews]
|
||||
// }
|
||||
// },
|
||||
// { immediate: true }
|
||||
// )
|
||||
|
||||
onMounted(async () => {
|
||||
loading.value = true
|
||||
await init()
|
||||
|
||||
@@ -1,10 +1,29 @@
|
||||
<template>
|
||||
<div style="padding: 0 10px;">
|
||||
<baseTitle title="需求征集信息"></baseTitle>
|
||||
<CollectionDetailMoblie :formData="collectData.formData" :data="collectData" type="singleDetail"
|
||||
:fileListShow="fileListShow"
|
||||
:processViewer="processViewer" :loading="loading" v-model:value="auditOpinion"/>
|
||||
<OpinionMoblie v-if="collectData.taskId" :formData="formData" :taskId="collectData.taskId" :taskUserOptionList="collectData.taskUserOptionList" v-model:value="auditOpinion"></OpinionMoblie>
|
||||
<div class="page-container">
|
||||
<div class="notice-wrapper">
|
||||
<div v-if="collectData.formData&&collectData.formData.state==4" class="notice">
|
||||
<div class="alert-icon">⚠️</div>
|
||||
<div class="alert-content">
|
||||
<div class="alert-title">操作限制提示</div>
|
||||
<div class="alert-message">当前版本不支持手机端需求上报,请在电脑网页上执行需求上报操作</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="formData && formData.state == 3" class="notice">
|
||||
<div class="alert-icon">⚠️</div>
|
||||
<div class="alert-content">
|
||||
<div class="alert-title">操作限制提示</div>
|
||||
<div class="alert-message">当前版本不支持手机端驳回重新提交,请在电脑网页上执行重新提交操作。</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="padding: 0 10px;" >
|
||||
<baseTitle title="需求征集信息"></baseTitle>
|
||||
<CollectionDetailMoblie :formData="collectData.formData" :data="collectData" type="singleDetail"
|
||||
:fileListShow="fileListShow"
|
||||
:processViewer="processViewer" :loading="loading" v-model:value="auditOpinion"/>
|
||||
<OpinionMoblie v-if="collectData.taskId" :formData="formData" :taskId="collectData.taskId" :taskUserOptionList="collectData.taskUserOptionList" v-model:value="auditOpinion"></OpinionMoblie>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -104,6 +123,47 @@ onMounted(async () => {
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.page-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.notice-wrapper {
|
||||
//margin-bottom: 8px; /* 从15px改为8px */
|
||||
}
|
||||
|
||||
.notice {
|
||||
background: linear-gradient(90deg, #fff3f3 0%, #fff8f8 100%);
|
||||
padding: 15px 20px;
|
||||
border-left: 6px solid #ff7875;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 0 4px 4px 0;
|
||||
|
||||
.alert-icon {
|
||||
font-size: 24px;
|
||||
margin-right: 15px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.alert-content {
|
||||
flex: 1;
|
||||
|
||||
.alert-title {
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
margin-bottom: 4px;
|
||||
color: #d9363e;
|
||||
}
|
||||
|
||||
.alert-message {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-empty__description) {
|
||||
margin-top: 0;
|
||||
}
|
||||
@@ -141,5 +201,4 @@ onMounted(async () => {
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -221,7 +221,7 @@
|
||||
:style="{marginLeft:!formData.isSpecialFund?route.query.id?'-10px':'-10px':route.query.id?'0':'-40px'}">
|
||||
<el-form-item label="主项目" prop="masterProjectId">
|
||||
<el-select v-model="formData.masterProjectId" clearable placeholder="请选择主项目"
|
||||
@change="changeCollectData">
|
||||
@change="changeCollectData" filterable :remote-method="filterMasterProject">
|
||||
<el-option
|
||||
v-for="item in masterProjectList"
|
||||
:key="item.value"
|
||||
@@ -462,10 +462,10 @@ const showSingleTable = ref(false)
|
||||
const otherFileList = ref([])
|
||||
const singleList = ref([])
|
||||
const formData = ref({
|
||||
isWithinBudget: false,
|
||||
isSpecialFund: false,
|
||||
industryUniversityResearch: '1',
|
||||
governmentDeclaration: '1',
|
||||
isWithinBudget: null,
|
||||
isSpecialFund: null,
|
||||
industryUniversityResearch: null,
|
||||
governmentDeclaration: null,
|
||||
other: '无',
|
||||
resultForm: []
|
||||
})
|
||||
@@ -567,6 +567,14 @@ const changeCollectData = () => {
|
||||
localStorage.setItem('collectData', JSON.stringify(params))
|
||||
}
|
||||
}
|
||||
|
||||
const filterMasterProject= (val)=>{
|
||||
masterProjectList.value= JSON.parse(localStorage.getItem("projectOption"))
|
||||
if(val){
|
||||
getProjectList(val)
|
||||
}
|
||||
}
|
||||
|
||||
const handleShowOptionalChargeLeadershipPicker = () => {
|
||||
optionalChargeLeadershipPickerRef.value.showUserPicker()
|
||||
}
|
||||
@@ -578,19 +586,25 @@ const optionalChargeLeaderPickerOkOrCancel = (userList) => {
|
||||
}
|
||||
|
||||
const handleBack = () => {
|
||||
history.back()
|
||||
router.push({
|
||||
name: 'Summary'
|
||||
})
|
||||
}
|
||||
const disabledDate = (time) => {
|
||||
return time.getTime() < new Date(formData.value.startTime).getTime();
|
||||
}
|
||||
|
||||
const getProjectList = () => {
|
||||
getProjectOption().then(res => {
|
||||
const getProjectList = (val) => {
|
||||
getProjectOption(val).then(res => {
|
||||
if (res.code === 1000) {
|
||||
if(name.value === 'Summary/edit'){
|
||||
masterProjectList.value = res.data.filter(item => item.value!=route.query.projectId)
|
||||
}else{
|
||||
masterProjectList.value = res.data
|
||||
if(!val){
|
||||
|
||||
localStorage.setItem("projectOption", JSON.stringify(res.data))
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -380,11 +380,12 @@ const tableConfig = reactive({
|
||||
}
|
||||
}
|
||||
],
|
||||
rowKey: 'projectId',
|
||||
api: '/workflow/mosr/requirement/collect',
|
||||
params: {},
|
||||
btns: [
|
||||
{name: '新增上报', key: 'add', color: '#DED0B2', auth: auths.report},
|
||||
{name: '创建年度计划', key: 'export', color: '#DED0B2', auth: auths.planAdd},
|
||||
{name: '创建项目计划', key: 'export', color: '#DED0B2', auth: auths.planAdd},
|
||||
// {name: '经费预算生成', key: 'preMonty', auth: ''},
|
||||
]
|
||||
})
|
||||
|
||||
@@ -12,7 +12,7 @@ import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
||||
import {toThousands} from '@/utils/changePrice.js'
|
||||
import {switchAttachmentState} from "@/api/project-manage/attachment";
|
||||
import {ElMessageBox, ElNotification} from "element-plus";
|
||||
import { getSubCompOpt } from '@/api/user/user.js';
|
||||
import {getSubCompOpt} from '@/api/user/user.js';
|
||||
import {filterProjectName} from "@/api/project-manage";
|
||||
import {filterRequirementName} from "@/api/project-demand";
|
||||
|
||||
@@ -57,16 +57,16 @@ const searchConfig = ref([
|
||||
filterable: true,
|
||||
options: [],
|
||||
remote: true,
|
||||
remoteMethod:async (val)=>{
|
||||
if(val){
|
||||
const res=await filterRequirementName(val)
|
||||
if(res.code==1000){
|
||||
let optionObj={}
|
||||
let options=[]
|
||||
res.data.forEach(item=>{
|
||||
optionObj={
|
||||
value:item,
|
||||
label:item
|
||||
remoteMethod: async (val) => {
|
||||
if (val) {
|
||||
const res = await filterRequirementName(val)
|
||||
if (res.code == 1000) {
|
||||
let optionObj = {}
|
||||
let options = []
|
||||
res.data.forEach(item => {
|
||||
optionObj = {
|
||||
value: item,
|
||||
label: item
|
||||
}
|
||||
options.push(optionObj)
|
||||
})
|
||||
@@ -86,7 +86,7 @@ const searchConfig = ref([
|
||||
data: [],
|
||||
filterable: true,
|
||||
checkStrictly: true,
|
||||
remote:true
|
||||
remote: true
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -99,16 +99,16 @@ const searchConfig = ref([
|
||||
filterable: true,
|
||||
options: [],
|
||||
remote: true,
|
||||
remoteMethod:async (val)=>{
|
||||
if(val){
|
||||
const res=await filterProjectName(val,'50')
|
||||
if(res.code==1000){
|
||||
let optionObj={}
|
||||
let options=[]
|
||||
res.data.forEach(item=>{
|
||||
optionObj={
|
||||
value:item,
|
||||
label:item
|
||||
remoteMethod: async (val) => {
|
||||
if (val) {
|
||||
const res = await filterProjectName(val, '50')
|
||||
if (res.code == 1000) {
|
||||
let optionObj = {}
|
||||
let options = []
|
||||
res.data.forEach(item => {
|
||||
optionObj = {
|
||||
value: item,
|
||||
label: item
|
||||
}
|
||||
options.push(optionObj)
|
||||
})
|
||||
@@ -211,7 +211,7 @@ const tableConfig = reactive({
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width:85,
|
||||
width: 85,
|
||||
index: index => {
|
||||
return (tableIns.value.getQuery().pageNum - 1) * tableIns.value.getQuery().pageSize + index + 1
|
||||
}
|
||||
@@ -284,7 +284,7 @@ const tableConfig = reactive({
|
||||
label: '预估经费预算(元)',
|
||||
align: 'center',
|
||||
width: 150,
|
||||
currentRender:({row})=>{
|
||||
currentRender: ({row}) => {
|
||||
return <span>{toThousands(row.economicEstimate)}</span>
|
||||
}
|
||||
},
|
||||
@@ -302,11 +302,11 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
width: 120,
|
||||
currentRender: ({row, index}) => {
|
||||
if(row.state=='3'||row.state=='4'){
|
||||
if (row.state == '3' || row.state == '4') {
|
||||
return <span>{row.taskNode}</span>
|
||||
}else if(row.state=='1'){
|
||||
} else if (row.state == '1') {
|
||||
return <span>{row.approveName}</span>
|
||||
}else {
|
||||
} else {
|
||||
return <span>--</span>
|
||||
}
|
||||
}
|
||||
@@ -319,12 +319,17 @@ const tableConfig = reactive({
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let buttons = new Set(Array.from(row.buttons))
|
||||
if (!buttons.has("openFileSwitch")&&row.state!=1) {
|
||||
console.log('row',row)
|
||||
return (<Tag dictType={'project_filing'} value={'0'}/>)
|
||||
}else if (buttons.has("openFileSwitch")) {
|
||||
if (!buttons.has("openFileSwitch") && row.state != 1) {
|
||||
console.log('row', row)
|
||||
if (!buttons.has("openFileSwitch") && !buttons.has("closeFileSwitch") && row.state == 4) {
|
||||
//下属公司, 没这两个按钮时, 状态为4
|
||||
return (<Tag dictType={'project_filing'} value={'4'}/>)
|
||||
} else {
|
||||
return (<Tag dictType={'project_filing'} value={'0'}/>)
|
||||
}
|
||||
} else if (buttons.has("openFileSwitch")) {//科创部, 有这权限时
|
||||
return (<Tag dictType={'project_filing'} value={'4'}/>)
|
||||
}else{
|
||||
} else {
|
||||
if (row.state !== null) {
|
||||
return (<Tag dictType={'project_filing'} value={row.state}/>)
|
||||
} else {
|
||||
@@ -337,29 +342,59 @@ const tableConfig = reactive({
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
fixed:'right',
|
||||
fixed: 'right',
|
||||
width: 150,
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
let buttons = new Set(Array.from(row.buttons))
|
||||
if (buttons.has("details")) {
|
||||
btn.push({label: '详情', prem: ['project:management:filing:detail'], func: () => handleDetail(row), type: 'primary'})
|
||||
btn.push({
|
||||
label: '详情',
|
||||
prem: ['project:management:filing:detail'],
|
||||
func: () => handleDetail(row),
|
||||
type: 'primary'
|
||||
})
|
||||
}
|
||||
if (buttons.has("attachments")) {
|
||||
btn.push({label: '附件', prem: ['project:management:filing:attachment'], func: () => handleAttachment(row), type: 'primary'})
|
||||
btn.push({
|
||||
label: '附件',
|
||||
prem: ['project:management:filing:attachment'],
|
||||
func: () => handleAttachment(row),
|
||||
type: 'primary'
|
||||
})
|
||||
}
|
||||
if (buttons.has("entry")) {
|
||||
btn.push({label: '结项', prem: ['project:management:filing:conclusion'], func: () => handleConclusion(row), type: 'primary'})
|
||||
btn.push({
|
||||
label: '结项',
|
||||
prem: ['project:management:filing:conclusion'],
|
||||
func: () => handleConclusion(row),
|
||||
type: 'primary'
|
||||
})
|
||||
}
|
||||
if (buttons.has("edit")) {
|
||||
btn.push({label: '编辑', prem: ['project:management:filing:conclusion'], func: () => handleEdit(row), type: 'primary'})
|
||||
btn.push({
|
||||
label: '编辑',
|
||||
prem: ['project:management:filing:conclusion'],
|
||||
func: () => handleEdit(row),
|
||||
type: 'primary'
|
||||
})
|
||||
}
|
||||
if (buttons.has("openFileSwitch")) {
|
||||
btn.push({label: '开启上传', prem: ['filing:attachment:switch'], func: () => handleOpenUpload(row,true), type: 'primary'})
|
||||
btn.push({
|
||||
label: '开启上传',
|
||||
prem: ['filing:attachment:switch'],
|
||||
func: () => handleOpenUpload(row, true),
|
||||
type: 'primary'
|
||||
})
|
||||
}
|
||||
if (buttons.has("closeFileSwitch")) {
|
||||
btn.push({label: '关闭上传', prem: ['filing:attachment:switch'], func: () => handleOpenUpload(row,false), type: 'primary'})
|
||||
btn.push({
|
||||
label: '关闭上传',
|
||||
prem: ['filing:attachment:switch'],
|
||||
func: () => handleOpenUpload(row, false),
|
||||
type: 'primary'
|
||||
})
|
||||
}
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
@@ -411,7 +446,7 @@ const handleAttachment = (row) => {
|
||||
name: 'Filing/attachment',
|
||||
query: {
|
||||
id: row.projectId,
|
||||
requirementId:row.requirementId
|
||||
requirementId: row.requirementId
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -433,21 +468,21 @@ const handleEdit = (row) => {
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleOpenUpload=(row,flag)=>{
|
||||
console.log('tableIns',tableIns.value)
|
||||
ElMessageBox.confirm(`是否确认${flag?'开启':'关闭'}上传文件?`, '提示', {
|
||||
const handleOpenUpload = (row, flag) => {
|
||||
console.log('tableIns', tableIns.value)
|
||||
ElMessageBox.confirm(`是否确认${flag ? '开启' : '关闭'}上传文件?`, '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
let params={
|
||||
let params = {
|
||||
open: flag,
|
||||
projectId: row.projectId
|
||||
projectId: row.projectId
|
||||
}
|
||||
switchAttachmentState(params).then(res=>{
|
||||
if(res.code==1000){
|
||||
switchAttachmentState(params).then(res => {
|
||||
if (res.code == 1000) {
|
||||
tableIns.value.refresh()
|
||||
}else{
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
@@ -459,7 +494,7 @@ const handleOpenUpload=(row,flag)=>{
|
||||
}
|
||||
const init = async () => {
|
||||
const res = await getSubCompOpt()
|
||||
searchConfig.value.find(item=>item.prop == 'affiliatedCompanyId').props.data = res.data
|
||||
searchConfig.value.find(item => item.prop == 'affiliatedCompanyId').props.data = res.data
|
||||
}
|
||||
|
||||
init()
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<!-- <baseTitle title="审核意见"></baseTitle>-->
|
||||
<!-- <fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm>-->
|
||||
<div class="oper-page-btn" style="display: flex">
|
||||
<div class="oper-page-btn-mobile" style="display: flex">
|
||||
<el-button type="danger" @click="handleReject">驳回</el-button>
|
||||
<el-button color="#DED0B2" @click="handleAgree">同意</el-button>
|
||||
</div>
|
||||
@@ -129,13 +129,13 @@ const back = () => {
|
||||
}
|
||||
}
|
||||
break;
|
||||
// case 'Summary/detail':
|
||||
// if (route.query.source === 'home') {
|
||||
// router.push('/home')
|
||||
// } else {
|
||||
// router.push({name: 'Summary'})
|
||||
// }
|
||||
// break;
|
||||
// case 'Summary/detail':
|
||||
// if (route.query.source === 'home') {
|
||||
// router.push('/home')
|
||||
// } else {
|
||||
// router.push({name: 'Summary'})
|
||||
// }
|
||||
// break;
|
||||
case 'Requirement/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
@@ -233,4 +233,10 @@ const handleAgree = async () => {
|
||||
padding: 0 !important;
|
||||
}
|
||||
}
|
||||
.oper-page-btn-mobile {
|
||||
position: fixed;
|
||||
top: 20px;
|
||||
right: 15px;
|
||||
z-index: 5;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,105 +1,113 @@
|
||||
<template>
|
||||
<!-- <special-fund-detail :formData="fundData.formData" :data="fundData" :showTable="showTable" :processViewer="fundProcessViewer"-->
|
||||
<!-- :loading="loading"/>-->
|
||||
|
||||
<div v-loading="loading" style="padding: 0 10px;">
|
||||
<baseTitle title="专项资金详情"></baseTitle>
|
||||
<el-form :model="formData" ref="form" label-width="left">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="专项名称">
|
||||
<span>{{ formData.name }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="金额(元)">
|
||||
<span>{{ toThousands(formData.fundAmount) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="剩余金额(元)">
|
||||
<span>{{ toThousands(formData.residualAmount) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- <baseTitle title="介绍"></baseTitle>-->
|
||||
<!-- <el-col :span="24">-->
|
||||
<!-- <el-form-item>-->
|
||||
<!-- <el-card style="width: 100%">-->
|
||||
<!-- <div v-html="formData.introduce">-->
|
||||
<!-- </div>-->
|
||||
<!-- </el-card>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<el-col :span="24">
|
||||
<el-form-item label="专项资金情况说明" >
|
||||
<div style="white-space: pre-wrap">{{formData.introduce}}
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row style="margin-top: -18px;" class="projects">
|
||||
<baseTitle title="关联项目"></baseTitle>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<fvTable style="width: 100%;max-height:160px" height="160" v-if="showTable" :scrollbar-always-on="true" :tableConfig="projectTable"
|
||||
:data="formData.projects" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row style="margin-top: -18px;" class="projects">
|
||||
<baseTitle title="附件文件"></baseTitle>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<fvTable style="width: 100%;max-height: 160px;" height="160" v-if="showTable":scrollbar-always-on="true" :tableConfig="fileTable"
|
||||
:data="formData.files" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<div v-if="fundData.taskId">
|
||||
<baseTitle title="审核意见"></baseTitle>
|
||||
<el-form-item prop="auditOpinion">
|
||||
<el-input
|
||||
v-model="formData.auditOpinion"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="approval-record">
|
||||
<div class="approval-title">
|
||||
<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>
|
||||
</div>
|
||||
<div class="process">
|
||||
<operation-render v-if="fundProcessViewer && fundData.operationList && fundData.operationList.length > 0&&!changeDiagram" :isColumn="true"
|
||||
:operation-list="fundData.operationList"
|
||||
:state="fundData.state"/>
|
||||
<process-diagram-viewer v-if="fundProcessViewer&&changeDiagram" id-name="fundProcess"/>
|
||||
<div class="page-container">
|
||||
<div class="notice-wrapper">
|
||||
<div v-if="fundData && fundData.state == 3" class="notice">
|
||||
<div class="alert-icon">⚠️</div>
|
||||
<div class="alert-content">
|
||||
<div class="alert-title">操作限制提示</div>
|
||||
<div class="alert-message">当前版本不支持手机端驳回重新提交,请在电脑网页上执行重新提交操作。</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
<opinion-moblie v-if="fundData.taskId" :formData="formData" :taskId="fundData.taskId" :taskUserOptionList="fundData.taskUserOptionList"
|
||||
v-model:value="formData.auditOpinion"></opinion-moblie>
|
||||
<file-preview ref="filePreviewRef" :fullscreen="true" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
||||
:fileType="filePreviewParam.fileType"/>
|
||||
</div>
|
||||
<div v-loading="loading" style="padding: 0 10px;">
|
||||
<baseTitle title="专项资金详情"></baseTitle>
|
||||
<el-form :model="formData" ref="form" label-width="left">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="专项名称">
|
||||
<span>{{ formData.name }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="金额(元)">
|
||||
<span>{{ toThousands(formData.fundAmount) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="剩余金额(元)">
|
||||
<span>{{ toThousands(formData.residualAmount) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- <baseTitle title="介绍"></baseTitle>-->
|
||||
<!-- <el-col :span="24">-->
|
||||
<!-- <el-form-item>-->
|
||||
<!-- <el-card style="width: 100%">-->
|
||||
<!-- <div v-html="formData.introduce">-->
|
||||
<!-- </div>-->
|
||||
<!-- </el-card>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<el-col :span="24">
|
||||
<el-form-item label="专项资金情况说明" >
|
||||
<div style="white-space: pre-wrap">{{formData.introduce}}
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row style="margin-top: -18px;" class="projects">
|
||||
<baseTitle title="关联项目"></baseTitle>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<fvTable style="width: 100%;max-height:160px" height="160" v-if="showTable" :scrollbar-always-on="true" :tableConfig="projectTable"
|
||||
:data="formData.projects" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row style="margin-top: -18px;" class="projects">
|
||||
<baseTitle title="附件文件"></baseTitle>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<fvTable style="width: 100%;max-height: 160px;" height="160" v-if="showTable":scrollbar-always-on="true" :tableConfig="fileTable"
|
||||
:data="formData.files" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<div v-if="fundData.taskId">
|
||||
<baseTitle title="审核意见"></baseTitle>
|
||||
<el-form-item prop="auditOpinion">
|
||||
<el-input
|
||||
v-model="formData.auditOpinion"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="approval-record">
|
||||
<div class="approval-title">
|
||||
<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>
|
||||
</div>
|
||||
<div class="process">
|
||||
<operation-render v-if="fundProcessViewer && fundData.operationList && fundData.operationList.length > 0&&!changeDiagram" :isColumn="true"
|
||||
:operation-list="fundData.operationList"
|
||||
:state="fundData.state"/>
|
||||
<process-diagram-viewer v-if="fundProcessViewer&&changeDiagram" id-name="fundProcess"/>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
<opinion-moblie v-if="fundData.taskId" :formData="formData" :taskId="fundData.taskId" :taskUserOptionList="fundData.taskUserOptionList"
|
||||
v-model:value="formData.auditOpinion"></opinion-moblie>
|
||||
<file-preview ref="filePreviewRef" :fullscreen="true" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
||||
:fileType="filePreviewParam.fileType"/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -276,6 +284,47 @@ const getDetail = async () => {
|
||||
getDetail()
|
||||
</script>
|
||||
<style scoped>
|
||||
.page-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.notice-wrapper {
|
||||
/* 与index页面一致 */
|
||||
}
|
||||
|
||||
.notice {
|
||||
background: linear-gradient(90deg, #fff3f3 0%, #fff8f8 100%);
|
||||
padding: 15px 20px;
|
||||
border-left: 6px solid #ff7875;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 0 4px 4px 0;
|
||||
}
|
||||
|
||||
.notice .alert-icon {
|
||||
font-size: 24px;
|
||||
margin-right: 15px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.notice .alert-content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.notice .alert-title {
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
margin-bottom: 4px;
|
||||
color: #d9363e;
|
||||
}
|
||||
|
||||
.notice .alert-message {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
:deep(.el-table--fit ) {
|
||||
height: 300px !important;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div id="printBox">
|
||||
<div style="display: flex;justify-content: space-between">
|
||||
<baseTitle title="项目基本信息"></baseTitle>
|
||||
<el-button v-print="print" color="#ded0b2" icon="Printer" style="margin-top: 15px" @click="handlePrint(print)"> 打印</el-button>
|
||||
<!-- <el-button v-print="print" color="#ded0b2" icon="Printer" style="margin-top: 15px" @click="handlePrint(print)"> 打印</el-button>-->
|
||||
</div>
|
||||
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e" label-position="left" label-width="left" style="margin-left: 15px"></fvForm>
|
||||
<div class="steps-box">
|
||||
|
||||
@@ -182,8 +182,8 @@
|
||||
</div>
|
||||
</el-form>
|
||||
<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>
|
||||
<el-button type="danger" @click="handleRejectPlan">驳回项目计划</el-button>
|
||||
<el-button color="#DED0B2" @click="handleAgreePlan">通过项目计划</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -1,60 +1,71 @@
|
||||
<template>
|
||||
<div style="padding: 0 10px;">
|
||||
<StepsMoblie :active="route.query.id==='-1'?currentStep-1:currentStep" @setDetail="setDetail"
|
||||
@stepChange="stepChange"
|
||||
:reportType="route.query.id==='-1'?'direct':''">
|
||||
<template #content v-if="detailShow">
|
||||
<collection-detail :formData="detailData.formData"
|
||||
:data="detailData"
|
||||
:processViewer="commonProvessViewer"
|
||||
v-if="showActive == '00'"
|
||||
:fileListShow="fileListShow"
|
||||
v-model:value="auditOpinion"
|
||||
/>
|
||||
<summary-detail v-if="showActive == '10'"
|
||||
:formData="detailData.formData"
|
||||
:data="detailData"
|
||||
:processViewer="commonProvessViewer"
|
||||
:fileListShow="fileListShow"
|
||||
v-model:value="auditOpinion"/>
|
||||
<ApprovalDetail type="approval"
|
||||
v-if="showActive == '20'"
|
||||
:formData="detailData.formData"
|
||||
:data="detailData"
|
||||
:processViewer="commonProvessViewer"
|
||||
:fileListShow="fileListShow"
|
||||
:preProcessShow="preProcessShow"
|
||||
v-model:value="auditOpinion"/>
|
||||
<div v-if="showActive == '30'">
|
||||
<project-attachment fileNameTableWidth="200" :isLineBtn="true"/>
|
||||
<div class="page-container">
|
||||
<div class="notice-wrapper">
|
||||
<div v-if="detailData && detailData.state == 3" class="notice">
|
||||
<div class="alert-icon">⚠️</div>
|
||||
<div class="alert-content">
|
||||
<div class="alert-title">操作限制提示</div>
|
||||
<div class="alert-message">当前版本不支持手机端驳回重新提交,请在电脑网页上执行重新提交操作。</div>
|
||||
</div>
|
||||
<ApprovalDetail type="execute"
|
||||
v-if="showActive == '40'"
|
||||
:formData="detailData.formData"
|
||||
:data="detailData"
|
||||
:processViewer="commonProvessViewer"
|
||||
:fileListShow="fileListShow"
|
||||
:preProcessShow="preProcessShow"
|
||||
v-model:value="auditOpinion"/>
|
||||
<ApprovalDetail type="archivist"
|
||||
v-if="showActive == '50'"
|
||||
:formData="detailData.formData"
|
||||
:data="detailData"
|
||||
:processViewer="commonProvessViewer"
|
||||
:fileListShow="fileListShow"
|
||||
:preProcessShow="preProcessShow"
|
||||
v-model:value="auditOpinion"/>
|
||||
<!-- <project-apply-moblie :title="applyTitle"-->
|
||||
<!-- v-if="editShow"-->
|
||||
<!-- :mode="mode"-->
|
||||
<!-- :step="showActive"-->
|
||||
<!-- :data="detailData"-->
|
||||
<!-- :formData="detailData.formData"/>-->
|
||||
</template>
|
||||
</StepsMoblie>
|
||||
<opinion-moblie v-if="detailData.taskId" :formData="detailData.formData" :taskId="detailData.taskId"
|
||||
:taskUserOptionList="detailData.taskUserOptionList"
|
||||
v-model:value="auditOpinion"/>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding: 0 10px;">
|
||||
<StepsMoblie :active="route.query.id==='-1'?currentStep-1:currentStep" @setDetail="setDetail"
|
||||
@stepChange="stepChange"
|
||||
:reportType="route.query.id==='-1'?'direct':''">
|
||||
<template #content v-if="detailShow">
|
||||
<collection-detail :formData="detailData.formData"
|
||||
:data="detailData"
|
||||
:processViewer="commonProvessViewer"
|
||||
v-if="showActive == '00'"
|
||||
:fileListShow="fileListShow"
|
||||
v-model:value="auditOpinion"
|
||||
/>
|
||||
<summary-detail v-if="showActive == '10'"
|
||||
:formData="detailData.formData"
|
||||
:data="detailData"
|
||||
:processViewer="commonProvessViewer"
|
||||
:fileListShow="fileListShow"
|
||||
v-model:value="auditOpinion"/>
|
||||
<ApprovalDetail type="approval"
|
||||
v-if="showActive == '20'"
|
||||
:formData="detailData.formData"
|
||||
:data="detailData"
|
||||
:processViewer="commonProvessViewer"
|
||||
:fileListShow="fileListShow"
|
||||
:preProcessShow="preProcessShow"
|
||||
v-model:value="auditOpinion"/>
|
||||
<div v-if="showActive == '30'">
|
||||
<project-attachment fileNameTableWidth="200" :isLineBtn="true"/>
|
||||
</div>
|
||||
<ApprovalDetail type="execute"
|
||||
v-if="showActive == '40'"
|
||||
:formData="detailData.formData"
|
||||
:data="detailData"
|
||||
:processViewer="commonProvessViewer"
|
||||
:fileListShow="fileListShow"
|
||||
:preProcessShow="preProcessShow"
|
||||
v-model:value="auditOpinion"/>
|
||||
<ApprovalDetail type="archivist"
|
||||
v-if="showActive == '50'"
|
||||
:formData="detailData.formData"
|
||||
:data="detailData"
|
||||
:processViewer="commonProvessViewer"
|
||||
:fileListShow="fileListShow"
|
||||
:preProcessShow="preProcessShow"
|
||||
v-model:value="auditOpinion"/>
|
||||
<!-- <project-apply-moblie :title="applyTitle"-->
|
||||
<!-- v-if="editShow"-->
|
||||
<!-- :mode="mode"-->
|
||||
<!-- :step="showActive"-->
|
||||
<!-- :data="detailData"-->
|
||||
<!-- :formData="detailData.formData"/>-->
|
||||
</template>
|
||||
</StepsMoblie>
|
||||
<opinion-moblie v-if="detailData.taskId" :formData="detailData.formData" :taskId="detailData.taskId"
|
||||
:taskUserOptionList="detailData.taskUserOptionList"
|
||||
v-model:value="auditOpinion"/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -175,6 +186,47 @@ const stepChange = (data) => {
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.page-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.notice-wrapper {
|
||||
/* 与special页面一致 */
|
||||
}
|
||||
|
||||
.notice {
|
||||
background: linear-gradient(90deg, #fff3f3 0%, #fff8f8 100%);
|
||||
padding: 15px 20px;
|
||||
border-left: 6px solid #ff7875;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 0 4px 4px 0;
|
||||
}
|
||||
|
||||
.notice .alert-icon {
|
||||
font-size: 24px;
|
||||
margin-right: 15px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.notice .alert-content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.notice .alert-title {
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
margin-bottom: 4px;
|
||||
color: #d9363e;
|
||||
}
|
||||
|
||||
.notice .alert-message {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.detail-block {
|
||||
padding-top: 15px;
|
||||
}
|
||||
@@ -191,11 +243,6 @@ const stepChange = (data) => {
|
||||
flex: 1;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
//.is-active {
|
||||
// color: black;
|
||||
// //background-color: #DED0B2;
|
||||
//}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,19 +1,30 @@
|
||||
<template>
|
||||
<div style="padding: 0 10px; box-sizing: border-box;">
|
||||
<baseTitle title="项目基本信息"></baseTitle>
|
||||
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e" label-position="left" label-width="left"></fvForm>
|
||||
<baseTitle title="阶段变更详情" style="margin-top: -10px"></baseTitle>
|
||||
<div style="color: #606266;font-size: 14px;height:32px;line-height: 32px"><span style="display:inline-block;text-align: right;margin-right: 14px;margin-left: 15px">抄送人</span>{{copyName?copyName:'--'}}</div>
|
||||
<div style="color: #606266;font-size: 14px;display: flex;height:40px;line-height: 32px;margin-bottom: -10px">
|
||||
<span style="display:inline-block;text-align: right;margin-right: 14px;margin-left: 15px">变更状态</span>
|
||||
<!-- {{changeState=='1'?'开发阶段':'研究阶段'}}-->
|
||||
<tag dict-type="fee_stage" :value="changeState"/>
|
||||
<div class="page-container">
|
||||
<div class="notice-wrapper">
|
||||
<div v-if="summaryData && summaryData.state == 3" class="notice">
|
||||
<div class="alert-icon">⚠️</div>
|
||||
<div class="alert-content">
|
||||
<div class="alert-title">操作限制提示</div>
|
||||
<div class="alert-message">当前版本不支持手机端驳回重新提交,请在电脑网页上执行重新提交操作。</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding: 0 10px; box-sizing: border-box;">
|
||||
<baseTitle title="项目基本信息"></baseTitle>
|
||||
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e" label-position="left" label-width="left"></fvForm>
|
||||
<baseTitle title="阶段变更详情" style="margin-top: -10px"></baseTitle>
|
||||
<div style="color: #606266;font-size: 14px;height:32px;line-height: 32px"><span style="display:inline-block;text-align: right;margin-right: 14px;margin-left: 15px">抄送人</span>{{copyName?copyName:'--'}}</div>
|
||||
<div style="color: #606266;font-size: 14px;display: flex;height:40px;line-height: 32px;margin-bottom: -10px">
|
||||
<span style="display:inline-block;text-align: right;margin-right: 14px;margin-left: 15px">变更状态</span>
|
||||
<!-- {{changeState=='1'?'开发阶段':'研究阶段'}}-->
|
||||
<tag dict-type="fee_stage" :value="changeState"/>
|
||||
</div>
|
||||
<ApprovalDetailMoblie :formData="summaryData.formData" :data="summaryData" type="phase"
|
||||
:processViewer="summaryProcessViewer" :loading="loading" :fileListShow="fileListShow" v-model:value="auditOpinion"/>
|
||||
<opinion-moblie v-if="summaryData.taskId" :formData="summaryData.formData" :taskId="summaryData.taskId"
|
||||
:taskUserOptionList="summaryData.taskUserOptionList"
|
||||
v-model:value="auditOpinion"/>
|
||||
</div>
|
||||
<ApprovalDetailMoblie :formData="summaryData.formData" :data="summaryData" type="phase"
|
||||
:processViewer="summaryProcessViewer" :loading="loading" :fileListShow="fileListShow" v-model:value="auditOpinion"/>
|
||||
<opinion-moblie v-if="summaryData.taskId" :formData="summaryData.formData" :taskId="summaryData.taskId"
|
||||
:taskUserOptionList="summaryData.taskUserOptionList"
|
||||
v-model:value="auditOpinion"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -323,5 +334,44 @@ getInfo()
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.page-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.notice-wrapper {
|
||||
/* 与special页面一致 */
|
||||
}
|
||||
|
||||
.notice {
|
||||
background: linear-gradient(90deg, #fff3f3 0%, #fff8f8 100%);
|
||||
padding: 15px 20px;
|
||||
border-left: 6px solid #ff7875;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 0 4px 4px 0;
|
||||
}
|
||||
|
||||
.notice .alert-icon {
|
||||
font-size: 24px;
|
||||
margin-right: 15px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.notice .alert-content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.notice .alert-title {
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
margin-bottom: 4px;
|
||||
color: #d9363e;
|
||||
}
|
||||
|
||||
.notice .alert-message {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -234,7 +234,9 @@ const getFile = (val) => {
|
||||
})
|
||||
}
|
||||
const handleBack = () => {
|
||||
history.back()
|
||||
router.push({
|
||||
name: 'Fund'
|
||||
})
|
||||
}
|
||||
|
||||
const submitParam = (item) => {
|
||||
@@ -325,11 +327,7 @@ const init = async () => {
|
||||
}
|
||||
const getDetailInfo = async () => {
|
||||
getFundDetailProcess(route.query.id).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
|
||||
if (res.code === 1000) {
|
||||
formData.value = res.data.formData
|
||||
opentionData.value = res.data
|
||||
@@ -337,6 +335,12 @@ const getDetailInfo = async () => {
|
||||
nextTick(() => {
|
||||
showTable.value = true
|
||||
})
|
||||
}else{
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -50,6 +50,8 @@ const openChangeRoleDialog = (selectRoleId, data) => {
|
||||
}
|
||||
})
|
||||
}
|
||||
console.log("🚀 ~ file: ", authStore.roles.includes('superAdmin'))
|
||||
|
||||
const schame = computed(() => {
|
||||
let arr = [
|
||||
{
|
||||
@@ -62,7 +64,7 @@ const schame = computed(() => {
|
||||
filterable: true,
|
||||
checkStrictly: true,
|
||||
data: localData.subCompanyIdOpt,
|
||||
disabled: route.query.userType == 0 ? true : false
|
||||
disabled: route.query.userType == 0 ? true : !authStore.roles.includes('superAdmin') ? true : false
|
||||
},
|
||||
on: {
|
||||
change: async (val) => {
|
||||
@@ -73,15 +75,15 @@ const schame = computed(() => {
|
||||
},
|
||||
{
|
||||
label: '归属部门',
|
||||
prop: 'departmentId',
|
||||
component: 'el-tree-select',
|
||||
prop:!authStore.roles.includes('superAdmin') ?'departmentName': 'departmentId',
|
||||
component: !authStore.roles.includes('superAdmin') ?'el-input':'el-tree-select',
|
||||
props: {
|
||||
placeholder: '请选择',
|
||||
clearable: true,
|
||||
data: localData.departmentIdOpt,
|
||||
filterable: true,
|
||||
checkStrictly: true,
|
||||
disabled: route.query.userType == 0 ? true : false
|
||||
disabled: route.query.userType == 0 ? true : !authStore.roles.includes('superAdmin') ? true : false
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -90,7 +92,7 @@ const schame = computed(() => {
|
||||
component: 'el-input',
|
||||
props: {
|
||||
placeholder: '请输入',
|
||||
disabled: route.query.userType == 0 ? true : false
|
||||
disabled: true
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -99,7 +101,7 @@ const schame = computed(() => {
|
||||
component: 'el-input',
|
||||
props: {
|
||||
placeholder: '请输入',
|
||||
disabled: route.query.userType == 0 ? true : false
|
||||
disabled: route.query.userType == 0 ? true : !authStore.roles.includes('superAdmin') ? true : false
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -120,7 +122,7 @@ const schame = computed(() => {
|
||||
filterable: true,
|
||||
checkStrictly: true,
|
||||
data: localData.jobOpt,
|
||||
disabled: route.query.userType == 0 ? true : false
|
||||
disabled: route.query.userType == 0 ? true : !authStore.roles.includes('superAdmin') ? true : false
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -130,7 +132,8 @@ const schame = computed(() => {
|
||||
props: {
|
||||
placeholder: '请选择',
|
||||
multiple: true,
|
||||
data: localData.roleOpt
|
||||
data: localData.roleOpt,
|
||||
disabled:!authStore.roles.includes('superAdmin') ? true : false
|
||||
},
|
||||
on: {
|
||||
change: async (val) => {
|
||||
@@ -173,7 +176,7 @@ const schame = computed(() => {
|
||||
props: {
|
||||
placeholder: '请选择',
|
||||
data: cacheStore.getDict('user_sex'),
|
||||
disabled: route.query.userType == 0 ? true : false
|
||||
disabled: route.query.userType == 0 ? true : !authStore.roles.includes('superAdmin') ? true : false
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -183,7 +186,7 @@ const schame = computed(() => {
|
||||
props: {
|
||||
placeholder: '请选择',
|
||||
data: cacheStore.getDict('normal_disable'),
|
||||
disabled: route.query.userType == 0 ? true : false
|
||||
disabled: route.query.userType == 0 ? true : !authStore.roles.includes('superAdmin') ? true : false
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -192,7 +195,7 @@ const schame = computed(() => {
|
||||
component: 'el-input',
|
||||
props: {
|
||||
placeholder: '请输入',
|
||||
disabled: route.query.userType == 0 ? true : false
|
||||
disabled: route.query.userType == 0 ? true : !authStore.roles.includes('superAdmin') ? true : false
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -201,7 +204,7 @@ const schame = computed(() => {
|
||||
component: 'el-input',
|
||||
props: {
|
||||
placeholder: '请输入',
|
||||
disabled: route.query.userType == 0 ? true : false
|
||||
disabled: route.query.userType == 0 ? true : !authStore.roles.includes('superAdmin') ? true : false
|
||||
}
|
||||
},
|
||||
]
|
||||
@@ -244,6 +247,7 @@ const init = async () => {
|
||||
getJobOpt()
|
||||
]
|
||||
const resAll = await Promise.all(reqList)
|
||||
console.log('resAll',resAll)
|
||||
localData.departmentIdOpt = resAll[0].data
|
||||
localData.subCompanyIdOpt = resAll[1].data
|
||||
localData.roleOpt = resAll[2].data
|
||||
@@ -254,10 +258,11 @@ const getInfo = async () => {
|
||||
if (!route.query.id) return
|
||||
// 获取详情数据
|
||||
const {data} = await getUserDetail(route.query.id)
|
||||
if (data.subCompanyId) {
|
||||
const res = await getDeptOpt({subCompanyId: data.subCompanyId})
|
||||
localData.departmentIdOpt = res.data
|
||||
}
|
||||
// if (data.subCompanyId) {
|
||||
// const res = await getDeptOpt({subCompanyId: data.subCompanyId})
|
||||
// console.log('getInfo',res)
|
||||
// localData.departmentIdOpt = res.data
|
||||
// }
|
||||
nextTick(() => {
|
||||
form.value.setValues(data)
|
||||
currentRoleArray.value = form.value.getValues().roleIds
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<el-button type="primary" v-perm="auths.agentSetting"
|
||||
@click="handleAgentSetting(scope.row)" link>设置代理
|
||||
</el-button>
|
||||
<el-button type="danger" v-if="scope.row.userType != 0" v-perm="auths.del"
|
||||
<el-button type="danger" v-if="scope.row.userType != 0&&!authStore.roles.includes('superAdmin')" v-perm="auths.del"
|
||||
@click="handleDel(scope.row)" link>删除
|
||||
</el-button>
|
||||
<el-button type="primary" v-if="scope.row.accountType == 0" v-perm="auths.bindUser"
|
||||
|
||||
@@ -136,7 +136,7 @@ const init = () => {
|
||||
timeline.value = {
|
||||
color: '#f78f5f',
|
||||
icon: 'MoreFilled',
|
||||
context: '年度计划审批中'
|
||||
context: '项目计划审批中'
|
||||
}
|
||||
}
|
||||
break
|
||||
@@ -159,7 +159,7 @@ const init = () => {
|
||||
timeline.value = {
|
||||
color: '#0bbd87',
|
||||
icon: 'CircleCheckFilled',
|
||||
context: '年度计划审批通过'
|
||||
context: '项目计划审批通过'
|
||||
}
|
||||
break
|
||||
default:
|
||||
|
||||
@@ -8,8 +8,10 @@ import IconsResolver from 'unplugin-icons/resolver'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
import vueJsx from '@vitejs/plugin-vue-jsx'
|
||||
import Inspect from 'vite-plugin-inspect'
|
||||
import viteSvgIcons from 'vite-plugin-svg-icons'
|
||||
// import viteSvgIcons from 'vite-plugin-svg-icons'
|
||||
import path from 'path'
|
||||
import pkg from 'vite-plugin-svg-icons'
|
||||
const viteSvgIcons = pkg.default
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
@@ -71,7 +73,7 @@ export default defineConfig({
|
||||
open: true,
|
||||
proxy: {
|
||||
// '/api/workflow': {
|
||||
// target: 'http://frp.feashow.cn:31800/',
|
||||
// target: 'http://frp.toomewhy.top:38000/',
|
||||
// // target: 'http://clay.frp.feashow.cn/',
|
||||
// // target: 'http://192.168.31.175:8000',
|
||||
// changeOrigin: true,
|
||||
Reference in New Issue
Block a user