安装插件后的基础文件

This commit is contained in:
panx
2024-07-13 12:53:20 +08:00
parent db41c93a84
commit 7f33ce4bf6
318 changed files with 31711 additions and 0 deletions

View File

@@ -0,0 +1,363 @@
<?php
declare (strict_types = 1);
namespace app\admin\controller\easyflow;
use app\AdminController;
use Exception;
use think\facade\Db;
use Throwable;
/**
* flow_group
* 分组
*/
class FlowBase extends AdminController
{
/**
* FlowGroup模型对象
* @var \app\admin\model\FlowGroup
*/
public $tplsharing = 'add';
public $user = null;
public $noNeedAuth = ['*'];
public function __construct()
{
$this->user = get_admin_info();
parent::__construct();
//$this->user = Session::get('AdminLogin');
//debugger
}
/**
* 默认生成的方法为index/add/edit/del/status 五个方法
* 当创建CURD的时候DIY的函数体和模板为空请自行编写代码
*/
/***
* 获取组织架构
*/
public function getOrgTree(){
$deptId = request()->input('deptId');
if(!$deptId){
$deptId = 1;
}
$list = Db::name('department')->where(['pid'=>$deptId,'status'=>1])->select();
$data = [];
foreach($list as $row =>$key){
$data[] = ['id'=>$key['id'],'name'=>$key['title'],"select"=>false,"type"=>"dept",'sex'=>null,'avatar'=>null];
$userlist = Db::name('admin')->where(['department_id'=>$key['id']])->select();
foreach($userlist as $row =>$user){
$data[] = ['id'=>$user['id'],'name'=>$user['nickname'],"select"=>false,"type"=>"user",'sex'=>null,'avatar'=>null];
}
}
$result =['code' =>200,'data' =>$data] ;
return json($result);
}
/***
* 获取组织架构
*/
public function search($userName){
$data = [];
$list = Db::name('admin')->field('id,nickname as name')->where(['status'=>1])->where('nickname','like',"%$userName%")->select();
foreach($list as $row =>$key){
$data[] = ['id'=>$key['id'],'name'=>$key['title'],"select"=>false,"type"=>"role",'sex'=>null,'avatar'=>null];
}
$result =['code' =>200,'data' =>$data] ;
return json($result);
}
public function getRole(){
$data = [];
$list = Db::name('jobs')->field('id,title')->where(['status'=>1])->select();
foreach($list as $row =>$key){
$data[] = ['id'=>$key['id'],'name'=>$key['title'],"select"=>false,"type"=>"role",'sex'=>null,'avatar'=>null];
}
$result =['code' =>200,'data' =>$data] ;
return json($result);
}
public function getFlowGroup()
{
$groupList = Db::name('flow_group')->field('id,name')->select();
$data = [];
foreach($groupList as $row =>$group){
$data1 = ['id'=>$group['id'],'label'=>$group['name'],'type'=>'group'];
$flowList = Db::name('flow_scheme')->where(['group'=>$group['id']])->select();
$dataFlow=[];
foreach($flowList as $row =>$flow){
$dataFlow[]=['id'=>$flow['id'],'icon'=>$flow['icon'],'isstop'=>$flow['isstop']==1?true:false,'type'=>'scheme',
'label'=>$flow['name'],'remark'=>$flow['remark'],'tgId'=>$flow['tgId'],'updated'=>$flow['updatetime'],
'background'=>$flow['background'],'group'=>$flow['group']];
}
$data1['children'] = $dataFlow;
$data[] = $data1;
}
//停用的流程
/*$data2 = ['id'=>0,'label'=>'已停用','type'=>'group'];
$flowList = Db::name('flow_scheme')->where(['isstop'=>0])->select();
$dataFlowDisable=[];
foreach($flowList as $row =>$flow){
$dataFlowDisable[]=['id'=>$flow['id'],'icon'=>$flow['icon'],'isstop'=>true,'type'=>'scheme',
'label'=>$flow['name'],'remark'=>$flow['remark'],'tgId'=>$flow['tgId'],'updated'=>$flow['updatetime'],
'background'=>$flow['background'],'group'=>$flow['group']];
}
$data2['children'] = $dataFlowDisable;
$data[] = $data2;*/
$isAdmin = $this->user['group_id'] == 1?true:false;
$result =['code' =>200,'data' =>$data,'isAdmin'=>$isAdmin] ;
return json($result);
}
public function updateFlowGroup()
{
$method = request()->method();
$params = \request()->all();
$result =null;
$msg = null;
try{
switch ($method)
{
case 'POST':
$name = $params['name'];
$data = ['name'=>$name];
Db::name('flow_group')->insertGetId($data);
$result = "添加$name 分组成功";
break;
case 'DELETE':
$id = $params['id'];
$isexist = Db::name('flow_scheme')->where('group',$id)->find();
if($isexist){
throw new Exception('分组有流程无法删除');
}
Db::name('flow_group')->delete($id);
$msg = "删除成功";
break;
case 'PUT':
Db::name('flow_group')->save($params);
$msg='修改成功';
break;
}
$result =['code' =>200,'data' =>$result,'msg'=>$msg ] ;
}
catch(Throwable $th){
$result =['code' =>500,'msg' =>$th->getMessage() ] ;
}
return json($result);
}
public function updateFlowForm()
{
$method = request()->method();
$params = \request()->all();
$result =null;
$msg = null;
switch ($method)
{
case 'GET':
$id = $params['formId'];
$result = Db::name('flow_scheme')->where('id', $id)->find();
break;
case 'DELETE':
$id = $params['id'];
$msg = "删除成功";
break;
case 'PUT':
$params['id']= $params['formId'];
$params['isstop'] = isset($params['isstop'])?$params['isstop']: 0;
Db::name('flow_scheme')->strict(false)->save($params);
$msg='修改成功';
break;
}
$result =['code' =>200,'data' =>$result,'msg'=>$msg] ;
return json($result);
}
public function getSysTable()
{
$database = function_exists('get_env') ? get_env('DATABASE_DATABASE') : getenv('DATABASE_DATABASE');
$sql = "SELECT
table_name as tablebame ,table_name as name
FROM
information_schema.tables
WHERE table_schema = '$database' AND table_type = 'BASE TABLE'";
$result = Db::query($sql);
$result =['code' =>200,'data' =>$result] ;
return json($result);
}
public function updateTemplate()
{
$result =['code' =>200,'data' =>'保存成功'] ;
return json($result);
}
public function getWorkItemList()
{
$params = request()->post();
$currentPage = $params['currentPage'];
$pageSize = $params['pageSize'];
$group=$params['group'];
$where = ['status'=>'0','receiveid'=>$this->user['id']];
$whereIn = '';
$totalResult = 0;
if($group){
if($group['type'] == 'scheme'){
$where['scheme'] = $group['id'];
$data = Db::name('flow_workitem_view')->order('createtime', 'desc')->where($where)->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_workitem_view')->where($where)->page($currentPage,$pageSize)->count();
}else{
$groupId = $group['id'];
$shemes = Db::name('flow_scheme')->where('group',$groupId)->select();
$wherescheme = [];
foreach($shemes as $sheme){
array_unshift($wherescheme,$sheme['id']);
}
$data = Db::name('flow_workitem_view')->whereIn('scheme',implode(',',$wherescheme))->where($where)->order('createtime', 'desc')->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_workitem_view')->whereIn('scheme',implode(',',$wherescheme))->where($where)->page($currentPage,$pageSize)->count();
}
}
else{
$data = Db::name('flow_workitem_view')->where($where)->order('createtime', 'desc')->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_workitem_view')->where($where)->page($currentPage,$pageSize)->count();
}
$result =['code' =>200,'data' =>$data,'input'=>$group,'total'=>$totalResult] ;
return json($result);
}
public function getInstanceList()
{
$params = request()->post();
$currentPage = $params['currentPage'];
$pageSize = $params['pageSize'];
$group=$params['group'];
$where = [];
$whereIn = '';
$totalResult = 0;
if($group){
if($group['type'] == 'scheme'){
$where['scheme'] = $group['id'];
$data = Db::name('flow_workitem_view')->order('createtime', 'desc')->where($where)->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_workitem_view')->where($where)->page($currentPage,$pageSize)->count();
}else{
$groupId = $group['id'];
$shemes = Db::name('flow_scheme')->where('group',$groupId)->select();
$wherescheme = [];
foreach($shemes as $sheme){
array_unshift($wherescheme,$sheme['id']);
}
$data = Db::name('flow_workitem_view')->whereIn('scheme',implode(',',$wherescheme))->where($where)->order('createtime', 'desc')->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_workitem_view')->whereIn('scheme',implode(',',$wherescheme))->where($where)->page($currentPage,$pageSize)->count();
}
}
else{
$data = Db::name('flow_workitem_view')->where($where)->order('createtime', 'desc')->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_workitem_view')->where($where)->page($currentPage,$pageSize)->count();
}
$result =['code' =>200,'data' =>$data,'input'=>$group,'total'=>$totalResult] ;
return json($result);
}
public function getFinishList()
{
$params = request()->post();
$currentPage = $params['currentPage'];
$pageSize = $params['pageSize'];
$group=$params['group'];
$where = ['status'=>'2','receiveid'=>$this->user['id']];
$whereIn = '';
$totalResult = 0;
if($group){
if($group['type'] == 'scheme'){
$where['scheme'] = $group['id'];
$data = Db::name('flow_workitem_view')->where($where)->order('completedtime', 'desc')->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_workitem_view')->where($where)->page($currentPage,$pageSize)->count();
}else{
$groupId = $group['id'];
$shemes = Db::name('flow_scheme')->where('group',$groupId)->select();
$wherescheme = [];
foreach($shemes as $sheme){
array_unshift($wherescheme,$sheme['id']);
}
$data = Db::name('flow_workitem_view')->whereIn('scheme',implode(',',$wherescheme))->where($where)->order('completedtime', 'desc')->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_workitem_view')->whereIn('scheme',implode(',',$wherescheme))->where($where)->page($currentPage,$pageSize)->count();
}
}
else{
$data = Db::name('flow_workitem_view')->where($where)->order('completedtime', 'desc')->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_workitem_view')->where($where)->page($currentPage,$pageSize)->count();
}
$result =['code' =>200,'data' =>$data,'input'=>$group,'total'=>$totalResult] ;
return json($result);
}
public function getMyList()
{
$params = request()->post();
$currentPage = $params['currentPage'];
$pageSize = $params['pageSize'];
$group=$params['group'];
$where = ['originator'=>$this->user['id']];
$whereIn = '';
$totalResult = 0;
if($group){
if($group['type'] == 'scheme'){
$where['scheme'] = $group['id'];
$data = Db::name('flow_instace_view')
->where($where)->order('createtime', 'desc')->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_instace_view')->where($where)->page($currentPage,$pageSize)->count();
}else{
$groupId = $group['id'];
$shemes = Db::name('flow_scheme')->where('group',$groupId)->select();
$wherescheme = [];
foreach($shemes as $sheme){
array_unshift($wherescheme,$sheme['id']);
}
$data = Db::name('flow_instace_view')
->whereIn('scheme',implode(',',$wherescheme))->where($where)->order('createtime', 'desc')->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_instace_view')->whereIn('scheme',implode(',',$wherescheme))->where($where)->page($currentPage,$pageSize)->count();
}
}
else{
$data = Db::name('flow_instace_view')
->where($where)->order('createtime', 'desc')->page($currentPage,$pageSize)->select();
$totalResult = Db::name('flow_instace_view')->where($where)->page($currentPage,$pageSize)->count();
}
$result =['code' =>200,'data' =>$data,'input'=>$group,'total'=>$totalResult] ;
return json($result);
}
public function getFieldList()
{
$formId = request()->input('formId');
//$result = Db::name('flow_scheme')->where('id', $formId)->find();
$database = function_exists('get_env') ? get_env('DATABASE_DATABASE') : getenv('DATABASE_DATABASE');
$fieldListAll = Db::name('flow_field_view')->where(['table_name'=>$formId,'TABLE_SCHEMA'=>$database])->select();
//$result =['code' =>200,'data' =>$fieldListAll] ;
return json($fieldListAll);
}
}

