Browse Source

feat: "课题中期检查报告、结题报告、验收证书、子课题论文、专利、软著、中期报告、结题报告、验收证书、实验报告、过程、数据、代码、结果"

master
xuesinan 4 years ago
parent
commit
062ea6ef45
  1. 15
      src/apis/index.js
  2. 2
      src/components/tall/center/Global.vue
  3. 12
      src/components/tall/center/RegularTask.vue
  4. 4
      src/components/tall/left/Projects.vue
  5. 199
      src/components/tall/task/Conclusion.vue
  6. 211
      src/components/tall/task/ExperimentalCode.vue
  7. 211
      src/components/tall/task/ExperimentalData.vue
  8. 207
      src/components/tall/task/ExperimentalResult.vue
  9. 197
      src/components/tall/task/InterimInspection.vue
  10. 266
      src/components/tall/task/LabReport.vue
  11. 203
      src/components/tall/task/Procedure.vue
  12. 286
      src/components/tall/task/PublishPatent.vue
  13. 256
      src/components/tall/task/PublishThesis.vue
  14. 256
      src/components/tall/task/PublishWork.vue
  15. 203
      src/components/tall/task/Result.vue
  16. 0
      src/components/tall/task/ScientificPayoffs.vue
  17. 197
      src/components/tall/task/SubConclusion.vue
  18. 197
      src/components/tall/task/SubInterimInspection.vue
  19. 0
      src/components/tall/task/SubMemberManagement.vue
  20. 197
      src/components/tall/task/SubResult.vue
  21. 65
      src/components/tall/task/TaskConList.vue
  22. 2
      src/components/tall/top/Navbar.vue
  23. 111
      src/store/tall/task/index.js
  24. 32
      src/views/detail/Test.vue

15
src/apis/index.js

@ -93,3 +93,18 @@ export const delMember = params => http.post(`${experiment}/organization/del`, p
// 分配实验
export const createExperiment = params => http.post(`${experiment}/subExperiment/create`, params);
// 根据code查询所有试题
export const getByCode = params => http.post(`${experiment}/question/getByCode`, params);
// 提交答案
export const submitAnswer = params => http.post(`${experiment}/question/submit`, params);
// 查询知识产权题目(论文、专利、软著)
export const getIntellectual = params => http.post(`${experiment}/question/getIntellectual`, params);
// 查询知识产权列表 (论文、专利、软著)
export const getIntellectualList = params => http.post(`${experiment}/question/getIntellectualList`, params);
// 提交知识产权信息(论文、专利、软著)
export const submitIntellectual = params => http.post(`${experiment}/question/submitIntellectual`, params);

2
src/components/tall/center/Global.vue

@ -47,6 +47,8 @@ async function getPermanentData(id) {
function toDetail(item) {
store.commit('task/setTaskDetail', item);
store.commit('layout/setListStatus', false);
store.commit('task/setIntellectualId', '');
}
</script>

12
src/components/tall/center/RegularTask.vue

@ -1,6 +1,6 @@
<template>
<div class="task-list" :style="{ height: 'calc(100vh - 160px - (' + globalHeight + 'px))' }">
<div class="task-box" v-for="(item, index) in tasks" :key="index">
<div class="task-box" v-for="(item, index) in regularTasks" :key="index">
<div class="task-time flex items-center justify-between">
<div class="flex items-center">
<PlayCircleOutlined style="font-size: 23px; color: #999999" />
@ -46,9 +46,9 @@ const project = computed(() => store.state.projects.project); // 项目信息
const roleId = computed(() => store.state.role.roleId); //
const globalHeight = computed(() => store.state.task.globalHeight); //
const sessionGlobalHeight = sessionStorage.getItem('globalHeight'); //
const tasks = computed(() => store.state.task.tasks); //
const regularTasks = computed(() => store.state.task.regularTasks); //
const taskObj = reactive({ tasks: [] }); //
const sessionTasks = sessionStorage.getItem('tasks'); //
const sessionTasks = sessionStorage.getItem('regularTasks'); //
const subProjectInfo = computed(() => store.state.task.subProjectInfo); //
if (sessionGlobalHeight) {
@ -57,7 +57,7 @@ if (sessionGlobalHeight) {
if (sessionTasks) {
const arr = JSON.parse(sessionTasks);
store.commit('task/setUpTasks', arr);
store.commit('task/setRegularTasks', arr);
}
watch([project, roleId, subProjectInfo], async () => {
@ -89,7 +89,7 @@ async function getTasks(query) {
});
});
store.commit('task/setUpTasks', data);
store.commit('task/setRegularTasks', data);
} catch (error) {
throw new Error(error);
}
@ -106,7 +106,7 @@ async function getSonTask(id) {
}
});
store.commit('task/setUpTasks', taskObj.tasks);
store.commit('task/setRegularTasks', taskObj.tasks);
} catch (error) {
throw new Error(error);
}

