This commit is contained in:
weipengfei 2024-01-10 18:00:35 +08:00
parent 99cb6a6e16
commit a7d92cda03
12 changed files with 107 additions and 126 deletions

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<!--<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">-->
<link id="icon" rel="icon" type="image/x-icon" href="<%= BASE_URL %>favicon.ico">
<title>Pear Project</title>
<title>工单系统</title>
</head>
<body>
<div id="app"></div>

View File

@ -33,7 +33,7 @@
desc: {
type: [String],
default() {
return '欢迎使用Pear Project项目管理系统';
return '欢迎使用工单项目管理系统';
}
}
}

View File

@ -350,10 +350,10 @@
<a-list-item-meta>
<a-avatar size="small" slot="avatar" shape="square"
icon="link"
:src="item.sourceDetail.file_url"/>
:src="item.fileUrl"/>
<div slot="title">
<a class="muted" target="_blank"
:href="item.sourceDetail.file_url">{{ item.title
:href="item.fileUrl">{{ item.name
}}</a>
</div>
<div slot="description">
@ -361,33 +361,10 @@
</div>
</a-list-item-meta>
<a class="muted" slot="actions">
<span>{{item.sourceDetail.projectName}}</span>
<span>{{item.projectName}}</span>
</a>
<a class="muted" slot="actions">
<a-dropdown :trigger="['click']"
placement="bottomCenter">
<!-- <a-tooltip :mouseEnterDelay="0.5">
<template slot="title">
<span>更多操作</span>
</template>-->
<a class="action-item muted">
<a-icon type="down"/>
</a>
<!--</a-tooltip>-->
<a-menu v-clipboard="item.sourceDetail.file_url"
@click="doSource($event,item)"
class="field-right-menu"
slot="overlay">
<a-menu-item key="copy">
<a-icon type="link"/>
<span>复制链接</span>
</a-menu-item>
<a-menu-item key="unlink">
<a-icon type="disconnect"/>
<span>取消关联</span>
</a-menu-item>
</a-menu>
</a-dropdown>
<a class="muted" slot="actions" @click="removeTaskSource(item, index)">
<a-icon type="delete"/>
</a>
</a-list-item>
</a-list>
@ -477,6 +454,7 @@
loading: false,
code: this.taskCode,
projectCodeCurrent: '',
projectName: '',
task: {
pri: 0,
priText: '普通',
@ -631,13 +609,11 @@
uploader: {
handler(newVal, oldVal) {
//
console.log(newVal);
console.log(newVal.fileList);
console.log('上传文件', newVal);
console.log('上传文件', newVal.fileList, oldVal.fileList);
const files = newVal.fileList;
const index = files.findIndex(item => item.projectName == this.task.projectName);
if (index !== -1) {
this.taskSources();
this.getTaskLog();
if(files[files.length-1].projectName == this.projectName){
this.taskSourceList.push(files[files.length-1])
}
},
deep: true
@ -649,6 +625,7 @@
this.getDepartment();
// console.log('router', this.$route);
this.projectCode = this.$route.params.code;
this.projectName = this.$route.query.name;
this.$nextTick(()=>{
this.changeModalHeight();
})
@ -741,6 +718,10 @@
})
}
},
//
removeTaskSource(e, index){
this.taskSourceList.splice(index, 1);
},
//
addTask(){
if(!this.task.name) return notice({title: '请输入工单名称'}, 'error', 5000);
@ -755,6 +736,9 @@
task.exchangeList = task.exchangeList.map(item=>{
return item.code;
})
task.file_list = this.taskSourceList.map(item=>{
return item.code;
}).join(',');
task.exchangeList = task.exchangeList.join(',');
task.copied_list = task.copied_list.map(item=>{
return item.code;
@ -841,7 +825,7 @@
// })
},
taskSources() {
// taskSources({taskCode: this.code,}).then((res) => {
// taskSources().then((res) => {
// this.taskSourceList = res.data;
// })
},

View File

@ -98,12 +98,12 @@
</a-tooltip>
</span>
</div>
<div class="task-wrap">
<div class="task-wrap" >
<div class="task-content">
<div class="content-left">
<vue-scroll :ops="scrollOps">
<div class="task-title" :class="{'disabled': task.deleted}" :style="{'pointer-events': userInfo.code==task.create_by? 'all':'none'}">
<a-input ref="inputTitle" auto-focus @blur="doName" v-model="task.name" size="large"
<a-input ref="inputTitle" @blur="doName" v-model="task.name" size="large"
v-show="showEditName"/>
<a-tooltip :mouseEnterDelay="0.5" v-if="!task.deleted">
<template slot="title">
@ -117,16 +117,16 @@
{{task.name}}
</div>
</div>
<div class="task-basic-attrs-view muted" :style="{'pointer-events': userInfo.code==task.create_by? 'all':'none'}">
<div class="task-basic-attrs-view muted" >
<div class="field-list" :class="{'disabled': task.deleted}">
<div class="component-mount pink-bg">
<div class="component-mount pink-bg" :style="{'pointer-events': userInfo.code==task.create_by? 'all':'none'}">
<div class="field">
<div class="field-left">
<a-icon type="file-text"/>
<span class="field-name">工作内容</span>
</div>
<div class="field-right width-block">
<div class="task-description" :class="{'disabled': task.deleted}"
<div :class="{'task-description': userInfo.code==task.create_by}"
v-show="!showTaskDescriptionEdit"
@click="showTaskDesc">
<div class="description-txt img-preview-content" v-show="task.description"
@ -371,7 +371,7 @@
</div>
</div>
</div>
<div class="component-mount">
<div class="component-mount" style="pointer-events:none">
<div class="field">
<div class="field-left">
<a-icon type="user"/>
@ -415,7 +415,7 @@
</div>
</div>
</div>
<div class="component-mount">
<div class="component-mount" style="pointer-events:none">
<div class="field">
<div class="field-left">
<a-icon type="apartment"/>
@ -431,7 +431,7 @@
</div>
</div>
</div>
<div class="component-mount">
<div class="component-mount" style="pointer-events:none">
<div class="field">
<div class="field-left">
<a-icon type="gateway"/>
@ -550,11 +550,11 @@
</div>
</div>
</div>
<div class="component-mount" v-if="userInfo.code==task.create_by">
<div class="component-mount" v-show="userInfo.code==task.create_by||(userInfo.code==task.assign_to&&task.status==2)" >
<div class="field">
<div class="block-field width-block">
<div class="task-child">
<a class="add-handler" id="upload-file">
<div class="task-child" >
<a class="add-handler" id="d-upload-file">
<a-icon type="plus" style="margin-right: 6px;"/>
上传文件
</a>
@ -698,7 +698,7 @@
<a class="show-more muted" v-show="checkShowMoreLog"
@click="getMoreTaskLog">
<a-icon type="ellipsis"/>
显示较早的 {{taskLogTotal - taskLogList.length}} 动态
显示较早的 {{taskLogTotal - taskLogList.length}} 数据
</a>
<div :class="{'log-comment': log.is_comment,'list-item': !log.is_comment, 'log-pass': log.type=='pass', 'log-reject': log.type=='reject', 'log-add': log.type=='add'}"
v-for="log in taskLogList" :key="log.code">
@ -741,7 +741,7 @@
</vue-scroll>
</div>
<div class="footer" id="footer">
<a-popover v-if="userInfo.code==task.create_by||userInfo.code==task.assign_to" trigger="click" placement="top" :visible="showMentions" arrowPointAtCenter :getPopupContainer="getPopup">
<a-popover v-if="(userInfo.code==task.create_by&&task.status==4)||(userInfo.code == task.assign_to&&task.status==2)" trigger="click" placement="top" :visible="showMentions" arrowPointAtCenter :getPopupContainer="getPopup">
<template slot="content">
<div class="mentions-content" style="width: 200px;">
<div class="mentions-wrapper" v-for="member in taskMemberList" :key="member.id" @click="selectMentionMember(member)">
@ -753,11 +753,11 @@
<a-textarea @focus="commenting = true" @blur="commenting = false" ref="commentText" v-model="comment" :rows="1" placeholder="@提及任务成员Ctrl+Enter发送"
style="margin-right: 15px;"/>
</a-popover>
<template v-if="userInfo.code == task.create_by">
<template v-if="userInfo.code == task.create_by&&task.status==4">
<a-button class="middle-btn" type="danger" @click="createComment(2)">驳回</a-button>
<a-button class="middle-btn" type="primary" style="margin-left: 15px;" @click="createComment(1)">通过</a-button>
</template>
<template v-if="userInfo.code == task.assign_to">
<template v-if="userInfo.code == task.assign_to&&task.status==2">
<a-button class="middle-btn" type="primary" @click="createComment(3)">提交</a-button>
</template>
</div>
@ -1114,7 +1114,6 @@
},
created() {
this.init();
console.log(this.userInfo);
},
mounted() {
this.$nextTick(()=>{
@ -1139,7 +1138,7 @@
}
};
setTimeout(() => {
this.uploader.assignBrowse(document.getElementById('upload-file'));
this.uploader.assignBrowse(document.getElementById('d-upload-file'));
}, 500)
},
filters: {
@ -1236,37 +1235,41 @@
this.$store.commit('viewRefresh');
this.clearMemberMenu();
read(this.code).then((res) => {
this.getTaskLog();
this.taskSources();
this.taskName = res.data.name;
this.task = res.data;
this.projectCodeCurrent = res.data.project_code;
if (!this.task.end_time) {
this.task.setEndTime = false;
this.task.end_time = moment(moment().format('YYYY-MM-DD') + ' 18:00');
} else {
this.task.setEndTime = true;
this.task.end_time = moment(this.task.end_time);
try {
this.getTaskLog();
this.taskSources();
this.taskName = res.data.name;
this.task = res.data;
this.projectCodeCurrent = res.data.project_code;
if (!this.task.end_time) {
this.task.setEndTime = false;
this.task.end_time = moment(moment().format('YYYY-MM-DD') + ' 18:00');
} else {
this.task.setEndTime = true;
this.task.end_time = moment(this.task.end_time);
}
this.task.end_time_format = relativelyTaskTime(this.task.end_time, true);
if (!this.task.begin_time) {
this.task.setBeginTime = false;
this.task.begin_time = moment(moment().format('YYYY-MM-DD') + ' 18:00');
} else {
this.task.setBeginTime = true;
this.task.begin_time = moment(this.task.begin_time);
}
this.task.begin_time_format = relativelyTaskTime(this.task.begin_time, true);
this.initContent(this.task.description);
if (this.task.executor && !this.childExecutor) {
this.childExecutor = this.task.executor;
}
this.loading = false;
this.$store.dispatch('setTempData', {
projectCode: this.projectCodeCurrent,
taskCode: this.code,
projectName: res.data.projectName
})
} catch (error) {
console.error(error);
}
this.task.end_time_format = relativelyTaskTime(this.task.end_time, true);
if (!this.task.begin_time) {
this.task.setBeginTime = false;
this.task.begin_time = moment(moment().format('YYYY-MM-DD') + ' 18:00');
} else {
this.task.setBeginTime = true;
this.task.begin_time = moment(this.task.begin_time);
}
this.task.begin_time_format = relativelyTaskTime(this.task.begin_time, true);
this.initContent(this.task.description);
if (this.task.executor && !this.childExecutor) {
this.childExecutor = this.task.executor;
}
this.loading = false;
this.$store.dispatch('setTempData', {
projectCode: this.projectCodeCurrent,
taskCode: this.code,
projectName: res.data.projectName
})
});
},
getTaskLog() {

View File

@ -177,7 +177,7 @@
let ignored = false;
let fileName = '';
const singleMaxSize = this.singleMaxSize * 1024 * 1024;
console.log(fileList);
// console.log(fileList);
fileList.forEach((v, k) => {
if (v.size > singleMaxSize) {
ignored = true;
@ -214,6 +214,7 @@
}
rootFile.projectName = response.data.projectName;
rootFile.fileUrl = response.data.url;
rootFile.code = response.data.code || '';
console.log('file success', rootFile);
this.completeTotal++;
},

View File

@ -1,10 +1,10 @@
<template>
<div class="home-index">
<div class="page-header">
<p class="day-text muted"> {{ yiyan.hitokoto }} {{ yiyan.from }} <a class="muted" @click="getYiYan">
<!-- <p class="day-text muted"> {{ yiyan.hitokoto }} {{ yiyan.from }} <a class="muted" @click="getYiYan">
<a-icon type="reload"/>
</a>
</p>
</p> -->
<div class="header-content" v-if="userInfo">
<div class="left-content">
<div class="avatar">
@ -104,7 +104,7 @@
<div slot="title">
<span>{{ item.member_name }}</span>
<span v-if="item.is_comment == 0"> <span v-html="item.remark "></span></span>&nbsp;
<template v-if="item.is_comment == 1">表了评论
<template v-if="item.is_comment == 1">布了审核流程
<p class="comment-text">{{ item.content }}</p>
</template>
<router-link target="_blank"
@ -173,13 +173,7 @@
<span v-if="item.hasUnDone" style="font-size: 12px;">子任务尚未全部完成无法完成父任务</span>
</template>
</template>
<span class="check-box-wrapper task-item"
@click.stop="()=>{if(item.deleted || item.hasUnDone || (item.pcode && item.parentDone)) return false;taskDone(item.code, !item.done)}">
<a-icon class="check-box"
:class="{'disabled': item.deleted || item.parentDone || item.hasUnDone}"
:type="item.done ? 'check-square' : 'border'"
:style="{fontSize:'16px'}"/>
</span>
</a-tooltip>
<a-tooltip :title="item.name">
<span @click="showTaskDetail = true;taskCode = item.code">{{ item.name }}</span>

View File

@ -33,14 +33,14 @@
@click="$router.push('/project/space/overview/' + code)">
概览</a>
</li>
<li class=""><a class="app" data-app="build"
<!-- <li class=""><a class="app" data-app="build"
@click="$router.push('/project/space/features/' + code)">
版本</a>
</li>
<li class="actives"><a class="app" data-app="works"
@click="$router.push('/project/space/events/' + code)">
日程</a>
</li>
</li> -->
</ul>
</section>
</div>

View File

@ -33,14 +33,14 @@
@click="$router.push('/project/space/overview/' + code)">
概览</a>
</li>
<li class="actives"><a class="app" data-app="build"
<!-- <li class="actives"><a class="app" data-app="build"
@click="$router.push('/project/space/features/' + code)">
版本</a>
</li>
<li><a class="app" data-app="build"
@click="$router.push('/project/space/events/' + code)">
日程</a>
</li>
</li> -->
</ul>
</section>
</div>

View File

@ -33,14 +33,14 @@
@click="$router.push('/project/space/overview/' + code)">
概览</a>
</li>
<li class=""><a class="app" data-app="build"
<!-- <li class=""><a class="app" data-app="build"
@click="$router.push('/project/space/features/' + code)">
版本</a>
</li>
<li><a class="app" data-app="build"
@click="$router.push('/project/space/events/' + code)">
日程</a>
</li>
</li> -->
</ul>
</section>
</div>

View File

@ -33,14 +33,14 @@
@click="$router.push('/project/space/overview/' + code)">
概览</a>
</li>
<li class=""><a class="app" data-app="build"
<!-- <li class=""><a class="app" data-app="build"
@click="$router.push('/project/space/features/' + code)">
版本</a>
</li>
<li><a class="app" data-app="build"
@click="$router.push('/project/space/events/' + code)">
日程</a>
</li>
</li> -->
</ul>
</section>
</div>
@ -125,7 +125,7 @@
<span>{{ item.member_name }} </span>
<span v-if="item.is_comment == 0"> <span
v-html="item.remark "></span></span>&nbsp;
<template v-if="item.is_comment == 1">表了评论
<template v-if="item.is_comment == 1">布了审核流程
<p class="comment-text">{{ item.content }}</p>
</template>
<span class="right-item muted"> {{ formatTime(item.create_time) }}

View File

@ -62,7 +62,7 @@
概览</a
>
</li>
<li class="">
<!-- <li class="">
<a
class="app"
data-app="build"
@ -79,7 +79,7 @@
>
日程</a
>
</li>
</li> -->
</ul>
</section>
<div class="project-nav-footer">
@ -87,13 +87,13 @@
<a-icon type="plus-circle"></a-icon>
<span> 创建任务</span>
</a>
<a class="footer-item" @click="changeViewType()">
<!-- <a class="footer-item" @click="changeViewType()">
<span>
<span v-if="viewType == 'task-board'">
<a-icon type="database"></a-icon> </span
><span v-else> <a-icon type="table"></a-icon> </span></span
>
</a>
</a> -->
<a class="footer-item" @click="visibleDraw('taskSearch')">
<a-icon type="search"></a-icon>
<span> 筛选</span>
@ -117,10 +117,10 @@
</div>
</div>
<wrapper-content :showHeader="false">
<draggable
<!-- draggable组件拖动 v-model="taskStages" -->
<div
e
v-show="viewType == 'task-board'"
v-model="taskStages"
:options="{
group: 'stages',
filter: '.undraggables',
@ -132,7 +132,6 @@
id="board-scrum-stages"
class="board-scrum-stages"
@end="stageSort"
v-dragscroll2
>
<div
class="scrum-stage"
@ -215,9 +214,8 @@
wrapperClassName="tasks-loading"
:spinning="stage.tasksLoading"
>
<!--未完成列表-->
<draggable
v-model="stage.unDoneTasks"
<!--未完成列表 v-model="stage.unDoneTasks" 拖动 -->
<div
:options="{
group: 'task',
ghostClass: 'task-ghost',
@ -373,7 +371,7 @@
</div>
</div>
</template>
</draggable>
</div>
<!--创建任务卡片-->
<div
class="task-creator-wrap card"
@ -448,8 +446,7 @@
</form>
</div>
<!--已完成列表-->
<draggable
v-model="stage.doneTasks"
<div
:options="{
group: 'task-done',
ghostClass: 'task-ghost',
@ -527,7 +524,7 @@
</div>
</template>
<!--</ul>-->
</draggable>
</div>
<div
class="scrum-stage-tasks-done"
v-show="stage.canNotReadCount"
@ -602,7 +599,7 @@
</div>
</header>
</div>
</draggable>
</div>
<task-table
v-if="viewType == 'task-table' && !loading"
:project-code="this.code"
@ -722,19 +719,19 @@
项目设置
</a>
</li>
<li class="menu-item">
<!-- <li class="menu-item">
<a @click="taskTagModal.modalStatus = true">
<a-icon type="tags" />
标签
</a>
</li>
</li> -->
<li class="menu-item">
<a @click="recycleModal.modalStatus = true">
<a-icon type="delete" />
查看回收站
</a>
</li>
<li class="menu-item">
<!-- <li class="menu-item">
<a :href="downLoadUrl" target="_blank">
<a-icon type="copy" />
下载导入任务模板
@ -759,7 +756,7 @@
上传文件导入任务
</a>
</a-upload>
</li>
</li> -->
<li class="menu-item">
<a>
<a-icon type="logout" />
@ -941,6 +938,7 @@ export default {
data() {
return {
viewType: "task-board",
// viewType: "task-table",
code: this.$route.params.code,
loading: true,
project: { task_board_theme: "simple" },
@ -1147,6 +1145,7 @@ export default {
},
directives: {
dragscroll2: function (el) {
return;
el.oncontextmenu = function (ev) {
el.onmousedown = function (ev) {
console.log(ev.target.classList);
@ -1336,7 +1335,7 @@ export default {
// this.task.project_code = this.code;
// this.task.assign_to = this.defaultExecutor.code;
this.$router.push(
`${this.$route.path}/add/${this.code}?from=${0}&stage_code=${this.taskStages[0].code}`
`${this.$route.path}/add/${this.code}?name=${this.project.name}&from=${0}&stage_code=${this.taskStages[0].code}`
);
},
//

View File

@ -26,8 +26,8 @@ module.exports = {
proxy: { // 配置跨域
'/api': {
//要访问的跨域的api的域名
target: `https://work.lihaink.cn`,
// target: `${process.env.VUE_APP_API_URL}/`,
// target: `https://work.lihaink.cn`,
target: `${process.env.VUE_APP_API_URL}/`,
ws: true,
changOrigin: true,
pathRewrite: {