kuaifan 5 yıl önce
ebeveyn
işleme
226ba334c5

+ 20 - 0
app/Http/Controllers/Api/ProjectController.php

@@ -785,6 +785,9 @@ class ProjectController extends Controller
      * - 已完成
      * @apiParam {String} [username]            负责人用户名
      * @apiParam {Number} [statistics]          是否获取统计数据(1:获取)
+     * @apiParam {Object} [sorts]               排序方式,格式:{key:'', order:''}("archived=已归档"时无效)
+     * - key: title|labelid|enddate|username|level|indate|type
+     * - order: asc|desc
      * @apiParam {Number} [page]                当前页,默认:1
      * @apiParam {Number} [pagesize]            每页显示数量,默认:20,最大:100
      */
@@ -804,6 +807,23 @@ class ProjectController extends Controller
         }
         //
         $orderBy = '`inorder` DESC,`id` DESC';
+        $sorts = Base::json2array(Request::input('sorts'));
+        if (in_array($sorts['key'], ['asc', 'desc'])) {
+            switch ($sorts['key']) {
+                case 'title':
+                case 'labelid':
+                case 'enddate':
+                case 'username':
+                case 'level':
+                case 'indate':
+                    $orderBy = '`' . $sorts['key'] . '` ' . $sorts['key'] . ',`id` DESC';
+                    break;
+                case 'type':
+                    $orderBy = 'CASE WHEN `complete`= 0 AND `enddate` BETWEEN 1 AND ' . Base::time() . ' THEN 0 ELSE 1 END ' . $sorts['key'] . ', `complete` ' . $sorts['key'] . ',`id` DESC';
+                    break;
+            }
+        }
+        //
         $whereArray = [];
         $whereArray[] = ['project_lists.id', '=', $projectid];
         $whereArray[] = ['project_lists.delete', '=', 0];

+ 6 - 0
app/Module/Base.php

@@ -310,6 +310,9 @@ class Base
      */
     public static function json2array($string)
     {
+        if (is_array($string)) {
+            return $string;
+        }
         try {
             return json_decode($string, true);
         } catch (Exception $e) {
@@ -324,6 +327,9 @@ class Base
      */
     public static function array2json($array)
     {
+        if (!is_array($array)) {
+            return $array;
+        }
         try {
             return json_encode($array);
         } catch (Exception $e) {

+ 28 - 11
resources/assets/js/main/components/project/task/lists.vue

@@ -45,7 +45,7 @@
         </Row>
 
         <!-- 列表 -->
-        <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" stripe></Table>
+        <Table class="tableFill" ref="tableRef" :columns="columns" :data="lists" :loading="loadIng > 0" :no-data-text="noDataText" @on-sort-change="sortChange" 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>
@@ -80,6 +80,7 @@
         data() {
             return {
                 keys: {},
+                sorts: {key:'', order:''},
 
                 loadYet: false,
 
@@ -99,10 +100,13 @@
                 "title": "任务名称",
                 "key": 'title',
                 "minWidth": 100,
+                "tooltip": true,
+                "sortable": true,
             }, {
                 "title": "阶段",
                 "key": 'labelid',
                 "minWidth": 80,
+                "sortable": true,
                 render: (h, params) => {
                     let labelid = params.row.labelid;
                     let labelDetail = this.labelLists.find((item) => { return item.id === labelid});
@@ -110,35 +114,39 @@
                 }
             }, {
                 "title": "计划时间",
+                "key": 'enddate',
                 "width": 160,
                 "align": "center",
+                "sortable": true,
                 render: (h, params) => {
                     return h('span', params.row.enddate ? $A.formatDate("Y-m-d H:i:s", params.row.enddate) : '-');
                 }
             }, {
                 "title": "负责人",
                 "key": 'username',
-                "minWidth": 80,
+                "minWidth": 90,
+                "sortable": true,
             }, {
                 "title": "优先级",
                 "key": 'level',
                 "align": "center",
-                "minWidth": 70,
-                "maxWidth": 80,
+                "minWidth": 90,
+                "maxWidth": 100,
+                "sortable": true,
                 render: (h, params) => {
                     let level = params.row.level;
                     let color;
                     switch (level) {
-                        case "1":
+                        case 1:
                             color = "#ff0000";
                             break;
-                        case "2":
+                        case 2:
                             color = "#BB9F35";
                             break;
-                        case "3":
+                        case 3:
                             color = "#449EDD";
                             break;
-                        case "4":
+                        case 4:
                             color = "#84A83B";
                             break;
                     }
@@ -150,10 +158,11 @@
                 },
             }, {
                 "title": "状态",
-                "key": 'complete',
+                "key": 'type',
                 "align": "center",
-                "minWidth": 70,
-                "maxWidth": 80,
+                "minWidth": 80,
+                "maxWidth": 100,
+                "sortable": true,
                 render: (h, params) => {
                     let color;
                     let status;
@@ -175,7 +184,9 @@
                 },
             }, {
                 "title": "创建时间",
+                "key": 'indate',
                 "width": 160,
+                "sortable": true,
                 render: (h, params) => {
                     return h('span', $A.formatDate("Y-m-d H:i:s", params.row.indate));
                 }
@@ -211,6 +222,11 @@
                 this.getLists(true);
             },
 
+            sortChange(info) {
+                this.sorts = {key:info.key, order:info.order};
+                this.getLists(true);
+            },
+
             setPage(page) {
                 this.listPage = page;
                 this.getLists();
@@ -238,6 +254,7 @@
                 whereData.page = Math.max(this.listPage, 1);
                 whereData.pagesize = Math.max($A.runNum(this.listPageSize), 10);
                 whereData.projectid = this.projectid;
+                whereData.sorts = this.sorts;
                 $A.aAjax({
                     url: 'project/task/lists',
                     data: whereData,

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

@@ -387,7 +387,6 @@
                     data: {
                         projectid: this.projectid,
                         labelid: item.id,
-                        levelsort: 1
                     },
                     complete: () => {
                         this.$set(item, 'loadIng', false);