forked from TALL/tall3-pc-keti
29 changed files with 2523 additions and 33 deletions
@ -0,0 +1,108 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="experimentFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验名称</label> |
||||
|
<a-input v-model:value="experimentFormData.name" placeholder="实验名称" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">完成期限</label> |
||||
|
<a-space direction="vertical" :size="12"> |
||||
|
<a-range-picker v-model:value="experimentFormData.date" /> |
||||
|
</a-space> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">负责人</label> |
||||
|
<a-select v-model:value="experimentFormData.memberId"> |
||||
|
<a-select-option value="jack">Jack</a-select-option> |
||||
|
<a-select-option value="lucy">Lucy</a-select-option> |
||||
|
<a-select-option value="Yiminghe">yiminghe</a-select-option> |
||||
|
</a-select> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验目标</label> |
||||
|
<a-textarea v-model:value="experimentFormData.target" placeholder="实验目标" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">确定</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import dayjs from 'dayjs'; |
||||
|
// import { createExperiment } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const experimentFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
id: '', |
||||
|
name: '', |
||||
|
memberId: '', |
||||
|
date: [], |
||||
|
startTime: '', |
||||
|
endTime: '', |
||||
|
target: '', |
||||
|
}); |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
experimentFormData.value.date.forEach((item, index) => { |
||||
|
if (index === 0) { |
||||
|
experimentFormData.value.startTime = dayjs(item).format('x'); |
||||
|
} else { |
||||
|
experimentFormData.value.endTime = dayjs(item).format('x'); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// const params = { param: experimentFormData.value }; |
||||
|
|
||||
|
// createExperiment(params); |
||||
|
console.log('submit!', toRaw(experimentFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,220 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="topicSubFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">子课题名称</label> |
||||
|
<a-input v-model:value="topicSubFormData.name" placeholder="子课题名称" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">子课题负责人</label> |
||||
|
<a-select v-model:value="topicSubFormData.memberId"> |
||||
|
<a-select-option value="jack">Jack</a-select-option> |
||||
|
<a-select-option value="lucy">Lucy</a-select-option> |
||||
|
<a-select-option value="Yiminghe">yiminghe</a-select-option> |
||||
|
</a-select> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">完成期限</label> |
||||
|
<a-space direction="vertical" :size="12"> |
||||
|
<a-range-picker v-model:value="topicSubFormData.date" /> |
||||
|
</a-space> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="form-item-dad"> |
||||
|
<div class="flex items-center" style="margin-bottom: 5px"> |
||||
|
<label class="color-3" style="margin-bottom: 0; margin-right: 8px">进度安排</label> |
||||
|
<PlusCircleOutlined style="color: #1890ff; font-size: 16px" @click="addMilestones" /> |
||||
|
</div> |
||||
|
|
||||
|
<div class="form-item-son" style="padding-left: 16px"> |
||||
|
<div v-for="(item, index) in stageList" :key="index"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">时间</label> |
||||
|
<a-space direction="vertical" :size="12"> |
||||
|
<a-range-picker v-model:value="item.date" /> |
||||
|
</a-space> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">指标</label> |
||||
|
|
||||
|
<a-checkbox-group v-model:value="item.checkContent"> |
||||
|
<a-row> |
||||
|
<a-col :span="5" class="deliverables"> |
||||
|
<a-checkbox value="1"><span class="color-6">论文</span><a-input v-model:value="item.thesis" /></a-checkbox> |
||||
|
</a-col> |
||||
|
<a-col :span="15" class="deliverables"> |
||||
|
<a-checkbox value="2"><span class="color-6">专利</span><a-input v-model:value="item.patent" /></a-checkbox> |
||||
|
</a-col> |
||||
|
<a-col :span="4" class="deliverables"> |
||||
|
<a-checkbox value="3"><span class="color-6">软著</span><a-input v-model:value="item.theSoft" /></a-checkbox> |
||||
|
</a-col> |
||||
|
<a-col :span="5" class="deliverables-son" style="padding-left: 14px"> |
||||
|
<a-checkbox value="4"><span class="color-6">SCI论文</span><a-input v-model:value="item.sciThesis" /></a-checkbox> |
||||
|
</a-col> |
||||
|
<a-col :span="5" class="deliverables-son" style="padding-left: 14px"> |
||||
|
<a-checkbox value="5"><span class="color-6">发明专利</span><a-input v-model:value="item.inventPatent" /></a-checkbox> |
||||
|
</a-col> |
||||
|
<a-col :span="5" class="deliverables-son"> |
||||
|
<a-checkbox value="6"><span class="color-6">实用新型</span><a-input v-model:value="item.practicalPatent" /></a-checkbox> |
||||
|
</a-col> |
||||
|
<a-col :span="5" class="deliverables-son"> |
||||
|
<a-checkbox value="7"><span class="color-6">外观专利</span><a-input v-model:value="item.facadePatent" /></a-checkbox> |
||||
|
</a-col> |
||||
|
<a-col :span="4" class="deliverables-son"></a-col> |
||||
|
</a-row> |
||||
|
</a-checkbox-group> |
||||
|
</a-form-item> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">上传计划任务书</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import { PlusCircleOutlined } from '@ant-design/icons-vue'; |
||||
|
// import { saveSubExperiment } from 'apis'; |
||||
|
import dayjs from 'dayjs'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
const sessionTaskDetail = sessionStorage.getItem('taskDetail'); |
||||
|
const taskDetail = computed(() => store.state.task.taskDetail); // 任务名称 |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
if (sessionTaskDetail) { |
||||
|
const detail = JSON.parse(sessionTaskDetail); |
||||
|
store.commit('task/setTaskDetail', detail); |
||||
|
} |
||||
|
|
||||
|
const topicSubFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
taskId: taskDetail.value.id, |
||||
|
experimentId: '', |
||||
|
name: '', |
||||
|
memberId: '', |
||||
|
date: [], |
||||
|
startTime: '', |
||||
|
endTime: '', |
||||
|
stageList: [], |
||||
|
}); |
||||
|
|
||||
|
const stageList = ref([ |
||||
|
{ |
||||
|
date: [], |
||||
|
startTime: '', |
||||
|
endTime: '', |
||||
|
checkContent: [], |
||||
|
thesis: '', |
||||
|
sciThesis: '', |
||||
|
patent: '', |
||||
|
inventPatent: '', |
||||
|
practicalPatent: '', |
||||
|
facadePatent: '', |
||||
|
theSoft: '', |
||||
|
}, |
||||
|
]); |
||||
|
|
||||
|
// 添加实施内容与目标 |
||||
|
function addMilestones() { |
||||
|
stageList.value.push({ |
||||
|
date: [], |
||||
|
startTime: '', |
||||
|
endTime: '', |
||||
|
checkContent: [], |
||||
|
thesis: '', |
||||
|
sciThesis: '', |
||||
|
patent: '', |
||||
|
inventPatent: '', |
||||
|
practicalPatent: '', |
||||
|
facadePatent: '', |
||||
|
theSoft: '', |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
topicSubFormData.value.stageList = []; |
||||
|
|
||||
|
stageList.value.forEach(item => { |
||||
|
const obj = { |
||||
|
startTime: '', |
||||
|
endTime: '', |
||||
|
thesis: item.thesis, |
||||
|
sciThesis: item.sciThesis, |
||||
|
patent: item.patent, |
||||
|
inventPatent: item.inventPatent, |
||||
|
practicalPatent: item.practicalPatent, |
||||
|
facadePatent: item.facadePatent, |
||||
|
theSoft: item.theSoft, |
||||
|
}; |
||||
|
|
||||
|
item.date.forEach((val, key) => { |
||||
|
if (key === 0) { |
||||
|
obj.startTime = dayjs(val).format('x'); |
||||
|
} else { |
||||
|
obj.endTime = dayjs(val).format('x'); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
topicSubFormData.value.stageList.push(obj); |
||||
|
}); |
||||
|
|
||||
|
topicSubFormData.value.date.forEach((item, index) => { |
||||
|
if (index === 0) { |
||||
|
topicSubFormData.value.startTime = dayjs(item).format('x'); |
||||
|
} else { |
||||
|
topicSubFormData.value.endTime = dayjs(item).format('x'); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// const params = { param: topicSubFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(topicSubFormData.value), stageList.value); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,142 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="topicConclusionFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">结题日期</label> |
||||
|
<a-date-picker v-model:value="topicConclusionFormData.date" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">项目结题报告</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:pdf</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">上传课题结题报告</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import { InboxOutlined } from '@ant-design/icons-vue'; |
||||
|
import { uploadImg } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const headers = { Authorization: `Bearer ${token.value}` }; |
||||
|
const action = uploadImg; |
||||
|
const fileList = ref([]); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const topicConclusionFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
date: null, |
||||
|
fileIdList: [], |
||||
|
}); |
||||
|
|
||||
|
const handleChange = info => { |
||||
|
const resFileList = [...info.fileList]; |
||||
|
|
||||
|
// 数组去重 |
||||
|
const arr = ref([]); |
||||
|
resFileList.forEach(file => { |
||||
|
let num = -1; |
||||
|
|
||||
|
arr.value.forEach((item, index) => { |
||||
|
if (file.name === item.name) { |
||||
|
num = index; |
||||
|
} |
||||
|
}); |
||||
|
if (num > -1) { |
||||
|
arr.value.splice(num, 1); |
||||
|
} |
||||
|
|
||||
|
arr.value.push(file); |
||||
|
}); |
||||
|
|
||||
|
// 更改上传文件路径 |
||||
|
arr.value = arr.value.map(file => { |
||||
|
if (file.response) { |
||||
|
file.url = file.response.data[0].visitUrl; |
||||
|
file.id = file.response.data[0].id; |
||||
|
} |
||||
|
|
||||
|
return file; |
||||
|
}); |
||||
|
|
||||
|
fileList.value = arr.value; |
||||
|
}; |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
fileList.value.forEach(item => { |
||||
|
// let obj = { |
||||
|
// fileId: item.id, |
||||
|
// fileName: item.name, |
||||
|
// filePathL: item.url |
||||
|
// } |
||||
|
|
||||
|
// topicConclusionFormData.value.fileList.push(obj); |
||||
|
topicConclusionFormData.value.fileIdList.push(item.id); |
||||
|
}); |
||||
|
|
||||
|
// const params = { param: topicConclusionFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(topicConclusionFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,154 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="topicContractFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">合同名称</label> |
||||
|
<a-input v-model:value="topicContractFormData.name" placeholder="合同名称" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">合同编号</label> |
||||
|
<a-input v-model:value="topicContractFormData.number" placeholder="合同编号" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">合同甲方/委托方</label> |
||||
|
<a-input v-model:value="topicContractFormData.firstParty" placeholder="合同甲方/委托方" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">合同扫描</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:pdf</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">上传合同扫描件</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import { InboxOutlined } from '@ant-design/icons-vue'; |
||||
|
import { uploadImg } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const headers = { Authorization: `Bearer ${token.value}` }; |
||||
|
const action = uploadImg; |
||||
|
const fileList = ref([]); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const topicContractFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
name: '', |
||||
|
number: '', |
||||
|
firstParty: '', |
||||
|
fileIdList: [], |
||||
|
}); |
||||
|
|
||||
|
const handleChange = info => { |
||||
|
const resFileList = [...info.fileList]; |
||||
|
|
||||
|
// 数组去重 |
||||
|
const arr = ref([]); |
||||
|
resFileList.forEach(file => { |
||||
|
let num = -1; |
||||
|
|
||||
|
arr.value.forEach((item, index) => { |
||||
|
if (file.name === item.name) { |
||||
|
num = index; |
||||
|
} |
||||
|
}); |
||||
|
if (num > -1) { |
||||
|
arr.value.splice(num, 1); |
||||
|
} |
||||
|
|
||||
|
arr.value.push(file); |
||||
|
}); |
||||
|
|
||||
|
// 更改上传文件路径 |
||||
|
arr.value = arr.value.map(file => { |
||||
|
if (file.response) { |
||||
|
file.url = file.response.data[0].visitUrl; |
||||
|
file.id = file.response.data[0].id; |
||||
|
} |
||||
|
|
||||
|
return file; |
||||
|
}); |
||||
|
|
||||
|
fileList.value = arr.value; |
||||
|
}; |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
fileList.value.forEach(item => { |
||||
|
// let obj = { |
||||
|
// fileId: item.id, |
||||
|
// fileName: item.name, |
||||
|
// filePathL: item.url |
||||
|
// } |
||||
|
|
||||
|
// topicContractFormData.value.fileList.push(obj); |
||||
|
topicContractFormData.value.fileIdList.push(item.id); |
||||
|
}); |
||||
|
|
||||
|
// const params = { param: topicContractFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(topicContractFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,117 @@ |
|||||
|
<template> |
||||
|
<div class="flex flex-wrap"> |
||||
|
<a-card title="解锁申请"> |
||||
|
<p><span class="color-9">申请人</span><span class="color-3">子课题负责人</span></p> |
||||
|
<p><span class="color-9">申请时间</span><span class="color-3">2021-09-17 10:30</span></p> |
||||
|
<p><span class="color-9">申请原因</span><span class="color-3">修改交付物</span></p> |
||||
|
<div class="flex justify-end"> |
||||
|
<a-button class="action-btn edit-btn" type="primary">通过</a-button> |
||||
|
<a-button class="action-btn del-btn" type="primary">驳回</a-button> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
|
||||
|
<a-card title="解锁申请"> |
||||
|
<p><span class="color-9">申请人</span><span class="color-3">子课题负责人</span></p> |
||||
|
<p><span class="color-9">申请时间</span><span class="color-3">2021-09-17 10:30</span></p> |
||||
|
<p><span class="color-9">申请原因</span><span class="color-3">修改交付物</span></p> |
||||
|
<div class="flex justify-end"> |
||||
|
<a-button class="action-btn edit-btn" type="primary">通过</a-button> |
||||
|
<a-button class="action-btn del-btn" type="primary">驳回</a-button> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
|
||||
|
<a-card title="解锁申请"> |
||||
|
<p><span class="color-9">申请人</span><span class="color-3">子课题负责人</span></p> |
||||
|
<p><span class="color-9">申请时间</span><span class="color-3">2021-09-17 10:30</span></p> |
||||
|
<p><span class="color-9">申请原因</span><span class="color-3">修改交付物</span></p> |
||||
|
<div class="flex justify-end"> |
||||
|
<a-button class="action-btn edit-btn" type="primary">通过</a-button> |
||||
|
<a-button class="action-btn del-btn" type="primary">驳回</a-button> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
|
||||
|
<a-card title="解锁申请"> |
||||
|
<p><span class="color-9">申请人</span><span class="color-3">子课题负责人</span></p> |
||||
|
<p><span class="color-9">申请时间</span><span class="color-3">2021-09-17 10:30</span></p> |
||||
|
<p><span class="color-9">申请原因</span><span class="color-3">修改交付物</span></p> |
||||
|
<div class="flex justify-end"> |
||||
|
<a-button class="action-btn edit-btn" type="primary">通过</a-button> |
||||
|
<a-button class="action-btn del-btn" type="primary">驳回</a-button> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<style scoped> |
||||
|
.ant-card { |
||||
|
border-radius: 10px; |
||||
|
margin-right: 16px; |
||||
|
margin-bottom: 16px; |
||||
|
} |
||||
|
|
||||
|
@media screen and (max-width: 1650px) { |
||||
|
.ant-card { |
||||
|
width: calc(50% - 8px); |
||||
|
} |
||||
|
|
||||
|
.ant-card:nth-child(2n) { |
||||
|
margin-right: 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@media screen and (min-width: 1651px) { |
||||
|
.ant-card { |
||||
|
width: calc((100% - 32px) / 3); |
||||
|
} |
||||
|
|
||||
|
.ant-card:nth-child(3n) { |
||||
|
margin-right: 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-card-head) { |
||||
|
padding: 0 16px; |
||||
|
height: 45px; |
||||
|
min-height: 45px; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-card-head-title) { |
||||
|
padding: 0; |
||||
|
line-height: 45px; |
||||
|
font-size: 14px; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-card-body) { |
||||
|
padding: 24px 16px; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-card-body) p { |
||||
|
line-height: 1; |
||||
|
margin-bottom: 16px; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-card-body) p span:first-of-type { |
||||
|
display: inline-block; |
||||
|
width: 80px; |
||||
|
} |
||||
|
|
||||
|
.action-btn { |
||||
|
width: 50px !important; |
||||
|
height: 28px !important; |
||||
|
font-size: 14px !important; |
||||
|
padding: 0; |
||||
|
letter-spacing: 0 !important; |
||||
|
} |
||||
|
|
||||
|
.edit-btn { |
||||
|
background: #0dc26c; |
||||
|
border: 0; |
||||
|
} |
||||
|
|
||||
|
.del-btn { |
||||
|
margin-left: 16px; |
||||
|
background: #ff5353; |
||||
|
border: 0; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,84 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="experCodeFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验时间</label> |
||||
|
<a-date-picker v-model:value="experCodeFormData.date" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验人</label> |
||||
|
<a-input v-model:value="experCodeFormData.member" placeholder="实验人" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验程序代码</label> |
||||
|
<a-input v-model:value="experCodeFormData.codeUrl" placeholder="github链接" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">确定</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const experCodeFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
date: null, |
||||
|
member: '', |
||||
|
codeUrl: '', |
||||
|
}); |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
// const params = { param: experCodeFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(experCodeFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,84 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="experDataFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验时间</label> |
||||
|
<a-date-picker v-model:value="experDataFormData.date" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验人</label> |
||||
|
<a-input v-model:value="experDataFormData.member" placeholder="实验人" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验数据</label> |
||||
|
<a-input v-model:value="experDataFormData.data" placeholder="github链接" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">确定</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const experDataFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
date: null, |
||||
|
member: '', |
||||
|
data: '', |
||||
|
}); |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
// const params = { param: experDataFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(experDataFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,78 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="experResultFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">结论</label> |
||||
|
<a-textarea v-model:value="experResultFormData.result" placeholder="结论" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验程序代码</label> |
||||
|
<a-input v-model:value="experResultFormData.codeUrl" placeholder="github链接" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">确定</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const experResultFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
result: '', |
||||
|
codeUrl: '', |
||||
|
}); |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
// const params = { param: experResultFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(experResultFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,142 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="topicMetaphaseFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">检查日期</label> |
||||
|
<a-date-picker v-model:value="topicMetaphaseFormData.date" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">中期检查报告</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:pdf</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">上传中期检查报告</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import { InboxOutlined } from '@ant-design/icons-vue'; |
||||
|
import { uploadImg } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const headers = { Authorization: `Bearer ${token.value}` }; |
||||
|
const action = uploadImg; |
||||
|
const fileList = ref([]); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const topicMetaphaseFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
date: null, |
||||
|
fileIdList: [], |
||||
|
}); |
||||
|
|
||||
|
const handleChange = info => { |
||||
|
const resFileList = [...info.fileList]; |
||||
|
|
||||
|
// 数组去重 |
||||
|
const arr = ref([]); |
||||
|
resFileList.forEach(file => { |
||||
|
let num = -1; |
||||
|
|
||||
|
arr.value.forEach((item, index) => { |
||||
|
if (file.name === item.name) { |
||||
|
num = index; |
||||
|
} |
||||
|
}); |
||||
|
if (num > -1) { |
||||
|
arr.value.splice(num, 1); |
||||
|
} |
||||
|
|
||||
|
arr.value.push(file); |
||||
|
}); |
||||
|
|
||||
|
// 更改上传文件路径 |
||||
|
arr.value = arr.value.map(file => { |
||||
|
if (file.response) { |
||||
|
file.url = file.response.data[0].visitUrl; |
||||
|
file.id = file.response.data[0].id; |
||||
|
} |
||||
|
|
||||
|
return file; |
||||
|
}); |
||||
|
|
||||
|
fileList.value = arr.value; |
||||
|
}; |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
fileList.value.forEach(item => { |
||||
|
// let obj = { |
||||
|
// fileId: item.id, |
||||
|
// fileName: item.name, |
||||
|
// filePathL: item.url |
||||
|
// } |
||||
|
|
||||
|
// topicMetaphaseFormData.value.fileList.push(obj); |
||||
|
topicMetaphaseFormData.value.fileIdList.push(item.id); |
||||
|
}); |
||||
|
|
||||
|
// const params = { param: topicMetaphaseFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(topicMetaphaseFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,125 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="topicMeetFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验名称</label> |
||||
|
<a-input v-model:value="topicMeetFormData.name" placeholder="实验名称" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验人</label> |
||||
|
<a-input v-model:value="topicMeetFormData.members" placeholder="实验人1;实验人2;实验人3" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验日期</label> |
||||
|
<a-date-picker v-model:value="topicMeetFormData.date" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验地点</label> |
||||
|
<a-input v-model:value="topicMeetFormData.address" placeholder="实验地点" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">仪器用具/软件</label> |
||||
|
<a-input v-model:value="topicMeetFormData.tools" placeholder="仪器用具/软件" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验原理</label> |
||||
|
<a-input v-model:value="topicMeetFormData.principle" placeholder="实验原理" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验步骤</label> |
||||
|
<a-input v-model:value="topicMeetFormData.step" placeholder="实验步骤" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验报告</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:word</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit">确定</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
// import { computed, watch, ref } from 'vue'; |
||||
|
import { ref, computed } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
// import { message } from 'ant-design-vue'; |
||||
|
import { InboxOutlined } from '@ant-design/icons-vue'; |
||||
|
import { uploadImg } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const headers = { Authorization: `Bearer ${token.value}` }; |
||||
|
const action = uploadImg; |
||||
|
const fileList = ref([]); |
||||
|
const topicMeetFormData = ref({ |
||||
|
name: '', |
||||
|
members: '', |
||||
|
date: null, |
||||
|
address: '', |
||||
|
tools: '', |
||||
|
principle: '', |
||||
|
step: '', |
||||
|
fileList: [], |
||||
|
}); |
||||
|
|
||||
|
const handleChange = info => { |
||||
|
const resFileList = [...info.fileList]; |
||||
|
|
||||
|
// 数组去重 |
||||
|
const arr = ref([]); |
||||
|
resFileList.forEach(file => { |
||||
|
let flag = false; |
||||
|
|
||||
|
arr.value.forEach(item => { |
||||
|
if (file.name === item.name) { |
||||
|
flag = true; |
||||
|
} |
||||
|
}); |
||||
|
if (!flag) { |
||||
|
arr.value.push(file); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 更改上传文件路径 |
||||
|
arr.value = arr.value.map(file => { |
||||
|
if (file.response) { |
||||
|
file.url = file.response.data[0].visitUrl; |
||||
|
} |
||||
|
|
||||
|
return file; |
||||
|
}); |
||||
|
|
||||
|
fileList.value = arr.value; |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,148 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="procedureFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验时间</label> |
||||
|
<a-date-picker v-model:value="procedureFormData.date" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验人</label> |
||||
|
<a-input v-model:value="procedureFormData.member" placeholder="实验人" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">实验过程</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:word</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">确定</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import { InboxOutlined } from '@ant-design/icons-vue'; |
||||
|
import { uploadImg } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const headers = { Authorization: `Bearer ${token.value}` }; |
||||
|
const action = uploadImg; |
||||
|
const fileList = ref([]); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const procedureFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
date: null, |
||||
|
member: '', |
||||
|
fileIdList: [], |
||||
|
}); |
||||
|
|
||||
|
const handleChange = info => { |
||||
|
const resFileList = [...info.fileList]; |
||||
|
|
||||
|
// 数组去重 |
||||
|
const arr = ref([]); |
||||
|
resFileList.forEach(file => { |
||||
|
let num = -1; |
||||
|
|
||||
|
arr.value.forEach((item, index) => { |
||||
|
if (file.name === item.name) { |
||||
|
num = index; |
||||
|
} |
||||
|
}); |
||||
|
if (num > -1) { |
||||
|
arr.value.splice(num, 1); |
||||
|
} |
||||
|
|
||||
|
arr.value.push(file); |
||||
|
}); |
||||
|
|
||||
|
// 更改上传文件路径 |
||||
|
arr.value = arr.value.map(file => { |
||||
|
if (file.response) { |
||||
|
file.url = file.response.data[0].visitUrl; |
||||
|
file.id = file.response.data[0].id; |
||||
|
} |
||||
|
|
||||
|
return file; |
||||
|
}); |
||||
|
|
||||
|
fileList.value = arr.value; |
||||
|
}; |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
fileList.value.forEach(item => { |
||||
|
// let obj = { |
||||
|
// fileId: item.id, |
||||
|
// fileName: item.name, |
||||
|
// filePathL: item.url |
||||
|
// } |
||||
|
|
||||
|
// procedureFormData.value.fileList.push(obj); |
||||
|
procedureFormData.value.fileIdList.push(item.id); |
||||
|
}); |
||||
|
|
||||
|
// const params = { param: procedureFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(procedureFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,148 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="topicResultFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">项目名称</label> |
||||
|
<a-input v-model:value="topicResultFormData.name" placeholder="项目名称" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">验收人</label> |
||||
|
<a-input v-model:value="topicResultFormData.receiver" placeholder="验收人" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">验收证书</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:pdf</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">上传验收证书</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import { InboxOutlined } from '@ant-design/icons-vue'; |
||||
|
import { uploadImg } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const headers = { Authorization: `Bearer ${token.value}` }; |
||||
|
const action = uploadImg; |
||||
|
const fileList = ref([]); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const topicResultFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
name: '', |
||||
|
receiver: '', |
||||
|
fileIdList: [], |
||||
|
}); |
||||
|
|
||||
|
const handleChange = info => { |
||||
|
const resFileList = [...info.fileList]; |
||||
|
|
||||
|
// 数组去重 |
||||
|
const arr = ref([]); |
||||
|
resFileList.forEach(file => { |
||||
|
let num = -1; |
||||
|
|
||||
|
arr.value.forEach((item, index) => { |
||||
|
if (file.name === item.name) { |
||||
|
num = index; |
||||
|
} |
||||
|
}); |
||||
|
if (num > -1) { |
||||
|
arr.value.splice(num, 1); |
||||
|
} |
||||
|
|
||||
|
arr.value.push(file); |
||||
|
}); |
||||
|
|
||||
|
// 更改上传文件路径 |
||||
|
arr.value = arr.value.map(file => { |
||||
|
if (file.response) { |
||||
|
file.url = file.response.data[0].visitUrl; |
||||
|
file.id = file.response.data[0].id; |
||||
|
} |
||||
|
|
||||
|
return file; |
||||
|
}); |
||||
|
|
||||
|
fileList.value = arr.value; |
||||
|
}; |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
fileList.value.forEach(item => { |
||||
|
// let obj = { |
||||
|
// fileId: item.id, |
||||
|
// fileName: item.name, |
||||
|
// filePathL: item.url |
||||
|
// } |
||||
|
|
||||
|
// topicResultFormData.value.fileList.push(obj); |
||||
|
topicResultFormData.value.fileIdList.push(item.id); |
||||
|
}); |
||||
|
|
||||
|
// const params = { param: topicResultFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(topicResultFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,142 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="subTopicConclusionFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">结题日期</label> |
||||
|
<a-date-picker v-model:value="subTopicConclusionFormData.date" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">课题结题报告</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:pdf</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">上传课题结题报告</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import { InboxOutlined } from '@ant-design/icons-vue'; |
||||
|
import { uploadImg } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const headers = { Authorization: `Bearer ${token.value}` }; |
||||
|
const action = uploadImg; |
||||
|
const fileList = ref([]); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const subTopicConclusionFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
date: null, |
||||
|
fileIdList: [], |
||||
|
}); |
||||
|
|
||||
|
const handleChange = info => { |
||||
|
const resFileList = [...info.fileList]; |
||||
|
|
||||
|
// 数组去重 |
||||
|
const arr = ref([]); |
||||
|
resFileList.forEach(file => { |
||||
|
let num = -1; |
||||
|
|
||||
|
arr.value.forEach((item, index) => { |
||||
|
if (file.name === item.name) { |
||||
|
num = index; |
||||
|
} |
||||
|
}); |
||||
|
if (num > -1) { |
||||
|
arr.value.splice(num, 1); |
||||
|
} |
||||
|
|
||||
|
arr.value.push(file); |
||||
|
}); |
||||
|
|
||||
|
// 更改上传文件路径 |
||||
|
arr.value = arr.value.map(file => { |
||||
|
if (file.response) { |
||||
|
file.url = file.response.data[0].visitUrl; |
||||
|
file.id = file.response.data[0].id; |
||||
|
} |
||||
|
|
||||
|
return file; |
||||
|
}); |
||||
|
|
||||
|
fileList.value = arr.value; |
||||
|
}; |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
fileList.value.forEach(item => { |
||||
|
// let obj = { |
||||
|
// fileId: item.id, |
||||
|
// fileName: item.name, |
||||
|
// filePathL: item.url |
||||
|
// } |
||||
|
|
||||
|
// subTopicConclusionFormData.value.fileList.push(obj); |
||||
|
subTopicConclusionFormData.value.fileIdList.push(item.id); |
||||
|
}); |
||||
|
|
||||
|
// const params = { param: subTopicConclusionFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(subTopicConclusionFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,142 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="subTopicMetaphaseFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">检查日期</label> |
||||
|
<a-date-picker v-model:value="subTopicMetaphaseFormData.date" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">中期检查报告</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:pdf</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">上传中期检查报告</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import { InboxOutlined } from '@ant-design/icons-vue'; |
||||
|
import { uploadImg } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const headers = { Authorization: `Bearer ${token.value}` }; |
||||
|
const action = uploadImg; |
||||
|
const fileList = ref([]); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const subTopicMetaphaseFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
date: null, |
||||
|
fileIdList: [], |
||||
|
}); |
||||
|
|
||||
|
const handleChange = info => { |
||||
|
const resFileList = [...info.fileList]; |
||||
|
|
||||
|
// 数组去重 |
||||
|
const arr = ref([]); |
||||
|
resFileList.forEach(file => { |
||||
|
let num = -1; |
||||
|
|
||||
|
arr.value.forEach((item, index) => { |
||||
|
if (file.name === item.name) { |
||||
|
num = index; |
||||
|
} |
||||
|
}); |
||||
|
if (num > -1) { |
||||
|
arr.value.splice(num, 1); |
||||
|
} |
||||
|
|
||||
|
arr.value.push(file); |
||||
|
}); |
||||
|
|
||||
|
// 更改上传文件路径 |
||||
|
arr.value = arr.value.map(file => { |
||||
|
if (file.response) { |
||||
|
file.url = file.response.data[0].visitUrl; |
||||
|
file.id = file.response.data[0].id; |
||||
|
} |
||||
|
|
||||
|
return file; |
||||
|
}); |
||||
|
|
||||
|
fileList.value = arr.value; |
||||
|
}; |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
fileList.value.forEach(item => { |
||||
|
// let obj = { |
||||
|
// fileId: item.id, |
||||
|
// fileName: item.name, |
||||
|
// filePathL: item.url |
||||
|
// } |
||||
|
|
||||
|
// subTopicMetaphaseFormData.value.fileList.push(obj); |
||||
|
subTopicMetaphaseFormData.value.fileIdList.push(item.id); |
||||
|
}); |
||||
|
|
||||
|
// const params = { param: subTopicMetaphaseFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(subTopicMetaphaseFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,122 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="topicMeetFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">会议名称</label> |
||||
|
<a-input v-model:value="topicMeetFormData.name" placeholder="会议名称" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">会议日期</label> |
||||
|
<a-space direction="vertical" :size="12"> |
||||
|
<a-range-picker v-model:value="topicMeetFormData.date" /> |
||||
|
</a-space> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">会议地点</label> |
||||
|
<a-input v-model:value="topicMeetFormData.address" placeholder="会议地点" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">会议纪要</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:jpg、jpeg、rar、zip</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">照片附件/其他</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:pdf</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit">上传会议记录</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
// import { computed, watch, ref } from 'vue'; |
||||
|
import { ref, computed } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
// import { message } from 'ant-design-vue'; |
||||
|
import { InboxOutlined } from '@ant-design/icons-vue'; |
||||
|
import { uploadImg } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const headers = { Authorization: `Bearer ${token.value}` }; |
||||
|
const action = uploadImg; |
||||
|
const fileList = ref([]); |
||||
|
const topicMeetFormData = ref({ |
||||
|
name: '', |
||||
|
date: [], |
||||
|
address: '', |
||||
|
fileList: [], |
||||
|
}); |
||||
|
|
||||
|
const handleChange = info => { |
||||
|
const resFileList = [...info.fileList]; |
||||
|
|
||||
|
// 数组去重 |
||||
|
const arr = ref([]); |
||||
|
resFileList.forEach(file => { |
||||
|
let flag = false; |
||||
|
|
||||
|
arr.value.forEach(item => { |
||||
|
if (file.name === item.name) { |
||||
|
flag = true; |
||||
|
} |
||||
|
}); |
||||
|
if (!flag) { |
||||
|
arr.value.push(file); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 更改上传文件路径 |
||||
|
arr.value = arr.value.map(file => { |
||||
|
if (file.response) { |
||||
|
file.url = file.response.data[0].visitUrl; |
||||
|
} |
||||
|
|
||||
|
return file; |
||||
|
}); |
||||
|
|
||||
|
fileList.value = arr.value; |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,142 @@ |
|||||
|
<template> |
||||
|
<div class="task-form bg-white border-radius-10"> |
||||
|
<a-form ref="formRef" :model="subTopicResultFormData"> |
||||
|
<a-form-item> |
||||
|
<label class="color-3">验收日期</label> |
||||
|
<a-date-picker v-model:value="subTopicResultFormData.date" /> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item> |
||||
|
<label class="color-3">验收证书</label> |
||||
|
<a-upload-dragger |
||||
|
v-model:fileList="fileList" |
||||
|
name="files" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
:headers="headers" |
||||
|
:accept="'.pdf'" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<p class="ant-upload-drag-icon"> |
||||
|
<inbox-outlined></inbox-outlined> |
||||
|
</p> |
||||
|
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> |
||||
|
<p class="ant-upload-hint color-c">格式:pdf</p> |
||||
|
</a-upload-dragger> |
||||
|
</a-form-item> |
||||
|
|
||||
|
<a-form-item class="text-right"> |
||||
|
<a-button type="primary" html-type="submit" @click="onSubmit">上传验收证书</a-button> |
||||
|
</a-form-item> |
||||
|
</a-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, toRaw } from 'vue'; |
||||
|
import { useStore } from 'vuex'; |
||||
|
import { InboxOutlined } from '@ant-design/icons-vue'; |
||||
|
import { uploadImg } from 'apis'; |
||||
|
|
||||
|
const store = useStore(); |
||||
|
const formRef = ref(null); |
||||
|
const sessionProject = sessionStorage.getItem('project'); |
||||
|
const projectId = computed(() => store.getters['projects/projectId']); |
||||
|
const token = computed(() => store.getters['user/token']); |
||||
|
const headers = { Authorization: `Bearer ${token.value}` }; |
||||
|
const action = uploadImg; |
||||
|
const fileList = ref([]); |
||||
|
|
||||
|
if (sessionProject) { |
||||
|
const project = JSON.parse(sessionProject); |
||||
|
store.commit('projects/setProject', project); |
||||
|
} |
||||
|
|
||||
|
const subTopicResultFormData = ref({ |
||||
|
projectId: projectId.value, |
||||
|
code: '', |
||||
|
date: null, |
||||
|
fileIdList: [], |
||||
|
}); |
||||
|
|
||||
|
const handleChange = info => { |
||||
|
const resFileList = [...info.fileList]; |
||||
|
|
||||
|
// 数组去重 |
||||
|
const arr = ref([]); |
||||
|
resFileList.forEach(file => { |
||||
|
let num = -1; |
||||
|
|
||||
|
arr.value.forEach((item, index) => { |
||||
|
if (file.name === item.name) { |
||||
|
num = index; |
||||
|
} |
||||
|
}); |
||||
|
if (num > -1) { |
||||
|
arr.value.splice(num, 1); |
||||
|
} |
||||
|
|
||||
|
arr.value.push(file); |
||||
|
}); |
||||
|
|
||||
|
// 更改上传文件路径 |
||||
|
arr.value = arr.value.map(file => { |
||||
|
if (file.response) { |
||||
|
file.url = file.response.data[0].visitUrl; |
||||
|
file.id = file.response.data[0].id; |
||||
|
} |
||||
|
|
||||
|
return file; |
||||
|
}); |
||||
|
|
||||
|
fileList.value = arr.value; |
||||
|
}; |
||||
|
|
||||
|
const onSubmit = () => { |
||||
|
fileList.value.forEach(item => { |
||||
|
// let obj = { |
||||
|
// fileId: item.id, |
||||
|
// fileName: item.name, |
||||
|
// filePathL: item.url |
||||
|
// } |
||||
|
|
||||
|
// subTopicResultFormData.value.fileList.push(obj); |
||||
|
subTopicResultFormData.value.fileIdList.push(item.id); |
||||
|
}); |
||||
|
|
||||
|
// const params = { param: subTopicResultFormData.value }; |
||||
|
|
||||
|
// saveSubExperiment(params); |
||||
|
console.log('submit!', toRaw(subTopicResultFormData.value)); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.task-detail { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.ant-col { |
||||
|
margin-top: 10px; |
||||
|
} |
||||
|
|
||||
|
.ant-col:nth-child(-n + 4) { |
||||
|
margin-top: 2px; |
||||
|
} |
||||
|
|
||||
|
.deliverables .ant-input, |
||||
|
.deliverables-son .ant-input { |
||||
|
width: 23px; |
||||
|
height: 14px; |
||||
|
border-radius: 0; |
||||
|
padding: 0; |
||||
|
font-size: 12px; |
||||
|
color: #1890ff; |
||||
|
text-align: center; |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
.deliverables-son { |
||||
|
margin-top: 10px !important; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,206 @@ |
|||||
|
<template> |
||||
|
<div class="task-progress flex flex-wrap justify-between"> |
||||
|
<div class="wrap overflow-hidden"> |
||||
|
<a-card title="任务目标"> |
||||
|
<div class="flex flex-wrap justify-center"> |
||||
|
<div class="achievements border-right text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">论文</p> |
||||
|
</div> |
||||
|
<div class="achievements border-bottom text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">专利</p> |
||||
|
</div> |
||||
|
<div class="achievements border-top text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">软著</p> |
||||
|
</div> |
||||
|
<div class="achievements border-left text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">会议</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
</div> |
||||
|
<div class="wrap overflow-hidden"> |
||||
|
<a-card title="概览"> |
||||
|
<div class="topic"> |
||||
|
<p>脑卒中远程康复与健康监护系统</p> |
||||
|
<a-progress |
||||
|
:percent="30" |
||||
|
:strokeWidth="22" |
||||
|
:show-info="false" |
||||
|
:stroke-color="'#1890FF'" |
||||
|
:trail-color="'rgba(24, 144, 255, 0.2)'" |
||||
|
/> |
||||
|
</div> |
||||
|
|
||||
|
<div class="sub-topic flex justify-between flex-wrap"> |
||||
|
<div class="topic"> |
||||
|
<p>穿戴式运动捕获单元</p> |
||||
|
<a-progress |
||||
|
:percent="30" |
||||
|
:strokeWidth="22" |
||||
|
:show-info="false" |
||||
|
:stroke-color="colorList[0].color" |
||||
|
:trail-color="colorList[0].bgColor" |
||||
|
/> |
||||
|
</div> |
||||
|
|
||||
|
<div class="topic"> |
||||
|
<p>穿戴式康复数据手套</p> |
||||
|
<a-progress |
||||
|
:percent="30" |
||||
|
:strokeWidth="22" |
||||
|
:show-info="false" |
||||
|
:stroke-color="colorList[1].color" |
||||
|
:trail-color="colorList[1].bgColor" |
||||
|
/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
</div> |
||||
|
<div class="wrap overflow-hidden"> |
||||
|
<a-card title="穿戴式运动捕获单元"> |
||||
|
<div class="flex flex-wrap justify-center"> |
||||
|
<div class="achievements border-right text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">论文</p> |
||||
|
</div> |
||||
|
<div class="achievements border-bottom text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">专利</p> |
||||
|
</div> |
||||
|
<div class="achievements border-top text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">软著</p> |
||||
|
</div> |
||||
|
<div class="achievements border-left text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">会议</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
</div> |
||||
|
<div class="wrap overflow-hidden"> |
||||
|
<a-card title="穿戴式康复数据手套"> |
||||
|
<div class="flex flex-wrap justify-center"> |
||||
|
<div class="achievements border-right text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">论文</p> |
||||
|
</div> |
||||
|
<div class="achievements border-bottom text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">专利</p> |
||||
|
</div> |
||||
|
<div class="achievements border-top text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">软著</p> |
||||
|
</div> |
||||
|
<div class="achievements border-left text-center"> |
||||
|
<p class="num">1/6</p> |
||||
|
<p class="name">会议</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
// import { computed, watch, ref } from 'vue'; |
||||
|
import { ref } from 'vue'; |
||||
|
|
||||
|
// import { useStore } from 'vuex'; |
||||
|
|
||||
|
// const store = useStore(); |
||||
|
|
||||
|
const colorList = ref([ |
||||
|
{ color: '#FF9191', bgColor: 'rgba(255, 145, 145, 0.2)' }, |
||||
|
{ color: '#FF934B', bgColor: 'rgba(255, 147, 75, 0.2)' }, |
||||
|
]); |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.wrap { |
||||
|
margin-top: 16px; |
||||
|
width: calc((100% - 16px) / 2); |
||||
|
background-color: #fff; |
||||
|
border-radius: 10px; |
||||
|
border: 1px solid #cccccc; |
||||
|
} |
||||
|
|
||||
|
.wrap:nth-child(-n + 2) { |
||||
|
margin-top: 0; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-card-head) { |
||||
|
padding: 0 16px; |
||||
|
min-height: 45px; |
||||
|
max-height: 45px; |
||||
|
border-color: #cccccc; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
|
||||
|
:deep(.ant-card-head-title) { |
||||
|
padding: 0; |
||||
|
line-height: 45px; |
||||
|
} |
||||
|
|
||||
|
.wrap .num { |
||||
|
font-size: 22px; |
||||
|
color: #4b8aff; |
||||
|
} |
||||
|
|
||||
|
.wrap .name { |
||||
|
color: #666666; |
||||
|
} |
||||
|
|
||||
|
.wrap p { |
||||
|
margin: 0; |
||||
|
} |
||||
|
|
||||
|
.border-right { |
||||
|
border-right: 1px solid #cccccc; |
||||
|
margin-right: -1px; |
||||
|
} |
||||
|
|
||||
|
.border-left { |
||||
|
border-left: 1px solid #cccccc; |
||||
|
} |
||||
|
|
||||
|
.border-top { |
||||
|
border-top: 1px solid #cccccc; |
||||
|
margin-top: -1px; |
||||
|
} |
||||
|
|
||||
|
.border-bottom { |
||||
|
border-bottom: 1px solid #cccccc; |
||||
|
} |
||||
|
|
||||
|
.achievements { |
||||
|
width: 40%; |
||||
|
padding: 25px 0; |
||||
|
} |
||||
|
|
||||
|
.topic p { |
||||
|
margin-bottom: 8px; |
||||
|
color: #666666; |
||||
|
} |
||||
|
|
||||
|
.sub-topic .topic { |
||||
|
margin-top: 40px; |
||||
|
width: calc((100% - 32px) / 2); |
||||
|
} |
||||
|
|
||||
|
.ant-card { |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.ant-card :deep(.ant-card-body) { |
||||
|
height: calc(100% - 48px); |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
</style> |
Loading…
Reference in new issue