View File

@@ -0,0 +1,616 @@
<?php
declare (strict_types = 1);
namespace app\admin\controller\easyflow;
use app;
use app\AdminController;
use app\admin\model\FlowGroup as FlowGroupModel;
use Exception;
use think\facade\Db;
/**
* flow_group
* 分组
*/
class FlowEngine extends AdminController
{
/**
* FlowGroup模型对象
* @var \app\admin\model\FlowGroup
*/
public $admin = [];
public $tplsharing = 'add';
public $noNeedAuth = ['*'];
public function __construct()
{
parent::__construct();
}
public function start(){
Db::startTrans();
try{
$data = request()->post();
$data = $data['data'];
$formdata = $data['data'];
$this->admin = get_admin_info();
$originator = $this->admin['id'];//发起人
$flowid = $data['flowid'];
$flow = Db::name('flow_scheme')->where('id',$flowid)->find();
$vformJson = json_decode($flow['formitems'],true);
$widgetList = $vformJson['widgetList'];
$controleList = [];
//判断 如果值为数组的话需要转为字符串
foreach($widgetList as $k){
$controleList[$k['options']['name']]=$k;
}
//判断回传的字段类型处理,有一些多选 是数组需要转字符串
$mControlList = array("picture-upload","select","cascader",'file-upload');
foreach($formdata as $d => $v){
$sc = $controleList[$d];
if(($sc['type'] == 'picture-upload' || $sc['type'] == 'file-upload') && isset($formdata[$d])){
$fileData = $formdata[$d];
foreach($fileData as $f){
if(isset($f['response'])){
$f['url'] = $f['response']['url'];
}
}
$formdata[$d] = json_encode($fileData);
}
else if($sc && (in_array($sc['type'],$mControlList))){
$formdata[$d] = json_encode($formdata[$d]);
}
}
$table = $flow['bizscheme'];
$insertId = Db::table($table)->strict(false)->insertGetId($formdata);
$today = str_replace('-','',date("Y-m-d"));
//新建流程实例
$instanceId= Db::name('flow_instance')->insertGetId(array(
'originator' => $originator,
'scheme' => $flowid,
'createtime' => date("Y-m-d H:i:s"),
'instancecode' => time(),
'bizobjectid' => $insertId,
'instancestatus' => 1,
'title'=>$flow['name'].'-'.$today.str_pad($insertId,5,'0',STR_PAD_LEFT),
'completedtime' => '1990-01-01 00:00:00',
));
//获取发起流程节点
$process = json_decode($flow['process'],true);
Db::name('flow_task')->save(array(
'flowid' => $flowid,
'stepname' => $process['name'],
'type'=>'root',
'stepid' => $process['id'],
'receiveid' => $originator,
'instanceid' => $instanceId,
'senderid' => $originator,
'status' => 2,
'createtime' => date("Y-m-d H:i:s"),
'completedtime' => date("Y-m-d H:i:s"),
'comment' => '提交'
));
//寻找下一个节点
if(isset($process['children'])){
$currentNode = $process['children'];
$nodeType = $currentNode['type'];
$normal = 0;
switch($nodeType){
//指定人员
case 'CONDITIONS':
//获取所有条件分支
$branchsList = $currentNode['branchs'];
//判断符合条件的分支
foreach($branchsList as $branch){
try {
$express = $branch['props']['expression'];
$sql = "select * from (select * from " . $table . " where id = '" . $insertId . "') a where " . $express;
$tableRes = Db::query($sql);
if (count((array)$tableRes) >= 1) {
$normal++;
//下一个节点逻辑
$currentNode = $branch['children'];
$spType = $currentNode['props']['assignedType'];
switch($spType){
case 'ASSIGN_USER':
$userIdList = $currentNode['props']['assignedUser'];
foreach($userIdList as $user){
Db::name('flow_task')->save(array(
'flowid' => $flowid,
'stepname' => $currentNode['name'],
'type'=>'node',
'stepid' => $currentNode['id'],
'receiveid' => $user['id'],
'prevstepid' => '10000',
'instanceid' => $instanceId,
'senderid' => $originator,
'status' => 0,
'createtime' => date("Y-m-d H:i:s"),
'completedtime' => date("Y-m-d H:i:s"),
'comment' => '提交'
));
}
break;
case 'ROLE':
$roleList = $currentNode['props']['role'];
foreach($roleList as $jobid){
//$userList = Db::name('admin')->where(['jobs_id'=>$jobid['id']])->select();
$userList = Db::name('admin')->where("FIND_IN_SET('".$jobid['id']."',jobs_id)")->select();
foreach($userList as $row =>$user){
Db::name('flow_task')->save(array(
'flowid' => $flowid,
'stepname' => $currentNode['name'],
'stepid' => $currentNode['id'],
'receiveid' => $user['id'],
'prevstepid' => '10000',
'type'=>'node',
'instanceid' => $instanceId,
'senderid' => $originator,
'status' => 0,
'createtime' => date("Y-m-d H:i:s"),
'completedtime' => date("Y-m-d H:i:s"),
'comment' => '提交'
));
}
}
break;
}
continue;
}
} catch (\think\Exception $e) {
continue;
}
}
if($normal == 0){
throw new Exception('找不到下一个流程节点,请联系管理员');
}
break;
case 'APPROVAL':
$spType = $currentNode['props']['assignedType'];
switch($spType){
case 'ASSIGN_USER':
$userIdList = $currentNode['props']['assignedUser'];
foreach($userIdList as $user){
Db::name('flow_task')->save(array(
'flowid' => $flowid,
'stepname' => $currentNode['name'],
'type'=>'node',
'stepid' => $currentNode['id'],
'receiveid' => $user['id'],
'prevstepid' => '10000',
'instanceid' => $instanceId,
'senderid' => $originator,
'status' => 0,
'createtime' => date("Y-m-d H:i:s"),
'completedtime' => date("Y-m-d H:i:s"),
'comment' => '提交'
));
}
break;
case 'ROLE':
$roleList = $currentNode['props']['role'];
foreach($roleList as $jobid){
//$userList = Db::name('admin')->where(['jobs_id'=>$jobid['id']])->select();
$userList = Db::name('admin')->where("FIND_IN_SET('".$jobid['id']."',jobs_id)")->select();
foreach($userList as $row =>$user){
Db::name('flow_task')->save(array(
'flowid' => $flowid,
'stepname' => $currentNode['name'],
'stepid' => $currentNode['id'],
'receiveid' => $user['id'],
'prevstepid' => '10000',
'type'=>'node',
'instanceid' => $instanceId,
'senderid' => $originator,
'status' => 0,
'createtime' => date("Y-m-d H:i:s"),
'completedtime' => date("Y-m-d H:i:s"),
'comment' => '提交'
));
}
}
break;
}
break;
case 'CONDITION':
break;
}
}else{
//流程结束
Db::name('flow_instance')->where('id', $instanceId)->update(['instancestatus' => '2']);
}
Db::commit();
$result =['code' =>200,'msg' =>'提交成功'.$instanceId] ;
}
catch(Exception $ex){
$result =['code' =>500,'msg' => $ex->getMessage()] ;
Db::rollback();
}
return json($result);
}
/**拒绝流程
* @param $taskid
* @param string $comment
* @return bool
* @throws Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
* @throws \think\exception\PDOException
*/
public function refuse()
{
$params = \request()->all();
$taskid = $params['taskid'];
$comment = $params['comment'];
$task = Db::name('flow_task')->where(['id' => $taskid, 'status' => 0])->find();
if (!$task)
throw new Exception('找不到当前任务,或已处理,请联系管理员');
//更改当前流程为拒绝状态
$comment = $comment == '' ? '[同意]' : $comment;
Db::name('flow_task')->where('id', $taskid)
->update(['status' => 2, 'completedtime' => date("Y-m-d H:i:s"), 'comment' => $comment]);
//取消其他流程
Db::name('flow_task')->where(['instanceid' => $task['instanceid'], 'status' => 0])
->update(['status' => 3, 'completedtime' => date("Y-m-d H:i:s")]);
//更改流程实例为草稿状态
Db::name('flow_instance')->where(['id' => $task['instanceid']])
->update(['instancestatus' => 0]);
//寻找下一个待办任务
$startNode = Db::name('flow_task')->where(['instanceid' => $task['instanceid'], 'type' => 'root'])->find();
//$startNode->status = 0;
Db::name('flow_task')->insert([
'flowid' => $startNode['flowid'],
'stepname' => $startNode['stepname'],
'type'=>'root',
'stepid' => $startNode['stepid'],
'receiveid' => $startNode['receiveid'],
'instanceid' => $startNode['instanceid'],
'senderid' => $startNode['senderid'],
'status' => '0',
'createtime' => date("Y-m-d H:i:s")
]);
$result =['code' =>200,'msg'=>'提交成功'] ;
return json($result);
}
/**取消流程
* @param $taskid
* @param string $comment
* @return bool
* @throws \think\exception\DbException
*/
public function cancel()
{
$params = \request()->all();
$taskid = $params['taskid'];
$comment = $params['comment'];
$res = true;
$task = $this->task->get($taskid);
$comment = $comment == '' ? '[取消]' : $comment;
//更改当前流程为取消状态
$this->task->where(['instanceid' => $task['instanceid']])->where('status', 'in', [0, 1])->update(['status' => 3, 'completedtime' => date("Y-m-d H:i:s"), 'comment' => $comment]);
$this->instance->where(['id' => $task['instanceid']])->update(['instancestatus' => 3]);
return $res;
}
/**同意流程
* @param $taskid
* @param string $comment
* @return bool
* @throws \think\exception\DbException
*/
public function agree()
{
Db::startTrans();
try{
$params = \request()->all();
$taskid = $params['taskid'];
$comment = $params['comment'];
$comment = $comment==''?'[同意]':$comment;
$this->admin = get_admin_info();
$task = Db::name('flow_task')->where(['id' => $taskid, 'status' => 0])->find();
if (!$task){
throw new Exception('找不到当前任务,或已处理,请联系管理员');
}
else{
Db::name('flow_task')->where('id', $taskid)->update(['comment'=>$comment,'status' => '2','completedtime'=>date("Y-m-d H:i:s")]);
}
$originator = $this->admin['id'];//发起人
$flowid = $task['flowid'];
$instanceId = $task['instanceid'];
$flow = Db::name('flow_scheme')->where('id',$task['flowid'])->find();
$instance = Db::name('flow_instance')->where('id',$task['instanceid'])->find();
$insertId = $instance['bizobjectid'];
$table = $flow['bizscheme'];
$process = json_decode($flow['process'],true);
$currentNode = $this->getNode($task['stepid'],$process);
//寻找下一个节点
if($currentNode){
$nodeType = $currentNode['type'];
switch($nodeType){
case 'APPROVAL':
$spType = $currentNode['props']['assignedType'];
switch($spType){
case 'ASSIGN_USER':
$userIdList = $spType = $currentNode['props']['assignedUser'];
foreach($userIdList as $user){
Db::name('flow_task')->save(array(
'flowid' => $flowid,
'stepname' => $currentNode['name'],
'type'=>'node',
'stepid' => $currentNode['id'],
'receiveid' => $user['id'],
'prevstepid' => $task['stepid'],
'instanceid' => $instanceId,
'senderid' => $originator,
'status' => 0,
'createtime' => date("Y-m-d H:i:s"),
'completedtime' => date("Y-m-d H:i:s"),
'comment' => ''
));
}
break;
case 'ROLE':
$roleList = $currentNode['props']['role'];
foreach($roleList as $jobid){
$userList = Db::name('admin')->where(['jobs_id'=>$jobid])->select();
foreach($userList as $row =>$user){
Db::name('flow_task')->save(array(
'flowid' => $flowid,
'stepname' => $currentNode['name'],
'stepid' => $currentNode['id'],
'receiveid' => $user['id'],
'type'=>'node',
'prevstepid' => $task['stepid'],
'instanceid' => $instanceId,
'senderid' => $originator,
'status' => 0,
'createtime' => date("Y-m-d H:i:s"),
'completedtime' => date("Y-m-d H:i:s"),
'comment' => ''
));
}
}
break;
}
break;
case 'CONDITIONS':
//获取所有条件分支
$branchsList = $currentNode['branchs'];
$normal = 0;
//判断符合条件的分支
foreach($branchsList as $branch){
try {
$express = $branch['props']['expression'];
$sql = "select * from (select * from " . $table . " where id = '" . $insertId . "') a where " . $express;
$tableRes = Db::query($sql);
if (count((array)$tableRes) >= 1) {
$normal++;
//下一个节点逻辑
$currentNode = $branch['children'];
$spType = $currentNode['props']['assignedType'];
switch($spType){
case 'ASSIGN_USER':
$userIdList = $currentNode['props']['assignedUser'];
foreach($userIdList as $user){
Db::name('flow_task')->save(array(
'flowid' => $flowid,
'stepname' => $currentNode['name'],
'type'=>'node',
'stepid' => $currentNode['id'],
'receiveid' => $user['id'],
'prevstepid' => '10000',
'instanceid' => $instanceId,
'senderid' => $originator,
'status' => 0,
'createtime' => date("Y-m-d H:i:s"),
'completedtime' => date("Y-m-d H:i:s"),
'comment' => '提交'
));
}
break;
case 'ROLE':
$roleList = $currentNode['props']['role'];
foreach($roleList as $jobid){
//$userList = Db::name('admin')->where(['jobs_id'=>$jobid['id']])->select();
$userList = Db::name('admin')->where("FIND_IN_SET('".$jobid['id']."',jobs_id)")->select();
foreach($userList as $row =>$user){
Db::name('flow_task')->save(array(
'flowid' => $flowid,
'stepname' => $currentNode['name'],
'stepid' => $currentNode['id'],
'receiveid' => $user['id'],
'prevstepid' => '10000',
'type'=>'node',
'instanceid' => $instanceId,
'senderid' => $originator,
'status' => 0,
'createtime' => date("Y-m-d H:i:s"),
'completedtime' => date("Y-m-d H:i:s"),
'comment' => '提交'
));
}
}
break;
}
continue;
}
} catch (\think\Exception $e) {
continue;
}
}
if($normal == 0){
throw new Exception('找不到下一个流程节点,请联系管理员');
}
break;
}
}else{
//流程结束
Db::name('flow_instance')->where('id', $instanceId)->update(['instancestatus' => '2']);
}
Db::commit();
$result =['code' =>200,'msg' =>'提交成功'.$instanceId] ;
}
catch(Exception $ex){
$result =['code' =>500,'msg' => $ex->getMessage()] ;
Db::rollback();
}
return json($result);
}
public function getFlowForm($id)
{
$msg='';
$instanceId = '';
$params = \request()->all();
$id = request()->input('id');
if(isset($params['instanceId']))
{
$instanceId = $params['instanceId'];
}
else
{
$task = Db::name('flow_task')->where('id',$id)->find();
$instanceId = $task['instanceid'];
}
$instance = Db::name('flow_instance')->where('id',$instanceId)->find();
$scheme = Db::name('flow_scheme')->where('id', $instance['scheme'])->find();
$formData = Db::table($scheme['bizscheme'])->where('id',$instance['bizobjectid'])->find();
$vformJson = json_decode($scheme['formitems'],true);
$widgetList = $vformJson['widgetList'];
$controleList = [];
//判断 如果值为数组的话需要转为字符串
foreach($widgetList as $k){
$controleList[$k['options']['name']]=$k;
}
//判断回传的字段类型处理,有一些多选 是数组需要转字符串
$mControlList = array("picture-upload","file-upload","select","cascader");
foreach($formData as $d => $v){
if( $d == 'id'){
continue;
}
//$sc = $controleList[$d];
if(isset($controleList[$d]) && (in_array($controleList[$d]['type'],$mControlList))){
$formData[$d] =$formData[$d]? json_decode($formData[$d],true):[];
}
}
$history = Db::name('flow_workitem_view')
->where(['instanceid'=>$instanceId,'status'=>2])
->order('taskcreatetime', 'desc')->select();
$data = ['process'=>$scheme['process'],'formitems'=>$scheme['formitems'],'formdata'=>$formData,'history'=>$history];
$result =['code' =>200,'data' =>$data,'msg'=>$msg] ;
return json($result);
}
/**
* id 要寻找的父节点id
* node 当前遍历的节点用来判断类型
* json 当前遍历的节点
*/
public function getNode($id,$node)
{
if(!isset($node['children']) || empty($node['children'])){
return [];
}
//处理当前节点为开始节点 驳回重新提交
else if($id =='root'){
return $node['children'];
}
//处理非开始节点
else if($this->isPrimaryNode($node)){
if(isset($node['children']['children']) && $node['children']['id'] == $id){
return $node['children']['children'];
}
return $this->getNode($id,$node['children']);
}
//循环每个分支节点
else if($this->isBranchNode($node)){
$branchs = $node['branchs'];
foreach($branchs as $branch){
$nodeFind = $this->getNode($id,$branchs['children']);
if($nodeFind){
return $nodeFind;
}
}
return $this->getNode($id,$node['children']);
}
else if($node['type'] === 'EMPTY'){
return [];
}
else{
return $this->getNode($id,$node['children']);
}
}
public function isPrimaryNode($node)
{
return $node &&
($node['type'] === 'ROOT' || $node['type'] === 'APPROVAL'
|| $node['type'] === 'CC' || $node['type'] === 'DELAY'
|| $node['type'] === 'TRIGGER');
}
public function isBranchNode($node)
{
return $node && ($node['type'] === 'CONDITIONS' || $node['type'] === 'CONCURRENTS');
}
public function isEmptyNode($node)
{
return $node && ($node['type'] === 'EMPTY');
}
public function deletetask($id)
{
$id = request()->input('id');
Db::name('flow_task')->where('id',$id)->delete();
$result =['code' =>200,'data' =>'','msg'=>'删除成功'] ;
return json($result);
}
public function canceltask($id)
{
$id = request()->input('id');
Db::name('flow_task')->where('id',$id)->update(['status'=>3]);
$task = Db::name('flow_task')->where('id',$id)->find();
$instancid = $task['instanceid'];
$isalltask = Db::name('flow_task')
->where('instanceid',$instancid)
->where([['id', '<>', $id]])
->where([['status', '=', 0]])
->find();
if(!$isalltask){
Db::name('flow_instance')->where('id',$instancid)->update(['instancestatus'=>3]);
}
$result =['code' =>200,'data' =>'','msg'=>'取消成功'] ;
return json($result);
}
public function forwardtask()
{
$id = request()->input('id');
$taskid = request()->input('taskid');
Db::name('flow_task')->where('id',$taskid)->update(['receiveid'=>$id]);
$result =['code' =>200,'data' =>'','msg'=>'转发成功'] ;
return json($result);
}
}

