Merge pull request 'fix : 修复细节' (#273) from dj into master

Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/273
This commit is contained in:
2024-06-02 11:42:44 +00:00
11 changed files with 172 additions and 159 deletions

View File

@@ -19,3 +19,10 @@ export const getAllocationProcess = () => {
method: "get"
});
};
export const getAllocationDetailList = (params) => {
return request({
url: '/workflow/mosr/cost/allocation/process',
method: "get",
params:params
});
};

View File

@@ -2,16 +2,6 @@
<div v-loading="loading">
<el-form :model="formData" ref="form" class="query-form" label-width="auto">
<el-row>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="分摊名称">-->
<!-- <span>{{ formData.shareName }}</span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="分摊月份">-->
<!-- <span>{{ formData.apportionmentMonth }}</span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="24">
<el-form-item>
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>
@@ -19,7 +9,7 @@
</el-col>
<el-col :span="24">
<el-form-item>
<el-table :data="formData.usrAllocationList" style="width: 100%">
<el-table :data="detailList" style="width: 100%">
<el-table-column prop="projectId" label="项目名称" width="180"/>
<el-table-column prop="researchPersonnel" label="研发人员" width="180"/>
<el-table-column prop="wagesPayable" label="应发工资"/>
@@ -30,40 +20,14 @@
<el-table-column prop="workday" label="工作日(天)"/>
<el-table-column prop="researchDuration" label="研发时长(天)"/>
</el-table>
</el-form-item>
</el-col>
<el-col :span="24">
<div v-if="formData.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-form-item>
</el-col>
</el-row>
</el-form>
<div class="approval-record">
<baseTitle title="审批记录"></baseTitle>
<div class="process">
<operation-render v-if="processViewer" :operation-list="data.operationList"
:state="data.state"/>
<process-diagram-viewer v-if="processViewer" id-name="collectionProcess"/>
</div>
</div>
<opinion v-if="data.taskId" :formData="data.formData" :taskId="data.taskId"></opinion>
</div>
</template>
<script setup lang="jsx">
import OperationRender from '@/views/workflow/common/OperationRender.vue'
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
const searchConfig = reactive([
{
@@ -100,7 +64,6 @@ const searchConfig = reactive([
},
])
const tableIns = ref()
const tableData = ref([])
const props = defineProps({
formData: {
type: Array,
@@ -110,9 +73,9 @@ const props = defineProps({
type: Array,
default: []
},
processViewer: {
type: Boolean,
default: false
detailList: {
type: Array,
default: []
},
loading: {
type: Boolean,
@@ -121,7 +84,7 @@ const props = defineProps({
})
const search = (val) => {
tableConfig.params = {...val}
// tableIns.value.refresh()
tableIns.value.refresh()
}
</script>

View File

@@ -1,6 +1,6 @@
<template>
<el-form-item label="需求上报附件" v-if="fileListShow === 'READ' || fileListShow === 'EDIT'">
<file-upload @getFile="getOtherFile" v-if="fileListShow === 'EDIT'"/>
<file-upload @getFile="getOtherFile" v-if="fileListShow === 'EDIT'"/>{{fileList}}
<fvTable style="width: 100%;max-height: 400px;" v-if="processViewer" :tableConfig="tableConfig"
:data="fileList" :isSettingCol="false" :pagination="false">
<template #empty>

View File

@@ -3,7 +3,7 @@
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
<el-row gutter="50">
<el-col :span="12">
<el-form-item label="名称" prop="projectName">
<el-form-item label="项目名称" prop="projectName">
<span>{{ localFormData.projectName }}</span>
</el-form-item>
</el-col>
@@ -19,7 +19,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="结束时间" prop="endTime">
<span>{{ formData.endTime }}</span>
<span>{{ localFormData.endTime }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
@@ -73,7 +73,9 @@
</el-col>
<el-col :span="12">
<el-form-item label="知识产权状况" prop="intellectualProperty">
<span>{{ filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty) }}</span>
<span>{{
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
}}</span>
</el-form-item>
</el-col>
<el-col :span="6">
@@ -129,33 +131,11 @@
</el-button>
</el-form-item>
</el-col>
<el-col :span="24" >
<el-col :span="24">
<file-component title="需求上报附件" tag="需求上报"
:file-list="localFormData.fileList"
:file-list-show="fileListShow"/>
<!-- <el-form-item label="需求上报附件">-->
<!-- <file-upload @getFile="getOtherFile" v-if="fileListShow === 'EDIT'"/>-->
<!-- <fvTable style="width: 100%;max-height: 400px;" v-if="processViewer" :tableConfig="tableConfig"-->
<!-- :data="localFormData.fileList" :isSettingCol="false" :pagination="false">-->
<!-- <template #empty>-->
<!-- <el-empty :image-size="90" description="暂无数据" style="padding: 0"/>-->
<!-- </template>-->
<!-- </fvTable>-->
<!-- </el-form-item>-->
</el-col>
<!-- <el-col :span="24">-->
<!-- <div v-if="data.taskId">-->
<!-- <baseTitle title="审核意见"></baseTitle>-->
<!-- <el-form-item prop="auditOpinion">-->
<!-- <el-input-->
<!-- v-model="localFormData.auditOpinion"-->
<!-- :rows="3"-->
<!-- type="textarea"-->
<!-- placeholder="请输入审核意见"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- </div>-->
<!-- </el-col>-->
</el-row>
<div class="approval-record">
<baseTitle title="审批记录"></baseTitle>
@@ -165,10 +145,6 @@
<process-diagram-viewer v-if="processViewer" id-name="summaryProcess"/>
</div>
</div>
<!-- <div class="oper-page-btn" v-if="data.state === '1' && data.taskId">-->
<!-- <el-button @click="handleReject(summaryForm)">驳回</el-button>-->
<!-- <el-button color="#DED0B2" @click="handleAgree">同意</el-button>-->
<!-- </div>-->
</el-form>
</div>
</template>
@@ -252,8 +228,6 @@ const handleDownload = (row) => {
})
}
watch(() => props.processViewer, (newVal) => {
props.processViewer = newVal
}, {deep: true})

View File

@@ -42,7 +42,7 @@ const props = defineProps({
},
})
const rules = reactive({
tagName: [{required: true, message: '请输入标签名称', trigger: 'blur'}],
tagName: [{required: true, message: '请输入标签名称', trigger: ['blur', 'change']}],
})
const tagForm = ref()
const showTable = ref(true)

View File

@@ -45,6 +45,11 @@ const props = defineProps({
stepSuccess: {
type: Array,
default: ['00']
},
//直接上报/需求征集
reportType:{
type: String,
default: ''
}
})
@@ -238,6 +243,11 @@ getBaseInfo()
watchEffect(() => {
localActive.value = props.active
})
watchEffect(() => {
if(props.reportType==='direct'){
localSteps.value=localSteps.value.slice(1)
}
})
</script>
<style lang="scss" scoped>

View File

@@ -15,12 +15,16 @@
</el-form>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="分摊明细" name="first">
<expense-detail :formData="shareData.formData" :data="shareData" :showTable="showTable"
:processViewer="shareProcessViewer"
<expense-detail :formData="shareData.formData" :data="shareData"
:processViewer="shareProcessViewer" :detailList="detailList"
:loading="loading"/>
</el-tab-pane>
<el-tab-pane label="分摊汇总" name="second">
<!-- <fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick">-->
<!-- <template #empty>-->
<!-- <el-empty description="暂无数据"/>-->
<!-- </template>-->
<!-- </fvTable>-->
</el-tab-pane>
</el-tabs>
<div class="approval-record">
@@ -37,32 +41,40 @@
<script setup lang="jsx">
import {ElNotification} from "element-plus";
import {useProcessStore} from '@/stores/processStore.js';
import {getAllocationDetail} from "@/api/expense-manage";
import {getAllocationDetail, getAllocationDetailList} from "@/api/expense-manage";
const processStore = useProcessStore()
const route = useRoute()
const shareData = ref({})
const detailList = ref([])
const formData = ref({})
const shareProcessViewer = ref(true)
const showTable = ref(true)
const loading = ref(false)
const activeName = ref('first')
const getDetail = async () => {
const id = route.query.id
showTable.value = false
shareProcessViewer.value = false
loading.value = true
const {code, data, msg} = await getAllocationDetail(id)
ElNotification({
title: '提示',
message: msg,
type: code === 1000 ? 'success' : 'error'
})
if (code === 1000) {
shareData.value = data
formData.value = data.formData
loading.value = false
if(data.operationList==null)return;
} else {
ElNotification({
title: '提示',
message: msg,
type: 'error'
})
}
loading.value = false
}
const getDetailList = async () => {
let params = {
allocationId: route.query.id
}
shareProcessViewer.value = false
const {code, data, msg} = await getAllocationDetailList(params)
if (code === 1000) {
detailList.value = data
processStore.setDesign(data)
processStore.runningList.value = data.runningList;
processStore.endList.value = data.endList;
@@ -71,32 +83,36 @@ const getDetail = async () => {
processStore.passList.value = data.passList;
nextTick(() => {
shareProcessViewer.value = true
showTable.value = true
})
} else {
loading.value = false
}else {
ElNotification({
title: '提示',
message: msg,
type: 'error'
})
}
}
getDetail()
getDetailList()
</script>
<style scoped lang="scss">
:deep(.el-tabs__nav-scroll) {
width: 100%;
:deep(.el-tabs__nav-scroll) {
width: 100%;
display: flex;
.el-tabs__nav {
display: flex;
flex: 1;
.el-tabs__nav {
display: flex;
.el-tabs__item {
flex: 1;
font-size: 16px;
}
.el-tabs__item {
flex: 1;
font-size: 16px;
}
.is-active {
color: black;
//background-color: #DED0B2;
}
.is-active {
color: black;
//background-color: #DED0B2;
}
}
}
</style>

View File

@@ -8,24 +8,25 @@
<el-input v-model="formData.projectName" placeholder="请输入项目名称" clearable></el-input>
</el-form-item>
</el-col>
<!-- <el-col :span="5">-->
<!-- <el-form-item label="是否专项资金" prop="isSpecialFund">-->
<!-- <el-radio-group v-model="formData.isSpecialFund" >-->
<!-- <el-radio :label="true"></el-radio>-->
<!-- <el-radio :label="false"></el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="5">
<el-form-item label="是否专项资金" prop="isSpecialFund">
<el-radio-group v-model="formData.isSpecialFund">
<el-radio :label="true"></el-radio>
<el-radio :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="专项资金" prop="specialFund" v-if="formData.isSpecialFund">
<el-select v-model="formData.specialFund" placeholder="请选择专项资金" clearable filterable>
<el-option
v-for="item in specialFundOption"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<!-- <span>{{ getSpecialFundName(formData.specialFund) }}</span>-->
<el-select v-model="formData.specialFund" placeholder="请选择专项资金" clearable filterable>
<el-option
v-for="item in specialFundOption"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
@@ -33,8 +34,9 @@
<el-config-provider>
<el-date-picker
v-model="formData.startTime"
type="datetime"
type="date"
placeholder="开始时间"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
/>
@@ -46,10 +48,13 @@
<el-config-provider>
<el-date-picker
v-model="formData.endTime"
type="datetime"
type="date"
placeholder="结束时间"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
:disabled="!formData.startTime"
:disabled-date="disabledDate"
/>
</el-config-provider>
</el-form-item>
@@ -243,7 +248,7 @@
<script setup lang="jsx">
import {debounce} from 'lodash'
import {getDetail, getProcessInfo, requirementReported, resubmitReported} from "./api";
import {ElMessage, ElNotification} from "element-plus";
import {ElNotification} from "element-plus";
import {useTagsView} from '@/stores/tagsview.js'
import {useCacheStore} from '@/stores/cache.js'
import {useProcessStore} from '@/stores/processStore.js';
@@ -272,21 +277,22 @@ const formData = ref({
industryUniversityResearch: '0',
governmentDeclaration: '0',
})
const rules = reactive({
projectName: [{required: true, message: '请输入项目名称', trigger: 'blur'}],
specialFund: [{required: true, message: '请选择专项资金', trigger: 'blur'}],
startTime: [{required: true, message: '请选择开始时间', trigger: 'blur'}],
rdSubject: [{required: true, message: '请输入研发主体', trigger: 'blur'}],
projectType: [{required: true, message: '请选择项目类型', trigger: 'blur'}],
endTime: [{required: true, message: '请选择结束时间', trigger: 'blur'}],
investmentType: [{required: true, message: '请选择出资类型', trigger: 'blur'}],
projectImpact: [{required: true, message: '请选择项目影响', trigger: 'blur'}],
businessSegment: [{required: true, message: '请选择所属业务板块', trigger: 'blur'}],
resultForm: [{required: true, message: '请选择预期成果形式', trigger: 'blur'}],
technicalStandard: [{required: true, message: '请选择预期技术标准制定', trigger: 'blur'}],
industryUniversityResearch: [{required: true, message: '请选择产学研联合', trigger: 'blur'}],
governmentDeclaration: [{required: true, message: '请选择开展政府申报', trigger: 'blur'}],
intellectualProperty: [{required: true, message: '请选择知识产权状况', trigger: 'blur'}],
startTime: [{required: true, message: '请选择开始时间', trigger: ['blur', 'change']}],
endTime: [{required: true, message: '请选择结束时间', trigger: ['blur', 'change']}],
rdSubject: [{required: true, message: '请选择研发主体', trigger: ['blur', 'change']}],
projectType: [{required: true, message: '请选择项目类型', trigger: ['blur', 'change']}],
investmentType: [{required: true, message: '请选择出资类型', trigger: ['blur', 'change']}],
projectImpact: [{required: true, message: '请选择项目影响', trigger: ['blur', 'change']}],
businessSegment: [{required: true, message: '请选择所属业务板块', trigger: ['blur', 'change']}],
resultForm: [{required: true, message: '请选择预期成果形式', trigger: ['blur', 'change']}],
technicalStandard: [{required: true, message: '请选择预期技术标准制定', trigger: ['blur', 'change']}],
industryUniversityResearch: [{required: true, message: '请选择产学研联合', trigger: ['blur', 'change']}],
governmentDeclaration: [{required: true, message: '请选择开展政府申报', trigger: ['blur', 'change']}],
intellectualProperty: [{required: true, message: '请选择知识产权状况', trigger: ['blur', 'change']}],
inventionPatent: [{required: true, message: '请输入发明专利', trigger: 'blur'}],
newPatent: [{required: true, message: '请输入实用性新型专利', trigger: 'blur'}],
softwareCopyright: [{required: true, message: '请输入软件著作权', trigger: 'blur'}],
@@ -297,16 +303,33 @@ const rules = reactive({
serviceDescription: [{required: true, message: '请输入现有业务描述', trigger: 'blur'}],
contentDescription: [{required: true, message: '请输入研发项目关键内容描述', trigger: 'blur'}]
})
const disabledDate = (time) => {
return time.getTime() < new Date(formData.value.startTime).getTime();
}
const getIsFund = async () => {
getFormInfo(route.query.id).then(res => {
if (!route.query.id) return;
loading.value = true
await getFormInfo(route.query.id).then(res => {
if (res.code === 1000) {
loading.value = false
formData.value.isSpecialFund = res.data.isSpecialFund
if(res.data.isSpecialFund){
if (res.data.isSpecialFund) {
formData.value.specialFund = Number(res.data.specialFund)
}
}
})
}
const getSpecialFundName = (val) => {
let label
specialFundOption.value.forEach(item => {
if (item.value == val) {
label = item.label
}
})
return label
}
const compositeParam = (item, type) => {
let tag = ''
if (name.value === 'Summary/add' || name.value === 'Summary/edit') {
@@ -346,7 +369,13 @@ const getFileParam = (item) => {
const handleSubmit = debounce(async (instance) => {
if (!instance) return
instance.validate(async (valid, fields) => {
if (!valid) return
if (!valid) {
return ElNotification({
title: '提示',
message: '请完善数据,再提交!',
type: 'error'
})
}
let singleFile = {}
if (file.value.fileId !== undefined) {
singleFile = {
@@ -388,12 +417,13 @@ const handleSubmit = debounce(async (instance) => {
// }
let params = {
...formData.value,
isSpecialFund:false,
isSpecialFund: formData.value.isSpecialFund ? formData.value.isSpecialFund : false,
deploymentId: deploymentId.value,
fileList: otherFiles,
singleFile: singleFile,
requirementId: route.query.id
requirementId: route.query.id ? route.query.id : '-1'
}
console.log('params', params)
if (JSON.stringify(singleFile) === "{}") {
attachment.value.validate()
ElNotification({
@@ -402,10 +432,9 @@ const handleSubmit = debounce(async (instance) => {
type: 'error'
})
return;
}else {
} else {
attachment.value.clearValidate()
}
console.log('params', params)
let res = await requirementReported(params)
ElNotification({
title: '提示',
@@ -446,7 +475,7 @@ const handleResubmit = debounce(() => {
deploymentId: deploymentId.value,
fileList: otherFiles,
singleFile: singleFile,
requirementId: route.query.id
requirementId: route.query.id ? route.query.id : '-1'
}
if (JSON.stringify(singleFile) === "{}") {
attachment.value.validate()
@@ -456,7 +485,7 @@ const handleResubmit = debounce(() => {
type: 'error'
})
return;
}else {
} else {
attachment.value.clearValidate()
}
console.log('重新提交params', params)

View File

@@ -1,5 +1,5 @@
<template>
<steps :active="1" @setDetail="setDetail" @stepChange="stepChange">
<steps :active="1" @setDetail="setDetail" @stepChange="stepChange" :reportType="route.query.id=='-1'?'direct':''">
<template #content>
<collection-detail v-show="showActive == '00'" :formData="summaryData.formData" :data="summaryData"
:processViewer="summaryProcessViewer" :loading="loading"/>

View File

@@ -7,6 +7,7 @@
import {reactive, ref, shallowRef} from 'vue';
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
import {useRouter} from 'vue-router';
const localData = reactive({})
const tableIns = ref()
@@ -82,7 +83,12 @@ const tableConfig = reactive({
},
{
prop: 'requirementName',
label: '名称',
label: '征集名称',
align: 'center'
},
{
prop: 'projectName',
label: '项目名称',
align: 'center'
},
{
@@ -164,9 +170,9 @@ const tableConfig = reactive({
if (buttons.has("edit")) {
btn.push({label: '编辑', prem: ['mosr:collect:resubmit'], func: () => handleEdit(row), type: 'primary'})
}
if (buttons.has("report")) {
btn.push({label: '上报', prem: ['mosr:collect:reported'], func: () => handleAdd(row), type: 'primary'})
}
// if (buttons.has("report")) {
// btn.push({label: '上报', prem: ['mosr:collect:reported'], func: () => handleAdd(row), type: 'primary'})
// }
return (
<div style={{width: '100%'}}>
{
@@ -184,7 +190,7 @@ const tableConfig = reactive({
{
buttons.has("delete") ?
<popover-delete name={row.requirementName} type={'需求'} btnType={'danger'}
perm={['mosr:collect:del']} onDelete={() => handleDelete(row)}/>
perm={['mosr:collect:del']} onDelete={() => handleDelete(row)}/>
: ''
}
</div>
@@ -195,10 +201,18 @@ const tableConfig = reactive({
api: '/workflow/mosr/requirement/collect',
params: {},
btns: [
{name: '年度计划导出', key: '_export', color: '#DED0B2', auth: ''},
{name: '经费预算生成', key: 'preMonty', color: '#DED0B2', auth: ''},
{name: '新增上报', key: 'add', color: '#DED0B2', auth: ''},
{name: '年度计划导出', key: '_export', auth: ''},
{name: '经费预算生成', key: 'preMonty', auth: ''},
]
})
const headBtnClick = (key) => {
switch (key) {
case 'add':
handleAdd()
break;
}
}
const search = (val) => {
let obj = {...val}
@@ -211,11 +225,11 @@ const search = (val) => {
tableIns.value.refresh()
}
const handleAdd = (row) => {
const handleAdd = () => {
router.push({
name: 'Summary/add',
query: {
id: row.requirementId
// id: row.requirementId
}
})
}
@@ -232,7 +246,7 @@ const handleDetail = (row) => {
router.push({
name: 'Summary/detail',
query: {
id: row.requirementId,
id: row.requirementId===null?'-1':row.requirementId,
projectId: row.projectId,
state: row.state
}

View File

@@ -85,7 +85,7 @@ const showTable = ref(true)
const tagForm = ref()
const name = ref(router.currentRoute.value.name)
const rules = reactive({
tagName: [{required: true, message: '请输入标签名称', trigger: 'blur'}],
tagName: [{required: true, message: '请输入标签名称', trigger: ['blur', 'change']}],
})
const changeInput=()=>{
showInput.value=!showInput.value;