Quellcode durchsuchen

流程、节点、用户组、数据共享4个功能的管理

wufeng vor 2 Jahren
Ursprung
Commit
480ab618c2

+ 206 - 0
app/admin/controller/ActionProcess.php

@@ -0,0 +1,206 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\admin\model\ProcessWait;
+use think\facade\Db;
+use think\facade\Validate;
+use app\admin\model\ActionProcess as APModel;
+use app\admin\model\Process as PModel;
+
+//流程节点
+class ActionProcess extends BaseController
+{
+
+    //获取流程节点列表
+    public function getList()
+    {
+
+        $param = $this->request->filter('trim')->only(['process_id', 'action_type' => '', 'operation_type' => '', 'page' => 1, 'size' => 15], 'post');
+
+        $val = Validate::rule([
+            'process_id|流程id' => 'require|number|gt:0',
+            'page|页码' => 'require|number|gt:0',
+            'size|每页显示的页码' => 'require|number|gt:0',
+        ]);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        $where = [['is_del', '=', APModel::$is_del_normal]];
+        if ($param['process_id'] != '') $where[] = ['process_id', '=', $param['process_id']];
+        if ($param['action_type'] != '') $where[] = ['action_type', '=', $param['action_type']];
+        if ($param['operation_type'] != '') $where[] = ['operation_type', '=', $param['operation_type']];
+
+        $count = Db::name('action_process')
+            ->where($where)
+            ->count('id');
+
+        $list = APModel::field('id,status_name,order_process,status,action_type,operation_type,next_action_ids,creater,addtime,remark')
+            ->where($where)
+            ->order('id', 'desc')
+            ->page($param['page'], $param['size'])
+            ->select()
+            ->toArray();
+
+        $all_next_ids = implode(',', array_column($list, 'next_action_ids'));
+
+        //处理下一个节点的名称
+        $child = Db::name('action_process')
+            ->whereIn('id', $all_next_ids)
+            ->column('status_name', 'id');
+
+        foreach ($list as &$item) {
+            if ($item['next_action_ids']) {
+                $next_action_ids = explode(',', $item['next_action_ids']);
+                foreach ($next_action_ids as $next_action_id) {
+                    if (isset($child[$next_action_id])) $item['next_actions'][] = $child[$next_action_id];
+                }
+            } else $item['next_actions'] = [];
+        }
+
+        return app_show(0, '获取成功', ['count' => $count, 'list' => $list]);
+
+    }
+
+    //新增
+    public function add()
+    {
+
+        $param = $this->request->filter('trim')->only(['token', 'process_id', 'action_type', 'operation_type', 'status_name', 'order_process', 'next_action_ids' => '', 'remark' => ''], 'post');
+
+        $val = Validate::rule([
+            'token' => 'require',
+            'process_id|流程id' => 'require|number|gt:0',
+            'action_type|节点类型' => 'require|number|between:' . APModel::$action_type_start . ',' . APModel::$action_type_end,
+            'operation_type|操作类型' => 'require|number|in:' . APModel::$operation_type_approval . ',' . APModel::$operation_type_system,
+            'status_name|节点名称' => 'require|max:255',
+            'order_process|节点值' => 'require|number|egt:0|checkOrderProcess:',
+            'next_action_ids|下一节点' => 'array|requireIf:action_type,' . APModel::$action_type_start . '|requireIf:action_type,' . APModel::$action_type_process,
+        ]);
+
+
+        $val->extend('checkOrderProcess', function ($val, $rule, $data) {
+            return APModel::where([
+                'process_id' => $data['process_id'],
+                'order_process' => $val,
+                'is_del' => APModel::$is_del_normal
+            ])->field('id')->findOrEmpty()->isEmpty() ? true : '同一个流程编码下该节点值已存在';
+        });
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        $user = GetUserInfo($param['token']);
+
+        $uid = isset($user['data']['id']) ? $user['data']['id'] : 0;
+        $uname = isset($user['data']['nickname']) ? $user['data']['nickname'] : '';
+        $date = date('Y-m-d H:i:s');
+
+        return APModel::create(array_merge($param, [
+            'status' => APModel::$status_disable,
+            'is_del' => APModel::$is_del_normal,
+            'createrid' => $uid,
+            'creater' => $uname,
+            'addtime' => $date,
+            'updaterid' => $uid,
+            'updater' => $uname,
+            'updatetime' => $date,
+        ]))->save() ? app_show(0, '新增流程节点成功') : error_show(1005, '新增流程节点失败');
+
+    }
+
+    //读取
+    public function read()
+    {
+
+        $id = $this->request->filter('trim')->post('id/d', 0);
+
+        $res = APModel::field(true)
+            ->where(['id' => $id, 'is_del' => APModel::$is_del_normal])
+            ->withAttr('next_action_ids', function ($val) {
+                return explode(',', $val);
+            })
+            ->findOrEmpty()
+            ->toArray();
+
+        return app_show(0, '请求成功', $res);
+    }
+
+    //修改
+    public function update()
+    {
+
+        $param = $this->request->filter('trim')->only(['token', 'id', 'process_id', 'action_type', 'operation_type', 'status_name', 'order_process', 'next_action_ids', 'remark' => '', 'status', 'is_del'], 'post');
+
+        $val = Validate::rule([
+            'token' => 'require',
+            'id|ID' => 'require|number|gt:0',
+            'process_id' => 'number|gt:0',
+            'action_type|节点类型' => 'number|between:' . APModel::$action_type_start . ',' . APModel::$action_type_end,
+            'operation_type|操作类型' => 'number|in:' . APModel::$operation_type_approval . ',' . APModel::$operation_type_system,
+            'status_name|节点名称' => 'max:255',
+            'order_process|节点值' => 'number|egt:0|checkOrderProcess:',
+            'next_action_ids|下一节点' => 'array|requireIf:action_type,' . APModel::$action_type_start . '|requireIf:action_type,' . APModel::$action_type_process,
+            'is_del|是否删除' => 'eq:' . APModel::$is_deleted,
+            'status|状态' => 'in:' . APModel::$status_disable . ',' . APModel::$status_normal,
+        ]);
+
+
+        $val->extend('checkOrderProcess', function ($val, $rule, $data) {
+            if (isset($val) && isset($data['process_id'])) return APModel::where(['process_id' => $data['process_id'], 'order_process' => $val, 'is_del' => APModel::$is_del_normal])->where('id', '<>', $data['id'])->field('id')->findOrEmpty()->isEmpty() ? true : '同一个流程编码下该节点值已存在';
+            else return true;
+        });
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        $info = APModel::where(['id' => $param['id'], 'is_del' => APModel::$is_del_normal])
+            ->field('id,process_id')
+            ->findOrEmpty();
+
+        if ($info->isEmpty()) return error_show(1005, '该节点记录不存在');
+
+        if (isset($param['status']) && $param['status'] == APModel::$status_disable) {
+            //禁用节点时,要校验其所属流程是否被禁用
+            $p_info = PModel::field('id')
+                ->where(['id' => $info->process_id, 'is_del' => PModel::$is_del_normal, 'status' => PModel::$status_normal])
+                ->findOrEmpty()
+                ->isEmpty();
+
+            if (!$p_info) return error_show(1005, '该节点所属流程尚未禁用');
+
+        }
+
+        $user = GetUserInfo($param['token']);
+
+        $uid = isset($user['data']['id']) ? $user['data']['id'] : 0;
+        $uname = isset($user['data']['nickname']) ? $user['data']['nickname'] : '';
+        $date = date('Y-m-d H:i:s');
+
+        if (isset($param['next_action_ids']) && is_array($param['next_action_ids'])) $param['next_action_ids'] = implode(',', $param['next_action_ids']);
+
+        return APModel::where(['id' => $param['id'], 'is_del' => APModel::$is_del_normal])->strict(false)->save(array_merge($param, ['updaterid' => $uid, 'updater' => $uname, 'updatetime' => $date])) ? app_show(0, '修改流程节点成功') : error_show(1005, '修改流程节点失败');
+
+    }
+
+    //获取所有流程的所有节点
+    public function getAll()
+    {
+
+        $data = PModel::where(['is_del' => PModel::$is_del_normal, 'status' => PModel::$status_normal])
+            ->order(['weight' => 'desc', 'id' => 'desc'])
+            ->column('id,process_name,process_type', 'id');
+
+        $action = APModel::where(['is_del' => APModel::$is_del_normal, 'status' => APModel::$status_normal, 'operation_type' => APModel::$operation_type_approval])
+            ->field('id,process_id,order_process,status_name')
+            ->cursor();
+
+        foreach ($action as $item) {
+            $data[$item->process_id]['child'][] = $item->toArray();
+        }
+
+        return app_show(0, '请求成功', array_column($data, null, null));
+
+    }
+
+
+}

