|
@@ -5,6 +5,10 @@ namespace App\Service;
|
|
|
use App\Model\Employee;
|
|
|
use App\Model\SysMenu;
|
|
|
use App\Model\WorkFlow;
|
|
|
+use App\Model\WorkFlowGenerated;
|
|
|
+use App\Model\WorkFlowGeneratedSub;
|
|
|
+use App\Model\WorkFlowGeneratedSubDetail;
|
|
|
+use App\Model\WorkFlowGeneratedSubDetailCondition;
|
|
|
use App\Model\WorkFlowSub;
|
|
|
use App\Model\WorkFlowSubDetail;
|
|
|
use App\Model\WorkFlowSubDetailCondition;
|
|
@@ -496,6 +500,10 @@ class WorkFlowService extends Service
|
|
|
try {
|
|
|
//生成
|
|
|
list($status, $msg) = $this->createWorkFlowDetail($data, $user);
|
|
|
+ if(! $status){
|
|
|
+ DB::rollBack();
|
|
|
+ return [false, $msg];
|
|
|
+ }
|
|
|
|
|
|
DB::commit();
|
|
|
} catch (\Exception $e) {
|
|
@@ -515,14 +523,204 @@ class WorkFlowService extends Service
|
|
|
if(empty($oa)) return [false, '工作流配置未设置,请联系开发者'];
|
|
|
$menu_id = array_column($oa,'menu_id');
|
|
|
if(! in_array($data['menu_id'], $menu_id)) return [false, '该菜单暂不支持工作流'];
|
|
|
+
|
|
|
+ return [true, ''];
|
|
|
}
|
|
|
|
|
|
public function createWorkFlowDetail($data, $user){
|
|
|
+ list($status, $msg) = $this->createWorkFlowDetailRule($data, $user);
|
|
|
+ if(! $status) {
|
|
|
+ if(isset($data['is_check'])){
|
|
|
+ //因为工作流不存在,或者点击的人不触发工作流,所以直接成功返回
|
|
|
+ list($status, $msg) = $this->callCheck($data, CheckService::TYPE_ONE, $user);
|
|
|
+ return [$status, $msg];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [false, $msg];
|
|
|
+ }
|
|
|
+
|
|
|
+ //创建审批流根据工作流
|
|
|
+ list($status, $msg) = $this->createWorkFlow($data, $user, $msg);
|
|
|
+ if(! $status) return [false, $msg];
|
|
|
+
|
|
|
+ return [true, ''];
|
|
|
+ }
|
|
|
+
|
|
|
+ public function createWorkFlowDetailRule($data, $user){
|
|
|
$workFlow = WorkFlow::where('del_time',0)
|
|
|
->where('menu_id', $data['menu_id'])
|
|
|
->first();
|
|
|
- if(empty($workFlow)) return [true, ''];
|
|
|
+ if(empty($workFlow)) return [false, [-1, '菜单工作流不存在、已被删除或未新建']];
|
|
|
+ $workFlow = $workFlow->toArray();
|
|
|
+
|
|
|
+ //判断是否创建工作流
|
|
|
+ list($status, $msg) = $this->getStartWorkFlow($workFlow['id'], $user);
|
|
|
+ if(! $status) return [false, $msg];
|
|
|
+
|
|
|
+ return [true, $workFlow];
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取工作流的开始 判断是否激活审批流
|
|
|
+ public function getStartWorkFlow($workFlowId = 0, $user){
|
|
|
+ //用户的部门
|
|
|
+ $depart_user = $user['depart_range'] ?? [];
|
|
|
+
|
|
|
+ //工作流开始节点数据
|
|
|
+ $list = WorkFlowSubDetail::where('del_time',0)
|
|
|
+ ->where('workflow_id',$workFlowId)
|
|
|
+ ->where('type', WorkFlowSubDetail::type_zero)
|
|
|
+ ->get()->toArray();
|
|
|
+
|
|
|
+ //工作流的部门 人
|
|
|
+ $workflow_depart = $workflow_man = [];
|
|
|
+ foreach ($list as $value){
|
|
|
+ if($value['p_id'] > 0 && ! in_array($value['p_id'], $workflow_man)) $workflow_man[] = $value['p_id'];
|
|
|
+ if($value['d_id'] > 0 && ! in_array($value['d_id'], $workflow_depart)) $workflow_depart[] = $value['d_id'];
|
|
|
+ }
|
|
|
+ //所有人都能触发审批流
|
|
|
+ if(empty($workflow_depart) && empty($workflow_man)) return [true, ''];
|
|
|
+
|
|
|
+ if(! empty($workflow_depart)){
|
|
|
+ $d = array_intersect($depart_user, $workflow_depart);
|
|
|
+ if(! empty($d)) return [true, ''];
|
|
|
+ }
|
|
|
+
|
|
|
+ if(! empty($workflow_man)){
|
|
|
+ $p = array_intersect([$user['id']], $workflow_man);
|
|
|
+ if(! empty($p)) return [true, ''];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [false, [-1, '触发人不在工作流发起者内']];
|
|
|
+ }
|
|
|
+
|
|
|
+ //创建审批流根据工作流
|
|
|
+ public function createWorkFlow($data, $user, $workFlow){
|
|
|
+ try {
|
|
|
+ DB::beginTransaction();
|
|
|
+
|
|
|
+ $time = time();
|
|
|
+ $model = new WorkFlowGenerated();
|
|
|
+ $model->title = $workFlow['title'];
|
|
|
+ $model->menu_id = $workFlow['menu_id'];
|
|
|
+ $model->vue_param = $workFlow['vue_param'];
|
|
|
+ $model->my_param = $workFlow['my_param'];
|
|
|
+ $model->order_number = $data['order_number'];
|
|
|
+ $model->crt_id = $user['id'];
|
|
|
+ $model->save();
|
|
|
+ $id = $model->id;
|
|
|
+
|
|
|
+ $this->insertSonModel2($workFlow['id'], $id, $time);
|
|
|
|
|
|
+ DB::commit();
|
|
|
+ }catch (\Throwable $e){
|
|
|
+ DB::rollBack();
|
|
|
+ if (str_contains($e->getMessage(), '1062') || str_contains($e->getMessage(), 'Duplicate entry')) {
|
|
|
+ return [false, '审批流程已存在'];
|
|
|
+ }
|
|
|
+ return [false, $e->getFile() . '|' . $e->getLine() . '|' . $e->getMessage()];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true, $id];
|
|
|
+ }
|
|
|
+
|
|
|
+ public function insertSonModel2($workFlowId = 0, $workFlowGeneratedId = 0, $time){
|
|
|
+ $insert = [];
|
|
|
+ $workFlowSub = WorkFlowSub::where('del_time',0)
|
|
|
+ ->where('workflow_id', $workFlowId)
|
|
|
+ ->select('id','menu_id','m_id')
|
|
|
+ ->get()->toArray();
|
|
|
+ $keys = [];
|
|
|
+ foreach ($workFlowSub as $value){
|
|
|
+ $insert[] = [
|
|
|
+ 'menu_id' => $value['menu_id'],
|
|
|
+ 'm_id' => $value['m_id'],
|
|
|
+ 'workflow_generated_id' => $workFlowGeneratedId,
|
|
|
+ 'crt_time' => $time,
|
|
|
+ ];
|
|
|
+ $keys[] = $value['id'];
|
|
|
+ }
|
|
|
+ WorkFlowGeneratedSub::insert($insert);
|
|
|
+
|
|
|
+ //获取上一次插入订单的所有id
|
|
|
+ $last_insert_id = WorkFlowGeneratedSub::where('workflow_generated_id', $workFlowGeneratedId)
|
|
|
+ ->where('crt_time', $time)
|
|
|
+ ->where('del_time', 0)
|
|
|
+ ->select('id')->get()->toArray();
|
|
|
+ $last_insert_id = array_column($last_insert_id,'id');
|
|
|
+ $map = array_combine($keys, $last_insert_id);
|
|
|
+
|
|
|
+ $workFlowSubDetail = WorkFlowSubDetail::where('del_time',0)
|
|
|
+ ->where('workflow_id', $workFlowId)
|
|
|
+ ->select('id','menu_id','m_id','workflow_sub_id','type','p_id','d_id','settype','selectMode','selectRange','examineMode','priorityLevel')
|
|
|
+ ->get()->toArray();
|
|
|
+ $insert2 = [];
|
|
|
+ $keys = [];
|
|
|
+ foreach ($workFlowSubDetail as $value){
|
|
|
+ $keys[] = $value['id'];
|
|
|
+ $workflow_generated_sub_id = $map[$value['workflow_sub_id']] ?? 0;
|
|
|
+ unset($value['id']);unset($value['workflow_sub_id']);
|
|
|
+ $value['workflow_generated_id'] = $workFlowGeneratedId;
|
|
|
+ $value['workflow_generated_sub_id'] = $workflow_generated_sub_id;
|
|
|
+ $value['crt_time'] = $time;
|
|
|
+ $insert2[] = $value;
|
|
|
+ }
|
|
|
+ WorkFlowGeneratedSubDetail::insert($insert2);
|
|
|
+
|
|
|
+ //获取上一次插入订单的所有id
|
|
|
+ $last_insert_id = WorkFlowGeneratedSubDetail::where('workflow_generated_id', $workFlowGeneratedId)
|
|
|
+ ->where('crt_time', $time)
|
|
|
+ ->where('del_time', 0)
|
|
|
+ ->get()->toArray();
|
|
|
+ $last_map = array_column($last_insert_id,null,'id');
|
|
|
+ $last_insert_id = array_column($last_insert_id,'id');
|
|
|
+ $map = array_combine($keys, $last_insert_id);
|
|
|
+
|
|
|
+ $insert3 = [];
|
|
|
+ $workFlowSubDetailCondition = WorkFlowSubDetailCondition::where('del_time',0)
|
|
|
+ ->where('workflow_id', $workFlowId)
|
|
|
+ ->select('menu_id','workflow_sub_detail_id','column','opt1','opt2','opt_type','zdy1','zdy2')
|
|
|
+ ->get()->toArray();
|
|
|
+ if(! empty($workFlowSubDetailCondition)){
|
|
|
+ foreach ($workFlowSubDetailCondition as $value){
|
|
|
+ $workflow_generated_sub_detail_id = $map[$value['workflow_sub_detail_id']] ?? 0;
|
|
|
+ unset($value['workflow_sub_detail_id']);
|
|
|
+ $tmp = $last_map[$workflow_generated_sub_detail_id] ?? [];
|
|
|
+ $value['workflow_generated_id'] = $tmp['workflow_generated_id'];
|
|
|
+ $value['workflow_generated_sub_id'] = $tmp['workflow_generated_sub_id'];
|
|
|
+ $value['workflow_generated_sub_detail_id'] = $workflow_generated_sub_detail_id;
|
|
|
+ $value['crt_time'] = $time;
|
|
|
+ $insert3[] = $value;
|
|
|
+ }
|
|
|
+ WorkFlowGeneratedSubDetailCondition::insert($insert3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //运行工作流
|
|
|
+ public function runWorkFlow($order_number = "", $workFlowGeneratedId = 0){
|
|
|
+ $workFlowGenerated = WorkFlowGenerated::where('del_time', 0)
|
|
|
+ ->when(! empty($order_number), function ($query) use ($order_number) {
|
|
|
+ return $query->where('order_number', $order_number);
|
|
|
+ })
|
|
|
+ ->when(! empty($workFlowGeneratedId), function ($query) use ($workFlowGeneratedId) {
|
|
|
+ return $query->where('id', $workFlowGeneratedId);
|
|
|
+ })
|
|
|
+ ->first();
|
|
|
+ if(empty($workFlowGenerated)) return [false, '工作流不存在或已被删除'];
|
|
|
+ $workFlowGenerated = $workFlowGenerated->toArray();
|
|
|
+
|
|
|
+// if($workFlowGenerated['node_id'])
|
|
|
+ }
|
|
|
|
|
|
+ //调用审批
|
|
|
+ public function callCheck($data, $type, $user)
|
|
|
+ {
|
|
|
+ $service = new CheckService();
|
|
|
+ list($bool, $msg) = $service->createRecordAndInventory([
|
|
|
+ 'order_number' => $data['order_number'],
|
|
|
+ 'type' => $type,
|
|
|
+ 'opt_case' => $data['opt_case'],
|
|
|
+ 'user_data' => $user,
|
|
|
+ ]);
|
|
|
+ return [$bool, $msg];
|
|
|
}
|
|
|
}
|