Browse Source

feat: "页面"

master
xuesinan 4 years ago
parent
commit
b4dc52f61f
  1. 1
      .eslintrc.js
  2. 4
      src/App.vue
  3. 12
      src/apis/index.js
  4. 5
      src/components/tall/left/Index.vue
  5. 18
      src/components/tall/left/Projects.vue
  6. 108
      src/components/tall/task/AssignmentExperiment.vue
  7. 220
      src/components/tall/task/AssignmentSubject.vue
  8. 142
      src/components/tall/task/Conclusion.vue
  9. 154
      src/components/tall/task/ContractManagement.vue
  10. 117
      src/components/tall/task/DataUnlock.vue
  11. 84
      src/components/tall/task/ExperimentalCode.vue
  12. 84
      src/components/tall/task/ExperimentalData.vue
  13. 78
      src/components/tall/task/ExperimentalResult.vue
  14. 142
      src/components/tall/task/InterimInspection.vue
  15. 125
      src/components/tall/task/LabReport.vue
  16. 4
      src/components/tall/task/MeetingManagement.vue
  17. 103
      src/components/tall/task/MemberManagement.vue
  18. 14
      src/components/tall/task/PlanAssignment.vue
  19. 148
      src/components/tall/task/Procedure.vue
  20. 148
      src/components/tall/task/Result.vue
  21. 142
      src/components/tall/task/SubConclusion.vue
  22. 142
      src/components/tall/task/SubInterimInspection.vue
  23. 122
      src/components/tall/task/SubMeetingManagement.vue
  24. 142
      src/components/tall/task/SubResult.vue
  25. 206
      src/components/tall/task/SubSubjectProgress.vue
  26. 2
      src/components/tall/top/Navbar.vue
  27. 6
      src/store/tall/layout/mutations.js
  28. 2
      src/store/tall/layout/state.js
  29. 81
      src/views/detail/Test.vue

1
.eslintrc.js