+ 268 - 0
app/admin/controller/DataGroup.php

@@ -0,0 +1,268 @@
+<?php
+
+namespace app\admin\controller;
+
+//用户组
+use app\admin\BaseController;
+use think\Exception;
+use think\facade\Db;
+use think\facade\Validate;
+use app\admin\model\DataGroup as DataGroupModel;
+
+class DataGroup extends BaseController
+{
+
+    //用户组列表
+    public function getDataGroupList()
+    {
+        $param = $this->request->filter('trim')->only(['page' => 1, 'size' => 10, 'status' => '', 'title' => '', 'nickname' => '', 'type' => '']);
+
+        $db = new DataGroupModel();
+
+        $rs = $db
+            ->alias('a')
+            ->leftJoin('data_group_userid b', 'b.data_group_id=a.id AND b.is_del=' . DataGroupModel::$delete_正常)
+            ->leftJoin('user_role u', 'u.uid=b.uid AND u.is_del=0')
+            ->group('a.id')
+            ->where('a.is_del', DataGroupModel::$delete_正常);
+
+        $val = Validate::rule([
+            'page|页码' => 'require|number|gt:0',
+            'size|每页数量' => 'require|number|gt:0|elt:100',
+            'status|状态' => 'number|in:' . DataGroupModel::$status_启用 . ',' . DataGroupModel::$status_禁用,
+            'title|用户组名称' => 'max:100',
+            'nickname|成员名称' => 'max:100',
+            'type|共享类型' => 'number|in:' . DataGroupModel::$type_可编辑 . ',' . DataGroupModel::$type_只读 . ',' . DataGroupModel::$type_不共享,
+        ]);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        if ($param['status'] != '') $rs->where('a.status', $param['status']);
+        if ($param['title'] != '') $rs->whereLike('a.title', '%' . $param['title'] . '%');
+        if ($param['nickname'] != '') $rs->whereLike('u.nickname', '%' . $param['nickname'] . '%');
+        if ($param['type'] != '') $rs->where('a.type', $param['type']);
+
+        $count = $rs->count('a.id');
+
+        $list = $rs
+            ->field('a.*,GROUP_CONCAT(u.nickname) nickname')
+            ->page($param['page'], $param['size'])
+            ->order('a.id', 'desc')
+            ->select()
+            ->toArray();
+
+        return app_show(0, '请求成功', ['count' => $count, 'list' => $list]);
+
+    }
+
+    //添加
+    public function addDataGroup()
+    {
+
+        $param = $this->request->filter('trim')->only(['title', 'uids', 'type', 'remark' => '']);
+
+        $val = Validate::rule([
+            'title|用户组名称' => 'require|max:100',
+            'uids|组成员' => 'require|array|max:100',
+            'type|共享类型' => 'require|number|in:' . DataGroupModel::$type_可编辑 . ',' . DataGroupModel::$type_只读 . ',' . DataGroupModel::$type_不共享,
+            'remark|备注' => 'max:100',
+        ]);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        Db::startTrans();
+        try {
+
+            //添加用户组
+            $group_id = Db::name('data_group')->insertGetId([
+                'title' => $param['title'],
+                'type' => $param['type'],
+                'remark' => $param['remark'],
+                'is_del' => DataGroupModel::$delete_正常,
+                'status' => DataGroupModel::$status_启用,
+                'createrid' => $this->uid,
+                'creater' => $this->uname,
+            ]);
+
+            //用户组-用户集合
+            $insert_data = [];
+            foreach ($param['uids'] as $uids) {
+                $insert_data[] = [
+                    'data_group_id' => $group_id,
+                    'uid' => $uids['uid'],
+                    'is_del' => DataGroupModel::$delete_正常,
+                    'status' => DataGroupModel::$status_启用,
+                ];
+            }
+            if ($insert_data) Db::name('data_group_userid')->insertAll($insert_data);
+
+            Db::commit();
+            return app_show(0, '添加用户组成功');
+        } catch (Exception $exception) {
+            Db::rollback();
+            return error_show(1005, '添加用户组失败');
+        }
+
+    }
+
+    //获取详情
+    public function getDataGroupDetail()
+    {
+        $id = $this->request->filter('trim')->post('id/d', 0);
+
+        $info = DataGroupModel::field(true)
+            ->where(['id' => $id, 'is_del' => DataGroupModel::$delete_正常])
+            ->append(['user_list'])
+            ->withAttr('user_list', function ($val, $data) {
+                return Db::name('data_group_userid')
+                    ->alias('a')
+                    ->field('a.id,a.uid,u.nickname,a.is_del')
+                    ->leftJoin('user_role u', 'u.uid=a.uid AND u.is_del=0')
+                    ->where([
+                        'a.is_del' => DataGroupModel::$delete_正常,
+                        'a.status' => DataGroupModel::$status_启用,
+                        'a.data_group_id' => $data['id']
+                    ])
+                    ->select()
+                    ->toArray();
+            })
+            ->findOrEmpty()
+            ->toArray();
+
+        return app_show(0, '获取详情成功', $info);
+
+    }
+
+    //修改
+    public function editDataGroup()
+    {
+
+        $param = $this->request->filter('trim')->only(['id', 'title', 'uids', 'type', 'remark']);
+
+        $val = Validate::rule([
+            'id' => 'require|number|gt:0',
+            'title|用户组名称' => 'require|max:100',
+            'uids|组成员' => 'require|array|max:100',
+            'type|共享类型' => 'require|number|in:' . DataGroupModel::$type_可编辑 . ',' . DataGroupModel::$type_只读 . ',' . DataGroupModel::$type_不共享,
+            'remark|备注' => 'max:100',
+        ]);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        Db::startTrans();
+        try {
+
+            $res = DataGroupModel::field('id')
+                ->where(['id' => $param['id'], 'is_del' => DataGroupModel::$delete_正常])
+                ->findOrEmpty()
+                ->isEmpty();
+
+            if ($res) throw new Exception('该记录不存在');
+
+            DataGroupModel::where(['id' => $param['id'], 'is_del' => DataGroupModel::$delete_正常])->strict(false)->save($param);
+
+            //用户组-用户集合
+            $insert_data = $delete_data = [];
+            foreach ($param['uids'] as $uid) {
+
+                if (isset($uid['id']) && ((int)$uid['id']) != 0) {
+                    if ($uid['is_del'] == DataGroupModel::$delete_删除) $delete_data[] = $uid['id'];
+                } else $insert_data[] = [
+                    'data_group_id' => $param['id'],
+                    'uid' => $uid['uid'],
+                    'is_del' => DataGroupModel::$delete_正常,
+                    'status' => DataGroupModel::$status_启用,
+                ];
+
+            }
+            if ($delete_data) Db::name('data_group_userid')
+                ->whereIn('id', $delete_data)
+                ->where(['is_del' => DataGroupModel::$delete_正常, 'data_group_id' => $param['id']])
+                ->update(['is_del' => DataGroupModel::$delete_删除]);
+
+            if ($insert_data) Db::name('data_group_userid')->insertAll($insert_data);
+
+            Db::commit();
+            return app_show(0, '修改用户组成功');
+        } catch (Exception $exception) {
+            Db::rollback();
+            return error_show(1005, '修改用户组失败');
+        }
+
+    }
+
+    //删除
+    public function deleteDataGroup()
+    {
+
+        $param = $this->request->filter('trim')->only(['id']);
+
+        $val = Validate::rule(['id' => 'require|array|max:100']);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        Db::startTrans();
+        try {
+
+            Db::name('data_group')
+                ->whereIn('id', $param['id'])
+                ->where(['is_del' => DataGroupModel::$delete_正常])
+                ->update(['is_del' => DataGroupModel::$delete_删除]);
+
+            Db::name('data_group_userid')
+                ->whereIn('data_group_id', $param['id'])
+                ->where('is_del', DataGroupModel::$delete_正常)
+                ->update(['is_del' => DataGroupModel::$delete_删除]);
+
+            Db::commit();
+            return app_show(0, '删除用户组成功');
+        } catch (Exception $exception) {
+            Db::rollback();
+            return error_show(1005, '删除用户组失败');
+        }
+
+    }
+
+    //启/禁用用户组
+    public function statusDataGroup()
+    {
+
+        $param = $this->request->filter('trim')->only(['id', 'status']);
+
+        $val = Validate::rule([
+            'id' => 'require|array|max:100',
+            'status|状态' => 'require|number|in:' . DataGroupModel::$status_启用 . ',' . DataGroupModel::$status_禁用,
+        ]);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        $status = [0 => '禁用', 1 => '启用'];
+
+        Db::startTrans();
+        try {
+
+            Db::name('data_group')
+                ->where([
+                    ['id', 'in', $param['id']],
+                    ['is_del', '=', DataGroupModel::$delete_正常],
+                    ['status', '<>', $param['status']],
+                ])->update(['status' => $param['status']]);
+
+            Db::name('data_group_userid')
+                ->where([
+                    ['data_group_id', 'in', $param['id']],
+                    ['is_del', '=', DataGroupModel::$delete_正常],
+                    ['status', '<>', $param['status']],
+                ])->update(['status' => $param['status']]);
+
+            Db::commit();
+            return app_show(0, $status[$param['status']] . '用户组成功');
+        } catch (Exception $exception) {
+            Db::rollback();
+            return error_show(1005, $status[$param['status']] . '用户组成功');
+        }
+
+    }
+
+
+}

