Browse Source

feat: 交付物提交和检查

text-draggable
xuesinan 4 years ago
parent
commit
980ab9ab0d
  1. 6
      src/App.vue
  2. 16
      src/apis/index.js
  3. 59
      src/components/tall/Reviewer/Reviewer.vue
  4. 13
      src/components/tall/center/Roles.vue
  5. 7
      src/components/tall/left/Projects.vue
  6. 4
      src/components/tall/plugin/Plugin.vue
  7. 15
      src/plugins/p-daily-account/p-daily-account-detail.vue
  8. 0
      src/plugins/p-daily-account/p-daily-account.vue
  9. 18
      src/plugins/p-deliver.vue
  10. 127
      src/plugins/p-deliver/check-form-modal.vue
  11. 104
      src/plugins/p-deliver/p-deliver-check.vue
  12. 135
      src/plugins/p-deliver/p-deliver-upload.vue
  13. 37
      src/plugins/p-deliver/p-deliver.vue
  14. 1
      src/store/tall/role/mutations.js
  15. 9
      src/utils/deliver.js
  16. 2
      src/views/detail/Test.vue
  17. 22
      src/views/home/Index.vue

6
src/App.vue

@ -12,6 +12,7 @@ const store = useStore();
// queryu token
const userString = sessionStorage.getItem('user');
const sessionToken = sessionStorage.getItem('token');
//
store.commit('layout/setDeviceId', uuidv4().split('-')[0]);
@ -19,7 +20,10 @@ store.commit('layout/setDeviceId', uuidv4().split('-')[0]);
if (userString) {
const user = JSON.parse(userString);
store.commit('user/setUser', user);
store.commit('user/setToken', user && user.token ? user.token : '');
}
if (sessionToken) {
store.commit('user/setToken', sessionToken);
}
//

16
src/apis/index.js

