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); 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) { function toDetail(item) {
store.commit('task/setTaskDetail', item); store.commit('task/setTaskDetail', item);
store.commit('layout/setListStatus', false);
store.commit('task/setIntellectualId', '');
} }
</script> </script>

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

@ -1,6 +1,6 @@
<template> <template>
<div class="task-list" :style="{ height: 'calc(100vh - 160px - (' + globalHeight + 'px))' }"> <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="task-time flex items-center justify-between">
<div class="flex items-center"> <div class="flex items-center">
<PlayCircleOutlined style="font-size: 23px; color: #999999" /> <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 roleId = computed(() => store.state.role.roleId); //
const globalHeight = computed(() => store.state.task.globalHeight); // const globalHeight = computed(() => store.state.task.globalHeight); //
const sessionGlobalHeight = sessionStorage.getItem('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 taskObj = reactive({ tasks: [] }); //
const sessionTasks = sessionStorage.getItem('tasks'); // const sessionTasks = sessionStorage.getItem('regularTasks'); //
const subProjectInfo = computed(() => store.state.task.subProjectInfo); // const subProjectInfo = computed(() => store.state.task.subProjectInfo); //
if (sessionGlobalHeight) { if (sessionGlobalHeight) {
@ -57,7 +57,7 @@ if (sessionGlobalHeight) {
if (sessionTasks) { if (sessionTasks) {
const arr = JSON.parse(sessionTasks); const arr = JSON.parse(sessionTasks);
store.commit('task/setUpTasks', arr); store.commit('task/setRegularTasks', arr);
} }
watch([project, roleId, subProjectInfo], async () => { 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) { } catch (error) {
throw new Error(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) { } catch (error) {
throw new Error(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); // getProjectsList(start, end);
// //
const showActionCard = item => { const showActionCard = item => {
@ -120,8 +120,8 @@ async function getProjectsList(startData, endData) {
sonItem.show = false; sonItem.show = false;
if (sonItem.id === projectId) { if (sonItem.id === projectId) {
sonItem.show = true;
item.show = true; item.show = true;
sonItem.show = true;
} }
}); });
} }

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

@ -1,63 +1,96 @@
<template> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicConclusionFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">结题日期</label> <template v-if="item.type === 1">
<a-date-picker v-model:value="topicConclusionFormData.date" /> <a-form-item>
</a-form-item> <label class="color-3">{{ item.question }}</label>
<a-input v-model:value="item.con" :placeholder="item.question" />
<a-form-item> </a-form-item>
<label class="color-3">项目结题报告</label> </template>
<a-upload-dragger
v-model:fileList="fileList" <template v-if="item.type === 2">
name="files" <a-form-item>
:multiple="true" <label class="color-3">{{ item.question }}</label>
:action="action" <a-textarea v-model:value="item.con" :placeholder="item.question" />
:headers="headers" </a-form-item>
:accept="'.pdf'" </template>
@change="handleChange"
> <template v-if="item.type === 3"> </template>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined> <template v-if="item.type === 4"> </template>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> <template v-if="item.type === 5"> </template>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger> <template v-if="item.type === 6">
</a-form-item> <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-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-item>
</a-form> </a-form>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, computed, toRaw } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue'; import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis'; import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project'); const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']); //
const token = computed(() => store.getters['user/token']); const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` }; const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg; 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) { if (sessionProject) {
const project = JSON.parse(sessionProject); const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project); store.commit('projects/setProject', project);
} }
const topicConclusionFormData = ref({ getDataByCode();
projectId: projectId.value,
code: '', const beforeUpload = index => {
date: null, currIndex.value = index;
fileIdList: [], };
});
const handleChange = info => { const handleChange = info => {
const resFileList = [...info.fileList]; const resFileList = [...info.fileList];
@ -89,26 +122,92 @@ const handleChange = info => {
return file; return file;
}); });
fileList.value = arr.value; questionList.value[currIndex.value].files = arr.value;
}; };
const onSubmit = () => { const onSubmit = async () => {
fileList.value.forEach(item => { const params = {
// let obj = { param: {
// fileId: item.id, code: code.value,
// fileName: item.name, projectId: projectId.value,
// filePathL: item.url 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); if (item.type === 6) {
topicConclusionFormData.value.fileIdList.push(item.id); 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); params.param.questionAndAnswerList = arr;
console.log('submit!', toRaw(topicConclusionFormData.value)); 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> </script>
<style scoped> <style scoped>

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

@ -1,20 +1,56 @@
<template> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="experCodeFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">实验时间</label> <template v-if="item.type === 1">
<a-date-picker v-model:value="experCodeFormData.date" /> <a-form-item>
</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> <template v-if="item.type === 2">
<label class="color-3">实验人</label> <a-form-item>
<a-input v-model:value="experCodeFormData.member" placeholder="实验人" /> <label class="color-3">{{ item.question }}</label>
</a-form-item> <a-textarea v-model:value="item.con" :placeholder="item.question" />
</a-form-item>
</template>
<a-form-item> <template v-if="item.type === 3"> </template>
<label class="color-3">实验程序代码</label>
<a-input v-model:value="experCodeFormData.codeUrl" placeholder="github链接" /> <template v-if="item.type === 4"> </template>
</a-form-item>
<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-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>
@ -24,33 +60,154 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, toRaw } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project'); 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) { if (sessionProject) {
const project = JSON.parse(sessionProject); const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project); store.commit('projects/setProject', project);
} }
const experCodeFormData = ref({ getDataByCode();
projectId: projectId.value,
code: '',
date: null,
member: '',
codeUrl: '',
});
const onSubmit = () => { const beforeUpload = index => {
// const params = { param: experCodeFormData.value }; currIndex.value = index;
};
// saveSubExperiment(params); const handleChange = info => {
console.log('submit!', toRaw(experCodeFormData.value)); 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> </script>
<style scoped> <style scoped>

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

@ -1,20 +1,56 @@
<template> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="experDataFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">实验时间</label> <template v-if="item.type === 1">
<a-date-picker v-model:value="experDataFormData.date" /> <a-form-item>
</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> <template v-if="item.type === 2">
<label class="color-3">实验人</label> <a-form-item>
<a-input v-model:value="experDataFormData.member" placeholder="实验人" /> <label class="color-3">{{ item.question }}</label>
</a-form-item> <a-textarea v-model:value="item.con" :placeholder="item.question" />
</a-form-item>
</template>
<a-form-item> <template v-if="item.type === 3"> </template>
<label class="color-3">实验数据</label>
<a-input v-model:value="experDataFormData.data" placeholder="github链接" /> <template v-if="item.type === 4"> </template>
</a-form-item>
<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-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>
@ -24,33 +60,154 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, toRaw } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project'); 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) { if (sessionProject) {
const project = JSON.parse(sessionProject); const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project); store.commit('projects/setProject', project);
} }
const experDataFormData = ref({ getDataByCode();
projectId: projectId.value,
code: '',
date: null,
member: '',
data: '',
});
const onSubmit = () => { const beforeUpload = index => {
// const params = { param: experDataFormData.value }; currIndex.value = index;
};
// saveSubExperiment(params); const handleChange = info => {
console.log('submit!', toRaw(experDataFormData.value)); 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> </script>
<style scoped> <style scoped>

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

@ -1,15 +1,56 @@
<template> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="experResultFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">结论</label> <template v-if="item.type === 1">
<a-textarea v-model:value="experResultFormData.result" placeholder="结论" /> <a-form-item>
</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> <template v-if="item.type === 2">
<label class="color-3">实验程序代码</label> <a-form-item>
<a-input v-model:value="experResultFormData.codeUrl" placeholder="github链接" /> <label class="color-3">{{ item.question }}</label>
</a-form-item> <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-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>
@ -19,32 +60,154 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, toRaw } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project'); 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) { if (sessionProject) {
const project = JSON.parse(sessionProject); const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project); store.commit('projects/setProject', project);
} }
const experResultFormData = ref({ getDataByCode();
projectId: projectId.value,
code: '',
result: '',
codeUrl: '',
});
const onSubmit = () => { const beforeUpload = index => {
// const params = { param: experResultFormData.value }; currIndex.value = index;
};
// saveSubExperiment(params); const handleChange = info => {
console.log('submit!', toRaw(experResultFormData.value)); 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> </script>
<style scoped> <style scoped>

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

@ -1,29 +1,56 @@
<template> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicMetaphaseFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">检查日期</label> <template v-if="item.type === 1">
<a-date-picker v-model:value="topicMetaphaseFormData.date" /> <a-form-item>
</a-form-item> <label class="color-3">{{ item.question }}</label>
<a-input v-model:value="item.con" :placeholder="item.question" />
<a-form-item> </a-form-item>
<label class="color-3">中期检查报告</label> </template>
<a-upload-dragger
v-model:fileList="fileList" <template v-if="item.type === 2">
name="files" <a-form-item>
:multiple="true" <label class="color-3">{{ item.question }}</label>
:action="action" <a-textarea v-model:value="item.con" :placeholder="item.question" />
:headers="headers" </a-form-item>
:accept="'.pdf'" </template>
@change="handleChange"
> <template v-if="item.type === 3"> </template>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined> <template v-if="item.type === 4"> </template>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> <template v-if="item.type === 5"> </template>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger> <template v-if="item.type === 6">
</a-form-item> <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-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>
@ -33,31 +60,37 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, toRaw } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue'; import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis'; import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project'); const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']); //
const token = computed(() => store.getters['user/token']); const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` }; const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg; 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) { if (sessionProject) {
const project = JSON.parse(sessionProject); const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project); store.commit('projects/setProject', project);
} }
const topicMetaphaseFormData = ref({ getDataByCode();
projectId: projectId.value,
code: '', const beforeUpload = index => {
date: null, currIndex.value = index;
fileIdList: [], };
});
const handleChange = info => { const handleChange = info => {
const resFileList = [...info.fileList]; const resFileList = [...info.fileList];
@ -89,26 +122,92 @@ const handleChange = info => {
return file; return file;
}); });
fileList.value = arr.value; questionList.value[currIndex.value].files = arr.value;
}; };
const onSubmit = () => { const onSubmit = async () => {
fileList.value.forEach(item => { const params = {
// let obj = { param: {
// fileId: item.id, code: code.value,
// fileName: item.name, projectId: projectId.value,
// filePathL: item.url 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); if (item.type === 6) {
topicMetaphaseFormData.value.fileIdList.push(item.id); 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); params.param.questionAndAnswerList = arr;
console.log('submit!', toRaw(topicMetaphaseFormData.value)); 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> </script>
<style scoped> <style scoped>

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

@ -1,91 +1,96 @@
<template> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicMeetFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">实验名称</label> <template v-if="item.type === 1">
<a-input v-model:value="topicMeetFormData.name" placeholder="实验名称" /> <a-form-item>
</a-form-item> <label class="color-3">{{ item.question }}</label>
<a-input v-model:value="item.con" :placeholder="item.question" />
<a-form-item> </a-form-item>
<label class="color-3">实验人</label> </template>
<a-input v-model:value="topicMeetFormData.members" placeholder="实验人1;实验人2;实验人3" />
</a-form-item> <template v-if="item.type === 2">
<a-form-item>
<a-form-item> <label class="color-3">{{ item.question }}</label>
<label class="color-3">实验日期</label> <a-textarea v-model:value="item.con" :placeholder="item.question" />
<a-date-picker v-model:value="topicMeetFormData.date" /> </a-form-item>
</a-form-item> </template>
<a-form-item> <template v-if="item.type === 3"> </template>
<label class="color-3">实验地点</label>
<a-input v-model:value="topicMeetFormData.address" placeholder="实验地点" /> <template v-if="item.type === 4"> </template>
</a-form-item>
<template v-if="item.type === 5"> </template>
<a-form-item>
<label class="color-3">仪器用具/软件</label> <template v-if="item.type === 6">
<a-input v-model:value="topicMeetFormData.tools" placeholder="仪器用具/软件" /> <a-form-item>
</a-form-item> <label class="color-3">{{ item.question }}</label>
<a-date-picker v-model:value="item.date" />
<a-form-item> </a-form-item>
<label class="color-3">实验原理</label> </template>
<a-input v-model:value="topicMeetFormData.principle" placeholder="实验原理" />
</a-form-item> <template v-if="item.type === 7">
<a-form-item>
<a-form-item> <label class="color-3">{{ item.question }}</label>
<label class="color-3">实验步骤</label> <a-upload-dragger
<a-input v-model:value="topicMeetFormData.step" placeholder="实验步骤" /> v-model:fileList="item.files"
</a-form-item> name="files"
:multiple="true"
<a-form-item> :action="action"
<label class="color-3">实验报告</label> :headers="headers"
<a-upload-dragger :accept="'.pdf'"
v-model:fileList="fileList" :before-upload="beforeUpload(index)"
name="files" @change="handleChange"
:multiple="true" >
:action="action" <p class="ant-upload-drag-icon">
:headers="headers" <inbox-outlined></inbox-outlined>
:accept="'.pdf'" </p>
@change="handleChange" <p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
> <p class="ant-upload-hint color-c">格式pdf</p>
<p class="ant-upload-drag-icon"> </a-upload-dragger>
<inbox-outlined></inbox-outlined> </a-form-item>
</p> </template>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> </div>
<p class="ant-upload-hint color-c">格式word</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right"> <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-item>
</a-form> </a-form>
</div> </div>
</template> </template>
<script setup> <script setup>
// import { computed, watch, ref } from 'vue';
import { ref, computed } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
// import { message } from 'ant-design-vue'; import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue'; import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis'; import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project');
//
const token = computed(() => store.getters['user/token']); const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` }; const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg; const action = uploadImg;
const fileList = ref([]); //
const topicMeetFormData = ref({ const projectId = computed(() => store.getters['projects/projectId']); // ID
name: '', const code = computed(() => store.state.task.label); // code
members: '', const questionList = ref([]);
date: null, //
address: '', const currIndex = ref(null);
tools: '',
principle: '', // ID
step: '', if (sessionProject) {
fileList: [], const project = JSON.parse(sessionProject);
}); store.commit('projects/setProject', project);
}
getDataByCode();
const beforeUpload = index => {
currIndex.value = index;
};
const handleChange = info => { const handleChange = info => {
const resFileList = [...info.fileList]; const resFileList = [...info.fileList];
@ -93,33 +98,144 @@ const handleChange = info => {
// //
const arr = ref([]); const arr = ref([]);
resFileList.forEach(file => { resFileList.forEach(file => {
let flag = false; let num = -1;
arr.value.forEach(item => { arr.value.forEach((item, index) => {
if (file.name === item.name) { if (file.name === item.name) {
flag = true; num = index;
} }
}); });
if (!flag) { if (num > -1) {
arr.value.push(file); arr.value.splice(num, 1);
} }
arr.value.push(file);
}); });
// //
arr.value = arr.value.map(file => { arr.value = arr.value.map(file => {
if (file.response) { if (file.response) {
file.url = file.response.data[0].visitUrl; file.url = file.response.data[0].visitUrl;
file.id = file.response.data[0].id;
} }
return file; 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> </script>
<style scoped> <style scoped>
.task-detail { .task-detail {
background-color: #fff; 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> </style>

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

@ -1,34 +1,56 @@
<template> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="procedureFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">实验时间</label> <template v-if="item.type === 1">
<a-date-picker v-model:value="procedureFormData.date" /> <a-form-item>
</a-form-item> <label class="color-3">{{ item.question }}</label>
<a-input v-model:value="item.con" :placeholder="item.question" />
<a-form-item> </a-form-item>
<label class="color-3">实验人</label> </template>
<a-input v-model:value="procedureFormData.member" placeholder="实验人" />
</a-form-item> <template v-if="item.type === 2">
<a-form-item>
<a-form-item> <label class="color-3">{{ item.question }}</label>
<label class="color-3">实验过程</label> <a-textarea v-model:value="item.con" :placeholder="item.question" />
<a-upload-dragger </a-form-item>
v-model:fileList="fileList" </template>
name="files"
:multiple="true" <template v-if="item.type === 3"> </template>
:action="action"
:headers="headers" <template v-if="item.type === 4"> </template>
:accept="'.pdf'"
@change="handleChange" <template v-if="item.type === 5"> </template>
>
<p class="ant-upload-drag-icon"> <template v-if="item.type === 6">
<inbox-outlined></inbox-outlined> <a-form-item>
</p> <label class="color-3">{{ item.question }}</label>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> <a-date-picker v-model:value="item.date" />
<p class="ant-upload-hint color-c">格式word</p> </a-form-item>
</a-upload-dragger> </template>
</a-form-item>
<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-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>
@ -38,32 +60,37 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, toRaw } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue'; import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis'; import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project'); const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']); //
const token = computed(() => store.getters['user/token']); const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` }; const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg; 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) { if (sessionProject) {
const project = JSON.parse(sessionProject); const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project); store.commit('projects/setProject', project);
} }
const procedureFormData = ref({ getDataByCode();
projectId: projectId.value,
code: '', const beforeUpload = index => {
date: null, currIndex.value = index;
member: '', };
fileIdList: [],
});
const handleChange = info => { const handleChange = info => {
const resFileList = [...info.fileList]; const resFileList = [...info.fileList];
@ -95,26 +122,92 @@ const handleChange = info => {
return file; return file;
}); });
fileList.value = arr.value; questionList.value[currIndex.value].files = arr.value;
}; };
const onSubmit = () => { const onSubmit = async () => {
fileList.value.forEach(item => { const params = {
// let obj = { param: {
// fileId: item.id, code: code.value,
// fileName: item.name, projectId: projectId.value,
// filePathL: item.url 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); if (item.type === 6) {
procedureFormData.value.fileIdList.push(item.id); 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); params.param.questionAndAnswerList = arr;
console.log('submit!', toRaw(procedureFormData.value)); 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> </script>
<style scoped> <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> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicResultFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">项目名称</label> <template v-if="item.type === 1">
<a-input v-model:value="topicResultFormData.name" placeholder="项目名称" /> <a-form-item>
</a-form-item> <label class="color-3">{{ item.question }}</label>
<a-input v-model:value="item.con" :placeholder="item.question" />
<a-form-item> </a-form-item>
<label class="color-3">验收人</label> </template>
<a-input v-model:value="topicResultFormData.receiver" placeholder="验收人" />
</a-form-item> <template v-if="item.type === 2">
<a-form-item>
<a-form-item> <label class="color-3">{{ item.question }}</label>
<label class="color-3">验收证书</label> <a-textarea v-model:value="item.con" :placeholder="item.question" />
<a-upload-dragger </a-form-item>
v-model:fileList="fileList" </template>
name="files"
:multiple="true" <template v-if="item.type === 3"> </template>
:action="action"
:headers="headers" <template v-if="item.type === 4"> </template>
:accept="'.pdf'"
@change="handleChange" <template v-if="item.type === 5"> </template>
>
<p class="ant-upload-drag-icon"> <template v-if="item.type === 6">
<inbox-outlined></inbox-outlined> <a-form-item>
</p> <label class="color-3">{{ item.question }}</label>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> <a-date-picker v-model:value="item.date" />
<p class="ant-upload-hint color-c">格式pdf</p> </a-form-item>
</a-upload-dragger> </template>
</a-form-item>
<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-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>
@ -38,32 +60,37 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, toRaw } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue'; import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis'; import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project'); const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']); //
const token = computed(() => store.getters['user/token']); const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` }; const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg; 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) { if (sessionProject) {
const project = JSON.parse(sessionProject); const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project); store.commit('projects/setProject', project);
} }
const topicResultFormData = ref({ getDataByCode();
projectId: projectId.value,
code: '', const beforeUpload = index => {
name: '', currIndex.value = index;
receiver: '', };
fileIdList: [],
});
const handleChange = info => { const handleChange = info => {
const resFileList = [...info.fileList]; const resFileList = [...info.fileList];
@ -95,26 +122,92 @@ const handleChange = info => {
return file; return file;
}); });
fileList.value = arr.value; questionList.value[currIndex.value].files = arr.value;
}; };
const onSubmit = () => { const onSubmit = async () => {
fileList.value.forEach(item => { const params = {
// let obj = { param: {
// fileId: item.id, code: code.value,
// fileName: item.name, projectId: projectId.value,
// filePathL: item.url 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); if (item.type === 6) {
topicResultFormData.value.fileIdList.push(item.id); 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); params.param.questionAndAnswerList = arr;
console.log('submit!', toRaw(topicResultFormData.value)); 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> </script>
<style scoped> <style scoped>

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

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

@ -1,29 +1,56 @@
<template> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="subTopicConclusionFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">结题日期</label> <template v-if="item.type === 1">
<a-date-picker v-model:value="subTopicConclusionFormData.date" /> <a-form-item>
</a-form-item> <label class="color-3">{{ item.question }}</label>
<a-input v-model:value="item.con" :placeholder="item.question" />
<a-form-item> </a-form-item>
<label class="color-3">课题结题报告</label> </template>
<a-upload-dragger
v-model:fileList="fileList" <template v-if="item.type === 2">
name="files" <a-form-item>
:multiple="true" <label class="color-3">{{ item.question }}</label>
:action="action" <a-textarea v-model:value="item.con" :placeholder="item.question" />
:headers="headers" </a-form-item>
:accept="'.pdf'" </template>
@change="handleChange"
> <template v-if="item.type === 3"> </template>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined> <template v-if="item.type === 4"> </template>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> <template v-if="item.type === 5"> </template>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger> <template v-if="item.type === 6">
</a-form-item> <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-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>
@ -33,31 +60,37 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, toRaw } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue'; import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis'; import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project'); const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']); //
const token = computed(() => store.getters['user/token']); const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` }; const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg; 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) { if (sessionProject) {
const project = JSON.parse(sessionProject); const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project); store.commit('projects/setProject', project);
} }
const subTopicConclusionFormData = ref({ getDataByCode();
projectId: projectId.value,
code: '', const beforeUpload = index => {
date: null, currIndex.value = index;
fileIdList: [], };
});
const handleChange = info => { const handleChange = info => {
const resFileList = [...info.fileList]; const resFileList = [...info.fileList];
@ -89,26 +122,92 @@ const handleChange = info => {
return file; return file;
}); });
fileList.value = arr.value; questionList.value[currIndex.value].files = arr.value;
}; };
const onSubmit = () => { const onSubmit = async () => {
fileList.value.forEach(item => { const params = {
// let obj = { param: {
// fileId: item.id, code: code.value,
// fileName: item.name, projectId: projectId.value,
// filePathL: item.url 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); if (item.type === 6) {
subTopicConclusionFormData.value.fileIdList.push(item.id); 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); params.param.questionAndAnswerList = arr;
console.log('submit!', toRaw(subTopicConclusionFormData.value)); 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> </script>
<style scoped> <style scoped>

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

@ -1,29 +1,56 @@
<template> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="subTopicMetaphaseFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">检查日期</label> <template v-if="item.type === 1">
<a-date-picker v-model:value="subTopicMetaphaseFormData.date" /> <a-form-item>
</a-form-item> <label class="color-3">{{ item.question }}</label>
<a-input v-model:value="item.con" :placeholder="item.question" />
<a-form-item> </a-form-item>
<label class="color-3">中期检查报告</label> </template>
<a-upload-dragger
v-model:fileList="fileList" <template v-if="item.type === 2">
name="files" <a-form-item>
:multiple="true" <label class="color-3">{{ item.question }}</label>
:action="action" <a-textarea v-model:value="item.con" :placeholder="item.question" />
:headers="headers" </a-form-item>
:accept="'.pdf'" </template>
@change="handleChange"
> <template v-if="item.type === 3"> </template>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined> <template v-if="item.type === 4"> </template>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> <template v-if="item.type === 5"> </template>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger> <template v-if="item.type === 6">
</a-form-item> <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-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>
@ -33,31 +60,37 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, toRaw } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue'; import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis'; import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project'); const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']); //
const token = computed(() => store.getters['user/token']); const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` }; const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg; 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) { if (sessionProject) {
const project = JSON.parse(sessionProject); const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project); store.commit('projects/setProject', project);
} }
const subTopicMetaphaseFormData = ref({ getDataByCode();
projectId: projectId.value,
code: '', const beforeUpload = index => {
date: null, currIndex.value = index;
fileIdList: [], };
});
const handleChange = info => { const handleChange = info => {
const resFileList = [...info.fileList]; const resFileList = [...info.fileList];
@ -89,26 +122,92 @@ const handleChange = info => {
return file; return file;
}); });
fileList.value = arr.value; questionList.value[currIndex.value].files = arr.value;
}; };
const onSubmit = () => { const onSubmit = async () => {
fileList.value.forEach(item => { const params = {
// let obj = { param: {
// fileId: item.id, code: code.value,
// fileName: item.name, projectId: projectId.value,
// filePathL: item.url 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); if (item.type === 6) {
subTopicMetaphaseFormData.value.fileIdList.push(item.id); 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); params.param.questionAndAnswerList = arr;
console.log('submit!', toRaw(subTopicMetaphaseFormData.value)); 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> </script>
<style scoped> <style scoped>

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

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

@ -1,29 +1,56 @@
<template> <template>
<div class="task-form bg-white border-radius-10"> <div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="subTopicResultFormData"> <a-form>
<a-form-item> <div v-for="(item, index) in questionList" :key="index">
<label class="color-3">验收日期</label> <template v-if="item.type === 1">
<a-date-picker v-model:value="subTopicResultFormData.date" /> <a-form-item>
</a-form-item> <label class="color-3">{{ item.question }}</label>
<a-input v-model:value="item.con" :placeholder="item.question" />
<a-form-item> </a-form-item>
<label class="color-3">验收证书</label> </template>
<a-upload-dragger
v-model:fileList="fileList" <template v-if="item.type === 2">
name="files" <a-form-item>
:multiple="true" <label class="color-3">{{ item.question }}</label>
:action="action" <a-textarea v-model:value="item.con" :placeholder="item.question" />
:headers="headers" </a-form-item>
:accept="'.pdf'" </template>
@change="handleChange"
> <template v-if="item.type === 3"> </template>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined> <template v-if="item.type === 4"> </template>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> <template v-if="item.type === 5"> </template>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger> <template v-if="item.type === 6">
</a-form-item> <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-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>
@ -33,31 +60,37 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, toRaw } from 'vue'; import { ref, computed } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { InboxOutlined } from '@ant-design/icons-vue'; import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis'; import { uploadImg } from 'apis';
const store = useStore(); const store = useStore();
const formRef = ref(null); //
const sessionProject = sessionStorage.getItem('project'); const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']); //
const token = computed(() => store.getters['user/token']); const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` }; const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg; 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) { if (sessionProject) {
const project = JSON.parse(sessionProject); const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project); store.commit('projects/setProject', project);
} }
const subTopicResultFormData = ref({ getDataByCode();
projectId: projectId.value,
code: '', const beforeUpload = index => {
date: null, currIndex.value = index;
fileIdList: [], };
});
const handleChange = info => { const handleChange = info => {
const resFileList = [...info.fileList]; const resFileList = [...info.fileList];
@ -89,26 +122,92 @@ const handleChange = info => {
return file; return file;
}); });
fileList.value = arr.value; questionList.value[currIndex.value].files = arr.value;
}; };
const onSubmit = () => { const onSubmit = async () => {
fileList.value.forEach(item => { const params = {
// let obj = { param: {
// fileId: item.id, code: code.value,
// fileName: item.name, projectId: projectId.value,
// filePathL: item.url 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); if (item.type === 6) {
subTopicResultFormData.value.fileIdList.push(item.id); 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); params.param.questionAndAnswerList = arr;
console.log('submit!', toRaw(subTopicResultFormData.value)); 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> </script>
<style scoped> <style scoped>

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

@ -1,10 +1,10 @@
<template> <template>
<div class="list-box"> <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="task-time flex items-center justify-between">
<div class="flex items-center"> <div class="flex items-center">
<div class="circular"></div> <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>
<div class="task-action"></div> <div class="task-action"></div>
</div> </div>
@ -12,29 +12,8 @@
<div class="task-info"> <div class="task-info">
<div> <div>
<div class="task-card"> <div class="task-card">
<div class="task-name cursor-pointer flex justify-between items-center"> <div class="task-name cursor-pointer flex justify-between items-center" @click="toDetail(item)">
<span class="leading-none color-3">第一次科研需求分析会议</span> <span class="leading-none truncate color-3" style="width: calc(100% - 30px)" :title="item.name">{{ item.name }}</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>
<RightOutlined style="color: #666" /> <RightOutlined style="color: #666" />
</div> </div>
</div> </div>
@ -45,7 +24,40 @@
</template> </template>
<script setup> <script setup>
import { computed, ref } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { RightOutlined } from '@ant-design/icons-vue'; 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> </script>
<style scoped> <style scoped>
@ -54,9 +66,6 @@ import { RightOutlined } from '@ant-design/icons-vue';
overflow-y: auto; overflow-y: auto;
} }
.task-box {
}
.task-time { .task-time {
height: 32px; height: 32px;
} }

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

@ -4,7 +4,7 @@
<div <div
class="flex items-center cursor-pointer" class="flex items-center cursor-pointer"
:style="{ color: isShowList ? '#1890FF' : '' }" :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" @click="changeShowStatus"
> >
<ClockCircleOutlined style="font-size: 18px" /> <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 { export default {
namespaced: true, namespaced: true,
@ -31,6 +31,9 @@ export default {
globalHeight: 0, // 日常任务面板高度 globalHeight: 0, // 日常任务面板高度
detailId: '', // 子课题Id detailId: '', // 子课题Id
subProjectInfo: null, // 当前子课题信息 subProjectInfo: null, // 当前子课题信息
regularTasks: [], // 定期任务
intellectualId: '', // 当前选择的知识产权ID
question: null,
}, },
getters: { getters: {
@ -157,8 +160,6 @@ export default {
state.tasks = [...arr]; state.tasks = [...arr];
// state.tasks = [...data.concat(state.tasks)]; // 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)); 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 * @param {Object} state
@ -348,7 +359,99 @@ export default {
setSubProjectInfo(state, data) { setSubProjectInfo(state, data) {
state.subProjectInfo = 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'" /> <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'" /> <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 SubSubjectProgress from 'components/tall/task/SubSubjectProgress.vue'; //
import SubMeetingManagement from 'components/tall/task/SubMeetingManagement.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 AssignmentExperiment from 'components/tall/task/AssignmentExperiment.vue'; //
import SubInterimInspection from 'components/tall/task/SubInterimInspection.vue'; // import SubInterimInspection from 'components/tall/task/SubInterimInspection.vue'; //
import SubConclusion from 'components/tall/task/SubConclusion.vue'; // import SubConclusion from 'components/tall/task/SubConclusion.vue'; //
@ -272,4 +291,15 @@ watch([taskDetail], () => {
:deep(.ant-checkbox-group) { :deep(.ant-checkbox-group) {
width: 100%; width: 100%;
} }
/* 单选 */
:deep(.ant-radio-group) {
width: 100%;
display: flex;
align-items: center;
}
:deep(.ant-radio-wrapper) {
display: flex !important;
}
</style> </style>

Loading…
Cancel
Save