+ 215 - 0
app/admin/controller/DataShare.php

@@ -0,0 +1,215 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use think\facade\Db;
+use think\facade\Validate;
+use app\admin\model\DataShare as DataShareModel;
+use app\admin\model\DataGroup as DataGroupModel;
+
+//数据共享规则
+class DataShare extends BaseController
+{
+
+    //列表
+    public function getDataShareList()
+    {
+        $param = $this->request->filter('trim')->only(['page' => 1, 'size' => 10, 'source_nickname' => '', 'source_group_title' => '', 'nickname' => '', 'group_title' => '', 'type' => '']);
+
+        $db = new DataShareModel();
+
+        $rs = $db
+            ->alias('a')
+            ->leftJoin('user_role b', 'b.uid=a.source_uid AND b.is_del=0')
+            ->leftJoin('data_group c', 'c.id=a.source_data_group_id AND c.is_del=' . DataGroupModel::$delete_正常)
+            ->leftJoin('user_role d', 'd.uid=a.uid AND d.is_del=0')
+            ->leftJoin('data_group e', 'e.id=a.data_group_id AND e.is_del=' . DataGroupModel::$delete_正常)
+            ->where('a.is_del', $db::$delete_正常);
+
+        $val = Validate::rule([
+            'page|页码' => 'require|number|gt:0',
+            'size|每页数量' => 'require|number|gt:0|elt:100',
+            'status|状态' => 'number|in:' . $db::$status_启用 . ',' . $db::$status_禁用,
+            'source_nickname|数据源用户' => 'max:100',
+            'source_group_title|数据源用户组' => 'max:100',
+            'nickname|共享用户' => 'max:100',
+            'type|共享权限' => 'number|in:' . $db::$type_只读 . ',' . $db::$type_读写,
+        ]);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        if ($param['source_nickname'] != '') $rs->whereLike('b.nickname', '%' . $param['source_nickname'] . '%');
+        if ($param['source_group_title'] != '') $rs->whereLike('c.title', '%' . $param['source_group_title'] . '%');
+        if ($param['nickname'] != '') $rs->whereLike('d.nickname', '%' . $param['nickname'] . '%');
+        if ($param['group_title'] != '') $rs->whereLike('e.title', '%' . $param['group_title'] . '%');
+        if ($param['type'] != '') $rs->whereLike('a.type', $param['type']);
+
+        $count = $rs->count('a.id');
+
+        $list = $rs
+            ->field('a.*,b.nickname source_nickname,c.title source_group_title,d.nickname,e.title group_title')
+            ->append(['menu_list'])
+            ->withAttr('menu_list', function ($val, $data) {
+                return Db::name('admin_menu')
+                    ->field('id,menu_name')
+                    ->whereIn('id', $data['menu_ids'])
+                    ->where('is_del', 0)
+                    ->select()
+                    ->toArray();
+            })
+            ->page($param['page'], $param['size'])
+            ->order('a.id', 'desc')
+            ->select()
+            ->toArray();
+
+        return app_show(0, '请求成功', ['count' => $count, 'list' => $list]);
+
+    }
+
+    //新建
+    public function addDataShare()
+    {
+
+        $param = $this->request->filter('trim')->only(['title' => '', 'menu_ids', 'source_uid', 'source_data_group_id', 'uid', 'data_group_id', 'type', 'remark' => '']);
+
+        $val = Validate::rule([
+            'title|共享规则名称' => 'max:100',
+            'menu_ids|菜单数据' => 'require|array|max:100',
+            'source_uid|数据源用户' => 'requireWithout:source_data_group_id|number|gt:0',
+            'source_data_group_id|数据源用户组' => 'requireWithout:source_uid|number|gt:0',
+            'uid|数据共享用户' => 'requireWithout:data_group_id|number|gt:0',
+            'data_group_id|数据共享用户组' => 'requireWithout:uid|number|gt:0',
+            'type|数据权限' => 'require|number|in:' . DataShareModel::$type_只读 . ',' . DataShareModel::$type_读写,
+            'remark|备注' => 'max:100',
+        ]);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        $rs = DataShareModel::create([
+            'title' => $param['title'],
+            'menu_ids' => implode(',', $param['menu_ids']),
+            'source_uid' => $param['source_uid'],
+            'source_data_group_id' => $param['source_data_group_id'],
+            'uid' => $param['uid'],
+            'data_group_id' => $param['data_group_id'],
+            'type' => $param['type'],
+            'remark' => $param['remark'],
+            'is_del' => DataShareModel::$delete_正常,
+            'status' => DataShareModel::$status_启用,
+            'createrid' => $this->uid,
+            'creater' => $this->uname,
+        ])->save();
+
+        return $rs ? app_show(0, '新建共享规则成功') : error_show(1004, '新建共享规则失败');
+
+    }
+
+    //获取详情
+    public function getDataShareDetail()
+    {
+        $id = $this->request->filter('trim')->post('id/d', 0);
+
+        $info = DataShareModel::field('a.*,b.nickname source_nickname,c.title source_group_title,d.nickname,e.title group_title')
+            ->alias('a')
+            ->leftJoin('user_role b', 'b.uid=a.source_uid AND b.is_del=0')
+            ->leftJoin('data_group c', 'c.id=a.source_data_group_id AND c.is_del=' . DataGroupModel::$delete_正常)
+            ->leftJoin('user_role d', 'd.uid=a.uid AND d.is_del=0')
+            ->leftJoin('data_group e', 'e.id=a.data_group_id AND e.is_del=' . DataGroupModel::$delete_正常)
+            ->where(['a.id' => $id, 'a.is_del' => DataShareModel::$delete_正常])
+            ->append(['menu_list'])
+            ->withAttr('menu_list', function ($val, $data) {
+                return Db::name('admin_menu')
+                    ->field('id,menu_name')
+                    ->whereIn('id', $data['menu_ids'])
+                    ->where('is_del', 0)
+                    ->select()
+                    ->toArray();
+            })
+            ->findOrEmpty()
+            ->toArray();
+
+        return app_show(0, '获取详情成功', $info);
+
+    }
+
+    //修改
+    public function editDataShare()
+    {
+
+        $param = $this->request->filter('trim')->only(['id', 'menu_ids', 'source_uid', 'source_data_group_id', 'uid', 'data_group_id', 'type', 'remark']);
+
+        $val = Validate::rule([
+            'id' => 'require|number|gt:0',
+            'title|共享规则名称' => 'max:100',
+            'menu_ids|菜单数据' => 'require|array|max:100',
+            'source_uid|数据源用户' => 'requireWithout:source_data_group_id|number|gt:0',
+            'source_data_group_id|数据源用户组' => 'requireWithout:source_uid|number|gt:0',
+            'uid|数据共享用户' => 'requireWithout:data_group_id|number|gt:0',
+            'data_group_id|数据共享用户组' => 'requireWithout:uid|number|gt:0',
+            'type|数据权限' => 'require|number|in:' . DataShareModel::$type_只读 . ',' . DataShareModel::$type_读写,
+            'remark|备注' => 'max:100',
+        ]);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        $res = DataShareModel::field('id')
+            ->where(['id' => $param['id'], 'is_del' => DataShareModel::$delete_正常])
+            ->findOrEmpty()
+            ->isEmpty();
+
+        if ($res) return error_show(1005, '该记录不存在');
+
+        if (isset($param['menu_ids']) && is_array($param['menu_ids'])) $param['menu_ids'] = implode(',', $param['menu_ids']);
+
+        $rs = DataShareModel::where(['id' => $param['id'], 'is_del' => DataShareModel::$delete_正常])->strict(false)->save($param);
+
+        return $rs ? app_show(0, '修改共享规则成功') : error_show(1005, '修改共享规则失败');
+
+    }
+
+    //删除
+    public function deleteDataShare()
+    {
+
+        $param = $this->request->filter('trim')->only(['id']);
+
+        $val = Validate::rule(['id' => 'require|array|max:100']);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        $rs = DataShareModel::whereIn('id', $param['id'])
+            ->where(['is_del' => DataShareModel::$delete_正常])
+            ->update(['is_del' => DataShareModel::$delete_删除]);
+
+        return $rs ? app_show(0, '删除共享规则成功') : error_show(1005, '删除共享规则失败');
+
+    }
+
+    //启/禁用
+    public function statusDataShare()
+    {
+
+        $param = $this->request->filter('trim')->only(['id', 'status']);
+
+        $val = Validate::rule([
+            'id' => 'require|array|max:100',
+            'status|状态' => 'require|number|in:' . DataShareModel::$status_启用 . ',' . DataShareModel::$status_禁用,
+        ]);
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        $status = [0 => '禁用', 1 => '启用'];
+
+        $rs = DataShareModel::where([
+            ['id', 'in', $param['id']],
+            ['is_del', '=', DataShareModel::$delete_正常],
+            ['status', '<>', $param['status']],
+        ])->update(['status' => $param['status']]);
+
+        return $rs ? app_show(0, $status[$param['status']] . '共享规则成功') : error_show(1005, $status[$param['status']] . '共享规则失败');
+
+    }
+
+
+}