4
src/components/tall/left/Projects.vue

@ -95,7 +95,7 @@ watch([newProject, startTime, endTime, projectInfo, subProjectInfo], () => {
getProjectsList(start, end);
});
getProjectsList(start, end);
// getProjectsList(start, end);
//
const showActionCard = item => {
@ -120,8 +120,8 @@ async function getProjectsList(startData, endData) {
sonItem.show = false;
if (sonItem.id === projectId) {
sonItem.show = true;
item.show = true;
sonItem.show = true;
}
});
}

199
src/components/tall/task/Conclusion.vue

@ -1,63 +1,96 @@
<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>
<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="files"
: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-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 { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
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([]);
//
const projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const topicConclusionFormData = ref({
projectId: projectId.value,
code: '',
date: null,
fileIdList: [],
});
getDataByCode();
const beforeUpload = index => {
currIndex.value = index;
};
const handleChange = info => {
const resFileList = [...info.fileList];
@ -89,26 +122,92 @@ const handleChange = info => {
return file;
});
fileList.value = arr.value;
questionList.value[currIndex.value].files = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
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);
}
// topicConclusionFormData.value.fileList.push(obj);
topicConclusionFormData.value.fileIdList.push(item.id);
});
if (item.type === 6) {
obj.answerList.push(dayjs(item.date).format('x'));
}
// const params = { param: topicConclusionFormData.value };
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);
});
// saveSubExperiment(params);
console.log('submit!', toRaw(topicConclusionFormData.value));
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) {
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 => {
val.answer = JSON.parse(val.answer);
item.files.push(val.answer);
});
}
}
});
questionList.value = data;
}
</script>
<style scoped>

211
src/components/tall/task/ExperimentalCode.vue

@ -1,20 +1,56 @@
<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>
<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>
<a-form-item>
<label class="color-3">实验人</label>
<a-input v-model:value="experCodeFormData.member" placeholder="实验人" />
</a-form-item>
<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>
<a-form-item>
<label class="color-3">实验程序代码</label>
<a-input v-model:value="experCodeFormData.codeUrl" placeholder="github链接" />
</a-form-item>
<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="files"
: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>
@ -24,33 +60,154 @@
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
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 projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const experCodeFormData = ref({
projectId: projectId.value,
code: '',
date: null,
member: '',
codeUrl: '',
});
getDataByCode();
const onSubmit = () => {
// const params = { param: experCodeFormData.value };
const beforeUpload = index => {
currIndex.value = index;
};
// saveSubExperiment(params);
console.log('submit!', toRaw(experCodeFormData.value));
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;
});
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) {
obj.answerList.push(dayjs(item.date).format('x'));
}
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) {
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 => {
val.answer = JSON.parse(val.answer);
item.files.push(val.answer);
});
}
}
});
questionList.value = data;
}
</script>
<style scoped>

211
src/components/tall/task/ExperimentalData.vue