@ -31,6 +31,7 @@ module.exports = {
'no-shadow': ['error', { builtinGlobals: false, hoist: 'functions', allow: [] }], 'no-shadow': ['error', { builtinGlobals: false, hoist: 'functions', allow: [] }],
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'array-callback-return': 'off',
'no-param-reassign': 'off', 'no-param-reassign': 'off',
'max-len': [ 'max-len': [
'error', 'error',

4
src/App.vue

@ -116,6 +116,10 @@ body,
color: #666 !important; color: #666 !important;
} }
.color-9 {
color: #999 !important;
}
.color-c { .color-c {
color: #cccccc !important; color: #cccccc !important;
} }

12
src/apis/index.js

@ -69,3 +69,15 @@ export const uploadImg = `${filedeal}/file/upload/multiple`;
// 添加/编辑计划任务书 // 添加/编辑计划任务书
export const savePlanTask = params => http.post(`${experiment}/experiment/savePlanTask`, params); export const savePlanTask = params => http.post(`${experiment}/experiment/savePlanTask`, params);
// 分配子课题
export const saveSubExperiment = params => http.post(`${experiment}/experiment/saveSubExperiment`, params);
// 查询成员
export const memberQuery = params => http.post(`${experiment}/organization/query`, params);
// 添加成员
export const saveMember = params => http.post(`${experiment}/organization/save`, params);
// 分配实验
export const createExperiment = params => http.post(`${experiment}/subExperiment/create`, params);

5
src/components/tall/left/Index.vue

@ -116,8 +116,9 @@ async function createExperiment() {
// getProjectsList(dayjs().startOf('day').format('x'), dayjs().endOf('day').format('x')); // getProjectsList(dayjs().startOf('day').format('x'), dayjs().endOf('day').format('x'));
function changeTime() { function changeTime(data) {
// getProjectsList(data.startTime, data.endTime); console.log(data);
store.commit('layout/setSelectTime', data);
} }
</script> </script>

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

@ -81,12 +81,18 @@ const visible = ref(false);
const deleteId = ref(null); const deleteId = ref(null);
const projectId = sessionStorage.getItem('projectId'); const projectId = sessionStorage.getItem('projectId');
const newProject = computed(() => store.state.projects.newProject); // const newProject = computed(() => store.state.projects.newProject); //
const startTime = computed(() => store.state.layout.startTime); //
watch(newProject, () => { const endTime = computed(() => store.state.layout.endTime); //
getProjectsList(dayjs().startOf('day').format('x'), dayjs().endOf('day').format('x')); let start = startTime.value ? startTime.value : dayjs().startOf('day').format('x');
let end = endTime.value ? endTime.value : dayjs().startOf('day').format('x');
watch([newProject, startTime, endTime], () => {
start = startTime.value ? startTime.value : dayjs().startOf('day').format('x');
end = endTime.value ? endTime.value : dayjs().startOf('day').format('x');
getProjectsList(start, end);
}); });
getProjectsList(dayjs().startOf('day').format('x'), dayjs().endOf('day').format('x')); getProjectsList(start, end);
// //
const showActionCard = item => { const showActionCard = item => {
@ -95,9 +101,9 @@ const showActionCard = item => {
}; };
// //
async function getProjectsList(startTime, endTime) { async function getProjectsList(startData, endData) {
try { try {
const data = await getProjects(startTime, endTime); const data = await getProjects(startData, endData);
projects.projects = []; projects.projects = [];
data.forEach(item => { data.forEach(item => {
item.show = false; item.show = false;

108
src/components/tall/task/AssignmentExperiment.vue

@ -0,0 +1,108 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="experimentFormData">
<a-form-item>
<label class="color-3">实验名称</label>
<a-input v-model:value="experimentFormData.name" placeholder="实验名称" />
</a-form-item>
<a-form-item>
<label class="color-3">完成期限</label>
<a-space direction="vertical" :size="12">
<a-range-picker v-model:value="experimentFormData.date" />
</a-space>
</a-form-item>
<a-form-item>
<label class="color-3">负责人</label>
<a-select v-model:value="experimentFormData.memberId">
<a-select-option value="jack">Jack</a-select-option>
<a-select-option value="lucy">Lucy</a-select-option>
<a-select-option value="Yiminghe">yiminghe</a-select-option>
</a-select>
</a-form-item>
<a-form-item>
<label class="color-3">实验目标</label>
<a-textarea v-model:value="experimentFormData.target" placeholder="实验目标" />
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">确定</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
// import { createExperiment } from 'apis';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const experimentFormData = ref({
projectId: projectId.value,
id: '',
name: '',
memberId: '',
date: [],
startTime: '',
endTime: '',
target: '',
});
const onSubmit = () => {
experimentFormData.value.date.forEach((item, index) => {
if (index === 0) {
experimentFormData.value.startTime = dayjs(item).format('x');
} else {
experimentFormData.value.endTime = dayjs(item).format('x');
}
});
// const params = { param: experimentFormData.value };
// createExperiment(params);
console.log('submit!', toRaw(experimentFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

220
src/components/tall/task/AssignmentSubject.vue

@ -0,0 +1,220 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicSubFormData">
<a-form-item>
<label class="color-3">子课题名称</label>
<a-input v-model:value="topicSubFormData.name" placeholder="子课题名称" />
</a-form-item>
<a-form-item>
<label class="color-3">子课题负责人</label>
<a-select v-model:value="topicSubFormData.memberId">
<a-select-option value="jack">Jack</a-select-option>
<a-select-option value="lucy">Lucy</a-select-option>
<a-select-option value="Yiminghe">yiminghe</a-select-option>
</a-select>
</a-form-item>
<a-form-item>
<label class="color-3">完成期限</label>
<a-space direction="vertical" :size="12">
<a-range-picker v-model:value="topicSubFormData.date" />
</a-space>
</a-form-item>
<a-form-item class="form-item-dad">
<div class="flex items-center" style="margin-bottom: 5px">
<label class="color-3" style="margin-bottom: 0; margin-right: 8px">进度安排</label>
<PlusCircleOutlined style="color: #1890ff; font-size: 16px" @click="addMilestones" />
</div>
<div class="form-item-son" style="padding-left: 16px">
<div v-for="(item, index) in stageList" :key="index">
<a-form-item>
<label class="color-3">时间</label>
<a-space direction="vertical" :size="12">
<a-range-picker v-model:value="item.date" />
</a-space>
</a-form-item>
<a-form-item>
<label class="color-3">指标</label>
<a-checkbox-group v-model:value="item.checkContent">
<a-row>
<a-col :span="5" class="deliverables">
<a-checkbox value="1"><span class="color-6">论文</span><a-input v-model:value="item.thesis" /></a-checkbox>
</a-col>
<a-col :span="15" class="deliverables">
<a-checkbox value="2"><span class="color-6">专利</span><a-input v-model:value="item.patent" /></a-checkbox>
</a-col>
<a-col :span="4" class="deliverables">
<a-checkbox value="3"><span class="color-6">软著</span><a-input v-model:value="item.theSoft" /></a-checkbox>
</a-col>
<a-col :span="5" class="deliverables-son" style="padding-left: 14px">
<a-checkbox value="4"><span class="color-6">SCI论文</span><a-input v-model:value="item.sciThesis" /></a-checkbox>
</a-col>
<a-col :span="5" class="deliverables-son" style="padding-left: 14px">
<a-checkbox value="5"><span class="color-6">发明专利</span><a-input v-model:value="item.inventPatent" /></a-checkbox>
</a-col>
<a-col :span="5" class="deliverables-son">
<a-checkbox value="6"><span class="color-6">实用新型</span><a-input v-model:value="item.practicalPatent" /></a-checkbox>
</a-col>
<a-col :span="5" class="deliverables-son">
<a-checkbox value="7"><span class="color-6">外观专利</span><a-input v-model:value="item.facadePatent" /></a-checkbox>
</a-col>
<a-col :span="4" class="deliverables-son"></a-col>
</a-row>
</a-checkbox-group>
</a-form-item>
</div>
</div>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">上传计划任务书</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import { PlusCircleOutlined } from '@ant-design/icons-vue';
// import { saveSubExperiment } from 'apis';
import dayjs from 'dayjs';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
const sessionTaskDetail = sessionStorage.getItem('taskDetail');
const taskDetail = computed(() => store.state.task.taskDetail); //
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
if (sessionTaskDetail) {
const detail = JSON.parse(sessionTaskDetail);
store.commit('task/setTaskDetail', detail);
}
const topicSubFormData = ref({
projectId: projectId.value,
taskId: taskDetail.value.id,
experimentId: '',
name: '',
memberId: '',
date: [],
startTime: '',
endTime: '',
stageList: [],
});
const stageList = ref([
{
date: [],
startTime: '',
endTime: '',
checkContent: [],
thesis: '',
sciThesis: '',
patent: '',
inventPatent: '',
practicalPatent: '',
facadePatent: '',
theSoft: '',
},
]);
//
function addMilestones() {
stageList.value.push({
date: [],
startTime: '',
endTime: '',
checkContent: [],
thesis: '',
sciThesis: '',
patent: '',
inventPatent: '',
practicalPatent: '',
facadePatent: '',
theSoft: '',
});
}
const onSubmit = () => {
topicSubFormData.value.stageList = [];
stageList.value.forEach(item => {
const obj = {
startTime: '',
endTime: '',
thesis: item.thesis,
sciThesis: item.sciThesis,
patent: item.patent,
inventPatent: item.inventPatent,
practicalPatent: item.practicalPatent,
facadePatent: item.facadePatent,
theSoft: item.theSoft,
};
item.date.forEach((val, key) => {
if (key === 0) {
obj.startTime = dayjs(val).format('x');
} else {
obj.endTime = dayjs(val).format('x');
}
});
topicSubFormData.value.stageList.push(obj);
});
topicSubFormData.value.date.forEach((item, index) => {
if (index === 0) {
topicSubFormData.value.startTime = dayjs(item).format('x');
} else {
topicSubFormData.value.endTime = dayjs(item).format('x');
}
});
// const params = { param: topicSubFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(topicSubFormData.value), stageList.value);
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

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

@ -0,0 +1,142 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicConclusionFormData">
<a-form-item>
<label class="color-3">结题日期</label>
<a-date-picker v-model:value="topicConclusionFormData.date" />
</a-form-item>
<a-form-item>
<label class="color-3">项目结题报告</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">上传课题结题报告</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg;
const fileList = ref([]);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const topicConclusionFormData = ref({
projectId: projectId.value,
code: '',
date: null,
fileIdList: [],
});
const handleChange = info => {
const resFileList = [...info.fileList];
//
const arr = ref([]);
resFileList.forEach(file => {
let num = -1;
arr.value.forEach((item, index) => {
if (file.name === item.name) {
num = index;
}
});
if (num > -1) {
arr.value.splice(num, 1);
}
arr.value.push(file);
});
//
arr.value = arr.value.map(file => {
if (file.response) {
file.url = file.response.data[0].visitUrl;
file.id = file.response.data[0].id;
}
return file;
});
fileList.value = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
// topicConclusionFormData.value.fileList.push(obj);
topicConclusionFormData.value.fileIdList.push(item.id);
});
// const params = { param: topicConclusionFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(topicConclusionFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

154
src/components/tall/task/ContractManagement.vue

@ -0,0 +1,154 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicContractFormData">
<a-form-item>
<label class="color-3">合同名称</label>
<a-input v-model:value="topicContractFormData.name" placeholder="合同名称" />
</a-form-item>
<a-form-item>
<label class="color-3">合同编号</label>
<a-input v-model:value="topicContractFormData.number" placeholder="合同编号" />
</a-form-item>
<a-form-item>
<label class="color-3">合同甲方/委托方</label>
<a-input v-model:value="topicContractFormData.firstParty" placeholder="合同甲方/委托方" />
</a-form-item>
<a-form-item>
<label class="color-3">合同扫描</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">上传合同扫描件</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg;
const fileList = ref([]);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const topicContractFormData = ref({
projectId: projectId.value,
code: '',
name: '',
number: '',
firstParty: '',
fileIdList: [],
});
const handleChange = info => {
const resFileList = [...info.fileList];
//
const arr = ref([]);
resFileList.forEach(file => {
let num = -1;
arr.value.forEach((item, index) => {
if (file.name === item.name) {
num = index;
}
});
if (num > -1) {
arr.value.splice(num, 1);
}
arr.value.push(file);
});
//
arr.value = arr.value.map(file => {
if (file.response) {
file.url = file.response.data[0].visitUrl;
file.id = file.response.data[0].id;
}
return file;
});
fileList.value = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
// topicContractFormData.value.fileList.push(obj);
topicContractFormData.value.fileIdList.push(item.id);
});
// const params = { param: topicContractFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(topicContractFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

117
src/components/tall/task/DataUnlock.vue

@ -0,0 +1,117 @@
<template>
<div class="flex flex-wrap">
<a-card title="解锁申请">
<p><span class="color-9">申请人</span><span class="color-3">子课题负责人</span></p>
<p><span class="color-9">申请时间</span><span class="color-3">2021-09-17 10:30</span></p>
<p><span class="color-9">申请原因</span><span class="color-3">修改交付物</span></p>
<div class="flex justify-end">
<a-button class="action-btn edit-btn" type="primary">通过</a-button>
<a-button class="action-btn del-btn" type="primary">驳回</a-button>
</div>
</a-card>
<a-card title="解锁申请">
<p><span class="color-9">申请人</span><span class="color-3">子课题负责人</span></p>
<p><span class="color-9">申请时间</span><span class="color-3">2021-09-17 10:30</span></p>
<p><span class="color-9">申请原因</span><span class="color-3">修改交付物</span></p>
<div class="flex justify-end">
<a-button class="action-btn edit-btn" type="primary">通过</a-button>
<a-button class="action-btn del-btn" type="primary">驳回</a-button>
</div>
</a-card>
<a-card title="解锁申请">
<p><span class="color-9">申请人</span><span class="color-3">子课题负责人</span></p>
<p><span class="color-9">申请时间</span><span class="color-3">2021-09-17 10:30</span></p>
<p><span class="color-9">申请原因</span><span class="color-3">修改交付物</span></p>
<div class="flex justify-end">
<a-button class="action-btn edit-btn" type="primary">通过</a-button>
<a-button class="action-btn del-btn" type="primary">驳回</a-button>
</div>
</a-card>
<a-card title="解锁申请">
<p><span class="color-9">申请人</span><span class="color-3">子课题负责人</span></p>
<p><span class="color-9">申请时间</span><span class="color-3">2021-09-17 10:30</span></p>
<p><span class="color-9">申请原因</span><span class="color-3">修改交付物</span></p>
<div class="flex justify-end">
<a-button class="action-btn edit-btn" type="primary">通过</a-button>
<a-button class="action-btn del-btn" type="primary">驳回</a-button>
</div>
</a-card>
</div>
</template>
<style scoped>
.ant-card {
border-radius: 10px;
margin-right: 16px;
margin-bottom: 16px;
}
@media screen and (max-width: 1650px) {
.ant-card {
width: calc(50% - 8px);
}
.ant-card:nth-child(2n) {
margin-right: 0;
}
}
@media screen and (min-width: 1651px) {
.ant-card {
width: calc((100% - 32px) / 3);
}
.ant-card:nth-child(3n) {
margin-right: 0;
}
}
:deep(.ant-card-head) {
padding: 0 16px;
height: 45px;
min-height: 45px;
}
:deep(.ant-card-head-title) {
padding: 0;
line-height: 45px;
font-size: 14px;
color: #333;
}
:deep(.ant-card-body) {
padding: 24px 16px;
}
:deep(.ant-card-body) p {
line-height: 1;
margin-bottom: 16px;
}
:deep(.ant-card-body) p span:first-of-type {
display: inline-block;
width: 80px;
}
.action-btn {
width: 50px !important;
height: 28px !important;
font-size: 14px !important;
padding: 0;
letter-spacing: 0 !important;
}
.edit-btn {
background: #0dc26c;
border: 0;
}
.del-btn {
margin-left: 16px;
background: #ff5353;
border: 0;
}
</style>

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

@ -0,0 +1,84 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="experCodeFormData">
<a-form-item>
<label class="color-3">实验时间</label>
<a-date-picker v-model:value="experCodeFormData.date" />
</a-form-item>
<a-form-item>
<label class="color-3">实验人</label>
<a-input v-model:value="experCodeFormData.member" placeholder="实验人" />
</a-form-item>
<a-form-item>
<label class="color-3">实验程序代码</label>
<a-input v-model:value="experCodeFormData.codeUrl" placeholder="github链接" />
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">确定</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const experCodeFormData = ref({
projectId: projectId.value,
code: '',
date: null,
member: '',
codeUrl: '',
});
const onSubmit = () => {
// const params = { param: experCodeFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(experCodeFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

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

@ -0,0 +1,84 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="experDataFormData">
<a-form-item>
<label class="color-3">实验时间</label>
<a-date-picker v-model:value="experDataFormData.date" />
</a-form-item>
<a-form-item>
<label class="color-3">实验人</label>
<a-input v-model:value="experDataFormData.member" placeholder="实验人" />
</a-form-item>
<a-form-item>
<label class="color-3">实验数据</label>
<a-input v-model:value="experDataFormData.data" placeholder="github链接" />
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">确定</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const experDataFormData = ref({
projectId: projectId.value,
code: '',
date: null,
member: '',
data: '',
});
const onSubmit = () => {
// const params = { param: experDataFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(experDataFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

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

@ -0,0 +1,78 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="experResultFormData">
<a-form-item>
<label class="color-3">结论</label>
<a-textarea v-model:value="experResultFormData.result" placeholder="结论" />
</a-form-item>
<a-form-item>
<label class="color-3">实验程序代码</label>
<a-input v-model:value="experResultFormData.codeUrl" placeholder="github链接" />
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">确定</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const experResultFormData = ref({
projectId: projectId.value,
code: '',
result: '',
codeUrl: '',
});
const onSubmit = () => {
// const params = { param: experResultFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(experResultFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

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

@ -0,0 +1,142 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicMetaphaseFormData">
<a-form-item>
<label class="color-3">检查日期</label>
<a-date-picker v-model:value="topicMetaphaseFormData.date" />
</a-form-item>
<a-form-item>
<label class="color-3">中期检查报告</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">上传中期检查报告</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg;
const fileList = ref([]);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const topicMetaphaseFormData = ref({
projectId: projectId.value,
code: '',
date: null,
fileIdList: [],
});
const handleChange = info => {
const resFileList = [...info.fileList];
//
const arr = ref([]);
resFileList.forEach(file => {
let num = -1;
arr.value.forEach((item, index) => {
if (file.name === item.name) {
num = index;
}
});
if (num > -1) {
arr.value.splice(num, 1);
}
arr.value.push(file);
});
//
arr.value = arr.value.map(file => {
if (file.response) {
file.url = file.response.data[0].visitUrl;
file.id = file.response.data[0].id;
}
return file;
});
fileList.value = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
// topicMetaphaseFormData.value.fileList.push(obj);
topicMetaphaseFormData.value.fileIdList.push(item.id);
});
// const params = { param: topicMetaphaseFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(topicMetaphaseFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

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

@ -0,0 +1,125 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicMeetFormData">
<a-form-item>
<label class="color-3">实验名称</label>
<a-input v-model:value="topicMeetFormData.name" placeholder="实验名称" />
</a-form-item>
<a-form-item>
<label class="color-3">实验人</label>
<a-input v-model:value="topicMeetFormData.members" placeholder="实验人1;实验人2;实验人3" />
</a-form-item>
<a-form-item>
<label class="color-3">实验日期</label>
<a-date-picker v-model:value="topicMeetFormData.date" />
</a-form-item>
<a-form-item>
<label class="color-3">实验地点</label>
<a-input v-model:value="topicMeetFormData.address" placeholder="实验地点" />
</a-form-item>
<a-form-item>
<label class="color-3">仪器用具/软件</label>
<a-input v-model:value="topicMeetFormData.tools" placeholder="仪器用具/软件" />
</a-form-item>
<a-form-item>
<label class="color-3">实验原理</label>
<a-input v-model:value="topicMeetFormData.principle" placeholder="实验原理" />
</a-form-item>
<a-form-item>
<label class="color-3">实验步骤</label>
<a-input v-model:value="topicMeetFormData.step" placeholder="实验步骤" />
</a-form-item>
<a-form-item>
<label class="color-3">实验报告</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式word</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit">确定</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
// import { computed, watch, ref } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
// import { message } from 'ant-design-vue';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg;
const fileList = ref([]);
const topicMeetFormData = ref({
name: '',
members: '',
date: null,
address: '',
tools: '',
principle: '',
step: '',
fileList: [],
});
const handleChange = info => {
const resFileList = [...info.fileList];
//
const arr = ref([]);
resFileList.forEach(file => {
let flag = false;
arr.value.forEach(item => {
if (file.name === item.name) {
flag = true;
}
});
if (!flag) {
arr.value.push(file);
}
});
//
arr.value = arr.value.map(file => {
if (file.response) {
file.url = file.response.data[0].visitUrl;
}
return file;
});
fileList.value = arr.value;
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
</style>

4
src/components/tall/task/MeetingManagement.vue

@ -71,12 +71,12 @@
<inbox-outlined></inbox-outlined> <inbox-outlined></inbox-outlined>
</p> </p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p> <p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式pdf</p> <p class="ant-upload-hint color-c">格式jpgjpegrarzip</p>
</a-upload-dragger> </a-upload-dragger>
</a-form-item> </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">上传会议资料</a-button>
</a-form-item> </a-form-item>
</a-form> </a-form>
</div> </div>

103
src/components/tall/task/MemberManagement.vue

@ -1,27 +1,41 @@
<template> <template>
<div> <div>
<a-table :columns="columns" :data-source="data"> <a-table :columns="columns" :data-source="dataList">
<!-- <template #headerCell="{ column }"></template> --> <template #bodyCell="{ column, text, record }">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'"> <template v-if="column.key === 'action'">
<a-button class="action-btn edit-btn" type="primary" @click="toEdit(record)">编辑</a-button> <template v-if="record.isEdit === 0">
<a-button class="action-btn del-btn" type="primary" @click="toDelete(record)">删除</a-button> <a-button class="action-btn edit-btn" type="primary" @click="toEdit(record.key)">编辑</a-button>
<a-button class="action-btn del-btn" type="primary" @click="toDelete(record.key)">删除</a-button>
</template>
<template v-if="record.isEdit === 1">
<a-button class="action-btn edit-btn" type="primary" @click="save(record.key)">保存</a-button>
<a-button class="action-btn del-btn" type="primary" @click="cancel(record.key)">取消</a-button>
</template>
</template>
<template v-else-if="['name', 'account', 'role', 'unit'].includes(column.dataIndex)">
<div>
<a-input v-if="record.isEdit === 1" v-model:value="record[column.dataIndex]" style="margin: -5px 0" />
<template v-else>
{{ text }}
</template>
</div>
</template> </template>
</template> </template>
</a-table>
<div class="add-btn flex items-center cursor-pointer" @click="addMember"> <template #footer><PlusCircleOutlined @click="addMember" style="font-size: 24px; color: #1890ff" /></template>
<PlusCircleOutlined style="font-size: 24px; color: #1890ff" /> </a-table>
</div>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref } from 'vue';
import { PlusCircleOutlined } from '@ant-design/icons-vue'; import { PlusCircleOutlined } from '@ant-design/icons-vue';
import {} from 'apis'; // import { memberQuery, saveMember } from 'apis';
import { memberQuery } from 'apis';
const columns = [ const columns = ref([
{ {
title: '序号', title: '序号',
dataIndex: 'id', dataIndex: 'id',
@ -52,9 +66,9 @@ const columns = [
key: 'action', key: 'action',
dataIndex: 'action', dataIndex: 'action',
}, },
]; ]);
const data = [ const dataList = ref([
{ {
key: '1', key: '1',
id: '1', id: '1',
@ -62,6 +76,7 @@ const data = [
account: '12345678910', account: '12345678910',
role: '课题主持人', role: '课题主持人',
unit: '课题主持人', unit: '课题主持人',
isEdit: 0,
}, },
{ {
key: '2', key: '2',
@ -70,6 +85,7 @@ const data = [
account: '10987654321', account: '10987654321',
role: '子课题负责人1', role: '子课题负责人1',
unit: '子课题负责人1', unit: '子课题负责人1',
isEdit: 0,
}, },
{ {
key: '3', key: '3',
@ -78,6 +94,7 @@ const data = [
account: '12345678910', account: '12345678910',
role: '课题主持人', role: '课题主持人',
unit: '课题主持人', unit: '课题主持人',
isEdit: 0,
}, },
{ {
key: '4', key: '4',
@ -86,11 +103,50 @@ const data = [
account: '12345678910', account: '12345678910',
role: '课题主持人', role: '课题主持人',
unit: '课题主持人', unit: '课题主持人',
isEdit: 0,
}, },
]; ]);
getList();
async function getList() {
try {
const params = { param: {} };
const data = await memberQuery(params);
return data;
} catch (error) {
console.log('error', error);
}
}
const addMember = () => {
const num = (dataList.value.length + 1).toString;
const obj = { key: num, id: num, name: '', account: '', role: '', unit: '', isEdit: 1 };
dataList.value.push(obj);
};
function toEdit(key) {
dataList.value.forEach(item => {
if (item.key === key) {
item.isEdit = 1;
}
});
}
function cancel(key) {
dataList.value.filter(item => {
if (item.key === key) {
item.isEdit = 0;
}
});
}
function addMember() { function save(key) {
data.push({ key: '5', id: '5', name: '', account: '', role: '', unit: '' }); console.log(key);
}
function toDelete(key) {
console.log(key);
} }
</script> </script>
@ -124,4 +180,17 @@ function addMember() {
background: #ff5353; background: #ff5353;
border: 0; border: 0;
} }
:deep(.ant-table-container table > thead > tr:first-child th:first-child) {
width: 80px;
text-align: center;
}
:deep(.ant-table-container table > tbody > tr > td:first-child) {
text-align: center;
}
:deep(.ant-table-container table > thead > tr:first-child th:last-child) {
min-width: 160px;
}
</style> </style>

14
src/components/tall/task/PlanAssignment.vue

@ -141,16 +141,23 @@
import { ref, computed, toRaw } from 'vue'; import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import { InboxOutlined, PlusCircleOutlined } from '@ant-design/icons-vue'; import { InboxOutlined, PlusCircleOutlined } from '@ant-design/icons-vue';
import { uploadImg, savePlanTask } from 'apis'; import { uploadImg } from 'apis';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
const store = useStore(); const store = useStore();
const formRef = ref(null); const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']); 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 fileList = ref([]);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const topicMeetFormData = ref({ const topicMeetFormData = ref({
projectId: projectId.value, projectId: projectId.value,
name: '', name: '',
@ -225,6 +232,7 @@ const onSubmit = () => {
topicMeetFormData.value.fileIdList.push(item.id); topicMeetFormData.value.fileIdList.push(item.id);
}); });
topicMeetFormData.value.planTaskStageList = [];
planTaskStageList.value.forEach(item => { planTaskStageList.value.forEach(item => {
const obj = { const obj = {
startTime: '', startTime: '',
@ -252,9 +260,9 @@ const onSubmit = () => {
} }
}); });
const params = { param: topicMeetFormData.value }; // const params = { param: topicMeetFormData.value };
savePlanTask(params); // savePlanTask(params);
console.log('submit!', toRaw(topicMeetFormData.value), planTaskStageList.value, planTaskDefinedList.value); console.log('submit!', toRaw(topicMeetFormData.value), planTaskStageList.value, planTaskDefinedList.value);
}; };
</script> </script>

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

@ -0,0 +1,148 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="procedureFormData">
<a-form-item>
<label class="color-3">实验时间</label>
<a-date-picker v-model:value="procedureFormData.date" />
</a-form-item>
<a-form-item>
<label class="color-3">实验人</label>
<a-input v-model:value="procedureFormData.member" placeholder="实验人" />
</a-form-item>
<a-form-item>
<label class="color-3">实验过程</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式word</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">确定</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg;
const fileList = ref([]);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const procedureFormData = ref({
projectId: projectId.value,
code: '',
date: null,
member: '',
fileIdList: [],
});
const handleChange = info => {
const resFileList = [...info.fileList];
//
const arr = ref([]);
resFileList.forEach(file => {
let num = -1;
arr.value.forEach((item, index) => {
if (file.name === item.name) {
num = index;
}
});
if (num > -1) {
arr.value.splice(num, 1);
}
arr.value.push(file);
});
//
arr.value = arr.value.map(file => {
if (file.response) {
file.url = file.response.data[0].visitUrl;
file.id = file.response.data[0].id;
}
return file;
});
fileList.value = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
// procedureFormData.value.fileList.push(obj);
procedureFormData.value.fileIdList.push(item.id);
});
// const params = { param: procedureFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(procedureFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

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

@ -0,0 +1,148 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicResultFormData">
<a-form-item>
<label class="color-3">项目名称</label>
<a-input v-model:value="topicResultFormData.name" placeholder="项目名称" />
</a-form-item>
<a-form-item>
<label class="color-3">验收人</label>
<a-input v-model:value="topicResultFormData.receiver" placeholder="验收人" />
</a-form-item>
<a-form-item>
<label class="color-3">验收证书</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">上传验收证书</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg;
const fileList = ref([]);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const topicResultFormData = ref({
projectId: projectId.value,
code: '',
name: '',
receiver: '',
fileIdList: [],
});
const handleChange = info => {
const resFileList = [...info.fileList];
//
const arr = ref([]);
resFileList.forEach(file => {
let num = -1;
arr.value.forEach((item, index) => {
if (file.name === item.name) {
num = index;
}
});
if (num > -1) {
arr.value.splice(num, 1);
}
arr.value.push(file);
});
//
arr.value = arr.value.map(file => {
if (file.response) {
file.url = file.response.data[0].visitUrl;
file.id = file.response.data[0].id;
}
return file;
});
fileList.value = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
// topicResultFormData.value.fileList.push(obj);
topicResultFormData.value.fileIdList.push(item.id);
});
// const params = { param: topicResultFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(topicResultFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

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

@ -0,0 +1,142 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="subTopicConclusionFormData">
<a-form-item>
<label class="color-3">结题日期</label>
<a-date-picker v-model:value="subTopicConclusionFormData.date" />
</a-form-item>
<a-form-item>
<label class="color-3">课题结题报告</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">上传课题结题报告</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg;
const fileList = ref([]);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const subTopicConclusionFormData = ref({
projectId: projectId.value,
code: '',
date: null,
fileIdList: [],
});
const handleChange = info => {
const resFileList = [...info.fileList];
//
const arr = ref([]);
resFileList.forEach(file => {
let num = -1;
arr.value.forEach((item, index) => {
if (file.name === item.name) {
num = index;
}
});
if (num > -1) {
arr.value.splice(num, 1);
}
arr.value.push(file);
});
//
arr.value = arr.value.map(file => {
if (file.response) {
file.url = file.response.data[0].visitUrl;
file.id = file.response.data[0].id;
}
return file;
});
fileList.value = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
// subTopicConclusionFormData.value.fileList.push(obj);
subTopicConclusionFormData.value.fileIdList.push(item.id);
});
// const params = { param: subTopicConclusionFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(subTopicConclusionFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

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

@ -0,0 +1,142 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="subTopicMetaphaseFormData">
<a-form-item>
<label class="color-3">检查日期</label>
<a-date-picker v-model:value="subTopicMetaphaseFormData.date" />
</a-form-item>
<a-form-item>
<label class="color-3">中期检查报告</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">上传中期检查报告</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg;
const fileList = ref([]);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const subTopicMetaphaseFormData = ref({
projectId: projectId.value,
code: '',
date: null,
fileIdList: [],
});
const handleChange = info => {
const resFileList = [...info.fileList];
//
const arr = ref([]);
resFileList.forEach(file => {
let num = -1;
arr.value.forEach((item, index) => {
if (file.name === item.name) {
num = index;
}
});
if (num > -1) {
arr.value.splice(num, 1);
}
arr.value.push(file);
});
//
arr.value = arr.value.map(file => {
if (file.response) {
file.url = file.response.data[0].visitUrl;
file.id = file.response.data[0].id;
}
return file;
});
fileList.value = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
// subTopicMetaphaseFormData.value.fileList.push(obj);
subTopicMetaphaseFormData.value.fileIdList.push(item.id);
});
// const params = { param: subTopicMetaphaseFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(subTopicMetaphaseFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

122
src/components/tall/task/SubMeetingManagement.vue

@ -0,0 +1,122 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicMeetFormData">
<a-form-item>
<label class="color-3">会议名称</label>
<a-input v-model:value="topicMeetFormData.name" placeholder="会议名称" />
</a-form-item>
<a-form-item>
<label class="color-3">会议日期</label>
<a-space direction="vertical" :size="12">
<a-range-picker v-model:value="topicMeetFormData.date" />
</a-space>
</a-form-item>
<a-form-item>
<label class="color-3">会议地点</label>
<a-input v-model:value="topicMeetFormData.address" placeholder="会议地点" />
</a-form-item>
<a-form-item>
<label class="color-3">会议纪要</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式jpgjpegrarzip</p>
</a-upload-dragger>
</a-form-item>
<a-form-item>
<label class="color-3">照片附件/其他</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit">上传会议记录</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
// import { computed, watch, ref } from 'vue';
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
// import { message } from 'ant-design-vue';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg;
const fileList = ref([]);
const topicMeetFormData = ref({
name: '',
date: [],
address: '',
fileList: [],
});
const handleChange = info => {
const resFileList = [...info.fileList];
//
const arr = ref([]);
resFileList.forEach(file => {
let flag = false;
arr.value.forEach(item => {
if (file.name === item.name) {
flag = true;
}
});
if (!flag) {
arr.value.push(file);
}
});
//
arr.value = arr.value.map(file => {
if (file.response) {
file.url = file.response.data[0].visitUrl;
}
return file;
});
fileList.value = arr.value;
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
</style>

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

@ -0,0 +1,142 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="subTopicResultFormData">
<a-form-item>
<label class="color-3">验收日期</label>
<a-date-picker v-model:value="subTopicResultFormData.date" />
</a-form-item>
<a-form-item>
<label class="color-3">验收证书</label>
<a-upload-dragger
v-model:fileList="fileList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text color-3 font-14">点击或拖拽文件到区域内上传交付物</p>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit" @click="onSubmit">上传验收证书</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
const token = computed(() => store.getters['user/token']);
const headers = { Authorization: `Bearer ${token.value}` };
const action = uploadImg;
const fileList = ref([]);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const subTopicResultFormData = ref({
projectId: projectId.value,
code: '',
date: null,
fileIdList: [],
});
const handleChange = info => {
const resFileList = [...info.fileList];
//
const arr = ref([]);
resFileList.forEach(file => {
let num = -1;
arr.value.forEach((item, index) => {
if (file.name === item.name) {
num = index;
}
});
if (num > -1) {
arr.value.splice(num, 1);
}
arr.value.push(file);
});
//
arr.value = arr.value.map(file => {
if (file.response) {
file.url = file.response.data[0].visitUrl;
file.id = file.response.data[0].id;
}
return file;
});
fileList.value = arr.value;
};
const onSubmit = () => {
fileList.value.forEach(item => {
// let obj = {
// fileId: item.id,
// fileName: item.name,
// filePathL: item.url
// }
// subTopicResultFormData.value.fileList.push(obj);
subTopicResultFormData.value.fileIdList.push(item.id);
});
// const params = { param: subTopicResultFormData.value };
// saveSubExperiment(params);
console.log('submit!', toRaw(subTopicResultFormData.value));
};
</script>
<style scoped>
.task-detail {
background-color: #fff;
}
.ant-col {
margin-top: 10px;
}
.ant-col:nth-child(-n + 4) {
margin-top: 2px;
}
.deliverables .ant-input,
.deliverables-son .ant-input {
width: 23px;
height: 14px;
border-radius: 0;
padding: 0;
font-size: 12px;
color: #1890ff;
text-align: center;
margin-left: 5px;
}
.deliverables-son {
margin-top: 10px !important;
}
</style>

206
src/components/tall/task/SubSubjectProgress.vue

@ -0,0 +1,206 @@
<template>
<div class="task-progress flex flex-wrap justify-between">
<div class="wrap overflow-hidden">
<a-card title="任务目标">
<div class="flex flex-wrap justify-center">
<div class="achievements border-right text-center">
<p class="num">1/6</p>
<p class="name">论文</p>
</div>
<div class="achievements border-bottom text-center">
<p class="num">1/6</p>
<p class="name">专利</p>
</div>
<div class="achievements border-top text-center">
<p class="num">1/6</p>
<p class="name">软著</p>
</div>
<div class="achievements border-left text-center">
<p class="num">1/6</p>
<p class="name">会议</p>
</div>
</div>
</a-card>
</div>
<div class="wrap overflow-hidden">
<a-card title="概览">
<div class="topic">
<p>脑卒中远程康复与健康监护系统</p>
<a-progress
:percent="30"
:strokeWidth="22"
:show-info="false"
:stroke-color="'#1890FF'"
:trail-color="'rgba(24, 144, 255, 0.2)'"
/>
</div>
<div class="sub-topic flex justify-between flex-wrap">
<div class="topic">
<p>穿戴式运动捕获单元</p>
<a-progress
:percent="30"
:strokeWidth="22"
:show-info="false"
:stroke-color="colorList[0].color"
:trail-color="colorList[0].bgColor"
/>
</div>
<div class="topic">
<p>穿戴式康复数据手套</p>
<a-progress
:percent="30"
:strokeWidth="22"
:show-info="false"
:stroke-color="colorList[1].color"
:trail-color="colorList[1].bgColor"
/>
</div>
</div>
</a-card>
</div>
<div class="wrap overflow-hidden">
<a-card title="穿戴式运动捕获单元">
<div class="flex flex-wrap justify-center">
<div class="achievements border-right text-center">
<p class="num">1/6</p>
<p class="name">论文</p>
</div>
<div class="achievements border-bottom text-center">
<p class="num">1/6</p>
<p class="name">专利</p>
</div>
<div class="achievements border-top text-center">
<p class="num">1/6</p>
<p class="name">软著</p>
</div>
<div class="achievements border-left text-center">
<p class="num">1/6</p>
<p class="name">会议</p>
</div>
</div>
</a-card>
</div>
<div class="wrap overflow-hidden">
<a-card title="穿戴式康复数据手套">
<div class="flex flex-wrap justify-center">
<div class="achievements border-right text-center">
<p class="num">1/6</p>
<p class="name">论文</p>
</div>
<div class="achievements border-bottom text-center">
<p class="num">1/6</p>
<p class="name">专利</p>
</div>
<div class="achievements border-top text-center">
<p class="num">1/6</p>
<p class="name">软著</p>
</div>
<div class="achievements border-left text-center">
<p class="num">1/6</p>
<p class="name">会议</p>
</div>
</div>
</a-card>
</div>
</div>
</template>
<script setup>
// import { computed, watch, ref } from 'vue';
import { ref } from 'vue';
// import { useStore } from 'vuex';
// const store = useStore();
const colorList = ref([
{ color: '#FF9191', bgColor: 'rgba(255, 145, 145, 0.2)' },
{ color: '#FF934B', bgColor: 'rgba(255, 147, 75, 0.2)' },
]);
</script>
<style scoped>
.wrap {
margin-top: 16px;
width: calc((100% - 16px) / 2);
background-color: #fff;
border-radius: 10px;
border: 1px solid #cccccc;
}
.wrap:nth-child(-n + 2) {
margin-top: 0;
}
:deep(.ant-card-head) {
padding: 0 16px;
min-height: 45px;
max-height: 45px;
border-color: #cccccc;
font-size: 14px;
}
:deep(.ant-card-head-title) {
padding: 0;
line-height: 45px;
}
.wrap .num {
font-size: 22px;
color: #4b8aff;
}
.wrap .name {
color: #666666;
}
.wrap p {
margin: 0;
}
.border-right {
border-right: 1px solid #cccccc;
margin-right: -1px;
}
.border-left {
border-left: 1px solid #cccccc;
}
.border-top {
border-top: 1px solid #cccccc;
margin-top: -1px;
}
.border-bottom {
border-bottom: 1px solid #cccccc;
}
.achievements {
width: 40%;
padding: 25px 0;
}
.topic p {
margin-bottom: 8px;
color: #666666;
}
.sub-topic .topic {
margin-top: 40px;
width: calc((100% - 32px) / 2);
}
.ant-card {
height: 100%;
}
.ant-card :deep(.ant-card-body) {
height: calc(100% - 48px);
display: flex;
flex-direction: column;
justify-content: center;
}
</style>

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'" v-if="label == 'KT_KYHY' || label == 'ZKT_HYGL'"
@click="changeShowStatus" @click="changeShowStatus"
> >
<ClockCircleOutlined style="font-size: 18px" /> <ClockCircleOutlined style="font-size: 18px" />

6
src/store/tall/layout/mutations.js

@ -13,6 +13,12 @@ const mutations = {
setListStatus(state, data) { setListStatus(state, data) {
state.isShowListStatus = data; state.isShowListStatus = data;
}, },
// 设置选择的时间
setSelectTime(state, data) {
state.startTime = data.startTime;
state.endTime = data.endTime;
},
}; };
export default mutations; export default mutations;

2
src/store/tall/layout/state.js

@ -4,6 +4,8 @@ const state = {
left: true, // 是否显示左栏 left: true, // 是否显示左栏
}, },
isShowListStatus: false, // 是否显示任务详情列表 isShowListStatus: false, // 是否显示任务详情列表
startTime: '',
endTime: '',
}; };
export default state; export default state;

