Browse Source

feat: 微信复制

master
xuesinan 4 years ago
parent
commit
abf5137ce3
  1. 24
      src/apis/index.js
  2. 2
      src/components/tall/center/Global.vue
  3. 4
      src/components/tall/center/RegularTask.vue
  4. 2
      src/components/tall/left/Projects.vue
  5. 59
      src/components/tall/task/AssignmentExperiment.vue
  6. 127
      src/components/tall/task/DataUnlock.vue
  7. 154
      src/components/tall/task/MeetingManagement.vue
  8. 295
      src/components/tall/task/ScientificPayoffs.vue
  9. 129
      src/components/tall/task/SubMeetingManagement.vue
  10. 30
      src/components/tall/task/TaskConList.vue
  11. 28
      src/store/tall/task/index.js

24
src/apis/index.js

@ -108,3 +108,27 @@ export const getIntellectualList = params => http.post(`${experiment}/question/g
// 提交知识产权信息(论文、专利、软著)
export const submitIntellectual = params => http.post(`${experiment}/question/submitIntellectual`, params);
// 查询会议列表
export const getMeetQuery = params => http.post(`${experiment}/meeting/query`, params);
// 添加/修改会议信息
export const saveMeeting = params => http.post(`${experiment}/meeting/save`, params);
// 根据会议id查询会议详细信息
export const getMeetDetail = params => http.post(`${experiment}/meeting/get`, params);
// 科研成果列表
export const queryExperimentation = params => http.post(`${experiment}/subExperiment/queryExperimentation`, params);
// 审核科研成果
export const examineExperimentation = params => http.post(`${experiment}/subExperiment/examineExperimentation`, params);
// 申请解锁科研结果
export const applyUnlock = params => http.post(`${experiment}/subExperiment/applyUnlock`, params);
// 审批解锁申请
export const examineUnlock = params => http.post(`${experiment}/experiment/examineUnlock`, params);
// 查找数据追溯解锁信息
export const retrospectUnlock = params => http.post(`${experiment}/experiment/retrospectUnlock`, params);

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

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

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

@ -24,9 +24,9 @@
<span class="son-task-name cursor-pointer" @click.stop="toSonDetail(item, val.detailId)">{{ val.name }}</span>
</div>
</div>
<div class="open-icon" v-if="item.sonList" @click="openCard">
<!-- <div class="open-icon" v-if="item.sonList" @click="openCard">
<img />
</div>
</div> -->
</div>
</div>
</div>

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

@ -95,7 +95,7 @@ watch([newProject, startTime, endTime, projectInfo, subProjectInfo], () => {
getProjectsList(start, end);
});
// getProjectsList(start, end);
getProjectsList(start, end);
//
const showActionCard = item => {

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

@ -15,11 +15,20 @@
<a-form-item>
<label class="color-3">负责人</label>
<a-select v-model:value="assignExperFormData.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-select
v-model:value="assignExperFormData.memberId"
show-search
optionFilterProp="label"
placeholder="负责人"
:options="options"
:filter-option="filterOption"
@search="handleSearch"
:getPopupContainer="
triggerNode => {
return triggerNode.parentNode || document.body;
}
"
></a-select>
</a-form-item>
<a-form-item>
@ -38,12 +47,13 @@
import { ref, computed, toRaw } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
// import { createExperiment } from 'apis';
import { createExperiment, memberQuery } from 'apis';
const store = useStore();
const formRef = ref(null);
const sessionProject = sessionStorage.getItem('project');
const projectId = computed(() => store.getters['projects/projectId']);
const options = ref([]);
if (sessionProject) {
const project = JSON.parse(sessionProject);
@ -61,6 +71,17 @@ const assignExperFormData = ref({
target: '',
});
getList(); //
const handleSearch = async value => {
console.log('handleSearch', options.value, value);
// await getList(value); //
};
const filterOption = (input, option) => {
return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
const onSubmit = () => {
assignExperFormData.value.date.forEach((item, index) => {
if (index === 0) {
@ -70,11 +91,31 @@ const onSubmit = () => {
}
});
// const params = { param: assignExperFormData.value };
// createExperiment(params);
const params = { param: assignExperFormData.value };
createExperiment(params);
console.log('submit!', toRaw(assignExperFormData.value));
};
//
async function getList(name) {
try {
const params = { param: { projectId: projectId.value, name } };
const data = await memberQuery(params);
store.commit('task/setMembers', data);
options.value = [];
data.forEach(item => {
const obj = {
label: item.memberName,
value: item.memberId,
};
options.value.push(obj);
});
} catch (error) {
console.log('error', error);
}
}
</script>
<style scoped>

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

@ -1,46 +1,103 @@
<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>
<a-card title="解锁申请" v-for="(item, index) in unlockList" :key="index">
<p>
<span class="color-9">申请人</span><span class="color-3">{{ item.proposer }}</span>
</p>
<p>
<span class="color-9">实验名称</span><span class="color-3">{{ item.experimentName }}</span>
</p>
<p>
<span class="color-9">申请时间</span><span class="color-3">{{ dayjs(Number(item.time)).format('YYYY-MM-DD HH:mm') }}</span>
</p>
<p>
<span class="color-9">申请原因</span><span class="color-3">{{ item.remark }}</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>
<a-button class="action-btn edit-btn" type="primary" @click="toExamine(0, item.experimentId)">通过</a-button>
<a-button class="action-btn del-btn" type="primary" @click="showModal(item.experimentId)">驳回</a-button>
</div>
</a-card>
</div>
<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-modal v-model:visible="visible" :closable="false" @ok="handleOk">
<div class="modal-title flex items-center">
<CloseCircleFilled style="margin-right: 8px; font-size: 18px; color: #ff5353" />
<span class="color-3" style="font-size: 18px; font-weight: 600">确定要驳回该条解锁申请吗</span>
</div>
<div class="modal-con color-9" style="padding-left: 24px; margin-top: 16px">
<div style="margin-bottom: 5px; font-size: 16px; line-height: 26px">驳回原因</div>
<a-textarea v-model:value="remark" placeholder="驳回原因" :auto-size="{ minRows: 2, maxRows: 5 }" />
</div>
</a-modal>
</template>
<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>
<script setup>
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { retrospectUnlock, examineUnlock } from 'apis';
import { CloseCircleFilled } from '@ant-design/icons-vue';
const store = useStore();
const projectId = computed(() => store.getters['projects/projectId']);
const sessionProject = sessionStorage.getItem('project');
const unlockList = ref([]);
const visible = ref(false);
const remark = ref(null);
const experimentId = ref(null);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
<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>
getUnlockList();
const showModal = id => {
visible.value = true;
experimentId.value = id;
};
const handleOk = e => {
console.log(e);
visible.value = false;
toExamine(1, experimentId.value);
};
//
async function getUnlockList() {
try {
const params = { param: { projectId: projectId.value } };
const data = await retrospectUnlock(params);
unlockList.value = data;
} catch (error) {
console.log('error', error);
}
}
//
async function toExamine(type, id) {
try {
const params = {
param: {
projectId: projectId.value,
type,
experimentId: id,
remark: remark.value,
},
};
const data = await examineUnlock(params);
unlockList.value = data;
getUnlockList();
} catch (error) {
console.log('error', error);
}
}
</script>
<style scoped>
.ant-card {

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

@ -1,6 +1,6 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicMeetFormData">
<a-form :model="topicMeetFormData">
<a-form-item>
<label class="color-3">会议名称</label>
<a-input v-model:value="topicMeetFormData.name" placeholder="会议名称" />
@ -21,13 +21,13 @@
<a-form-item>
<label class="color-3">会议通知</label>
<a-upload-dragger
v-model:fileList="fileList"
v-model:fileList="notificationList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
@change="handleChange($event, 1)"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
@ -40,13 +40,13 @@
<a-form-item>
<label class="color-3">会议纪要</label>
<a-upload-dragger
v-model:fileList="fileList"
v-model:fileList="summaryList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
@change="handleChange($event, 2)"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
@ -59,13 +59,13 @@
<a-form-item>
<label class="color-3">照片附件/其他</label>
<a-upload-dragger
v-model:fileList="fileList"
v-model:fileList="attachmentList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
@change="handleChange($event, 3)"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
@ -76,34 +76,54 @@
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit">上传会议资料</a-button>
<a-button type="primary" html-type="submit" @click="onSubmit">上传会议资料</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
// import { computed, watch, ref } from 'vue';
import { ref, computed } from 'vue';
import { ref, computed, watch } from 'vue';
import { useStore } from 'vuex';
// import { message } from 'ant-design-vue';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
import { uploadImg, saveMeeting, getMeetDetail } from 'apis';
import dayjs from 'dayjs';
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 notificationList = ref([]);
const summaryList = ref([]);
const attachmentList = ref([]);
const meetId = computed(() => store.state.task.meetId);
const projectId = computed(() => store.getters['projects/projectId']);
const sessionProject = sessionStorage.getItem('project');
const topicMeetFormData = ref({
projectId: projectId.value,
id: '',
name: '',
date: [],
startTime: '',
endTime: '',
address: '',
fileList: [],
notificationList: [],
summaryList: [],
attachmentList: [],
});
const handleChange = info => {
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
getMeetingInfo();
watch(meetId, async () => {
await getMeetingInfo();
});
const handleChange = (info, index) => {
const resFileList = [...info.fileList];
//
@ -130,7 +150,107 @@ const handleChange = info => {
return file;
});
fileList.value = arr.value;
if (index === 1) {
notificationList.value = arr.value;
} else if (index === 2) {
summaryList.value = arr.value;
} else if (index === 3) {
attachmentList.value = arr.value;
}
};
// ID
async function getMeetingInfo() {
try {
const params = { param: { id: meetId.value } };
const data = await getMeetDetail(params);
if (data) {
data.projectId = projectId.value;
const start = dayjs(Number(data.startTime));
const end = dayjs(Number(data.endTime));
data.date = [start, end];
topicMeetFormData.value = data;
notificationList.value = [];
summaryList.value = [];
attachmentList.value = [];
data.notificationList.forEach(item => {
const obj = {
id: item.fileId,
name: item.fileName,
url: item.filePath,
};
notificationList.value.push(obj);
});
data.summaryList.forEach(item => {
const obj = {
id: item.fileId,
name: item.fileName,
url: item.filePath,
};
summaryList.value.push(obj);
});
data.attachmentList.forEach(item => {
const obj = {
id: item.fileId,
name: item.fileName,
url: item.filePath,
};
attachmentList.value.push(obj);
});
}
} catch (error) {
console.log('error', error);
}
}
const onSubmit = async () => {
notificationList.value.forEach(item => {
const obj = {
fileId: item.id,
fileName: item.name,
filePath: item.url,
};
topicMeetFormData.value.notificationList.push(obj);
});
summaryList.value.forEach(item => {
const obj = {
fileId: item.id,
fileName: item.name,
filePath: item.url,
};
topicMeetFormData.value.summaryList.push(obj);
});
attachmentList.value.forEach(item => {
const obj = {
fileId: item.id,
fileName: item.name,
filePath: item.url,
};
topicMeetFormData.value.attachmentList.push(obj);
});
topicMeetFormData.value.date.forEach((item, index) => {
if (index === 0) {
topicMeetFormData.value.startTime = dayjs(item).format('x');
} else {
topicMeetFormData.value.endTime = dayjs(item).format('x');
}
});
const params = { param: topicMeetFormData.value };
await saveMeeting(params);
getMeetingInfo();
};
</script>

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

@ -0,0 +1,295 @@
<template>
<div>
<a-table
class="member-list"
:columns="columns"
:data-source="dataList"
:row-class-name="(_record, index) => (index % 2 === 1 ? null : 'table-striped')"
>
<template #bodyCell="{ column, text, record }">
<div class="flex items-center" v-if="column.key === 'action'">
<a-button
:disabled="record.status === 0 ? false : true"
class="action-btn edit-btn"
type="primary"
@click="showModal(record.id, 'success')"
>
通过
</a-button>
<a-button
:disabled="record.status === 0 ? false : true"
class="action-btn del-btn"
type="primary"
@click="showModal(record.id, 'fail')"
>
驳回
</a-button>
<img v-if="record.status === 0" style="width: 28px" src="https://www.tall.wiki/staticrec/experiment/unlock.png" />
<img
v-if="record.status === 1"
class="cursor-pointer"
style="width: 28px"
src="https://www.tall.wiki/staticrec/experiment/locking.png"
@click="showModal(record.id, 'tips')"
/>
<div v-if="record.status === 2" class="status-btn" style="background: #cccccc"></div>
<div v-if="record.status === 4" class="status-btn" style="background: #ff5353"></div>
</div>
<template v-else-if="['report', 'course', 'information', 'result', 'sourceCode'].includes(column.dataIndex)">
<div style="color: #1890ff">{{ text }}</div>
</template>
</template>
</a-table>
</div>
<!-- 确定模态框 -->
<a-modal v-model:visible="success" :closable="false" @ok="handleOk('success')">
<div class="modal-title flex items-center">
<CheckCircleFilled style="margin-right: 8px; font-size: 18px; color: #52c41a" />
<span class="color-3" style="font-size: 18px; font-weight: 600">确定要审核通过该实验交付物吗</span>
</div>
<div class="modal-con color-9" style="padding-left: 24px; margin-top: 16px; font-size: 16px; line-height: 26px">
确定通过审核后改实验交付物将被锁定如需修改需向课题主持人提交解锁请求通过后即可修改
</div>
</a-modal>
<!-- 拒绝模态框 -->
<a-modal v-model:visible="fail" :closable="false" @ok="handleOk('fail')">
<div class="modal-title flex items-center">
<CloseCircleFilled style="margin-right: 8px; font-size: 18px; color: #ff5353" />
<span class="color-3" style="font-size: 18px; font-weight: 600">确定要驳回该实验交付物吗</span>
</div>
<div class="modal-con color-9" style="padding-left: 24px; margin-top: 16px">
<div style="margin-bottom: 5px; font-size: 16px; line-height: 26px">驳回原因</div>
<a-textarea v-model:value="remark1" placeholder="驳回原因" :auto-size="{ minRows: 2, maxRows: 5 }" />
</div>
</a-modal>
<!-- 提示模态框 -->
<a-modal v-model:visible="tips" :closable="false" @ok="handleOk('tips')">
<div class="modal-title flex items-center">
<ExclamationCircleFilled style="margin-right: 8px; font-size: 18px; color: #fa8c16" />
<span class="color-3" style="font-size: 18px; font-weight: 600">确定要申请解锁该项实验交付物吗</span>
</div>
<div class="modal-con color-9" style="padding-left: 24px; margin-top: 16px">
<div style="margin-bottom: 5px; font-size: 16px; line-height: 26px">申请原因</div>
<a-textarea v-model:value="remark2" placeholder="申请原因" :auto-size="{ minRows: 2, maxRows: 5 }" />
</div>
</a-modal>
</template>
<script setup>
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import { queryExperimentation, examineExperimentation, applyUnlock } from 'apis';
import { CheckCircleFilled, CloseCircleFilled, ExclamationCircleFilled } from '@ant-design/icons-vue';
const store = useStore();
const projectId = computed(() => store.getters['projects/projectId']);
const sessionProject = sessionStorage.getItem('project');
const success = ref(false);
const fail = ref(false);
const tips = ref(false);
const currId = ref(null);
const remark1 = ref(null);
const remark2 = ref(null);
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
const columns = ref([
{
title: '序号',
dataIndex: 'indexId',
key: 'indexId',
},
{
title: '实验名称',
dataIndex: 'name',
key: 'name',
},
{
title: '实验报告',
dataIndex: 'report',
key: 'report',
},
{
title: '实验过程',
dataIndex: 'course',
key: 'course',
},
{
title: '实验数据',
dataIndex: 'information',
key: 'information',
},
{
title: '实验结果',
dataIndex: 'result',
key: 'result',
},
{
title: '程序代码',
dataIndex: 'sourceCode',
key: 'sourceCode',
},
{
title: '审核',
key: 'action',
dataIndex: 'action',
},
]);
const dataList = ref([]);
getExperimentations();
//
const showModal = (id, tip) => {
currId.value = id;
if (tip === 'success') {
success.value = true;
} else if (tip === 'fail') {
fail.value = true;
} else if (tip === 'tips') {
tips.value = true;
}
};
//
const handleOk = async tip => {
if (tip === 'success') {
success.value = false;
await examine(0);
} else if (tip === 'fail') {
fail.value = false;
await examine(1);
} else if (tip === 'tips') {
tips.value = false;
await toUnlock();
}
};
async function getExperimentations() {
try {
const params = { param: { projectId: projectId.value } };
const data = await queryExperimentation(params);
data.forEach((item, index) => {
item.indexId = index + 1;
});
dataList.value = data;
} catch (error) {
console.log('error', error);
}
}
// /
async function examine(type) {
try {
const params = {
param: {
id: currId.value,
type,
remark: remark1.value ? remark1.value : '',
},
};
await examineExperimentation(params);
getExperimentations();
} catch (error) {
console.log('error', error);
}
}
//
async function toUnlock() {
try {
const params = {
param: {
id: currId.value,
remark: remark2.value ? remark2.value : '',
},
};
await applyUnlock(params);
getExperimentations();
} catch (error) {
console.log('error', error);
}
}
</script>
<style scoped>
.member-list {
border-radius: 10px 10px 0 0;
overflow: hidden;
}
:deep(.table-striped) td {
background-color: #fafafa;
}
.action-btn {
width: 50px !important;
height: 28px !important;
font-size: 14px !important;
padding: 0;
letter-spacing: 0 !important;
}
:deep(.ant-table-pagination.ant-pagination) {
height: 0;
margin: 0;
}
.add-btn {
height: 60px;
background: #fff;
padding-left: 36px;
}
.edit-btn {
background: #0dc26c;
border: 0;
}
.del-btn {
margin-left: 16px;
margin-right: 16px;
background: #ff5353;
border: 0;
}
.status-btn {
width: 28px;
height: 28px;
color: #fff;
border-radius: 50%;
text-align: center;
line-height: 28px;
}
:deep(.ant-table-container table > thead > tr:first-child th) {
min-width: 100px;
}
:deep(.ant-table-container table > thead > tr:first-child th:first-child) {
min-width: 70px;
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;
}
:deep(.ant-btn-primary[disabled]) {
color: #fff;
background: #cccccc;
}
</style>

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

@ -1,6 +1,6 @@
<template>
<div class="task-form bg-white border-radius-10">
<a-form ref="formRef" :model="topicMeetFormData">
<a-form :model="topicMeetFormData">
<a-form-item>
<label class="color-3">会议名称</label>
<a-input v-model:value="topicMeetFormData.name" placeholder="会议名称" />
@ -21,70 +21,87 @@
<a-form-item>
<label class="color-3">会议纪要</label>
<a-upload-dragger
v-model:fileList="fileList"
v-model:fileList="summaryList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
@change="handleChange($event, 1)"
>
<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>
<p class="ant-upload-hint color-c">格式pdf</p>
</a-upload-dragger>
</a-form-item>
<a-form-item>
<label class="color-3">照片附件/其他</label>
<a-upload-dragger
v-model:fileList="fileList"
v-model:fileList="attachmentList"
name="files"
:multiple="true"
:action="action"
:headers="headers"
:accept="'.pdf'"
@change="handleChange"
@change="handleChange($event, 2)"
>
<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>
<p class="ant-upload-hint color-c">格式jpgjpegrarzip</p>
</a-upload-dragger>
</a-form-item>
<a-form-item class="text-right">
<a-button type="primary" html-type="submit">上传会议记录</a-button>
<a-button type="primary" html-type="submit" @click="onSubmit">上传会议记录</a-button>
</a-form-item>
</a-form>
</div>
</template>
<script setup>
// import { computed, watch, ref } from 'vue';
import { ref, computed } from 'vue';
import { ref, computed, watch } from 'vue';
import { useStore } from 'vuex';
// import { message } from 'ant-design-vue';
import { InboxOutlined } from '@ant-design/icons-vue';
import { uploadImg } from 'apis';
import { uploadImg, saveMeeting, getMeetDetail } from 'apis';
import dayjs from 'dayjs';
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 summaryList = ref([]);
const attachmentList = ref([]);
const subMeetId = computed(() => store.state.task.subMeetId);
const projectId = computed(() => store.getters['projects/projectId']);
const sessionProject = sessionStorage.getItem('project');
const topicMeetFormData = ref({
projectId: projectId.value,
id: '',
name: '',
date: [],
startTime: '',
endTime: '',
address: '',
fileList: [],
summaryList: [],
attachmentList: [],
});
if (sessionProject) {
const project = JSON.parse(sessionProject);
store.commit('projects/setProject', project);
}
getMeetingInfo();
watch(subMeetId, async () => {
await getMeetingInfo();
});
const handleChange = info => {
const handleChange = (info, index) => {
const resFileList = [...info.fileList];
//
@ -111,7 +128,85 @@ const handleChange = info => {
return file;
});
fileList.value = arr.value;
if (index === 1) {
summaryList.value = arr.value;
} else if (index === 2) {
attachmentList.value = arr.value;
}
};
// ID
async function getMeetingInfo() {
try {
const params = { param: { id: subMeetId.value } };
const data = await getMeetDetail(params);
if (data) {
data.projectId = projectId.value;
const start = dayjs(Number(data.startTime));
const end = dayjs(Number(data.endTime));
data.date = [start, end];
topicMeetFormData.value = data;
summaryList.value = [];
attachmentList.value = [];
data.summaryList.forEach(item => {
const obj = {
id: item.fileId,
name: item.fileName,
url: item.filePath,
};
summaryList.value.push(obj);
});
data.attachmentList.forEach(item => {
const obj = {
id: item.fileId,
name: item.fileName,
url: item.filePath,
};
attachmentList.value.push(obj);
});
}
} catch (error) {
console.log('error', error);
}
}
const onSubmit = async () => {
summaryList.value.forEach(item => {
const obj = {
fileId: item.id,
fileName: item.name,
filePath: item.url,
};
topicMeetFormData.value.summaryList.push(obj);
});
attachmentList.value.forEach(item => {
const obj = {
fileId: item.id,
fileName: item.name,
filePath: item.url,
};
topicMeetFormData.value.attachmentList.push(obj);
});
topicMeetFormData.value.date.forEach((item, index) => {
if (index === 0) {
topicMeetFormData.value.startTime = dayjs(item).format('x');
} else {
topicMeetFormData.value.endTime = dayjs(item).format('x');
}
});
const params = { param: topicMeetFormData.value };
await saveMeeting(params);
getMeetingInfo();
};
</script>

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

@ -28,6 +28,7 @@ import { computed, ref } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { RightOutlined } from '@ant-design/icons-vue';
import { getMeetQuery } from 'apis';
const store = useStore();
const code = computed(() => store.state.task.label); // code
@ -39,6 +40,10 @@ init();
async function init() {
if (code.value === 'ZKT_LW' || code.value === 'ZKT_ZL' || code.value === 'ZKT_RZ') {
await getAchievementsList();
} else if (code.value === 'ZKT_HYGL') {
await getMeetList(1);
} else if (code.value === 'KT_KYHY') {
await getMeetList(0);
}
}
@ -55,8 +60,31 @@ async function getAchievementsList() {
lists.value = [...data];
}
//
async function getMeetList(type) {
const params = {
param: {
type,
projectId: projectId.value,
},
};
try {
const data = await getMeetQuery(params);
lists.value = [...data];
} catch (error) {
console.log('error', error);
}
}
function toDetail(item) {
store.commit('task/setIntellectualId', item.intellectualId);
if (code.value === 'ZKT_HYGL') {
store.commit('task/setSubMeetId', item.id);
} else if (code.value === 'KT_KYHY') {
store.commit('task/setMeetId', item.id);
} else if (code.value === 'ZKT_LW' || code.value === 'ZKT_ZL' || code.value === 'ZKT_RZ') {
store.commit('task/setIntellectualId', item.intellectualId);
}
}
</script>

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

@ -33,6 +33,8 @@ export default {
subProjectInfo: null, // 当前子课题信息
regularTasks: [], // 定期任务
intellectualId: '', // 当前选择的知识产权ID
meetId: '', // 当前选择的会议ID
subMeetId: '', // 当前选择的子课题会议ID
question: null,
},
@ -48,14 +50,14 @@ export default {
// },
// 计算任务开始时间的格式
startTimeFormat(state, { unitConfig }) {
return unitConfig.format || 'D日 HH:mm';
},
// startTimeFormat(state, { unitConfig }) {
// return unitConfig.format || 'D日 HH:mm';
// },
// 计算颗粒度 对应的 dayjs add 的单位
timeGranularity(state, { unitConfig }) {
return unitConfig.granularity;
},
// timeGranularity(state, { unitConfig }) {
// return unitConfig.granularity;
// },
},
mutations: {
@ -367,6 +369,20 @@ export default {
state.intellectualId = data;
},
/**
* 会议ID
*/
setMeetId(state, data) {
state.meetId = data;
},
/**
* 子课题会议ID
*/
setSubMeetId(state, data) {
state.subMeetId = data;
},
setQuestion(state, data) {
state.question = data;
},

Loading…
Cancel
Save