+ 141 - 0
app/admin/controller/Process.php

@@ -0,0 +1,141 @@
+<?php
+
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use think\App;
+use think\facade\Db;
+use think\facade\Validate;
+use app\admin\model\Process as ProcessModel;
+use app\admin\model\ActionProcess as APModel;
+
+//流程
+class Process extends BaseController
+{
+
+    //获取流程列表
+    public function getList()
+    {
+        $param = $this->request->filter('trim')->only(['status' => '', 'process_name' => '', 'creater' => '', 'addtime_start' => '', 'addtime_end' => '', 'page' => 1, 'size' => 15], 'post');
+
+        $where = [['is_del', '=', ProcessModel::$is_del_normal]];
+        if ($param['status'] != '') $where[] = ['status', '=', $param['status']];
+        if ($param['process_name'] != '') $where[] = ['process_name', 'like', '%' . $param['process_name'] . '%'];
+        if ($param['creater'] != '') $where[] = ['creater', 'like', '%' . $param['creater'] . '%'];
+        if ($param['addtime_start'] != '' && $param['addtime_end'] != '') $where[] = ['addtime', 'between', [$param['addtime_start'], $param['addtime_end'] . ' 23:59:59']];
+
+        $count = Db::name('process')
+            ->where($where)
+            ->count('id');
+
+        $list = ProcessModel::field('id,process_name,process_type,status,creater,addtime')
+            ->where($where)
+            ->order(['weight' => 'desc', 'id' => 'desc'])
+            ->page($param['page'], $param['size'])
+            ->select()
+            ->toArray();
+
+        return app_show(0, '获取成功', ['count' => $count, 'list' => $list]);
+
+    }
+
+    //增加流程
+    public function add()
+    {
+        $param = $this->request->filter('trim')->only(['token', 'process_name', 'process_type', 'remark' => ''], 'post');
+
+        $val = Validate::rule([
+            'token' => 'require',
+            'process_name|流程名称' => 'require|max:255',
+            'process_type|流程值' => 'require|max:255|checkProcessType:',
+        ]);
+
+        $val->extend('checkProcessType', function ($val) {
+            return ProcessModel::where(['process_type' => $val, 'is_del' => ProcessModel::$is_del_normal])->field('id')->findOrEmpty()->isEmpty() ? true : '该流程值已存在';
+        });
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        $user = GetUserInfo($param['token']);
+
+        $uid = isset($user['data']['id']) ? $user['data']['id'] : 0;
+        $uname = isset($user['data']['nickname']) ? $user['data']['nickname'] : '';
+        $date = date('Y-m-d H:i:s');
+
+        return ProcessModel::create(array_merge($param, [
+            'is_del' => ProcessModel::$is_del_normal,
+            'status' => ProcessModel::$status_disable,
+            'createrid' => $uid,
+            'creater' => $uname,
+            'addtime' => $date,
+            'updaterid' => $uid,
+            'updater' => $uname,
+            'updatetime' => $date,
+        ]))->save() ? app_show(0, '新增流程成功') : error_show(1005, '新增流程失败');
+
+    }
+
+    //读取
+    public function read()
+    {
+        $id = $this->request->filter('trim')->post('id/d', 0);
+
+        $res = ProcessModel::field('id,process_name,process_type')
+            ->where(['id' => $id, 'is_del' => ProcessModel::$is_del_normal])
+            ->findOrEmpty()
+            ->toArray();
+
+        return app_show(0, '获取详情成功', $res);
+    }
+
+    //修改流程
+    public function update()
+    {
+        $param = $this->request->filter('trim')->only(['token', 'id', 'process_name', 'process_type', 'status', 'is_del', 'remark'], 'post');
+
+        $val = Validate::rule([
+            'token' => 'require',
+            'id|ID' => 'require|number|gt:0',
+            'process_name|流程名称' => 'max:255',
+            'process_type|流程值' => 'max:255|checkProcessType:',
+            'status|状态' => 'number|in:' . ProcessModel::$status_normal . ',' . ProcessModel::$status_disable,
+            'is_del|是否删除' => 'number|eq:' . ProcessModel::$is_deleted,
+        ]);
+
+        $val->extend('checkProcessType', function ($val, $rule, $data) {
+            return ProcessModel::where(['process_type' => $val, 'is_del' => ProcessModel::$is_del_normal])->where('id', '<>', $data['id'])->field('id')->findOrEmpty()->isEmpty() ? true : '该流程值已存在';
+        });
+
+        if (!$val->check($param)) return error_show(1005, $val->getError());
+
+        if (isset($param['status']) && $param['status'] == ProcessModel::$status_normal) {
+            //启用流程时候,校验该流程下有没有开始节点和结束节点
+            $ap_info = APModel::where([
+                'process_id' => $param['id'],
+                'is_del' => APModel::$is_del_normal,
+                'status' => APModel::$status_normal
+            ])->whereIn('action_type', [
+                APModel::$action_type_start,
+                APModel::$action_type_end
+            ])->column('id', 'action_type');
+
+            if (count($ap_info) != 2) return error_show(1005, '该流程下缺少开始节点和结束节点');
+        }
+
+        $user = GetUserInfo($param['token']);
+
+        $uid = isset($user['data']['id']) ? $user['data']['id'] : 0;
+        $uname = isset($user['data']['nickname']) ? $user['data']['nickname'] : '';
+        $date = date('Y-m-d H:i:s');
+
+        return ProcessModel::where(['id' => $param['id'], 'is_del' => ProcessModel::$is_del_normal])->strict(false)->save(array_merge($param, [
+            'updaterid' => $uid,
+            'updater' => $uname,
+            'updatetime' => $date,
+        ])) ? app_show(0, '修改流程成功') : error_show(1005, '修改流程失败');
+
+    }
+
+
+}