@ -1,20 +1,56 @@
<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>
<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>
<a-form-item>
<label class="color-3">实验人</label>
<a-input v-model:value="experDataFormData.member" placeholder="实验人" />
</a-form-item>
<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>
<a-form-item>
<label class="color-3">实验数据</label>
<a-input v-model:value="experDataFormData.data" placeholder="github链接" />
</a-form-item>
<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="files"
: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>
@ -24,33 +60,154 @@
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
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 projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const experDataFormData = ref({
projectId: projectId.value,
code: '',
date: null,
member: '',
data: '',
});
getDataByCode();
const onSubmit = () => {
// const params = { param: experDataFormData.value };
const beforeUpload = index => {
currIndex.value = index;
};
// saveSubExperiment(params);
console.log('submit!', toRaw(experDataFormData.value));
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;
});
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) {
obj.answerList.push(dayjs(item.date).format('x'));
}
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) {
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 => {
val.answer = JSON.parse(val.answer);
item.files.push(val.answer);
});
}
}
});
questionList.value = data;
}
</script>
<style scoped>

207
src/components/tall/task/ExperimentalResult.vue

@ -1,15 +1,56 @@
<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>
<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>
<a-form-item>
<label class="color-3">实验程序代码</label>
<a-input v-model:value="experResultFormData.codeUrl" placeholder="github链接" />
</a-form-item>
<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="files"
: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>
@ -19,32 +60,154 @@
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
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 projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const experResultFormData = ref({
projectId: projectId.value,
code: '',
result: '',
codeUrl: '',
});
getDataByCode();
const onSubmit = () => {
// const params = { param: experResultFormData.value };
const beforeUpload = index => {
currIndex.value = index;
};
// saveSubExperiment(params);
console.log('submit!', toRaw(experResultFormData.value));
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;
});
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) {
obj.answerList.push(dayjs(item.date).format('x'));
}
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) {
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 => {
val.answer = JSON.parse(val.answer);
item.files.push(val.answer);
});
}
}
});
questionList.value = data;
}
</script>
<style scoped>

197
src/components/tall/task/InterimInspection.vue

@ -1,29 +1,56 @@
<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>
<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="files"
: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>
@ -33,31 +60,37 @@
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
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([]);
//
const projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const topicMetaphaseFormData = ref({
projectId: projectId.value,
code: '',
date: null,
fileIdList: [],
});
getDataByCode();
const beforeUpload = index => {
currIndex.value = index;
};
const handleChange = info => {
const resFileList = [...info.fileList];
@ -89,26 +122,92 @@ const handleChange = info => {
return file;
});
fileList.value = arr.value;
questionList.value[currIndex.value].files = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
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);
}
// topicMetaphaseFormData.value.fileList.push(obj);
topicMetaphaseFormData.value.fileIdList.push(item.id);
});
if (item.type === 6) {
obj.answerList.push(dayjs(item.date).format('x'));
}
// const params = { param: topicMetaphaseFormData.value };
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);
});
// saveSubExperiment(params);
console.log('submit!', toRaw(topicMetaphaseFormData.value));
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) {
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 => {
val.answer = JSON.parse(val.answer);
item.files.push(val.answer);
});
}
}
});
questionList.value = data;
}
</script>
<style scoped>

266
src/components/tall/task/LabReport.vue

@ -1,91 +1,96 @@
<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>
<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="files"
: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">确定</a-button>
<a-button type="primary" html-type="submit" @click="onSubmit">确定</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 dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
//
const sessionProject = sessionStorage.getItem('project');
//
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 projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
getDataByCode();
const beforeUpload = index => {
currIndex.value = index;
};
const handleChange = info => {
const resFileList = [...info.fileList];
@ -93,33 +98,144 @@ const handleChange = info => {
//
const arr = ref([]);
resFileList.forEach(file => {
let flag = false;
let num = -1;
arr.value.forEach(item => {
arr.value.forEach((item, index) => {
if (file.name === item.name) {
flag = true;
num = index;
}
});
if (!flag) {
arr.value.push(file);
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;
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) {
obj.answerList.push(dayjs(item.date).format('x'));
}
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) {
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 => {
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>

203
src/components/tall/task/Procedure.vue

@ -1,34 +1,56 @@
<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>
<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="files"
: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>
@ -38,32 +60,37 @@
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
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([]);
//
const projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const procedureFormData = ref({
projectId: projectId.value,
code: '',
date: null,
member: '',
fileIdList: [],
});
getDataByCode();
const beforeUpload = index => {
currIndex.value = index;
};
const handleChange = info => {
const resFileList = [...info.fileList];
@ -95,26 +122,92 @@ const handleChange = info => {
return file;
});
fileList.value = arr.value;
questionList.value[currIndex.value].files = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
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);
}
// procedureFormData.value.fileList.push(obj);
procedureFormData.value.fileIdList.push(item.id);
});
if (item.type === 6) {
obj.answerList.push(dayjs(item.date).format('x'));
}
// const params = { param: procedureFormData.value };
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);
});
// saveSubExperiment(params);
console.log('submit!', toRaw(procedureFormData.value));
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) {
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 => {
val.answer = JSON.parse(val.answer);
item.files.push(val.answer);
});
}
}
});
questionList.value = data;
}
</script>
<style scoped>