View File

@@ -0,0 +1,32 @@
<?php
declare(strict_types = 1);
namespace app\admin\controller\easyflow;
use app\AdminController;
use support\Response;
/**
* 简单工作流后台控制器
* <!--Easyflow-->
*/
class Index extends AdminController {
// 初始化函数
public function __construct()
{
parent::__construct();
/**
* TODO...
*/
}
/**
* 初始化后台首页
* @return Response
*/
public function index(): Response
{
return $this->view();
}
}

View File

@@ -0,0 +1,35 @@
<?php
declare (strict_types = 1);
namespace app\admin\model\easyflow;
use think\Model;
/**
* 简单工作流模型类
* <!--Easyflow-->
* @mixin Model
*/
class Easyflow extends Model
{
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'create_time';
protected $updatetime = 'update_time';
/**
* 字段修改器
* @param $value
* @return int|mixed
*/
public function setSortAttr($value)
{
if (is_empty($value)) {
return self::max('id') + 1;
}
return $value;
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace app\admin\validate\easyflow;
use think\Validate;
/**
* 简单工作流 验证器
* <!--Easyflow-->
*/
class Easyflow extends Validate
{
/**
* 验证规则
*/
protected $rule = [
];
/**
* 提示消息
*/
protected $message = [
];
/**
* 验证场景
*/
protected $scene = [
'add' => [],
'edit' => [],
];
}

View File

@@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>我是后台首页控制器模板</title>
</head>
<!--Easyflow-->
<body>
<iframe id="external-frame" src="/static/plugin/easyflow/dist/index.html?v={:release()}" width="100%" style="border: 0px"></iframe>
</body>
</html>
<script>
function reinitIframe(){
var iframe = document.getElementById("external-frame");
try{
var bHeight = iframe.contentWindow.document.body.scrollHeight;
var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
var height = Math.max(bHeight, dHeight);
iframe.height = window.innerHeight-50;
console.log(height);
}catch (ex){}
}
window.onload = reinitIframe()
//window.setInterval("reinitIframe()", 200);
</script>

View File

@@ -0,0 +1,55 @@
<?php
declare (strict_types = 1);
// +----------------------------------------------------------------------
// | swiftAdmin 极速开发框架 [基于 WebMan 开发]
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2099 http://www.swiftadmin.net
// +----------------------------------------------------------------------
// | swiftAdmin.net High Speed Development Framework
// +----------------------------------------------------------------------
// | Author: meystack <coolsec@foxmail.com> Apache2
// +----------------------------------------------------------------------
namespace app\index\controller;
use app\HomeController;
use support\Response;
/**
* 首页控制器
* <!--Easyflow-->
* Class Index
* @package app\index\controller
*/
class Easyflow extends HomeController
{
/**
* 鉴权控制器
*/
public $needLogin = false;
/**
* 非鉴权方法
* @var array
*/
public $noNeedAuth = ['index', 'home'];
// 初始化函数
public function __construct()
{
parent::__construct();
}
/**
* Easyflow 首页
* @return Response
* @throws InvalidArgumentException
*/
public function index(): Response
{
return response('Easyflow 前台首页模板');
}
}

View File

@@ -0,0 +1,22 @@
<!--Easyflow-->
<layout name="layout:layout"/>
<!-- 内容主体区域 -->
<div id="content">
<div class="layui-card">
<div class="layui-card-body"> 示例页面 TODO...</div>
<!-- // 创建数据实例 -->
<table id="lay-tableList" lay-filter="lay-tableList"></table>
</div>
</div>
<!-- // 列表工具栏 -->
<script type="text/html" id="tableBar">
<!-- // TODO-->
</script>
<script>
layui.use(['table','jquery'], function () {
let $ = layui.jquery;
let table = layui.table;
})
</script>