81
src/views/detail/Test.vue

@ -11,11 +11,64 @@
<!-- 科研会议管理 --> <!-- 科研会议管理 -->
<MeetingManagement v-if="label === 'KT_KYHY'" /> <MeetingManagement v-if="label === 'KT_KYHY'" />
<!-- 合同管理 -->
<ContractManagement v-if="label === 'KT_HTGL'" />
<!-- 数据追溯解锁 -->
<DataUnlock v-if="label === 'KT_SJZSJS'" />
<!-- 成员管理 --> <!-- 成员管理 -->
<MemberManagement v-if="label === 'KT_CYGL'" /> <MemberManagement v-if="label === 'KT_CYGL'" />
<!-- 计划任务书 --> <!-- 计划任务书 -->
<PlanAssignment v-if="label === 'KT_JHRWS'" /> <PlanAssignment v-if="label === 'KT_JHRWS'" />
<!-- 分配课题 -->
<AssignmentSubject v-if="label === 'KT_FPKT'" />
<!-- 提交中期检查报告 -->
<InterimInspection v-if="label === 'KT_ZQJC'" />
<!-- 项目结题报告 -->
<Conclusion v-if="label === 'KT_JTBG'" />
<!-- 项目验收报告 -->
<Result v-if="label === 'KT_YSZS'" />
<!-- 子课题 -->
<!-- 子课题进展 -->
<SubSubjectProgress v-if="label === 'ZKT_KTJZ'" />
<!-- 子课题科研会议管理 -->
<SubMeetingManagement v-if="label === 'ZKT_HYGL'" />
<!-- 分配实验 -->
<AssignmentExperiment v-if="label === 'ZKT_FPSY'" />
<!-- 子课题中期检查报告 -->
<SubInterimInspection v-if="label === 'ZKT_ZQJC'" />
<!-- 子课题结题报告 -->
<SubConclusion v-if="label === 'ZKT_JTBG'" />
<!-- 子课题验收报告 -->
<SubResult v-if="label === 'ZKT_YSZS'" />
<!-- 实验 -->
<!-- 提交实验报告 -->
<LabReport v-if="label === 'SY_BG'" />
<!-- 记录实验过程 -->
<Procedure v-if="label === 'SY_GC'" />
<!-- 记录实验数据 -->
<ExperimentalData v-if="label === 'SY_SJ'" />
<!-- 实验程序代码 -->
<ExperimentalCode v-if="label === 'SY_DM'" />
<!-- 撰写实验结果 -->
<ExperimentalResult v-if="label === 'SY_JG'" />
</div> </div>
<div class="task-con-list" v-if="isShowList"> <div class="task-con-list" v-if="isShowList">
@ -30,8 +83,28 @@ import { computed, watch, ref } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import CheckSubjectProgress from 'components/tall/task/CheckSubjectProgress.vue'; // import CheckSubjectProgress from 'components/tall/task/CheckSubjectProgress.vue'; //
import MeetingManagement from 'components/tall/task/MeetingManagement.vue'; // import MeetingManagement from 'components/tall/task/MeetingManagement.vue'; //
import PlanAssignment from 'components/tall/task/PlanAssignment.vue'; // import ContractManagement from 'components/tall/task/ContractManagement.vue'; //
import MemberManagement from 'components/tall/task/MemberManagement.vue'; // import DataUnlock from 'components/tall/task/DataUnlock.vue'; //
import MemberManagement from 'components/tall/task/MemberManagement.vue'; //
import PlanAssignment from 'components/tall/task/PlanAssignment.vue'; //
import AssignmentSubject from 'components/tall/task/AssignmentSubject.vue'; //
import InterimInspection from 'components/tall/task/InterimInspection.vue'; //
import Conclusion from 'components/tall/task/Conclusion.vue'; //
import Result from 'components/tall/task/Result.vue'; //
import SubSubjectProgress from 'components/tall/task/SubSubjectProgress.vue'; //
import SubMeetingManagement from 'components/tall/task/SubMeetingManagement.vue'; //
import AssignmentExperiment from 'components/tall/task/AssignmentExperiment.vue'; //
import SubInterimInspection from 'components/tall/task/SubInterimInspection.vue'; //
import SubConclusion from 'components/tall/task/SubConclusion.vue'; //
import SubResult from 'components/tall/task/SubResult.vue'; //
import LabReport from 'components/tall/task/LabReport.vue'; //
import Procedure from 'components/tall/task/Procedure.vue'; //
import ExperimentalData from 'components/tall/task/ExperimentalData.vue'; //
import ExperimentalCode from 'components/tall/task/ExperimentalCode.vue'; //
import ExperimentalResult from 'components/tall/task/ExperimentalResult.vue'; //
import TaskConList from 'components/tall/task/TaskConList.vue'; // import TaskConList from 'components/tall/task/TaskConList.vue'; //
@ -186,4 +259,8 @@ watch([taskDetail], () => {
> th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan])::before) { > th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan])::before) {
width: 0; width: 0;
} }
:deep(.ant-checkbox-group) {
width: 100%;
}
</style> </style>

Loading…
Cancel
Save