286
src/components/tall/task/PublishPatent.vue

@ -0,0 +1,286 @@
<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">
<a-form-item>
<label class="color-3">{{ item.question }}</label>
<a-radio-group v-model:value="item.con" name="radioGroup" @change="handleChangeRadio">
<a-radio :value="val.submitValue" :id="val.optionId" v-for="(val, key) in item.optionList" :key="key">{{
val.showValue
}}</a-radio>
</a-radio-group>
</a-form-item>
</template>
<template v-if="item.type === 4"> </template>
<template v-if="item.type === 5">
<a-form-item>
<label class="color-3">{{ item.question }}</label>
<a-select ref="select" v-model:value="item.con">
<a-select-option :value="val.submitValue" v-for="(val, key) in item.optionList" :key="key">{{
val.showValue
}}</a-select-option>
</a-select>
</a-form-item>
</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="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange($event, index)"
>
<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, watch } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
//
const sessionProject = sessionStorage.getItem('project');
//
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 intellectualId = computed(() => store.state.task.intellectualId); // ID
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
getDataByCode();
watch(intellectualId, () => {
getDataByCode();
});
//
const handleChangeRadio = value => {
const selectedId = value.target.id;
let addQuestion = [];
const getQuestions = questionList.value;
let selectedIndex = -1;
questionList.value.forEach((item, index) => {
if (item.type === 3) {
item.optionList.forEach(val => {
if (val.optionId === selectedId && val.questionInfos && val.questionInfos.length > 0) {
addQuestion = val.questionInfos;
selectedIndex = index;
}
});
}
});
addQuestion.forEach((item, index) => {
const addIndex = selectedIndex + index + 1;
getQuestions.splice(addIndex, 0, item);
});
questionList.value = getQuestions;
};
//
const handleChange = (info, currIndex) => {
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;
});
questionList.value[currIndex].files = arr.value;
};
const onSubmit = async () => {
const params = {
param: {
code: code.value,
projectId: projectId.value,
intellectualId: intellectualId.value,
questionAndAnswerList: [],
},
};
const arr = [];
questionList.value.forEach(item => {
const obj = {
questionId: item.questionId,
answerList: [],
};
if (item.type === 1 || item.type === 2 || item.type === 3 || item.type === 5) {
obj.answerList.push(item.con);
}
if (item.type === 6) {
obj.answerList.push(dayjs(item.date).format('x'));
}
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/submitIntellectual', params);
getDataByCode();
};
async function getDataByCode() {
const params = {
param: {
code: code.value,
projectId: projectId.value,
intellectualId: intellectualId.value,
},
};
const data = await store.dispatch('task/getIntellectual', params);
data.forEach(item => {
if (item.type === 1 || item.type === 2 || item.type === 3 || item.type === 5) {
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) {
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 => {
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>

256
src/components/tall/task/PublishThesis.vue

@ -0,0 +1,256 @@
<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">
<a-form-item>
<label class="color-3">{{ item.question }}</label>
<a-select ref="select" v-model:value="item.con">
<a-select-option :value="val.submitValue" v-for="(val, key) in item.optionList" :key="key">{{
val.showValue
}}</a-select-option>
</a-select>
</a-form-item>
</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="files"
: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, watch } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
//
const sessionProject = sessionStorage.getItem('project');
//
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 intellectualId = computed(() => store.state.task.intellectualId); // ID
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
getDataByCode();
watch(intellectualId, () => {
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[0].visitUrl;
file.id = file.response.data[0].id;
}
return file;
});
questionList.value[currIndex.value].files = arr.value;
};
const onSubmit = async () => {
const params = {
param: {
code: code.value,
projectId: projectId.value,
intellectualId: intellectualId.value,
questionAndAnswerList: [],
},
};
const arr = [];
questionList.value.forEach(item => {
const obj = {
questionId: item.questionId,
answerList: [],
};
if (item.type === 1 || item.type === 2 || item.type === 5) {
obj.answerList.push(item.con);
}
if (item.type === 6) {
obj.answerList.push(dayjs(item.date).format('x'));
}
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/submitIntellectual', params);
getDataByCode();
};
async function getDataByCode() {
const params = {
param: {
code: code.value,
projectId: projectId.value,
intellectualId: intellectualId.value,
},
};
const data = await store.dispatch('task/getIntellectual', params);
data.forEach(item => {
if (item.type === 1 || item.type === 2 || item.type === 5) {
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) {
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 => {
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>

256
src/components/tall/task/PublishWork.vue

@ -0,0 +1,256 @@
<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">
<a-form-item>
<label class="color-3">{{ item.question }}</label>
<a-select ref="select" v-model:value="item.con">
<a-select-option :value="val.submitValue" v-for="(val, key) in item.optionList" :key="key">{{
val.showValue
}}</a-select-option>
</a-select>
</a-form-item>
</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="files"
: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, watch } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
//
const sessionProject = sessionStorage.getItem('project');
//
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 intellectualId = computed(() => store.state.task.intellectualId); // ID
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
getDataByCode();
watch(intellectualId, () => {
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[0].visitUrl;
file.id = file.response.data[0].id;
}
return file;
});
questionList.value[currIndex.value].files = arr.value;
};
const onSubmit = async () => {
const params = {
param: {
code: code.value,
projectId: projectId.value,
intellectualId: intellectualId.value,
questionAndAnswerList: [],
},
};
const arr = [];
questionList.value.forEach(item => {
const obj = {
questionId: item.questionId,
answerList: [],
};
if (item.type === 1 || item.type === 2 || item.type === 5) {
obj.answerList.push(item.con);
}
if (item.type === 6) {
obj.answerList.push(dayjs(item.date).format('x'));
}
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/submitIntellectual', params);
getDataByCode();
};
async function getDataByCode() {
const params = {
param: {
code: code.value,
projectId: projectId.value,
intellectualId: intellectualId.value,
},
};
const data = await store.dispatch('task/getIntellectual', params);
data.forEach(item => {
if (item.type === 1 || item.type === 2 || item.type === 5) {
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) {
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 => {
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>

203
src/components/tall/task/Result.vue

@ -1,34 +1,56 @@
<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>
<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="files"
: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>
@ -38,32 +60,37 @@
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
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([]);
//
const projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const topicResultFormData = ref({
projectId: projectId.value,
code: '',
name: '',
receiver: '',
fileIdList: [],
});
getDataByCode();
const beforeUpload = index => {
currIndex.value = index;
};
const handleChange = info => {
const resFileList = [...info.fileList];
@ -95,26 +122,92 @@ const handleChange = info => {
return file;
});
fileList.value = arr.value;
questionList.value[currIndex.value].files = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
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);
}
// topicResultFormData.value.fileList.push(obj);
topicResultFormData.value.fileIdList.push(item.id);
});
if (item.type === 6) {
obj.answerList.push(dayjs(item.date).format('x'));
}
// const params = { param: topicResultFormData.value };
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);
});
// saveSubExperiment(params);
console.log('submit!', toRaw(topicResultFormData.value));
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) {
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 => {
val.answer = JSON.parse(val.answer);
item.files.push(val.answer);
});
}
}
});
questionList.value = data;
}
</script>
<style scoped>

0
src/components/tall/task/ScientificPayoffs.vue

197
src/components/tall/task/SubConclusion.vue

@ -1,29 +1,56 @@
<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>
<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="files"
: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>
@ -33,31 +60,37 @@
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
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([]);
//
const projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const subTopicConclusionFormData = ref({
projectId: projectId.value,
code: '',
date: null,
fileIdList: [],
});
getDataByCode();
const beforeUpload = index => {
currIndex.value = index;
};
const handleChange = info => {
const resFileList = [...info.fileList];
@ -89,26 +122,92 @@ const handleChange = info => {
return file;
});
fileList.value = arr.value;
questionList.value[currIndex.value].files = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
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);
}
// subTopicConclusionFormData.value.fileList.push(obj);
subTopicConclusionFormData.value.fileIdList.push(item.id);
});
if (item.type === 6) {
obj.answerList.push(dayjs(item.date).format('x'));
}
// const params = { param: subTopicConclusionFormData.value };
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);
});
// saveSubExperiment(params);
console.log('submit!', toRaw(subTopicConclusionFormData.value));
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) {
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 => {
val.answer = JSON.parse(val.answer);
item.files.push(val.answer);
});
}
}
});
questionList.value = data;
}
</script>
<style scoped>

