1169 lines
38 KiB
PHP
1169 lines
38 KiB
PHP
<?php namespace Gdoo\Workflow\Controllers;
|
|
|
|
use Auth;
|
|
use Request;
|
|
use DB;
|
|
use Paginator;
|
|
|
|
use App\Support\Dialog;
|
|
|
|
use Gdoo\User\Models\User;
|
|
use Gdoo\Workflow\Models\Workflow;
|
|
use Gdoo\Workflow\Models\WorkflowCategory;
|
|
|
|
use Gdoo\Index\Controllers\DefaultController;
|
|
|
|
class WorkflowController extends DefaultController
|
|
{
|
|
public $permission = [
|
|
'print',
|
|
'step',
|
|
'check',
|
|
'next',
|
|
'last',
|
|
'draft',
|
|
'state',
|
|
'query',
|
|
'export',
|
|
'timeout',
|
|
'end',
|
|
'dialog',
|
|
'correct',
|
|
'log',
|
|
];
|
|
|
|
// 已办工作列表
|
|
public function indexAction($flag = 'index')
|
|
{
|
|
$page = Request::get('page', 1);
|
|
|
|
$search = search_form([
|
|
'category' => '',
|
|
'work' => '',
|
|
'step' => '',
|
|
'option' => 'todo',
|
|
'done' => '',
|
|
'referer' => 1,
|
|
'limit' => 25,
|
|
], [
|
|
['text','wp.title','工作主题'],
|
|
['category','w.category_id','工作类别'],
|
|
['text','wp.id','工作流程号(ID)'],
|
|
['department','user.department_id','发起人部门'],
|
|
['text','wp.name','工作文号'],
|
|
['text','wp.work_id','流程编号'],
|
|
['text','user.name','工作发起人'],
|
|
['text','handle_user','当前主办人'],
|
|
|
|
]);
|
|
$query = $search['query'];
|
|
|
|
$model = DB::table('work_process as wp')
|
|
->LeftJoin('work_process_data as wpd', 'wpd.process_id', '=', 'wp.id')
|
|
->LeftJoin('work as w', 'w.id', '=', 'wp.work_id')
|
|
->orderBy('wp.id', 'desc');
|
|
|
|
// 我的工作
|
|
if ($flag == 'index') {
|
|
// 待办
|
|
if ($query['option'] == 'todo') {
|
|
$model->where('wpd.user_id', Auth::id())
|
|
->where('wpd.flag', 1)
|
|
->where('wp.state', 1);
|
|
}
|
|
|
|
// 已办
|
|
if ($query['option'] == 'trans') {
|
|
$model->where('wpd.user_id', Auth::id())
|
|
->where('wpd.flag', 2)
|
|
->where('wp.state', 1);
|
|
}
|
|
|
|
// 完成
|
|
if ($query['option'] == 'done') {
|
|
$model->where('wpd.user_id', Auth::id());
|
|
}
|
|
|
|
// 是否完成
|
|
if ($query['option'] == 'done') {
|
|
$model->whereRaw('wp.end_user_id > 0');
|
|
} else {
|
|
$model->whereRaw('wp.end_user_id = 0');
|
|
}
|
|
}
|
|
|
|
// 回收站
|
|
if ($flag == 'trash') {
|
|
// 数据访问权限
|
|
if (User::authoriseAccess('trash')) {
|
|
$model->whereRaw('(wp.start_user_id=? OR wpd.user_id=?)', [Auth::id(), Auth::id()]);
|
|
}
|
|
$model->where('wp.state', 0);
|
|
}
|
|
|
|
// 监控工作
|
|
if ($flag == 'monitor') {
|
|
if ($query['done'] == 1) {
|
|
$model->whereRaw('wp.end_user_id > 0');
|
|
} else {
|
|
$model->whereRaw('wp.end_user_id = 0');
|
|
}
|
|
$model->where('wp.state', 1);
|
|
}
|
|
|
|
$handle_user = false;
|
|
foreach ($search['where'] as $where) {
|
|
if ($where['active']) {
|
|
if ($where['field'] == 'w.category_id') {
|
|
if ($where['search'][0]) {
|
|
$model->where('w.category_id', $where['search'][0]);
|
|
}
|
|
if ($where['search'][1]) {
|
|
$model->where('wp.work_id', $where['search'][1]);
|
|
}
|
|
if ($where['search'][2]) {
|
|
$model->where('wpd.step_id', $where['search'][2]);
|
|
}
|
|
} else {
|
|
if ($where['field'] == 'handle_user') {
|
|
$handle_user = true;
|
|
$where['field'] = 'user.name';
|
|
}
|
|
$model->search($where);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 主办人
|
|
if ($handle_user) {
|
|
// 搜索当前主办人时匹配最大流水号
|
|
$model->whereRaw('wp.number = wpd.number')
|
|
->LeftJoin('user', 'user.id', '=', 'wpd.user_id');
|
|
} else {
|
|
$model->LeftJoin('user', 'user.id', '=', 'wp.start_user_id');
|
|
}
|
|
|
|
$model->leftJoin(DB::raw('
|
|
(select top 1 a.id, a.title as name, b.process_id, b.add_time, b.user_id, b.number as serial, a.number, a.timeout
|
|
from work_step as a
|
|
left join work_process_data as b on a.id = b.step_id order by b.id desc) as sp'
|
|
), 'sp.process_id', '=', 'wpd.process_id');
|
|
|
|
/*
|
|
$step = DB::table('work_step as ws')
|
|
->LeftJoin('work_process_data as wpd', 'ws.id', '=', 'wpd.step_id')
|
|
->where('wpd.process_id', $row['process_id'])
|
|
->orderBy('wpd.id', 'desc')
|
|
->first([)
|
|
'))
|
|
*/
|
|
|
|
// 数据总计
|
|
//$total = $model->distinct('wp.id')->count('wp.id');
|
|
|
|
$rows = $model->paginate($query['limit'])->appends($query);
|
|
|
|
/*
|
|
$rows = $model->forPage($page, $query['limit'])
|
|
->selectRaw('distinct(wp.id), wp.*, wpd.process_id')
|
|
->get();
|
|
|
|
$rows = Paginator::make($rows, $total)->appends($query);
|
|
|
|
if ($rows->count()) {
|
|
foreach ($rows as $key => $row) {
|
|
$step = DB::table('work_step as ws')
|
|
->LeftJoin('work_process_data as wpd', 'ws.id', '=', 'wpd.step_id')
|
|
->where('wpd.process_id', $row['process_id'])
|
|
->orderBy('wpd.id', 'desc')
|
|
->first(['ws.id', 'ws.title as name', 'wpd.add_time', 'wpd.user_id', 'wpd.number as serial', 'ws.number', 'ws.timeout']);
|
|
|
|
$row['step'] = $step;
|
|
$rows->put($key, $row);
|
|
}
|
|
}
|
|
*/
|
|
|
|
$categorys = WorkflowCategory::where('status', 1)->orderBy('sort', 'asc')->get(['id','title']);
|
|
if ($q_work_id) {
|
|
$steps = DB::table('work_step')->where('work_id', $q_work_id)->get();
|
|
}
|
|
|
|
// 返回json
|
|
if (Request::wantsJson()) {
|
|
return response()->json($rows);
|
|
}
|
|
|
|
return $this->display([
|
|
'rows' => $rows,
|
|
'steps' => $steps,
|
|
'categorys' => $categorys,
|
|
'works' => $works,
|
|
'search' => $search,
|
|
'options' => Workflow::$_options,
|
|
], $tpl);
|
|
}
|
|
|
|
// 监控流程
|
|
public function monitorAction()
|
|
{
|
|
return $this->indexAction('monitor');
|
|
}
|
|
|
|
// 修正流程进程
|
|
public function correctAction()
|
|
{
|
|
$gets = Request::all();
|
|
|
|
if (Request::method() == 'POST') {
|
|
return $this->json('流程纠正成功。', true);
|
|
}
|
|
|
|
return $this->render([
|
|
'rows' => $rows,
|
|
]);
|
|
}
|
|
|
|
// 回收站
|
|
public function trashAction()
|
|
{
|
|
return $this->indexAction('trash');
|
|
}
|
|
|
|
// 查询流程
|
|
public function queryAction()
|
|
{
|
|
$id = Request::get('id');
|
|
|
|
if ($id) {
|
|
$fields = Workflow::getFormData($id);
|
|
|
|
// 获取流程主表
|
|
$work = DB::table('work')->where('id', $id)->first();
|
|
|
|
$columns = [
|
|
'run_id' => [
|
|
'field' => 'p.id',
|
|
'name' => '流水号',
|
|
'format' => 'number'
|
|
],
|
|
'run_name' => [
|
|
'field' => 'p.name',
|
|
'name' => '名称/文号',
|
|
'format' => 'text'
|
|
],
|
|
'run_status' => [
|
|
'field' => 'p.end_user_id',
|
|
'name' => '流程状态',
|
|
'format' => 'number'
|
|
],
|
|
'run_user_id' => [
|
|
'field' => 'p.start_user_id',
|
|
'name' => '流程发起人',
|
|
'format' => 'text'
|
|
],
|
|
'run_date' => [
|
|
'field' => 'p.start_time',
|
|
'name' => '流程开始日期',
|
|
'format' => 'date'
|
|
],
|
|
'run_time' => [
|
|
'field' => 'p.start_time',
|
|
'name' => '流程开始时间',
|
|
'format' => 'datetime'
|
|
]
|
|
];
|
|
|
|
return $this->display([
|
|
'work_id' => $id,
|
|
'work' => $work,
|
|
'columns' => $columns,
|
|
'fields' => $fields,
|
|
], 'query_form');
|
|
} else {
|
|
$works = Workflow::permission('query_id')->get();
|
|
|
|
$rows = $categorys = [];
|
|
foreach ($works as $rowId => $row) {
|
|
$rows[$row->category_id][$rowId] = $row;
|
|
}
|
|
|
|
$j = 0;
|
|
|
|
$_categorys = WorkflowCategory::get();
|
|
|
|
foreach ($_categorys as $i => $category) {
|
|
if ($i % 3 == false) {
|
|
$j++;
|
|
}
|
|
|
|
$categorys[$j][] = $category;
|
|
}
|
|
|
|
return $this->display([
|
|
'rows' => $rows,
|
|
'categorys' => $categorys,
|
|
], 'query_list');
|
|
}
|
|
}
|
|
|
|
// 导出流程
|
|
public function exportAction()
|
|
{
|
|
$work_id = Request::get('work_id');
|
|
|
|
if (Request::method() == 'POST') {
|
|
$gets = Request::all();
|
|
|
|
$fields = Workflow::getFormData($work_id);
|
|
|
|
$query = DB::table('work_data_'.$work_id.' as d')
|
|
->LeftJoin('work_process as p', 'p.id', '=', 'd.process_id')
|
|
->LeftJoin('work_process_data as pd', 'pd.process_id', '=', 'p.id');
|
|
|
|
// 流程开始日期
|
|
$date_a = $gets['date_start_a'];
|
|
$date_b = $gets['date_start_b'];
|
|
|
|
if ($date_a && $date_b) {
|
|
$query->whereBetween('p.start_time', [strtotime($date_a), strtotime($date_b)]);
|
|
} elseif ($date_a) {
|
|
$query->where('p.start_time', '>', strtotime($date_a));
|
|
} elseif ($date_b) {
|
|
$query->where('p.start_time', '<', strtotime($date_b));
|
|
}
|
|
|
|
/*
|
|
// 流程结束日期
|
|
$date_a = $gets['date_end_a'];
|
|
$date_b = $gets['date_end_b'];
|
|
|
|
if ($date_a && $date_b) {
|
|
$query->whereBetween('p.end_time', [strtotime($date_a), strtotime($date_b)]);
|
|
} elseif ($date_a) {
|
|
$query->where('p.end_time', '>', strtotime($date_a));
|
|
} elseif ($date_b) {
|
|
$query->where('p.end_time', '<', strtotime($date_b));
|
|
}
|
|
*/
|
|
|
|
// 开始用户
|
|
if ($gets['start_user_id']) {
|
|
$query->where('p.start_user_id', $gets['start_user_id']);
|
|
}
|
|
|
|
// 工作流文号
|
|
if ($gets['run_name']) {
|
|
$query->where('p.name', 'like', '%'.$gets['run_name'].'%');
|
|
}
|
|
|
|
// 工作状态
|
|
if (is_numeric($gets['status'])) {
|
|
if ($gets['status'] == 0) {
|
|
$query->where('p.end_user_id', 0);
|
|
} else {
|
|
$query->where('p.end_user_id', '>', 0);
|
|
}
|
|
}
|
|
|
|
// 查询范围
|
|
if (is_numeric($gets['user_type'])) {
|
|
if ($gets['user_type'] == 1) {
|
|
$query->where('p.start_user_id', Auth::id());
|
|
}
|
|
if ($gets['user_type'] == 2) {
|
|
$query->where('pd.user_id', Auth::id());
|
|
}
|
|
}
|
|
|
|
$selects = $xls = [];
|
|
$selects[$gets['group_by']] = $gets['group_by'];
|
|
$selects[$gets['order_by']] = $gets['order_by'];
|
|
|
|
foreach ($gets['columns'] as $_columns) {
|
|
if ($_columns['field']) {
|
|
$field = $_columns['field'];
|
|
$columns[$field] = $_columns['name'];
|
|
|
|
// 去掉表前缀
|
|
$_field = explode('.', $field);
|
|
|
|
if ($_columns['total']) {
|
|
$selects[$field] = 'sum('.$field.') as '.$_field[1].'_total';
|
|
$name = $_field[1].'_total';
|
|
} else {
|
|
$selects[$field] = $field;
|
|
$name = $_field[1];
|
|
}
|
|
|
|
// 子表显示字段
|
|
if ($_columns['field1']) {
|
|
$fields[$name]['show'] = $_columns['field1'];
|
|
}
|
|
|
|
$xls[] = ['label' => $_columns['name'], 'name' => $name];
|
|
}
|
|
}
|
|
|
|
// 分组统计
|
|
$query->groupBy($gets['group_by'])
|
|
->orderBy($gets['order_by'], $gets['sort_by']);
|
|
|
|
// 去掉条件模板
|
|
array_shift($gets['conditions']);
|
|
|
|
$count = count($gets['conditions']);
|
|
|
|
$conditions = $values = [];
|
|
|
|
if ($gets['conditions']) {
|
|
foreach ($gets['conditions'] as $key => $condition) {
|
|
// 数组最后一个去掉逻辑
|
|
if ($key + 1 == $count) {
|
|
unset($condition['logic']);
|
|
}
|
|
|
|
$values[] = $condition['value'];
|
|
$condition['value'] = '?';
|
|
|
|
$conditions[] = join(' ', $condition);
|
|
}
|
|
$where = join(' ', $conditions);
|
|
|
|
$query->whereRaw($where, $values);
|
|
}
|
|
|
|
$selects = array_unique($selects);
|
|
$query->selectRaw(join(',', $selects));
|
|
$rows = $query->get();
|
|
|
|
$haeds = [];
|
|
foreach ($fields as $key => $field) {
|
|
if ($field['class'] == 'listview') {
|
|
$haed = [];
|
|
|
|
$show = $field['show'];
|
|
|
|
$tr = explode('`', $field['lv_title']);
|
|
foreach ($tr as $i => $td) {
|
|
if ($td && isset($show[$i])) {
|
|
$haed[] = $td;
|
|
}
|
|
}
|
|
$haeds[$key] = $gets['action'] == 'excel' ? join(',', $haed) : '<tr><th nowrap="nowrap">'.join('</th><th nowrap="nowrap">', $haed).'</th></tr>';
|
|
}
|
|
}
|
|
|
|
foreach ($rows as $key => &$row) {
|
|
$row['start_time'] = format_datetime($row['start_time']);
|
|
$row['start_user_id'] = get_user($row['start_user_id'], 'name', 0);
|
|
$row['end_user_id'] = $row['end_user_id'] == 0 ? '执行中' : '已结束';
|
|
|
|
foreach ($haeds as $key => $tr) {
|
|
if (isset($row[$key])) {
|
|
$table = $gets['action'] == 'excel' ? [] : [$tr];
|
|
|
|
$t = json_decode($row[$key], true);
|
|
|
|
$show = $fields[$key]['show'];
|
|
|
|
if ($t) {
|
|
foreach ($t as $tr) {
|
|
$tt = [];
|
|
foreach ($tr as $i => $td) {
|
|
if ($td && isset($show[$i])) {
|
|
$tt[] = $td;
|
|
}
|
|
}
|
|
$table[] = $gets['action'] == 'excel' ? join(',', $tt) : '<tr><td>'.join('</td><td>', $tt).'</td></tr>';
|
|
}
|
|
}
|
|
$row[$key] = $gets['action'] == 'excel' ? join("\n", $table) : '<table class="table table-condensed table-bordered table-hover">'. join('', $table) .'</table>';
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($gets['action'] == 'excel') {
|
|
writeExcel($xls, $rows, $gets['name'].date('-Y-m-d'));
|
|
}
|
|
|
|
return $this->display([
|
|
'rows' => $rows,
|
|
'columns' => $columns,
|
|
]);
|
|
}
|
|
}
|
|
|
|
// 超时统计
|
|
public function timeoutAction()
|
|
{
|
|
$query = [
|
|
'option' => 'step',
|
|
'flag' => 1,
|
|
];
|
|
foreach ($query as $k => $v) {
|
|
$query[$k] = Request::get($k, $v);
|
|
}
|
|
|
|
// 超时步骤
|
|
if ($query['option'] == 'step') {
|
|
$model = DB::table('work_process as wp')
|
|
->LeftJoin('work_process_data as wpd', 'wpd.process_id', '=', 'wp.id')
|
|
->LeftJoin('work as w', 'w.id', '=', 'wp.work_id')
|
|
->LeftJoin('work_step as ws', 'ws.id', '=', 'wpd.step_id')
|
|
->where('wp.end_user_id', 0)
|
|
->where('ws.number', '>', 1)
|
|
->where('ws.timeout', '>', 0)
|
|
->where('wpd.flag', $query['flag'])
|
|
->orderBy('wp.id', 'desc');
|
|
|
|
$model->selectRaw('wp.*, wpd.process_id, wpd.add_time as trans_at, wpd.deliver_time as deliver_at, wpd.user_id, wpd.flag, wpd.number as step_number, ws.title as step_name, ws.timeout as step_timeout');
|
|
|
|
// 办理中
|
|
if ($query['flag'] == 1) {
|
|
$model->addSelect(DB::raw('UNIX_TIMESTAMP() - ((ws.timeout * 3600) + wpd.add_time) as timeout_diff'))
|
|
->whereRaw('UNIX_TIMESTAMP() - ((ws.timeout * 3600) + wpd.add_time) > 0');
|
|
}
|
|
|
|
if ($query['flag'] == 2) {
|
|
$model->addSelect(DB::raw('wpd.deliver_time - ((ws.timeout * 3600) + wpd.add_time) as timeout_diff'))
|
|
->whereRaw('wpd.deliver_time - ((ws.timeout * 3600) + wpd.add_time) > 0');
|
|
}
|
|
|
|
$rows = $model->paginate();
|
|
}
|
|
|
|
// 超时统计
|
|
if ($query['option'] == 'count') {
|
|
$rows_1 = DB::table('work_process_data as wpd')
|
|
->LeftJoin('work_step as ws', 'ws.id', '=', 'wpd.step_id')
|
|
->where('wpd.number', '>', 1)
|
|
->where('wpd.flag', 1)
|
|
->groupBy('wpd.user_id')
|
|
->selectRaw('
|
|
count(wpd.id) as count,
|
|
wpd.user_id,
|
|
wpd.flag,
|
|
ws.timeout,
|
|
UNIX_TIMESTAMP() - ((ws.timeout * 3600) + wpd.add_time) as timeout_1
|
|
')->get();
|
|
|
|
$rows_2 = DB::table('work_process_data as wpd')
|
|
->LeftJoin('work_step as ws', 'ws.id', '=', 'wpd.step_id')
|
|
->where('wpd.number', '>', 1)
|
|
->where('wpd.flag', 2)
|
|
->groupBy('wpd.user_id')
|
|
->selectRaw('
|
|
count(wpd.id) as count,
|
|
wpd.user_id,
|
|
wpd.flag,
|
|
wpd.deliver_time - ((ws.timeout * 3600) + wpd.add_time) as timeout_2
|
|
')->get();
|
|
|
|
$rows = [];
|
|
|
|
// 办理中
|
|
foreach ($rows_1 as $row) {
|
|
$user_id = $row['user_id'];
|
|
$rows[$user_id]['count'] += $row['count'];
|
|
if ($row['timeout']) {
|
|
$rows[$user_id]['timeout_1'] += $row['count'];
|
|
}
|
|
}
|
|
|
|
// 已办理
|
|
foreach ($rows_2 as $row) {
|
|
$user_id = $row['user_id'];
|
|
$rows[$user_id]['count'] += $row['count'];
|
|
if ($row['timeout']) {
|
|
$rows[$user_id]['timeout_2'] += $row['count'];
|
|
}
|
|
}
|
|
}
|
|
|
|
return $this->display([
|
|
'query' => $query,
|
|
'rows' => $rows,
|
|
], 'timeout_'. $query['option']);
|
|
}
|
|
|
|
// 可办理工作列表
|
|
public function listAction()
|
|
{
|
|
$works = Workflow::permission('sponsor_id')->get();
|
|
|
|
$rows = $categorys = [];
|
|
foreach ($works as $rowId => $row) {
|
|
$rows[$row->category_id][] = $row;
|
|
}
|
|
|
|
$categorys = WorkflowCategory::orderBy('sort', 'ASC')->get();
|
|
|
|
$client = Request::get('client');
|
|
if ($client == 'app') {
|
|
$tpl = 'mobile/list';
|
|
} else {
|
|
$tpl = 'list';
|
|
}
|
|
|
|
return $this->display([
|
|
'rows' => $rows,
|
|
'categorys' => $categorys,
|
|
], $tpl);
|
|
}
|
|
|
|
// 新建工作表单
|
|
public function addAction()
|
|
{
|
|
if (Request::method() == 'POST') {
|
|
$gets = Request::all();
|
|
|
|
if (empty($gets['title'])) {
|
|
return $this->json('工作主题必须填写。');
|
|
}
|
|
|
|
// 获取第一步骤编号
|
|
$step = DB::table('work_step')->whereRaw('work_id=? and number=1', [$gets['work_id']])->first();
|
|
|
|
if (empty($step)) {
|
|
return $this->json('工作第一步骤不存在。');
|
|
}
|
|
|
|
// 写入运行实例
|
|
$gets['start_user_id'] = Auth::id();
|
|
$gets['start_time'] = time();
|
|
|
|
$process_id = DB::table('work_process')->insertGetid($gets);
|
|
|
|
// 写入运行实例第一步
|
|
DB::table('work_process_data')->insert([
|
|
'process_id' => $process_id,
|
|
'step_id' => $step['id'],
|
|
'user_id' => Auth::id(),
|
|
'number' => 1,
|
|
]);
|
|
|
|
// 处理工作表建立和更新
|
|
Workflow::updateTable($gets['work_id']);
|
|
|
|
// 建立工作
|
|
DB::table('work_data_'.$gets['work_id'])->insert([
|
|
'process_id' => $process_id,
|
|
'add_user_id' => Auth::id(),
|
|
'add_time' => time(),
|
|
]);
|
|
|
|
// 操作日志
|
|
// action_log('work_process', $process_id, 'workflow/workflow/view', 0, $gets['name']);
|
|
|
|
return $this->json(['process_id' => $process_id], true);
|
|
}
|
|
|
|
$id = (int)Request::get('id');
|
|
$row = DB::table('work')->where('id', $id)->first();
|
|
|
|
return $this->render([
|
|
'row' => $row,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 办理工作表单
|
|
*/
|
|
public function editAction()
|
|
{
|
|
$process_id = (int)Request::get('process_id');
|
|
|
|
// 当前主办数据
|
|
$process = DB::table('work_process as p')
|
|
->LeftJoin('work_process_data as d', 'p.id', '=', 'd.process_id')
|
|
->where('p.id', $process_id)
|
|
->where('d.user_id', Auth::id())
|
|
->orderBy('d.number', 'desc')
|
|
->first(['p.*', 'd.option', 'd.step_id', 'd.id as data_id']);
|
|
|
|
// 工作流主数据
|
|
$work = DB::table('work as w')
|
|
->LeftJoin('work_step as s', 'w.id', '=', 's.work_id')
|
|
->where('s.id', $process['step_id'])
|
|
->selectRaw('w.template_short,w.title work_title,w.id work_id,w.type work_type,s.id step_id,s.number step_number,s.field field_write,s.field_secret,s.field_auto,s.field_check,s.last,s.print')
|
|
->first();
|
|
|
|
$data = DB::table('work_data_'.$work['work_id'])
|
|
->where('process_id', $process_id)
|
|
->first();
|
|
|
|
$work['items'] = $data;
|
|
$work['process'] = $process;
|
|
|
|
// 主办人可编辑表单
|
|
$work['opflag'] = $process['option'];
|
|
|
|
$workFlow = [
|
|
'workId' => $work['work_id'],
|
|
'workType' => $work['work_type'],
|
|
'stepNumber' => $work['step_number'],
|
|
'stepId' => $work['step_id'],
|
|
'dataId' => $process['data_id'],
|
|
];
|
|
|
|
// 处理工作表建立和更新
|
|
Workflow::updateTable($work['work_id']);
|
|
|
|
// 编译表单
|
|
$form = Workflow::parseForm($work['template_short'], $work);
|
|
|
|
// 公共附件编辑
|
|
$attach = attachment_edit('work_attachment', $data['attachment'], 'workflow');
|
|
|
|
// 公共附件查看权限
|
|
$attach['auth'] = ['view' => 0,'add' => 0];
|
|
if (strpos($work['field_secret'], '[attach@]') === false) {
|
|
$attach['auth']['view'] = 1;
|
|
}
|
|
|
|
// 公共附件添加权限
|
|
if (strpos($work['field_write'], '[attach@]') !== false) {
|
|
$attach['auth']['add'] = 1;
|
|
}
|
|
|
|
$work['js'] = json_encode($workFlow);
|
|
|
|
$client = Request::get('client');
|
|
if ($client == 'app') {
|
|
$tpl = 'mobile/edit';
|
|
} else {
|
|
$tpl = 'edit';
|
|
}
|
|
|
|
return $this->display([
|
|
'attach' => $attach,
|
|
'work' => $work,
|
|
'process' => $process,
|
|
'template' => $form['template'],
|
|
'jsonload' => $form['jsonload'],
|
|
'js' => $form['js'],
|
|
], $tpl);
|
|
}
|
|
|
|
// 查看表单
|
|
public function viewAction()
|
|
{
|
|
$process_id = (int)Request::get('process_id');
|
|
|
|
// 当前办理数据
|
|
$model = DB::table('work_process as p')
|
|
->LeftJoin('work_process_data as d', 'p.id', '=', 'd.process_id')
|
|
->orderBy('d.number', 'desc')
|
|
->where('p.id', $process_id);
|
|
|
|
// 获取主办数据
|
|
$user = DB::table('work_process_data')
|
|
->where('user_id', Auth::id())
|
|
->where('process_id', $process_id)
|
|
->first();
|
|
|
|
// 有主办数据
|
|
if ($user) {
|
|
$model->where('d.user_id', Auth::id());
|
|
}
|
|
|
|
$process = $model->first(['p.*', 'd.step_id', 'd.id as data_id']);
|
|
|
|
// 工作流主数据
|
|
$work = DB::table('work as w')
|
|
->LeftJoin('work_step as s', 'w.id', '=', 's.work_id')
|
|
->where('s.id', $process['step_id'])
|
|
->selectRaw('w.template_short,w.title work_title,w.id work_id,w.type work_type,s.id step_id,s.number step_number,s.field field_write,s.field_secret,s.field_auto,s.print')
|
|
->first();
|
|
|
|
$data = DB::table('work_data_'.$work['work_id'])
|
|
->where('process_id', $process_id)
|
|
->first();
|
|
|
|
$work['items'] = $data;
|
|
|
|
$workFlow = [
|
|
'workId' => $work['work_id'],
|
|
'workType' => $work['work_type'],
|
|
'stepNumber' => $work['step_number'],
|
|
'stepId' => $work['step_id'],
|
|
'dataId' => $process['data_id'],
|
|
];
|
|
|
|
// 编译表单
|
|
$form = Workflow::parseForm($work['template_short'], $work);
|
|
|
|
$attach = attachment_view('work_attachment', $data['attachment']);
|
|
$attach['queue'] = $attach['view'];
|
|
$attach['auth'] = ['view' => 0,'add' => 0];
|
|
|
|
if (strpos($work['field_secret'], '[attach@]') === false) {
|
|
$attach['auth']['view'] = 1;
|
|
}
|
|
|
|
$work['js'] = json_encode($workFlow);
|
|
|
|
$client = Request::get('client');
|
|
if ($client == 'app') {
|
|
$tpl = 'mobile/view';
|
|
} else {
|
|
$tpl = 'view';
|
|
}
|
|
|
|
return $this->display([
|
|
'attach' => $attach,
|
|
'work' => $work,
|
|
'process' => $process,
|
|
'template' => $form['template'],
|
|
'jsonload' => $form['jsonload'],
|
|
'js' => $form['js'],
|
|
], $tpl);
|
|
}
|
|
|
|
// 打印
|
|
public function printAction()
|
|
{
|
|
$process_id = (int)Request::get('process_id');
|
|
|
|
// 当前办理数据
|
|
$model = DB::table('work_process as p')
|
|
->LeftJoin('work_process_data as d', 'p.id', '=', 'd.process_id')
|
|
->orderBy('d.number', 'desc')
|
|
->where('p.id', $process_id);
|
|
|
|
// 获取主办数据
|
|
$user = DB::table('work_process_data')
|
|
->where('user_id', Auth::id())
|
|
->where('process_id', $process_id)
|
|
->first(['user_id']);
|
|
|
|
if ($user) {
|
|
$model->where('d.user_id', Auth::id());
|
|
}
|
|
|
|
$process = $model->first(['p.*', 'd.step_id', 'd.id as data_id']);
|
|
|
|
// 工作主数据
|
|
$work = DB::table('work as w')
|
|
->LeftJoin('work_step as s', 'w.id', '=', 's.work_id')
|
|
->where('s.id', $process['step_id'])
|
|
->selectRaw('w.template_short,w.title work_title,w.id work_id,w.type work_type,s.id step_id,s.number step_number,s.field field_write,s.field_secret,s.field_auto,s.print')
|
|
->first();
|
|
|
|
// 工作数据
|
|
$data = DB::table('work_data_'.$work['work_id'])
|
|
->where('process_id', $process_id)
|
|
->first();
|
|
|
|
$work['items'] = $data;
|
|
|
|
// 打印标识
|
|
$work['printflag'] = true;
|
|
|
|
$workFlow = [
|
|
'workId' => $work['work_id'],
|
|
'workType' => $work['work_type'],
|
|
'stepNumber' => $work['step_number'],
|
|
'stepId' => $work['step_id'],
|
|
'dataId' => $process['data_id'],
|
|
];
|
|
|
|
// 编译表单
|
|
$form = Workflow::parseForm($work['template_short'], $work);
|
|
|
|
$work['js'] = json_encode($workFlow);
|
|
|
|
$this->layout = 'layouts.empty';
|
|
return $this->display([
|
|
'attach' => $attach,
|
|
'work' => $work,
|
|
'process' => $process,
|
|
'template' => $form['template'],
|
|
'jsonload' => $form['jsonload'],
|
|
'js' => $form['js'],
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 检查工作表单必填、转入条件、经办人
|
|
*/
|
|
public function checkAction()
|
|
{
|
|
if (Request::method() == 'POST') {
|
|
$gets = Request::all();
|
|
|
|
// 获取表单缓存
|
|
$work_form_data = Workflow::getFormData($gets['work_id']);
|
|
|
|
// 获取步骤信息
|
|
$step = DB::table('work_step')->where('id', $gets['step_id'])->first();
|
|
|
|
// 组合表单名称和表名
|
|
foreach ($work_form_data as $key => $row) {
|
|
$form_data[$row['title']] = $gets[$key];
|
|
}
|
|
|
|
// 检查必填字段
|
|
if ($step['field_check']) {
|
|
$field_check = explode(',', $step['field_check']);
|
|
|
|
$regular = config('default.regular');
|
|
|
|
foreach ($field_check as $check) {
|
|
list($key, $value) = explode('=', $check);
|
|
|
|
if($value == '') {
|
|
continue;
|
|
}
|
|
|
|
// 如果校验字段不存在则跳过
|
|
if (!isset($form_data[$key])) {
|
|
continue;
|
|
}
|
|
|
|
// 检查是否为空
|
|
if ($value == 'SYS_NOT_NULL') {
|
|
if (empty($form_data[$key])) {
|
|
return $this->json($key.$regular[$value]['title']);
|
|
}
|
|
} else {
|
|
// 检查为空后的其他正则
|
|
if (!preg_match($regular[$value]['regex'], $form_data[$key])) {
|
|
return $this->json($key.$regular[$value]['title']);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 结束流程标志
|
|
if ($step['type'] == 3) {
|
|
$json['step_id'] = '-1';
|
|
} else {
|
|
// 取得可以转入的步骤
|
|
$steps = Workflow::checkCondition($gets);
|
|
if (is_array($steps)) {
|
|
foreach ($steps as $row) {
|
|
$json['step_id'][] = $row['id'];
|
|
}
|
|
$json['step_id'] = join(',', (array)$json['step_id']);
|
|
}
|
|
}
|
|
return $this->json($json, true);
|
|
}
|
|
}
|
|
|
|
// 保存工作表单草稿
|
|
public function draftAction()
|
|
{
|
|
if (Request::method() == 'POST') {
|
|
$gets = Request::all();
|
|
|
|
$data = Workflow::saveForm($gets, true);
|
|
|
|
$table = 'work_data_'.$gets['work_id'];
|
|
|
|
DB::table($table)->where('process_id', $gets['process_id'])->update($data);
|
|
|
|
return $this->json('草稿保存成功。', true);
|
|
}
|
|
}
|
|
|
|
// 获取工作步骤
|
|
public function stepAction()
|
|
{
|
|
if (Request::method() == 'POST') {
|
|
$gets = Request::all();
|
|
|
|
$gets['step_id'] = $gets['next_step_id'];
|
|
|
|
if ($gets['step_id'] > 0) {
|
|
// 退回上一步
|
|
if ($gets['step_type'] == 'last') {
|
|
$data = DB::table('work_process_data')
|
|
->where('process_id', $gets['process_id'])
|
|
->where('step_id', $gets['next_step_id'])
|
|
->orderBy('process_id', 'asc')
|
|
->get();
|
|
|
|
$step['select_user_id'] = $data[0]['user_id'];
|
|
$step['select_user_lock'] = 1;
|
|
}
|
|
// 转交下一步
|
|
elseif ($gets['step_type'] == 'next') {
|
|
// 取得下一步骤办理人
|
|
$step = Workflow::getSelectUser($gets);
|
|
}
|
|
|
|
$html = '<div class="form-group"><label class="col-sm-2 control-label">主办人</label><div class="col-sm-10">';
|
|
$html .= Dialog::user('user', 'next_user_id', $step['select_user_id'], 0, $step['select_user_lock']);
|
|
$html .= '</div></div>';
|
|
|
|
// 转交下一步才显示会签人
|
|
if ($gets['step_type'] == 'next') {
|
|
$html .= '<div class="form-group"><label class="col-sm-2 control-label">会签人</label><div class="col-sm-10">';
|
|
$html .= Dialog::user('user', 'next_user_sign', $step['select_user_sign'], 1, $step['select_user_lock']);
|
|
$html .= '</div></div>';
|
|
}
|
|
return $this->json($html);
|
|
}
|
|
return $this->json('');
|
|
}
|
|
}
|
|
|
|
// 回退工作
|
|
public function lastAction()
|
|
{
|
|
// 写入转交数据到下一步
|
|
if (Request::method() == 'POST') {
|
|
$gets = Request::all();
|
|
|
|
$res = Workflow::nextStep($gets);
|
|
if ($res === true) {
|
|
Workflow::notification($gets);
|
|
return $this->json(url_referer('index'), true);
|
|
} else {
|
|
return $this->json($res);
|
|
}
|
|
}
|
|
|
|
$work_id = (int)Request::get('work_id');
|
|
$step_id = (int)Request::get('step_id');
|
|
|
|
$rows = DB::table('work_step')
|
|
->whereRaw('FIND_IN_SET(?, `join`) and work_id=?', [$step_id, $work_id])
|
|
->get();
|
|
|
|
return $this->render([
|
|
'step_type' => 'last',
|
|
'rows' => $rows,
|
|
], 'next');
|
|
}
|
|
|
|
// 转交工作
|
|
public function nextAction()
|
|
{
|
|
// 写入转交数据到下一步
|
|
if (Request::method() == 'POST') {
|
|
$gets = Request::all();
|
|
$res = Workflow::nextStep($gets);
|
|
if ($res === true) {
|
|
Workflow::notification($gets);
|
|
return $this->json(url_referer('index'), true);
|
|
} else {
|
|
return $this->json($res);
|
|
}
|
|
}
|
|
|
|
// 显示转交表单
|
|
$step_id = Request::get('step_id');
|
|
|
|
// 结束流程
|
|
if ($step_id == '-1') {
|
|
$rows[] = ['id' => '-1', 'title' => '结束流程'];
|
|
}
|
|
// 普通流程
|
|
elseif ($step_id) {
|
|
$_step_id = array_filter(explode(',', $step_id));
|
|
$rows = DB::table('work_step')->whereIn('id', $_step_id)->get();
|
|
}
|
|
return $this->render([
|
|
'step_type' => 'next',
|
|
'rows' => $rows,
|
|
]);
|
|
}
|
|
|
|
// 结束流程
|
|
public function endAction()
|
|
{
|
|
if (Request::method() == 'POST') {
|
|
$id = Request::get('id');
|
|
$ids = array_filter((array)$id);
|
|
|
|
foreach ($ids as $id) {
|
|
|
|
// 进入进程结束标志
|
|
DB::table('work_process')->where('id', $id)->update([
|
|
'end_user_id' => Auth::id(),
|
|
'end_time' => time(),
|
|
]);
|
|
}
|
|
return $this->back('结束操作成功。');
|
|
}
|
|
}
|
|
|
|
// 流程记录
|
|
public function logAction()
|
|
{
|
|
$process_id = Request::get('process_id');
|
|
$rows = DB::table('work_process_data')
|
|
->leftJoin('work_step', 'work_step.id', '=', 'work_process_data.step_id')
|
|
//->orderBy('work_process_data.number', 'desc')
|
|
->where('process_id', $process_id)->get(['work_process_data.*', 'work_step.title as step_name']);
|
|
return $this->render([
|
|
'rows' => $rows,
|
|
]);
|
|
}
|
|
|
|
// 放入回收站
|
|
public function deleteAction()
|
|
{
|
|
if (Request::method() == 'POST') {
|
|
$id = Request::get('id');
|
|
$ids = array_filter((array)$id);
|
|
|
|
$status = (int)Request::get('status');
|
|
|
|
foreach ($ids as $id) {
|
|
$data['state'] = $status;
|
|
DB::table('work_process')->where('id', $id)->update($data);
|
|
}
|
|
return $this->back('回收操作成功。');
|
|
}
|
|
}
|
|
|
|
public function dialogAction()
|
|
{
|
|
$gets = Request::all();
|
|
// 返回json
|
|
if (Request::ajax()) {
|
|
$rows = DB::table('work')->where('category_id', $gets['category_id'])->get(['id', 'title']);
|
|
return $this->json($rows);
|
|
}
|
|
}
|
|
|
|
// 销毁工作
|
|
public function destroyAction()
|
|
{
|
|
if (Request::method() == 'POST') {
|
|
$id = Request::get('id');
|
|
$id = array_filter((array)$id);
|
|
|
|
$rows = DB::table('work_process')->whereIn('id', $id)->get()->toArray();
|
|
if ($rows) {
|
|
foreach ($rows as $row) {
|
|
|
|
// 删除相关数据
|
|
DB::table('work_process')->where('id', $row['id'])->delete();
|
|
DB::table('work_process_data')->where('process_id', $row['id'])->delete();
|
|
DB::table('work_process_log')->where('process_id', $row['id'])->delete();
|
|
|
|
$model = DB::table('work_data_'.$row['work_id'])
|
|
->where('process_id', $row['id']);
|
|
|
|
// 工作数据
|
|
$row = $model->first();
|
|
|
|
// 删除工作附件
|
|
attachment_delete('work_attachment', $row['attachment']);
|
|
|
|
// 删除工作数据
|
|
$model->delete();
|
|
}
|
|
}
|
|
|
|
return $this->success('trash', '销毁操作成功。');
|
|
}
|
|
}
|
|
}
|