硕顺crm后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

338 lines
12 KiB

<?php
namespace addons\qingdong\model;
use addons\qingdong\model\Staff as StaffModel;
use app\admin\model\AuthGroup;
use think\Model;
use traits\model\SoftDelete;
/**
* 审批流程设置
*/
class Flow extends Model
{
use SoftDelete;
const CONTRACT_STATUS='contract';
const RECEIVABLES_STATUS='receivables';
const CONSUME_STATUS='consume';
const ACHIEVEMENT_STATUS='achievement';
const APPROVAL_STATUS='approval';
const CARD_STATUS='card';//补卡
const LEAVE_STATUS='leave';//请假
// 表名,不含前缀
protected $name = 'qingdong_flow';
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
protected $deleteTime = 'deletetime';
// 追加属性
protected $append = [
'groups_text',
'last_admin_text',
];
/**
* 角色组
*/
public function getGroupsTextAttr($value, $data)
{
$group_ids = $data['group_ids'] ?? "";
if(empty($group_ids)){
return '全公司';
}
$groups = AuthGroup::where(['id' => ['in', $group_ids]])->field('name')->select();
$names=[];
foreach ($groups as $v){
$names[]=$v['name'];
}
return implode(',',$names);
}
/**
* 最后修改人
*/
public function getLastAdminTextAttr($value,$data){
$admin_id=$data['last_admin_id']??'';
return \app\admin\model\Admin::where(['id'=>$admin_id])->value('nickname');
}
/**
* 获取审批信息
* @param $type
* @return array|mixed
*/
protected static function getFlowByTypes($type)
{
$staff = Staff::info();
$type=explode('_',$type);
if ($type[0] == self::APPROVAL_STATUS) {
$flow = FormApproval::where(['id' => $type[1]])->find();
return $flow;
}
$group_ids = $staff->group_ids;
$group_ids = explode(',', $group_ids);
$flows = Flow::where(['relation_type' => $type[0]])->order('id desc')->select();
$flows = collection($flows)->toArray();
$flow = [];
foreach ($flows as $v) {
if(empty($v['group_ids'])){
$flow = $v;
break;
}
$ids = explode(',', $v['group_ids']);
if (array_intersect($group_ids, $ids)) {
$flow = $v;
break;
}
}
return $flow;
}
/**
* 获取审批
* @param $type
* @return array|false
*/
public static function getsteplist($type){
$examineFlowData = Flow::getFlowByTypes($type);
if (!$examineFlowData) {
//无可用审批流,请联系管理员
return false;
}
$staff = Staff::info();
$flow_staff_ids=[];
//自选还是流程(1固定,0自选)
if ($examineFlowData['status'] == 1) {
$examine_ids = json_decode($examineFlowData['examine_ids'], true);
if (!$examine_ids) {
//无可用审批流,请联系管理员
return false;
}
$pid = StaffModel::where(['id' => $staff->id])->value('parent_id');
$stepList = [];
foreach ($examine_ids as $ks => $vs) {
$stepInfo = [];
$stepInfo['order_id'] = $ks + 1;//第几级
if ($vs['stafftype'] == 3) {//直属上级
$s = StaffModel::where(['id' => $pid])->field('id,name,img')->select();
$s = collection($s)->toArray();
$stepInfo['status'] = $vs['stafftype'];
$stepInfo['stafflist'] = $s;
$stepInfo['staffids'] = $pid;
$stepList[] = $stepInfo;
$flow_staff_ids[]=$pid;
} else if ($vs['stafftype'] == 1) {//指定员工(任意一人)
$s = StaffModel::where(['id' => ['in', $vs['staff_id']]])->field('id,name,img')->select();
$s = collection($s)->toArray();
$stepInfo['status'] = $vs['stafftype'];
$stepInfo['stafflist'] = $s;
$stepInfo['staffids'] = $vs['staff_id'];
$stepInfo['relation'] = 2;
$stepList[] = $stepInfo;
$flow_staff_ids[]=$vs['staff_id'];
} else {//指定员工(并签)
$s = StaffModel::where(['id' => ['in', $vs['staff_id']]])->field('id,name,img')->select();
$s = collection($s)->toArray();
$stepInfo['status'] = $vs['stafftype'];
$stepInfo['staffids'] = $vs['staff_id'];
$stepInfo['stafflist'] = $s;
$stepInfo['relation'] = 1;
$stepList[] = $stepInfo;
$flow_staff_ids[]=$vs['staff_id'];
}
}
} else {
$stepList = [];
}
$data = [];
$data['flow_staff_ids'] = implode(',',$flow_staff_ids); //审批id
$data['flow_id'] = $examineFlowData['id']; //审批id
$data['order_id']=$stepList?$stepList[0]['order_id']:0;
$data['status'] = $examineFlowData['status']; //1固定,0自选
$data['stepList'] = $stepList ?: [];//审批流程
return $data;
}
/**
* 获取审批详情
* @param $type
* @return array|false
*/
public static function getstepdetail($relation_type,$relation_id){
switch ($relation_type){
case self::CONTRACT_STATUS:
$model=new Contract();
break;
case self::RECEIVABLES_STATUS:
$model=new Receivables();
break;
case self::CONSUME_STATUS:
$model=new Consume();
break;
case self::ACHIEVEMENT_STATUS:
$model=new AchievementRecords();
break;
case self::APPROVAL_STATUS:
$model=new Approval();
break;
case self::CARD_STATUS:
$model=new AttendanceCard();
break;
case self::LEAVE_STATUS:
$model=new Leave();
break;
}
$row=$model->get($relation_id);
if(empty($row)){
return false;
}
if($relation_type==self::APPROVAL_STATUS){
$examineFlowData = FormApproval::withTrashed()->where(['id'=>$row->formapproval_id])->find();
}else{
$examineFlowData = Flow::withTrashed()->where(['id'=>$row->flow_id])->find();
}
if (!$examineFlowData) {
//无可用审批流,请联系管理员
return false;
}
$staff_id=$row->create_staff_id??($row->staff_id??$row->owner_staff_id);
$records=ExamineRecord::where(['relation_type'=>$relation_type,
'relation_id'=>$relation_id])->field('check_time,status,content,check_staff_id')->select();
$records=collection($records)->toArray();
$examineRecord=[];
foreach ($records as $v){
$examineRecord[$v['check_staff_id']]=$v;
}
$examine_ids = json_decode($examineFlowData['examine_ids'], true);
//自选还是流程(1固定,0自选)
if ($examineFlowData['status'] == 1) {
$pid = StaffModel::where(['id' => $staff_id])->value('parent_id');
$stepList = [];
foreach ($examine_ids as $ks => $vs) {
$stepInfo = [];
$stepInfo['order_id'] = $ks + 1;//第几级
if ($vs['stafftype'] == 3) {//直属上级
$s = StaffModel::where(['id' => $pid])->field('id,name,img')->select();
$s = collection($s)->toArray();
$stepInfo['status'] = $vs['stafftype'];
$stepInfo['stafflist'] = $s;
$stepInfo['staffids'] = $pid;
} else if ($vs['stafftype'] == 1) {//指定员工(任意一人)
$s = StaffModel::where(['id' => ['in', $vs['staff_id']]])->field('id,name,img')->select();
$s = collection($s)->toArray();
$stepInfo['status'] = $vs['stafftype'];
$stepInfo['stafflist'] = $s;
$stepInfo['staffids'] = $vs['staff_id'];
$stepInfo['relation'] = 2;
} else {//指定员工(并签)
$s = StaffModel::where(['id' => ['in', $vs['staff_id']]])->field('id,name,img')->select();
$s = collection($s)->toArray();
$stepInfo['status'] = $vs['stafftype'];
$stepInfo['staffids'] = $vs['staff_id'];
$stepInfo['stafflist'] = $s;
$stepInfo['relation'] = 1;
}
//审批记录
foreach ($stepInfo['stafflist'] as &$staffinfo) {
if (isset($examineRecord[$staffinfo['id']])) {
$staffinfo['examine_reord'] = $examineRecord[$staffinfo['id']];
} else {
$staffinfo['examine_reord'] = ['status' => 0, 'check_time' => '', 'content' => ''];
}
}
$stepList[] = $stepInfo;
}
} else {
$stepList = [];
$s = StaffModel::where(['id' => ['in', $row['flow_staff_ids']]])->field('id,name,img')->select();
$s = collection($s)->toArray();
$stepInfo['staffids'] = $row['flow_staff_ids'];
$stepInfo['stafflist'] = $s;
//审批记录
foreach ($stepInfo['stafflist'] as &$staffinfo) {
if (isset($examineRecord[$staffinfo['id']])) {
$staffinfo['examine_reord'] = $examineRecord[$staffinfo['id']];
} else {
$staffinfo['examine_reord'] = ['status' => 0, 'check_time' => '', 'content' => ''];
}
}
$stepList[] = $stepInfo;
}
$is_check=0;
$staff=Staff::info();
if(isset($examineRecord[$staff->id])){
if($examineRecord[$staff->id]['status'] == 0){
$is_check=1;
}
}
$data = [];
$data['flow_id'] = $examineFlowData['id']; //审批id
$data['flow_staff_ids'] = $row['flow_staff_ids'];
$data['order_id'] = $row['order_id'];
$data['status'] = $examineFlowData['status']; //1固定,0自选
$data['stepList'] = $stepList ?: [];//审批流程
$data['is_check'] = $is_check;//审批权限(1有)
$data['is_recheck'] = ($staff->id == $staff_id)?1:0;//撤销审批权限(1有)
return $data;
}
/**
* 给下一审批人发送审批通知
*/
public static function sendStepRecord($flow,$relation_type,$relation_id,$check_staff_ids=''){
if(!is_array($check_staff_ids)){
$check_staff_ids=explode(',',$check_staff_ids);
}
if($flow['status'] == 0){//发起人自选
$diff = array_diff(explode(',',$flow['flow_staff_ids']), $check_staff_ids);
if(empty($diff)){
return ['status'=>true,'order_id'=>1];
}else{
$diff=array_values($diff);
ExamineRecord::addExaminse($relation_type,$relation_id, $diff[0]);
return ['status'=>false,'order_id'=>1];
}
}
foreach ($flow['stepList'] as $v){
$staffIds=explode(',',$v['staffids']);
$is_check=0;//是否通过
if($v['status'] == 1){//任意一人 或签
foreach ($staffIds as $sid) {
if (in_array($sid, $check_staff_ids)) {
$is_check = 1;
}
}
}else{//直属上级和并签
$is_check = 1;
foreach ($staffIds as $sid) {
if (!in_array($sid, $check_staff_ids)) {
$is_check = 0;
}
}
}
if ($is_check != 1) {//发送审批通知
foreach ($staffIds as $sid) {
if (!in_array($sid, $check_staff_ids)) {
ExamineRecord::addExaminse($relation_type, $relation_id, $sid);
}
}
return ['status'=>false,'order_id'=>$v['order_id']];
}
}
return ['status'=>true,'order_id'=>$v['order_id']+1];
}
}