197
src/components/tall/task/SubInterimInspection.vue

@ -1,29 +1,56 @@
<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>
<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="files"
: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>
@ -33,31 +60,37 @@
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
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([]);
//
const projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const subTopicMetaphaseFormData = ref({
projectId: projectId.value,
code: '',
date: null,
fileIdList: [],
});
getDataByCode();
const beforeUpload = index => {
currIndex.value = index;
};
const handleChange = info => {
const resFileList = [...info.fileList];
@ -89,26 +122,92 @@ const handleChange = info => {
return file;
});
fileList.value = arr.value;
questionList.value[currIndex.value].files = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
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);
}
// subTopicMetaphaseFormData.value.fileList.push(obj);
subTopicMetaphaseFormData.value.fileIdList.push(item.id);
});
if (item.type === 6) {
obj.answerList.push(dayjs(item.date).format('x'));
}
// const params = { param: subTopicMetaphaseFormData.value };
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);
});
// saveSubExperiment(params);
console.log('submit!', toRaw(subTopicMetaphaseFormData.value));
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) {
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 => {
val.answer = JSON.parse(val.answer);
item.files.push(val.answer);
});
}
}
});
questionList.value = data;
}
</script>
<style scoped>

0
src/components/tall/task/SubMemberManagement.vue