+ 34 - 0
app/admin/model/ActionProcess.php

@@ -0,0 +1,34 @@
+<?php
+
+
+namespace app\admin\model;
+
+
+use think\Model;
+
+
+class ActionProcess extends Model
+{
+
+    protected $name = 'action_process';
+    protected $pk = 'id';
+    protected $autoWriteTimestamp = false;
+    protected $hidden = ['order_type', 'order_name', 'pid', 'roleid', 'uid', 'uname', 'weight'];
+
+    public static $action_type_start = 1;//节点类型,1开始节点
+    public static $action_type_process = 2;//节点类型,2过程节点
+    public static $action_type_interrupt = 3;//节点类型,3中断节点
+    public static $action_type_end = 4;//节点类型,4结束节点
+
+
+    public static $operation_type_approval = 1;//操作类型:1审批节点
+    public static $operation_type_system = 2;//操作类型:2系统节点
+
+    public static $status_normal = 1;//状态,1启用
+    public static $status_disable = 0;//状态,0禁用
+
+    public static $is_del_normal = 0;//是否删除,0正常
+    public static $is_deleted = 1;//是否删除,1删除
+
+
+}

+ 27 - 0
app/admin/model/DataGroup.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace app\admin\model;
+
+use think\Model;
+
+//用户组
+class DataGroup extends Model
+{
+    protected $name = 'data_group';
+    protected $pk = 'id';
+    protected $autoWriteTimestamp = false;
+
+    public static $status_启用 = 1;//状态:1启用
+    public static $status_禁用 = 0;//状态:0禁用
+
+    public static $delete_正常 = 0;//0未删除
+    public static $delete_删除 = 1;//1删除
+
+    public static $type_全部 = 0;//全部(这个值不在数据表里体现,只在业务逻辑处理中作为配置项)
+
+    public static $type_可编辑 = 1;//1可编辑
+    public static $type_只读 = 2;//2只读
+    public static $type_不共享 = 3;//3不共享
+
+
+}