@ -9,6 +9,7 @@ import http from 'utils/axios';
// const filedeal = `${apiUrl}/filedeal`; // 测试
// const filedeal = `http://101.201.226.21:7180`; // 生产
const baseUrl = import.meta.env.VITE_BASE_URL;
const apiUrl = import.meta.env.VITE_API_URL;
const tall = `${apiUrl}/ptostall`;
const experiment = `${apiUrl}/experiment`;
@ -58,7 +59,7 @@ export const delProject = (projectId, url) => http.post(`${url}/tall/project/del
export const findShowRole = (projectId, url) => http.post(`${url}/tall/role/show`, { param: { projectId } });
// 根据项目id查找所有成员
export const queryChecker = param => http.post(`${tall}/deliver/queryChecker`, param);
export const queryChecker = param => http.post(`${param.url}/deliver/queryChecker`, param);
// 查找带时间的日常任务
export const getGlobal = (params, url) => http.post(`${url}/tall/task/global`, params);
@ -69,6 +70,17 @@ export const getPermanent = (params, url) => http.post(`${url}/tall/task/permane
// 查找定期任务
export const getRegularTask = (params, url) => http.post(`${url}/tall/task/regular/page`, params);
// 交付物
// 提交交付物信息
export const submitDeliverInfo = (params, url) => http.post(`${url}/deliver/submitDeliver`, params);
// 根据任务id获取任务的交付物信息
export const getDeliverByTaskId = (params, url) => http.post(`${url}/deliver/getDeliver`, params);
// 检查交付物
export const checkDeliver = (params, url) => http.post(`${url}/deliver/checkDeliver`, params);
/**
* 导入wbs
* @param {object} e
@ -83,4 +95,4 @@ export const importWbs = async e => {
};
// 上传文件
// export const uploadImg = `${filedeal}/file/upload/multiple`;
export const uploadImg = `${baseUrl}/filedeal/file/upload/multiple`;

59
src/components/tall/Reviewer/Reviewer.vue

@ -0,0 +1,59 @@
<template>
<div class="px-2 py-1 border rounded-sm" @click="collapsed = !collapsed">
<div class="flex justify-between items-center">
<div>审核人</div>
<div class="flex items-center justify-end flex-1 text-sm">
<div class="mx-1" v-for="(item, index) in showCheckers" :key="index">{{ item.name }}</div>
<div class="mx-1" v-show="checkedCheckers.length > 3">...</div>
<DownOutlined v-if="!collapsed" />
<UpOutlined v-else />
</div>
</div>
<!-- 隐藏的审核人选项 -->
<div v-show="collapsed" class="foot mt-2 flex flex-wrap">
<a-button
v-for="(item, index) in checkers"
:key="index"
:type="checkedCheckers.find(checker => checker.memberId === item.memberId) ? 'primary' : 'default'"
size="small"
class="my-1 mx-2"
@click.stop="handleSelectChecker(item)"
>
{{ item.name }}
</a-button>
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import { DownOutlined, UpOutlined } from '@ant-design/icons-vue';
const store = useStore();
//
const collapsed = ref(false);
// store
//
const checkers = computed(() => store.state.role.members);
//
const checkedCheckers = ref([]);
// 3...
const showCheckers = computed(() => (checkedCheckers.value.length > 3 ? checkedCheckers.value.slice(0, 3) : checkedCheckers.value));
/**
* 点击成员 切换检查人的选中状态
* @param {object} member 成员对象
*/
function handleSelectChecker(member) {
const target = checkedCheckers.value.find(item => item.memberId === member.memberId);
if (target) {
//
checkedCheckers.value = checkedCheckers.value.filter(item => item.memberId !== member.memberId);
} else {
checkedCheckers.value.push(member);
}
}
</script>

13
src/components/tall/center/Roles.vue

@ -19,11 +19,16 @@ const store = useStore();
const roleId = computed(() => store.state.role.roleId); //
const roleList = computed(() => store.state.role.visibleRoles); //
const project = computed(() => store.state.projects.project); //
const sessionRoleId = sessionStorage.getItem('roleId'); // id
const roleBox = ref(null);
const roleAbs = ref(null);
const roleItem = ref(null);
if (sessionRoleId && !roleId.value) {
store.commit('role/setRoleId', sessionRoleId);
}
if (project.value && project.value.id) {
getRoles(project.value.id); // id
}
@ -61,7 +66,13 @@ async function getRoles(params) {
//
function setInitialRoleId(visibleList) {
if (!visibleList || !visibleList.length) return;
const index = visibleList.findIndex(item => +item.mine === 1);
let index = visibleList.findIndex(item => +item.mine === 1);
// id
if (roleId.value) {
index = visibleList.findIndex(item => item.id === roleId.value);
}
const currentRole = index > 0 ? visibleList[index] : visibleList[0];
const currentRoleId = currentRole ? currentRole.id : '';
store.commit('role/setRoleInfo', currentRole || null);

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

@ -61,12 +61,14 @@
<script setup>
import { ref, watch, computed } from 'vue';
import { useStore } from 'vuex';
import { useRouter } from 'vue-router';
import dayjs from 'dayjs';
import { getProjects, delProject } from 'apis';
import { RightOutlined, DownOutlined } from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';
const store = useStore();
const router = useRouter();
const visible = ref(false); //
const deleteId = ref(null); // id
const sessionProject = sessionStorage.getItem('project'); //
@ -126,6 +128,11 @@ function toDetail(item) {
clearRolesData();
clearTasksData();
store.commit('projects/setProject', item);
store.commit('task/setTaskDetailUrl', '');
sessionStorage.setItem('targetUrl', '');
store.commit('task/setTaskDetailShow', '');
sessionStorage.setItem('taskDetailShow', '');
router.push({ path: '/home/test' });
// store.commit('task/setTaskDetail', null);
}

4
src/components/tall/plugin/Plugin.vue

@ -39,8 +39,8 @@
import { provide, defineProps } from 'vue';
// import { useStore } from 'vuex';
import pTaskTitle from '@/plugins/p-task-title.vue';
import pDeliver from '@/plugins/p-deliver.vue';
import pDailyAccount from '@/plugins/p-daily-account.vue';
import pDeliver from '@/plugins/p-deliver/p-deliver.vue';
import pDailyAccount from '@/plugins/p-daily-account/p-daily-account.vue';
const props = defineProps({
task: { default: () => {}, type: Object },

15
src/plugins/p-daily-account-detail.vue → src/plugins/p-daily-account/p-daily-account-detail.vue

@ -97,8 +97,11 @@
</label>
<a-select
v-model:value="item.inspector"
:options="inspectorOptions"
:options="members"
show-search
placeholder="请选择检查人"
:field-names="{ label: 'name', value: 'memberId' }"
:filter-option="filterOption"
@change="handleInspector($event, index)"
></a-select>
</div>
@ -134,12 +137,15 @@
</template>
<script setup>
import { reactive, ref } from 'vue';
import { useStore } from 'vuex';
import { reactive, ref, computed } from 'vue';
import dayjs from 'dayjs';
import { FullscreenExitOutlined, FullscreenOutlined, DeleteOutlined } from '@ant-design/icons-vue';
const store = useStore();
const isFullScreen = ref(false);
const visible = ref(false); //
const members = computed(() => store.state.role.members); //
//
const formState = reactive({
@ -223,13 +229,16 @@ const modalFormState = ref([
]);
//
const workDurations = [...Array(8)].map((_, i) => ({ value: `${i + 1}小时` }));
const inspectorOptions = ref([{ value: '周勇' }, { value: '卫泽照' }]); //
//
function showModal() {
visible.value = true;
}
function filterOption(input, option) {
return option.name.indexOf(input) >= 0;
}
//
function handleDuration(e, index) {
console.log('index', index, e);

0
src/plugins/p-daily-account.vue → src/plugins/p-daily-account/p-daily-account.vue

18
src/plugins/p-deliver.vue

@ -1,18 +0,0 @@
<template>
<!-- 任务名插件 -->
<div class="u-font-14">
{{ deliver.deliverName }}
</div>
</template>
<script setup>
// import { useStore } from 'vuex';
import { ref, inject } from 'vue';
// const store = useStore();
// const task = inject('task');
const pluginInfo = inject('pluginInfo');
const deliver = ref(null); //
deliver.value = pluginInfo && pluginInfo.data ? JSON.parse(pluginInfo.data) : null;
</script>

127
src/plugins/p-deliver/check-form-modal.vue

@ -0,0 +1,127 @@
<template>
<a-modal v-model:visible="visible" centered :footer="null" :closable="false" @cancel="handleHide">
<div>
<!-- 审核标题 -->
<div class="modal-content-head">{{ data.mode === 'RESOLVE' ? '审核通过' : '审核驳回' }}</div>
<div class="modal-content-body mt-5">
<!-- 评分 -->
<div class="flex justify-between items-center mb-4" v-show="data.mode === 'RESOLVE'">
<a-input-number v-model:value="score" :max="100" :min="0" :step="1"> </a-input-number>
<div class="w-64">
<a-progress :percent="score" />
</div>
</div>
<a-textarea v-model:value="commit" />
<div class="common-list">
<div v-for="(item, index) in words" :key="index" class="leading-12" @click="commit = item">
{{ item }}
</div>
</div>
</div>
<div class="modal-content-foot mt-3 flex justify-center items-center">
<a-button class="mr-4" @click="handleHide">取消</a-button>
<a-button class="" type="primary" @click="handleSubmit(data.mode)">确定</a-button>
</div>
</div>
</a-modal>
</template>
<script setup>
import { ref, computed, watch, inject, defineProps, defineEmits } from 'vue';
import { useStore } from 'vuex';
import { message } from 'ant-design-vue';
import { checkDeliver } from 'apis';
import { quickWords } from '@/utils/deliver';
const props = defineProps({
data: { type: Object, default: () => {} },
msgId: { default: '', type: String },
});
const emits = defineEmits(['hide', 'submit-end']);
const store = useStore();
const task = inject('task');
const projectId = computed(() => store.getters['project/projectId']);
const roleId = computed(() => store.state.role.roleId);
const words = computed(() => quickWords[props.data.mode]); //
const visible = ref(false);
const commit = ref(''); //
const score = ref(100); //
watch(props, () => {
visible.value = props.data.mode !== 'HIDE';
});
/**
* 提交评审信息
* 提交成功后隐藏modal 重置表单控件
* 给父组件信息 更新值
* @param {string} mode 'RESOLVE'|'REJECT'
*/
async function handleSubmit(mode) {
try {
const { url } = store.state.projects.project;
const deliverRecordId = props.data.deliverRecordId();
const param = {
projectId: projectId.value,
roleId: roleId.value,
deliverRecordId,
type: mode === 'RESOLVE' ? 1 : 2,
remark: commit.value,
score: mode === 'RESOLVE' ? score.value : '',
msgId: task.msgId,
};
await checkDeliver(param, url);
handleHide(); // +
message.info('审核信息提交成功');
//
emits('submit-end', param);
} catch (error) {
console.error('error: ', error);
message.info('审核信息提交失败, 请稍后重试');
}
}
//
function handleHide() {
emits('hide');
//
score.value = 100;
commit.value = '';
}
</script>
<style scoped>
.modal-content-head {
text-align: center;
margin-top: 40rpx;
margin-bottom: 20rpx;
font-size: 16px;
font-weight: 600;
}
.common-list {
height: 12.5rem;
overflow-y: scroll;
}
.common-list::-webkit-scrollbar {
display: none;
}
.common-list div {
border-bottom: 1px solid #e5e7eb;
}
.common-list div:last-child {
border-bottom: none;
}
</style>

104
src/plugins/p-deliver/p-deliver-check.vue

@ -0,0 +1,104 @@
<template>
<div>
<!-- 审核标题 -->
<div class="flex justify-between items-center" @click="collapsed = !collapsed">
<div>{{ deliverData ? deliverData.deliverName : '' }}审核状态</div>
<DownOutlined v-if="!collapsed" />
<UpOutlined v-else />
</div>
<!-- 审核结果 -->
<div v-show="collapsed">
<!-- 提交人和时间 -->
<div class="my-2 flex justify-between items-center">
<div class="text-gray-400 text-xs">
<span class="mr-4" v-if="deliverData.submitMemberName">{{ deliverData.submitMemberName }}</span>
<span v-if="deliverData.submitTime"> {{ dayjs(+deliverData.submitTime).format('MM-DD HH:mm') }}</span>
</div>
<span class="text-blue-400 text-xs text-right" @click="openDeliverHistory">历史交付物</span>
</div>
<div @click="openLink" class="break-all text-blue-400 text-xs my-1" v-if="deliverData.details && deliverData.details[0]">
{{ deliverData.details[0] }}
</div>
<!-- 审核人 标题 -->
<div class="text-gray-400 flex justify-between mt-3">
<span>审核</span>
<span class="text-blue-400 text-xs" @click="openMoreRecords">更多审核记录</span>
</div>
<!-- 审核人 列表 -->
<div v-if="deliverData.checkerList">
<div class="mt-2 text-sm flex justify-between" v-for="(item, index) in deliverData.checkerList" :key="index">
<div>
<div class="font-semibold">{{ item.checkerName }}</div>
<div class="text-xs text-gray-400">{{ item.remark }}</div>
<div class="text-xs text-gray-400" v-if="+item.checkTime > 0">{{ dayjs(+item.checkTime).format('MM-DD HH:mm') }}</div>
</div>
<!-- 不是自己 显示审核状态 -->
<div v-show="item.isMine !== 1" class="text-xs">
<span v-if="item.status === 1" class="text-green-600"> 已通过 </span>
<span v-else-if="item.status === 2" class="text-red-600"> 已驳回 </span>
<span v-else class="text-gray-400"> 待审核 </span>
</div>
<!-- 自己是当前审核人 且未审核状态 -->
<div v-show="item.isMine === 1 && (item.status === null || item.status === 0)">
<a-button size="small" shape="round" class="mr-4 h-1-4 leading-1-4" type="primary" @click="checkModal.mode = 'RESOLVE'">
通过
</a-button>
<a-button size="small" shape="round" class="h-1-4 leading-1-4" type="primary" danger @click="checkModal.mode = 'REJECT'">
驳回
</a-button>
</div>
<!-- 自己是审核人 且审核过 当前审核人的审核状态并展示得分情况 -->
<div v-show="item.isMine === 1 && item.status > 0" class="text-xs">
<div class="mb-1">
<span v-if="item.status === 1" class="text-green-600"> 已通过 </span>
<span v-else-if="item.status === 2" class="text-red-600"> 已驳回 </span>
</div>
<span class="text-yellow-500 font-medium">{{ item.score }}</span>
</div>
</div>
</div>
</div>
<checkFormModal :data="checkModal" @hide="checkModal.mode = 'HIDE'" @submit-end="$emit('check-success')" />
</div>
</template>
<script setup>
import { ref, reactive, inject, defineEmits } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { DownOutlined, UpOutlined } from '@ant-design/icons-vue';
import checkFormModal from './check-form-modal.vue';
const store = useStore();
const deliverData = inject('deliver');
const collapsed = ref(false); // /
defineEmits(['check-success']);
//
function openDeliverHistory() {}
//
function openLink() {
store.commit('task/setTaskDetailUrl', deliverData.details[0]);
sessionStorage.setItem('targetUrl', deliverData.details[0]);
store.commit('task/setTaskDetailShow', '');
sessionStorage.setItem('taskDetailShow', '');
}
const checkModal = reactive({
mode: 'HIDE', // HIDE-> RESOLVE-> REJECT->
deliverRecordId: () => (deliverData.value ? deliverData.value.deliverRecordId : ''), // id
});
//
function openMoreRecords() {}
</script>

135
src/plugins/p-deliver/p-deliver-upload.vue

@ -0,0 +1,135 @@
<template>
<div @longpress.prevent="showMask = true">
<!-- 插件名称和提交按钮 -->
<div class="flex item-center justify-between">
<div class="flex-1">
<div v-if="deliver.deliverName" class="relative inline-block">
{{ deliver.deliverName }}
</div>
</div>
<!-- 提交 -->
<a-button type="primary" size="small" @click="submit" :disabled="submitState" :loading="submitBtnLoading"> 提交 </a-button>
</div>
<!-- 插件上传方式 -->
<div class="mt-3">
<div class="link-box">
<a-input v-model:value="linkValue" placeholder="请输入交付物地址/链接" />
</div>
<div class="mt-3">
<!-- <a-button type="primary" size="small" class="mr-3" @click="paste">粘贴</a-button> -->
<div class="inline-block">
<a-upload name="file" :action="action" :headers="headers" :max-count="1" @change="handleChange">
<a-button type="primary" size="small" class="mr-3">文件</a-button>
</a-upload>
</div>
<!-- <a-button type="primary" size="small" class="mr-3" @click="uploadPhoto">拍照</a-button> -->
</div>
</div>
<!-- 审核人 -->
<Reviewer class="mt-3" ref="reviewerRef" />
</div>
</template>
<script setup>
import { useStore } from 'vuex';
import { ref, inject, computed, defineEmits } from 'vue';
import { message } from 'ant-design-vue';
import { submitDeliverInfo, uploadImg } from 'apis';
import Reviewer from '@/components/tall/Reviewer/Reviewer.vue';
const store = useStore();
const projectId = computed(() => store.getters['project/projectId']);
const roleId = computed(() => store.state.role.roleId);
const deliver = inject('deliver'); //
const task = inject('task'); //
const linkValue = ref(''); //
const action = uploadImg;
const token = computed(() => store.state.user.token);
const headers = { Authorization: `Bearer ${token.value}` };
//
const submitState = computed(() => !linkValue.value); //
const submitBtnLoading = ref(false); //
const reviewerRef = ref(null); //
const showMask = ref(false); //
const emits = defineEmits(['upload-success']);
function handleChange(info) {
console.log('info', info);
}
//
async function submit() {
const { checkedCheckers } = reviewerRef.value; //
//
if (!validateDeliverForm(checkedCheckers)) return;
submitBtnLoading.value = true; // loading
try {
const checkerList = [];
checkedCheckers.forEach(item => {
checkerList.push(item.memberId);
});
const { url } = store.state.projects.project;
const param = {
projectId: projectId.value,
roleId: roleId.value,
deliverId: deliver.value.deliverId,
fileList: [linkValue.value],
checkerList,
msgId: task.msgId,
};
const data = await submitDeliverInfo(param, url);
message.info('提交交付物信息成功');
resetControlState(); //
emits('upload-success');
} catch (error) {
message.info('提交交付物信息失败');
throw new Error(error);
}
}
//
// function paste() {}
//
// function uploadPhoto() {}
//
function validateDeliverForm(checkedCheckers) {
const reg = /[a-zA-z]+:\/\/[^\s]*/;
if (!reg.test(linkValue.value)) {
// toast
message.info('请输入正确的链接');
return false;
}
//
if (!checkedCheckers || !checkedCheckers.length) {
message.info('请选择检查人');
return false;
}
return true;
}
//
function resetControlState() {
submitBtnLoading.value = false; // loading
linkValue.value = ''; //
reviewerRef.value.collapsed = true; //
}
</script>

37
src/plugins/p-deliver/p-deliver.vue

@ -0,0 +1,37 @@
<template>
<!-- 任务名插件 -->
<div>
<p-deliver-upload v-if="deliver" @upload-success="getDeliverData"></p-deliver-upload>
<p-deliver-check class="mt-3" v-if="deliver && deliver.details && deliver.details.length"></p-deliver-check>
</div>
</template>
<script setup>
// import { useStore } from 'vuex';
import { ref, inject, provide } from 'vue';
import { getDeliverByTaskId } from 'apis';
import pDeliverUpload from '@/plugins/p-deliver/p-deliver-upload.vue';
import pDeliverCheck from '@/plugins/p-deliver/p-deliver-check.vue';
// const store = useStore();
const task = inject('task');
const pluginInfo = inject('pluginInfo');
const deliver = ref(null); //
deliver.value = pluginInfo && pluginInfo.data ? JSON.parse(pluginInfo.data) : null;
provide('deliver', deliver);
// id
async function getDeliverData() {
try {
const { id: taskId } = task;
if (!taskId) return;
const param = { taskId };
const data = await getDeliverByTaskId(param);
deliver.value = data;
} catch (error) {
console.log('error: ', error);
}
}
</script>

1
src/store/tall/role/mutations.js

@ -34,6 +34,7 @@ const mutations = {
*/
setRoleId(state, roleId) {
state.roleId = roleId;
sessionStorage.setItem('roleId', roleId);
},
/**

9
src/utils/deliver.js

@ -0,0 +1,9 @@
// 上传文件的扩展名
export const UPLOAD_EXTENSION = ['.xls', '.xlsx', '.zip', '.exe', '.pdf', '.doc', '.docx', '.ppt', '.pptx'];
// 审核的快捷用语
export const quickWords = {
// RESOLVE: ['加油,再接再厉!', '很棒!', '不错,很详细!', '不详细', '还有需要改进的地方', '驳回审批']
RESOLVE: ['加油,再接再厉!', '很棒!', '不错,很详细!', '加油,再接再厉'], // 审核通过常用的审批语
REJECT: ['不详细', '还有需要改进的地方', '驳回审批1', '驳回审批2'], // 审核驳回常用的审批语
};

2
src/views/detail/Test.vue

@ -10,7 +10,7 @@
import { computed } from 'vue';
import { useStore } from 'vuex';
import DetailWebview from '@/components/tall/Right/DetailWebview.vue';
import pDailyAccountDetail from '@/plugins/p-daily-account-detail.vue';
import pDailyAccountDetail from '@/plugins/p-daily-account/p-daily-account-detail.vue';
const store = useStore();

22
src/views/home/Index.vue

@ -11,13 +11,14 @@
<a-layout-sider v-if="projectInfo.id" class="project-detail"><Center /></a-layout-sider>
<a-layout v-if="projectInfo.id && (taskDetailUrl || taskDetailShow)">
<a-layout v-if="projectInfo.id">
<!-- 导航栏 - 详情页导航 -->
<!-- <a-layout-header style="background: #fff">
<Navbar />
</a-layout-header> -->
<!-- 内容区 - 详情页 -->
<a-layout-content><router-view></router-view></a-layout-content>
<!-- <a-layout-content><router-view></router-view></a-layout-content> -->
<a-layout-content><Detail /></a-layout-content>
</a-layout>
</a-layout>
</a-layout>
@ -35,6 +36,7 @@ import Left from 'components/tall/Left/Index.vue';
import TopNavbar from 'components/tall/Top/TopNavbar.vue';
import Center from 'components/tall/Center/Index.vue';
import Intro from 'components/tall/Right/Intro.vue';
import Detail from '@/views/detail/Test.vue';
import '@/utils/storage.js';
const locale = zhCN;
@ -58,8 +60,16 @@ if (sessionProject && !projectInfo.value.id) {
store.commit('task/setBusinessCode', info && info.businessCode ? info.businessCode : '');
}
//
if (projectInfo.value.id || sessionProject) {
const info = JSON.parse(sessionProject);
const projectId = projectInfo.value.id || info.id;
const url = projectInfo.value.url || info.url;
const param = { projectId };
store.dispatch('role/getAllMembers', { param, url });
}
if (targetUrl && !taskDetailUrl.value) {
//
store.commit('task/setTaskDetailUrl', targetUrl);
}
@ -81,8 +91,10 @@ onMounted(() => {
});
window.addEventListener('setItemEvent', e => {
store.commit('task/setTaskDetailUrl', e.newValue);
console.log('sessionStorage值发生变化后触发:', e.newValue);
if (e.key === 'targetUrl') {
store.commit('task/setTaskDetailUrl', e.newValue);
}
console.log('sessionStorage值发生变化后触发:', e);
});
});

Loading…
Cancel
Save