197
src/components/tall/task/SubResult.vue

@ -1,29 +1,56 @@
<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>
<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="files"
: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>
@ -33,31 +60,37 @@
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
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([]);
//
const projectId = computed(() => store.getters['projects/projectId']); // ID
const code = computed(() => store.state.task.label); // code
const questionList = ref([]);
//
const currIndex = ref(null);
// ID
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const subTopicResultFormData = ref({
projectId: projectId.value,
code: '',
date: null,
fileIdList: [],
});
getDataByCode();
const beforeUpload = index => {
currIndex.value = index;
};
const handleChange = info => {
const resFileList = [...info.fileList];
@ -89,26 +122,92 @@ const handleChange = info => {
return file;
});
fileList.value = arr.value;
questionList.value[currIndex.value].files = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
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);
}
// subTopicResultFormData.value.fileList.push(obj);
subTopicResultFormData.value.fileIdList.push(item.id);
});
if (item.type === 6) {
obj.answerList.push(dayjs(item.date).format('x'));
}
// const params = { param: subTopicResultFormData.value };
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);
});
// saveSubExperiment(params);
console.log('submit!', toRaw(subTopicResultFormData.value));
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) {
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 => {
val.answer = JSON.parse(val.answer);
item.files.push(val.answer);
});
}
}
});
questionList.value = data;
}
</script>
<style scoped>

65
src/components/tall/task/TaskConList.vue