+ 24 - 0
app/admin/model/DataShare.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\admin\model;
+
+use think\Model;
+
+//数据共享规则
+class DataShare extends Model
+{
+    protected $name = 'data_share';
+    protected $pk = 'id';
+    protected $autoWriteTimestamp = false;
+
+    public static $status_启用 = 1;//状态:1启用
+    public static $status_禁用 = 0;//状态:0禁用
+
+    public static $delete_正常 = 0;//0未删除
+    public static $delete_删除 = 1;//1删除
+
+    public static $type_只读 = 2;//2只读
+    public static $type_读写 = 1;//1读写
+
+
+}

+ 23 - 0
app/admin/model/Process.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace app\admin\model;
+
+use think\Model;
+
+//流程表
+class Process extends Model
+{
+    protected $name = 'process';
+    protected $pk = 'id';
+    protected $autoWriteTimestamp = false;
+
+    public static $is_del_normal = 0;//是否删除,正常
+    public static $is_deleted = 1;//是否删除,已删除
+
+    public static $status_normal = 1;//状态,正常
+    public static $status_disable = 0;//状态,禁用
+
+
+
+
+}

+ 25 - 0
app/admin/route/app.php

@@ -147,6 +147,31 @@ Route::rule("catquery","admin/InvCat/query");
 Route::rule("addgood","admin/InvCat/AddGood");
 Route::rule("goodinfo","admin/InvCat/goodinfo");
 
