forked from TALL/tall3-pc-keti
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
246 lines
6.1 KiB
246 lines
6.1 KiB
<template>
|
|
<div class="task-form bg-white border-radius-10">
|
|
<a-form>
|
|
<div v-for="(item, index) in questionList" :key="index">
|
|
<template v-if="item.type === 1">
|
|
<a-form-item>
|
|
<label class="color-3">{{ item.question }}</label>
|
|
<a-input v-model:value="item.con" :placeholder="item.question" />
|
|
</a-form-item>
|
|
</template>
|
|
|
|
<template v-if="item.type === 2">
|
|
<a-form-item>
|
|
<label class="color-3">{{ item.question }}</label>
|
|
<a-textarea v-model:value="item.con" :placeholder="item.question" />
|
|
</a-form-item>
|
|
</template>
|
|
|
|
<template v-if="item.type === 3"> </template>
|
|
|
|
<template v-if="item.type === 4"> </template>
|
|
|
|
<template v-if="item.type === 5"> </template>
|
|
|
|
<template v-if="item.type === 6">
|
|
<a-form-item>
|
|
<label class="color-3">{{ item.question }}</label>
|
|
<a-date-picker v-model:value="item.date" />
|
|
</a-form-item>
|
|
</template>
|
|
|
|
<template v-if="item.type === 7">
|
|
<a-form-item>
|
|
<label class="color-3">{{ item.question }}</label>
|
|
<a-upload-dragger
|
|
v-model:fileList="item.files"
|
|
name="param"
|
|
:multiple="true"
|
|
:action="action"
|
|
:headers="headers"
|
|
:accept="'.pdf'"
|
|
:before-upload="beforeUpload(index)"
|
|
@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>
|
|
</template>
|
|
</div>
|
|
|
|
<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 } from 'vue';
|
|
import { useStore } from 'vuex';
|
|
import dayjs from 'dayjs';
|
|
import { InboxOutlined } from '@ant-design/icons-vue';
|
|
import { uploadImg } from 'apis';
|
|
// import { message } from 'ant-design-vue';
|
|
|
|
const store = useStore();
|
|
|
|
// 上传文件相关
|
|
const token = computed(() => store.getters['user/token']);
|
|
const headers = { Authorization: `Bearer ${token.value}` };
|
|
const action = uploadImg;
|
|
// 查找、提交相关
|
|
const projectId = computed(() => store.getters['projects/projectId']); // 项目ID
|
|
const code = computed(() => store.state.task.label); // code
|
|
const questionList = ref([]);
|
|
// 当前操作的问题下标
|
|
const currIndex = ref(null);
|
|
|
|
// 课题起止时间
|
|
// const subStartTime = computed(() => store.state.layout.subStartTime);
|
|
// const subEndTime = computed(() => store.state.layout.subEndTime);
|
|
|
|
getDataByCode();
|
|
|
|
const beforeUpload = index => {
|
|
currIndex.value = index;
|
|
};
|
|
|
|
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.filePath;
|
|
file.id = file.response.data.fileId;
|
|
}
|
|
|
|
return file;
|
|
});
|
|
|
|
questionList.value[currIndex.value].files = arr.value;
|
|
};
|
|
|
|
const onSubmit = async () => {
|
|
const params = {
|
|
param: {
|
|
code: code.value,
|
|
projectId: projectId.value,
|
|
questionAndAnswerList: [],
|
|
},
|
|
};
|
|
|
|
const arr = [];
|
|
questionList.value.forEach(item => {
|
|
const obj = {
|
|
questionId: item.questionId,
|
|
answerList: [],
|
|
};
|
|
|
|
if (item.type === 1 || item.type === 2) {
|
|
obj.answerList.push(item.con);
|
|
}
|
|
|
|
if (item.type === 6 && item.date) {
|
|
const time = dayjs(item.date).format('x');
|
|
// if (time < subStartTime.value || time > subEndTime.value) {
|
|
// message.info('中期检查时间必须在子课题起止时间之内');
|
|
// return false;
|
|
// }
|
|
obj.answerList.push(time);
|
|
}
|
|
|
|
if (item.type === 7) {
|
|
item.files.forEach(val => {
|
|
const file = {
|
|
id: val.id,
|
|
name: val.name,
|
|
url: val.url,
|
|
};
|
|
obj.answerList.push(JSON.stringify(file));
|
|
});
|
|
}
|
|
arr.push(obj);
|
|
});
|
|
|
|
params.param.questionAndAnswerList = arr;
|
|
await store.dispatch('task/submitAnswer', params);
|
|
getDataByCode();
|
|
};
|
|
|
|
async function getDataByCode() {
|
|
const params = {
|
|
param: {
|
|
code: code.value,
|
|
projectId: projectId.value,
|
|
intellectualId: null,
|
|
},
|
|
};
|
|
const data = await store.dispatch('task/getByCode', params);
|
|
|
|
data.forEach(item => {
|
|
if (item.type === 1 || item.type === 2) {
|
|
item.con = '';
|
|
|
|
if (item.answerList.length > 0) {
|
|
item.con = item.answerList[0].answer;
|
|
}
|
|
}
|
|
|
|
if (item.type === 6) {
|
|
item.date = null;
|
|
|
|
if (item.answerList.length > 0) {
|
|
if (item.answerList[0].answer) {
|
|
item.date = dayjs(Number(item.answerList[0].answer)).format('YYYY-MM-DD');
|
|
item.date = dayjs(item.date, 'YYYY-MM-DD');
|
|
}
|
|
}
|
|
}
|
|
|
|
if (item.type === 7) {
|
|
item.files = [];
|
|
|
|
if (item.answerList.length > 0) {
|
|
item.answerList.forEach(val => {
|
|
if (val.answer) val.answer = JSON.parse(val.answer);
|
|
item.files.push(val.answer);
|
|
});
|
|
}
|
|
}
|
|
});
|
|
questionList.value = data;
|
|
}
|
|
</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>
|
|
|