@ -1,10 +1,10 @@
<template>
<div class="list-box">
<div class="task-box">
<div class="task-box" v-for="(item, index) in lists" :key="index">
<div class="task-time flex items-center justify-between">
<div class="flex items-center">
<div class="circular"></div>
<span>2020年08月16日 13:30</span>
<span>{{ dayjs(Number(item.time)).format('YYYY年MM月DD日 HH:mm') }}</span>
</div>
<div class="task-action"></div>
</div>
@ -12,29 +12,8 @@
<div class="task-info">
<div>
<div class="task-card">
<div class="task-name cursor-pointer flex justify-between items-center">
<span class="leading-none color-3">第一次科研需求分析会议</span>
<RightOutlined style="color: #666" />
</div>
</div>
</div>
</div>
</div>
<div class="task-box">
<div class="task-time flex items-center justify-between">
<div class="flex items-center">
<div class="circular"></div>
<span>2020年08月16日 13:30</span>
</div>
<div class="task-action"></div>
</div>
<div class="task-info">
<div>
<div class="task-card">
<div class="task-name cursor-pointer flex justify-between items-center">
<span class="leading-none color-3">第一次科研需求分析会议</span>
<div class="task-name cursor-pointer flex justify-between items-center" @click="toDetail(item)">
<span class="leading-none truncate color-3" style="width: calc(100% - 30px)" :title="item.name">{{ item.name }}</span>
<RightOutlined style="color: #666" />
</div>
</div>
@ -45,7 +24,40 @@
</template>
<script setup>
import { computed, ref } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { RightOutlined } from '@ant-design/icons-vue';
const store = useStore();
const code = computed(() => store.state.task.label); // code
const projectId = computed(() => store.getters['projects/projectId']); // ID
const lists = ref([]);
init();
async function init() {
if (code.value === 'ZKT_LW' || code.value === 'ZKT_ZL' || code.value === 'ZKT_RZ') {
await getAchievementsList();
}
}
//
async function getAchievementsList() {
const params = {
param: {
code: code.value,
projectId: projectId.value,
},
};
const data = await store.dispatch('task/getIntellectualList', params);
lists.value = [...data];
}
function toDetail(item) {
store.commit('task/setIntellectualId', item.intellectualId);
}
</script>
<style scoped>
@ -54,9 +66,6 @@ import { RightOutlined } from '@ant-design/icons-vue';
overflow-y: auto;
}
.task-box {
}
.task-time {
height: 32px;
}

2
src/components/tall/top/Navbar.vue

@ -4,7 +4,7 @@
<div
class="flex items-center cursor-pointer"
:style="{ color: isShowList ? '#1890FF' : '' }"
v-if="label == 'KT_KYHY' || label == 'ZKT_HYGL'"
v-if="label == 'KT_KYHY' || label == 'ZKT_HYGL' || label == 'ZKT_LW' || label == 'ZKT_ZL' || label == 'ZKT_RZ'"
@click="changeShowStatus"
>
<ClockCircleOutlined style="font-size: 18px" />

111
src/store/tall/task/index.js