+//流程
+Route::rule('process_get_list','admin/Process/getList');
+Route::rule('process_add','admin/Process/add');
+Route::rule('process_read','admin/Process/read');
+Route::rule('process_update','admin/Process/update');
+//节点
+Route::rule('action_process_getlist','admin/ActionProcess/getList');
+Route::rule('action_process_add','admin/ActionProcess/add');
+Route::rule('action_process_read','admin/ActionProcess/read');
+Route::rule('action_process_update','admin/ActionProcess/update');
+Route::rule('action_process_all','admin/ActionProcess/getAll');
+//用户组
+route::rule('getDataGroupList', 'admin/DataGroup/getDataGroupList');//获取用户组列表
+route::rule('addDataGroup', 'admin/DataGroup/addDataGroup');//添加用户组
+route::rule('getDataGroupDetail', 'admin/DataGroup/getDataGroupDetail');//获取用户组详情
+route::rule('editDataGroup', 'admin/DataGroup/editDataGroup');//编辑用户组详情
+route::rule('deleteDataGroup', 'admin/DataGroup/deleteDataGroup');//删除用户组
+route::rule('statusDataGroup', 'admin/DataGroup/statusDataGroup');//启/禁用用户组
+//数据共享
+route::rule('getDataShareList', 'admin/DataShare/getDataShareList');//获取数据共享列表
+route::rule('addDataShare', 'admin/DataShare/addDataShare');//新建数据共享
+route::rule('getDataShareDetail', 'admin/DataShare/getDataShareDetail');//获取数据共享详情
+route::rule('editDataShare', 'admin/DataShare/editDataShare');//修改数据共享
+route::rule('deleteDataShare', 'admin/DataShare/deleteDataShare');//删除数据共享
+route::rule('statusDataShare', 'admin/DataShare/statusDataShare');//启/禁用数据共享