kuaifan 5 năm trước cách đây
mục cha
commit
2786ba6f83

+ 18 - 6
app/Http/Controllers/Api/ProjectController.php

@@ -984,6 +984,7 @@ class ProjectController extends Controller
      * - 未完成
      * - 已超期
      * - 已完成
+     * @apiParam {Number} [createuser]          是否仅获取自己创建的项目(1:是;赋值时projectid和username不强制)
      * @apiParam {Number} [attention]           是否仅获取关注数据(1:是)
      * @apiParam {Number} [statistics]          是否获取统计数据(1:获取)
      * @apiParam {String} [startdate]           任务开始时间,格式:YYYY-MM-DD
@@ -1044,14 +1045,25 @@ class ProjectController extends Controller
         $whereFunc = null;
         $whereArray = [];
         $whereArray[] = ['project_task.delete', '=', 0];
-        if ($projectid > 0) {
-            $whereArray[] = ['project_lists.id', '=', $projectid];
-            $whereArray[] = ['project_lists.delete', '=', 0];
+        if (intval(Request::input('createuser')) === 1) {
+            $whereArray[] = ['project_task.createuser', '=', $user['username']];
+            if ($projectid > 0) {
+                $whereArray[] = ['project_lists.id', '=', $projectid];
+                $whereArray[] = ['project_lists.delete', '=', 0];
+            }
             if (trim(Request::input('username'))) {
                 $whereArray[] = ['project_task.username', '=', trim(Request::input('username'))];
             }
         } else {
-            $whereArray[] = ['project_task.username', '=', $user['username']];
+            if ($projectid > 0) {
+                $whereArray[] = ['project_lists.id', '=', $projectid];
+                $whereArray[] = ['project_lists.delete', '=', 0];
+                if (trim(Request::input('username'))) {
+                    $whereArray[] = ['project_task.username', '=', trim(Request::input('username'))];
+                }
+            } else {
+                $whereArray[] = ['project_task.username', '=', $user['username']];
+            }
         }
         if ($taskid > 0) {
             $whereArray[] = ['project_task.id', '=', intval(Request::input('taskid'))];
@@ -1119,7 +1131,7 @@ class ProjectController extends Controller
             $lists['statistics_complete'] = $type === '已完成' ? $lists['total'] : DB::table('project_task')->where('projectid', $projectid)->where('delete', 0)->where('archived', 0)->where('complete', 1)->count();
         }
         if ($lists['total'] == 0) {
-            return Base::retError('未找到任何相关的任务', $lists);
+            return Base::retError('未找到任何相关的任务', $lists);
         }
         foreach ($lists['lists'] AS $key => $info) {
             $info['overdue'] = Project::taskIsOverdue($info);
@@ -1127,7 +1139,7 @@ class ProjectController extends Controller
         }
         if ($taskid > 0) {
             if (count($lists['lists']) == 0) {
-                return Base::retError('未能找到任何相关的任务');
+                return Base::retError('未能找到此任务或无法管理此任务!');
             }
             return Base::retSuccess('success', $lists['lists'][0]);
         } else {

+ 18 - 10
resources/assets/js/main/components/WHeader.vue

@@ -38,9 +38,9 @@
                 </Dropdown>
             </div>
         </div>
-        <Drawer v-model="userDrawer" width="70%">
-            <Tabs value="name1">
-                <TabPane :label="$L('个人资料')" name="name1">
+        <Drawer v-model="userDrawerShow" width="70%">
+            <Tabs v-model="userDrawerTab">
+                <TabPane :label="$L('个人资料')" name="personal">
                     <Form ref="formDatum" :model="formDatum" :rules="ruleDatum" :label-width="80">
                         <FormItem :label="$L('头像')" prop="userimg">
                             <ImgUpload v-model="formDatum.userimg"></ImgUpload>
@@ -57,9 +57,8 @@
                         </FormItem>
                     </Form>
                 </TabPane>
-                <!--<TabPane :label="$L('偏好设置')" name="name2"></TabPane>
-                <TabPane :label="$L('我创建的任务')" name="name3"></TabPane>-->
-                <TabPane :label="$L('账号密码')" name="name4">
+                <!--<TabPane :label="$L('偏好设置')" name="setting"></TabPane>-->
+                <TabPane :label="$L('账号密码')" name="account">
                     <Form ref="formPass" :model="formPass" :rules="rulePass" :label-width="100">
                         <FormItem :label="$L('旧密码')" prop="oldpass">
                             <Input v-model="formPass.oldpass"></Input>
@@ -76,6 +75,12 @@
                         </FormItem>
                     </Form>
                 </TabPane>
+                <TabPane :label="$L('我创建的任务')" name="createtask">
+                    <header-create :canload="userDrawerShow && userDrawerTab == 'createtask'"></header-create>
+                </TabPane>
+                <TabPane :label="$L('我归档的任务')" name="archivedtask">
+                    <header-archived :canload="userDrawerShow && userDrawerTab == 'archivedtask'"></header-archived>
+                </TabPane>
             </Tabs>
         </Drawer>
     </div>
@@ -156,9 +161,11 @@
 </style>
 <script>
     import ImgUpload from "./ImgUpload";
+    import HeaderCreate from "./project/header/create";
+    import HeaderArchived from "./project/header/archived";
     export default {
         name: 'WHeader',
-        components: {ImgUpload},
+        components: {HeaderArchived, HeaderCreate, ImgUpload},
         props: {
             value: {
             },
@@ -167,7 +174,8 @@
             return {
                 loadIng: 0,
                 userInfo: {},
-                userDrawer: false,
+                userDrawerShow: false,
+                userDrawerTab: 'personal',
 
                 formDatum: {
                     userimg: '',
@@ -245,7 +253,7 @@
             setRightSelect(act) {
                 switch (act) {
                     case 'user':
-                        this.userDrawer = true;
+                        this.userDrawerShow = true;
                         break;
 
                     case 'out':
@@ -296,7 +304,7 @@
                                     success: (res) => {
                                         if (res.ret === 1) {
                                             this.$Message.success(this.$L('修改成功,请重新登录!'));
-                                            this.userDrawer = false;
+                                            this.userDrawerShow = false;
                                             this.$refs[name].resetFields();
                                             $A.userLogout();
                                         } else {

+ 7 - 0
resources/assets/js/main/components/project/archived.vue

@@ -65,6 +65,13 @@
                 "key": 'username',
                 "minWidth": 80,
             }, {
+                "title": "完成",
+                "minWidth": 70,
+                "align": "center",
+                render: (h, params) => {
+                    return h('span', params.row.complete ? '√' : '-');
+                }
+            }, {
                 "title": "归档时间",
                 "width": 160,
                 render: (h, params) => {

+ 218 - 0
resources/assets/js/main/components/project/header/archived.vue

@@ -0,0 +1,218 @@
+<template>
+    <drawer-tabs-container>
+        <div class="project-complete">
+            <!-- 列表 -->
+            <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
+            <!-- 分页 -->
+            <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
+        </div>
+    </drawer-tabs-container>
+</template>
+
+<style lang="scss" scoped>
+    .project-complete {
+        .tableFill {
+            margin: 12px 12px 20px;
+        }
+    }
+</style>
+<script>
+    import DrawerTabsContainer from "../../DrawerTabsContainer";
+    import Task from "../../../mixins/task";
+
+    export default {
+        name: 'HeaderArchived',
+        components: {DrawerTabsContainer},
+        props: {
+            canload: {
+                type: Boolean,
+                default: true
+            },
+        },
+        mixins: [
+            Task
+        ],
+        data () {
+            return {
+                loadYet: false,
+
+                loadIng: 0,
+
+                columns: [],
+
+                lists: [],
+                listPage: 1,
+                listTotal: 0,
+                noDataText: "数据加载中.....",
+            }
+        },
+        created() {
+            this.columns = [{
+                "title": "任务名称",
+                "key": 'title',
+                "minWidth": 120,
+                render: (h, params) => {
+                    return this.renderTaskTitle(h, params);
+                }
+            }, {
+                "title": "创建人",
+                "key": 'createuser',
+                "minWidth": 80,
+            }, {
+                "title": "负责人",
+                "key": 'username',
+                "minWidth": 80,
+            }, {
+                "title": "完成",
+                "minWidth": 70,
+                "align": "center",
+                render: (h, params) => {
+                    return h('span', params.row.complete ? '√' : '-');
+                }
+            }, {
+                "title": "归档时间",
+                "width": 160,
+                render: (h, params) => {
+                    return h('span', $A.formatDate("Y-m-d H:i:s", params.row.archiveddate));
+                }
+            }, {
+                "title": "操作",
+                "key": 'action',
+                "width": 100,
+                "align": 'center',
+                render: (h, params) => {
+                    return h('Button', {
+                        props: {
+                            type: 'primary',
+                            size: 'small'
+                        },
+                        on: {
+                            click: () => {
+                                this.$Modal.confirm({
+                                    title: '取消归档',
+                                    content: '你确定要取消归档吗?',
+                                    loading: true,
+                                    onOk: () => {
+                                        $A.aAjax({
+                                            url: 'project/task/edit',
+                                            data: {
+                                                act: 'unarchived',
+                                                taskid: params.row.id,
+                                            },
+                                            error: () => {
+                                                this.$Modal.remove();
+                                                alert(this.$L('网络繁忙,请稍后再试!'));
+                                            },
+                                            success: (res) => {
+                                                this.$Modal.remove();
+                                                this.getLists();
+                                                setTimeout(() => {
+                                                    if (res.ret === 1) {
+                                                        this.$Message.success(res.msg);
+                                                        $A.triggerTaskInfoListener('unarchived', res.data);
+                                                    } else {
+                                                        this.$Modal.error({title: this.$L('温馨提示'), content: res.msg});
+                                                    }
+                                                }, 350);
+                                            }
+                                        });
+                                    }
+                                });
+                            }
+                        }
+                    }, '取消归档');
+                }
+            }];
+        },
+        mounted() {
+            if (this.canload) {
+                this.loadYet = true;
+                this.getLists(true);
+            }
+            $A.setOnTaskInfoListener('components/project/header/archived', (act, detail) => {
+                this.lists.some((task, i) => {
+                    if (task.id == detail.id) {
+                        this.lists.splice(i, 1, detail);
+                        return true;
+                    }
+                });
+                //
+                switch (act) {
+                    case "delete":      // 删除任务
+                    case "unarchived":  // 取消归档
+                        this.lists.some((task, i) => {
+                            if (task.id == detail.id) {
+                                this.lists.splice(i, 1);
+                                return true;
+                            }
+                        });
+                        break;
+
+                    case "archived":    // 归档
+                        let has = false;
+                        this.lists.some((task) => {
+                            if (task.id == detail.id) {
+                                return has = true;
+                            }
+                        });
+                        if (!has) {
+                            this.lists.unshift(detail);
+                        }
+                        break;
+                }
+            });
+        },
+
+        watch: {
+            canload(val) {
+                if (val && !this.loadYet) {
+                    this.loadYet = true;
+                    this.getLists(true);
+                }
+            }
+        },
+
+        methods: {
+            setPage(page) {
+                this.listPage = page;
+                this.getLists();
+            },
+
+            setPageSize(size) {
+                if (Math.max($A.runNum(this.listPageSize), 10) != size) {
+                    this.listPageSize = size;
+                    this.getLists();
+                }
+            },
+
+            getLists(resetLoad) {
+                if (resetLoad === true) {
+                    this.listPage = 1;
+                }
+                this.loadIng++;
+                $A.aAjax({
+                    url: 'project/task/lists',
+                    data: {
+                        page: Math.max(this.listPage, 1),
+                        pagesize: Math.max($A.runNum(this.listPageSize), 10),
+                        archived: '已归档',
+                    },
+                    complete: () => {
+                        this.loadIng--;
+                    },
+                    success: (res) => {
+                        if (res.ret === 1) {
+                            this.lists = res.data.lists;
+                            this.listTotal = res.data.total;
+                            this.noDataText = "没有相关的数据";
+                        } else {
+                            this.lists = [];
+                            this.listTotal = 0;
+                            this.noDataText = res.msg;
+                        }
+                    }
+                });
+            },
+        }
+    }
+</script>

+ 161 - 0
resources/assets/js/main/components/project/header/create.vue

@@ -0,0 +1,161 @@
+<template>
+    <drawer-tabs-container>
+        <div class="project-complete">
+            <!-- 列表 -->
+            <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
+            <!-- 分页 -->
+            <Page class="pageBox" :total="listTotal" :current="listPage" :disabled="loadIng > 0" @on-change="setPage" @on-page-size-change="setPageSize" :page-size-opts="[10,20,30,50,100]" placement="top" show-elevator show-sizer show-total transfer></Page>
+        </div>
+    </drawer-tabs-container>
+</template>
+
+<style lang="scss" scoped>
+    .project-complete {
+        .tableFill {
+            margin: 12px 12px 20px;
+        }
+    }
+</style>
+<script>
+    import DrawerTabsContainer from "../../DrawerTabsContainer";
+    import Task from "../../../mixins/task";
+
+    export default {
+        name: 'HeaderCreate',
+        components: {DrawerTabsContainer},
+        props: {
+            canload: {
+                type: Boolean,
+                default: true
+            },
+        },
+        mixins: [
+            Task
+        ],
+        data () {
+            return {
+                loadYet: false,
+
+                loadIng: 0,
+
+                columns: [],
+
+                lists: [],
+                listPage: 1,
+                listTotal: 0,
+                noDataText: "数据加载中.....",
+            }
+        },
+        created() {
+            this.columns = [{
+                "title": "任务名称",
+                "key": 'title',
+                "minWidth": 120,
+                render: (h, params) => {
+                    return this.renderTaskTitle(h, params);
+                }
+            }, {
+                "title": "负责人",
+                "key": 'username',
+                "minWidth": 80,
+            }, {
+                "title": "完成",
+                "minWidth": 70,
+                "align": "center",
+                render: (h, params) => {
+                    return h('span', params.row.complete ? '√' : '-');
+                }
+            }, {
+                "title": "归档",
+                "minWidth": 70,
+                "align": "center",
+                render: (h, params) => {
+                    return h('span', params.row.archived ? '√' : '-');
+                }
+            }, {
+                "title": "创建时间",
+                "width": 160,
+                render: (h, params) => {
+                    return h('span', $A.formatDate("Y-m-d H:i:s", params.row.indate));
+                }
+            }];
+        },
+        mounted() {
+            if (this.canload) {
+                this.loadYet = true;
+                this.getLists(true);
+            }
+            $A.setOnTaskInfoListener('components/project/header/create',(act, detail) => {
+                this.lists.some((task, i) => {
+                    if (task.id == detail.id) {
+                        this.lists.splice(i, 1, detail);
+                        return true;
+                    }
+                });
+                //
+                switch (act) {
+                    case "delete":      // 删除任务
+                        this.lists.some((task, i) => {
+                            if (task.id == detail.id) {
+                                this.lists.splice(i, 1);
+                                return true;
+                            }
+                        });
+                        break;
+                }
+            });
+        },
+
+        watch: {
+            canload(val) {
+                if (val && !this.loadYet) {
+                    this.loadYet = true;
+                    this.getLists(true);
+                }
+            }
+        },
+
+        methods: {
+            setPage(page) {
+                this.listPage = page;
+                this.getLists();
+            },
+
+            setPageSize(size) {
+                if (Math.max($A.runNum(this.listPageSize), 10) != size) {
+                    this.listPageSize = size;
+                    this.getLists();
+                }
+            },
+
+            getLists(resetLoad) {
+                if (resetLoad === true) {
+                    this.listPage = 1;
+                }
+                this.loadIng++;
+                $A.aAjax({
+                    url: 'project/task/lists',
+                    data: {
+                        createuser: 1,
+                        archived: '全部',
+                        page: Math.max(this.listPage, 1),
+                        pagesize: Math.max($A.runNum(this.listPageSize), 10),
+                    },
+                    complete: () => {
+                        this.loadIng--;
+                    },
+                    success: (res) => {
+                        if (res.ret === 1) {
+                            this.lists = res.data.lists;
+                            this.listTotal = res.data.total;
+                        } else {
+                            this.lists = [];
+                            this.listTotal = 0;
+                            this.noDataText = res.msg;
+                        }
+                    }
+                });
+            },
+        }
+    }
+</script>

+ 7 - 0
resources/assets/js/main/components/project/statistics.vue

@@ -176,6 +176,13 @@
                 "key": 'username',
                 "minWidth": 80,
             }, {
+                "title": "完成",
+                "minWidth": 70,
+                "align": "center",
+                render: (h, params) => {
+                    return h('span', params.row.complete ? '√' : '-');
+                }
+            }, {
                 "title": "创建时间",
                 "width": 160,
                 render: (h, params) => {

+ 4 - 0
resources/assets/js/main/pages/project-panel.vue

@@ -402,6 +402,10 @@
                 this.$set(this.projectDetail, 'title', $A.getObject(this.$route.params.other, 'title'))
             }
         },
+        deactivated() {
+            this.projectDrawerShow = false;
+            this.projectSettingDrawerShow = false;
+        },
         watch: {
             projectid(val) {
                 if ($A.runNum(val) <= 0) {

+ 1 - 1
resources/assets/js/main/pages/project.vue

@@ -75,7 +75,7 @@
 
         <Modal
             v-model="addShow"
-            :title="$L('添加团队成员')"
+            :title="$L('新建项目')"
             :closable="false"
             :mask-closable="false">
             <Form ref="add" :model="formAdd" :rules="ruleAdd" :label-width="80">

+ 3 - 0
resources/assets/js/main/pages/todo.vue

@@ -426,6 +426,9 @@
                 }
             }, true);
         },
+        deactivated() {
+            this.todoDrawerShow = false;
+        },
         computed: {
 
         },