@ -1,4 +1,4 @@
// import { getGlobal, getPermanent } from 'apis';
import { getByCode, submitAnswer, getIntellectual, getIntellectualList, submitIntellectual } from 'apis';
export default {
namespaced: true,
@ -31,6 +31,9 @@ export default {
globalHeight: 0, // 日常任务面板高度
detailId: '', // 子课题Id
subProjectInfo: null, // 当前子课题信息
regularTasks: [], // 定期任务
intellectualId: '', // 当前选择的知识产权ID
question: null,
},
getters: {
@ -157,8 +160,6 @@ export default {
state.tasks = [...arr];
// state.tasks = [...data.concat(state.tasks)];
}
const arr = state.tasks;
sessionStorage.setItem('tasks', JSON.stringify(arr));
},
/**
@ -228,6 +229,16 @@ export default {
sessionStorage.setItem('permanents', JSON.stringify(tasks));
},
/**
* 定期任务
* @param {object} state
* @param {array} tasks 服务端查询到的定期任务书籍
*/
setRegularTasks(state, tasks) {
state.regularTasks = tasks || [];
sessionStorage.setItem('regularTasks', JSON.stringify(tasks));
},
/**
* 设置时间轴是否继续向上查任务
* @param {Object} state
@ -348,7 +359,99 @@ export default {
setSubProjectInfo(state, data) {
state.subProjectInfo = data;
},
/**
* 知识产权ID
*/
setIntellectualId(state, data) {
state.intellectualId = data;
},
setQuestion(state, data) {
state.question = data;
},
},
actions: {},
actions: {
/**
* 根据code查询所有试题
* @param {string} param.code
* @param {integer} param.projectId
* @param {integer} param.intellectualId
*/
async getByCode({ commit }, param) {
try {
const data = await getByCode(param);
commit('setQuestion', data || null);
return data;
} catch (error) {
throw new Error(error);
}
},
/**
* 答案
* @param {string} param.code
* @param {integer} param.projectId
* @param {array} param.questionAndAnswerList
*/
async submitAnswer({ commit }, param) {
try {
const data = await submitAnswer(param);
commit('setQuestion', data || null);
return data;
} catch (error) {
throw new Error(error);
}
},
/**
* 查询知识产权题目论文专利软著
* @param {string} param.code
* @param {integer} param.projectId
* @param {integer} param.intellectualId
*/
async getIntellectual({ commit }, param) {
try {
const data = await getIntellectual(param);
commit('setQuestion', data || null);
return data;
} catch (error) {
throw new Error(error);
}
},
/**
* 查询知识产权列表 论文专利软著
* @param {string} param.code
* @param {integer} param.projectId
* @param {integer} param.intellectualId
*/
async getIntellectualList({ commit }, param) {
try {
const data = await getIntellectualList(param);
commit('setQuestion', data || null);
return data;
} catch (error) {
throw new Error(error);
}
},
/**
* 提交知识产权信息论文专利软著
* @param {string} param.code
* @param {integer} param.projectId
* @param {integer} param.intellectualId
* @param {array} param.questionAndAnswerList
*/
async submitIntellectual({ commit }, param) {
try {
const data = await submitIntellectual(param);
commit('setQuestion', data || null);
return data;
} catch (error) {
throw new Error(error);
}
},
},
};

32
src/views/detail/Test.vue

@ -42,6 +42,21 @@
<!-- 子课题科研会议管理 -->
<SubMeetingManagement v-if="label === 'ZKT_HYGL'" />
<!-- 发表论文 -->
<PublishThesis v-if="label === 'ZKT_LW'" />
<!-- 申请专利 -->
<PublishPatent v-if="label === 'ZKT_ZL'" />
<!-- 发表软件著作权 -->
<PublishWork v-if="label === 'ZKT_RZ'" />
<!-- 科研成果管理 -->
<ScientificPayoffs v-if="label === 'ZKT_KYCG'" />
<!-- 成员管理 -->
<SubMemberManagement v-if="label === 'ZKT_CYGL'" />
<!-- 分配实验 -->
<AssignmentExperiment v-if="label === 'ZKT_FPSY'" />
@ -94,7 +109,11 @@ import Result from 'components/tall/task/Result.vue'; // 项目验收报告
import SubSubjectProgress from 'components/tall/task/SubSubjectProgress.vue'; //
import SubMeetingManagement from 'components/tall/task/SubMeetingManagement.vue'; //
import PublishThesis from 'components/tall/task/PublishThesis.vue'; //
import PublishPatent from 'components/tall/task/PublishPatent.vue'; //
import PublishWork from 'components/tall/task/PublishWork.vue'; //
import ScientificPayoffs from 'components/tall/task/ScientificPayoffs.vue'; //
import SubMemberManagement from 'components/tall/task/SubMemberManagement.vue'; //
import AssignmentExperiment from 'components/tall/task/AssignmentExperiment.vue'; //
import SubInterimInspection from 'components/tall/task/SubInterimInspection.vue'; //
import SubConclusion from 'components/tall/task/SubConclusion.vue'; //
@ -272,4 +291,15 @@ watch([taskDetail], () => {
:deep(.ant-checkbox-group) {
width: 100%;
}
/* 单选 */
:deep(.ant-radio-group) {
width: 100%;
display: flex;
align-items: center;
}
:deep(.ant-radio-wrapper) {
display: flex !important;
}
</style>

Loading…
Cancel
Save