Evection.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. <?php
  2. namespace app\api\controller;
  3. use AlibabaCloud\SDK\Dingtalk\Vyida_1_0\Models\GetFormDataByIDResponseBody\originator\name;
  4. use app\common\model\EvectionApprove;
  5. use app\common\model\LeaveApprove;
  6. use app\common\model\ApproveFlow;
  7. use app\common\model\EvectionInfo;
  8. use app\common\service\ApproveService;
  9. use think\Db;
  10. use app\common\model\User;
  11. /**
  12. * @title 员工出差管理
  13. * @controller Evection
  14. * @group base
  15. */
  16. class Evection extends Base
  17. {
  18. public function initialize()
  19. {
  20. parent::initialize();
  21. parent::checkLogin();
  22. }
  23. /**
  24. * @title 获取审批流程
  25. * @desc 获取审批流程
  26. * @author qc
  27. * @url /api/Evection/getApproveFlow
  28. * @method GET
  29. * @tag
  30. * @header name:Authorization require:1 desc:Token
  31. * @return name:user_name type:string default:-- desc:会员名称
  32. * @return name:headimg type:string default:-- desc:会员头像
  33. */
  34. public function getApproveFlow()
  35. {
  36. $check_flow = ApproveFlow::where('user_id',$this->user_id)->where('type',1)->where('module',3)->find();
  37. $where = [];
  38. $where[] = ['l.type','=',1];
  39. $where[] = ['l.module','=',3];
  40. if($check_flow)$where[] = ['l.sort','>',$check_flow->sort];
  41. $list = ApproveFlow::field('l.user_id,u.name user_name,u.headimg')
  42. ->alias('l')
  43. ->where($where)
  44. ->order('l.sort asc')
  45. ->leftJoin('StoreMember u','u.id = l.user_id')
  46. ->select()->toArray();
  47. $this->success('ok',['list'=>$list]);
  48. }
  49. /**
  50. * @title 获取抄送人流程
  51. * @desc 获取抄送人流程
  52. * @author qc
  53. * @url /api/Evection/getCopyFlow
  54. * @method GET
  55. * @tag
  56. * @header name:Authorization require:1 desc:Token
  57. * @return name:user_name type:string default:-- desc:会员名称
  58. * @return name:headimg type:string default:-- desc:会员头像
  59. */
  60. public function getCopyFlow()
  61. {
  62. $check_flow = ApproveFlow::where('user_id',$this->user_id)->where('type',2)->where('module',3)->find();
  63. $where = [];
  64. $where[] = ['l.type','=',2];
  65. $where[] = ['l.module','=',3];
  66. if($check_flow)$where[] = ['l.sort','>',$check_flow->sort];
  67. $list = ApproveFlow::field('l.user_id,u.name user_name,u.headimg')
  68. ->alias('l')
  69. ->where($where)
  70. ->order('l.sort asc')
  71. ->leftJoin('StoreMember u','u.id = l.user_id')
  72. ->select()->toArray();
  73. $this->success('ok',['list'=>$list]);
  74. }
  75. /**
  76. * @title 出差申请
  77. * @desc 出差申请
  78. * @author qc
  79. * @url /api/Evection/applyEvection
  80. * @method GET
  81. * @tag
  82. * @header name:Authorization require:1 desc:Token
  83. * @param name:type type:int default:-- desc:出差类型(1市内2市外)
  84. * @param name:reason type:string default:-- desc:出差事由
  85. * @param name:start_time type:string default:-- desc:开始时间
  86. * @param name:end_time type:string default:-- desc:结束时间
  87. * @param name:document type:string default:-- desc:附件(文件路径)
  88. * @param name:images type:string default:-- desc:图片(多张|隔开)
  89. * @param name:peer_user type:string default:-- desc:同行员工id(多个,隔开)
  90. */
  91. public function applyEvection()
  92. {
  93. $request_param = input('post.');
  94. if(empty($request_param['start_time']) || empty($request_param['end_time'])) $this->error('请选择出差时间');
  95. if(empty($request_param['type'])) $this->error('请选择出差类型');
  96. if(empty($request_param['user_id'])) $request_param['user_id'] = $this->user_id;
  97. $request_param['apply_user'] = $this->user_id;// 申请会员id
  98. $flow = ApproveFlow::getApproveUser(3);// 出差审批流程设置
  99. $flow_user = array_column($flow,'user_id');
  100. $flow_key = array_search($request_param['user_id'],$flow_user);// 出差人是否在审批流程人员中
  101. $copy = ApproveFlow::getCopyTo(3);
  102. $copy_user = array_column($copy,'user_id');
  103. $copy_key = array_search($request_param['user_id'],$copy_user);// 出差人是否在抄送人员中
  104. $flow_info = EvectionInfo::create($request_param);//生成出差记录
  105. $flow_data = [];// 审批流程
  106. $flow_num = 0;
  107. foreach ($flow as $fk=>$fv) {
  108. if($flow_key !== false && $flow_key >= $fk) continue;
  109. $flow_num++;
  110. $flow_data[] = [
  111. 'eve_id' => $flow_info->id,
  112. 'approve_user' => $fv['user_id'],
  113. 'flow' =>$flow_num,
  114. 'create_at'=>date('Y-m-d H:i:s'),
  115. 'start_time'=> $flow_num == 1 ? date('Y-m-d H:i:s'):null,
  116. 'status'=> $flow_num == 1 ? 1 : 0,
  117. ];
  118. }
  119. foreach ($copy as $ck=>$cv) {
  120. if($copy_key !== false && $copy_key >= $ck) continue;
  121. $flow_data[] = [
  122. 'eve_id' => $flow_info->id,
  123. 'approve_user' => $cv['user_id'],
  124. 'approve_type' =>2
  125. ];
  126. }
  127. if(!empty($flow_data)) {
  128. EvectionInfo::where('id',$flow_info->id)->update(['approve_num'=>$flow_num]);
  129. (new EvectionApprove())->saveAll($flow_data);
  130. }else{
  131. EvectionInfo::where('id',$flow_info->id)->update(['status'=>2]);
  132. }
  133. $this->success('出差已提交,请等待审核',['detail'=>$flow_info->toArray()]);
  134. }
  135. /**
  136. * @title 我的出差记录【列表】
  137. * @desc 我的出差记录
  138. * @author qc
  139. * @url /api/Evection/getEvectionList
  140. * @method GET
  141. * @tag
  142. * @header name:Authorization require:1 desc:Token
  143. * @param name:page type:int default:-- desc:页数
  144. * @param name:page_num type:int default:-- desc:每页数量
  145. * @param name:type type:int default:0 desc:出差类型id
  146. * @param name:status type:int default:0 desc:审批状态0全部,1审批中,2审批通过,3审批拒绝,9取消
  147. * @param name:sel_time type:string default:0 desc:时间查询
  148. * @return name:start_time type:string default:-- desc:开始时间
  149. * @return name:end_time type:string default:-- desc:结束时间
  150. * @return name:reason type:string default:-- desc:出差事由
  151. * @return name:document type:string default:-- desc:附件(文件路径)
  152. * @return name:images type:string default:-- desc:图片(多张|隔开)
  153. * @return name:reason type:string default:-- desc:出差事由
  154. * @return name:type type:int default:-- desc:出差类型(1市内2市外)
  155. * @return name:status type:int default:-- desc:状态:1审批中,2审批通过,3审批拒绝,9取消
  156. * @return name:user_id type:int default:-- desc:出差会员id
  157. */
  158. public function getEvectionList()
  159. {
  160. $sel_where = [];
  161. $sel_where[] = ['user_id','=',$this->user_id];
  162. if(input('get.status') > 0) $sel_where[] = ['status','=',input('get.status')];
  163. if(input('get.type') > 0) $sel_where[] = ['type','=',input('get.type')];
  164. $list = EvectionInfo::where($sel_where)->limit($this->off_set,$this->page_num)->select()->toArray();
  165. $this->success('ok',['list'=>$list]);
  166. }
  167. /**
  168. * @title 我的出差详情
  169. * @desc 我的出差详情
  170. * @author qc
  171. * @url /api/Evection/getEvectionDetail
  172. * @method GET
  173. * @tag
  174. * @header name:Authorization require:1 desc:Token
  175. * @param name:id type:int default:-- desc:出差记录id
  176. * @return name:start_date type:string default:-- desc:开始日期(格式:2022-11-01)
  177. * @return name:start_time type:string default:-- desc:开始时间(上午||下午)
  178. * @return name:end_date type:string default:-- desc:结束日期(格式:2022-11-01)
  179. * @return name:end_time type:string default:-- desc:结束时间(上午||下午)
  180. * @return name:reason type:string default:-- desc:出差事由
  181. * @return name:type_name type:string default:-- desc:出差类型
  182. * @return name:status type:int default:-- desc:状态:1审批中,2审批通过,3审批拒绝,9取消
  183. * @return name:user_id type:int default:-- desc:出差会员id
  184. * @return name:document type:string default:-- desc:附件(文件路径)
  185. * @return name:images type:string default:-- desc:图片(多张|隔开)
  186. * @return name:content type:string default:-- desc:出差详细内容(是否离深)
  187. * @return name:approve_list type:array default:-- desc:审批记录
  188. * @return name:approve_list.status type:int default:-- desc:审批状态:0待审批(未到该审批人审批),1审批中(已到该审批人审批,还未审批)2审批通过3审批拒绝
  189. * @return name:approve_list.approve_time type:string default:-- desc:审批时间
  190. * @return name:approve_list.remark type:string default:-- desc:审批备注
  191. * @return name:approve_list.user_name type:string default:-- desc:审批人
  192. * @return name:approve_list.headimg type:string default:-- desc:审批人头像
  193. * @return name:approve_list.time type:string default:-- desc:审批用时(上一次审批完成到本次审批的时间,单位秒)
  194. * @return name:peer_list type:array default:-- desc:同行员工
  195. * @return name:peer_list type:array default:-- desc:同行员工名
  196. * @return name:peer_list.name type:string default:-- desc:同行员工名
  197. * @return name:peer_list.headimg type:string default:-- desc:同行员工头像
  198. */
  199. public function getEvectionDetail()
  200. {
  201. $id = input('get.id');
  202. $detail = EvectionInfo::with('approveList')->where(['user_id'=>$this->user_id])->where(['id'=>$id])
  203. ->limit($this->off_set,$this->page_num)
  204. ->find()->toArray();
  205. $detail['images_arr'] = $detail['images'] ? explode('|',$detail['images']) : null;
  206. $peer_list = User::field('id,name,headimg')->where('id','in',$detail['peer_user'])->select()->toArray();
  207. $detail['peer_list'] = !empty($peer_list) ?$peer_list: null ;
  208. $this->success('ok',['detail'=>$detail]);
  209. }
  210. /**
  211. * @title 需要我审批的
  212. * @desc 需要我审批的
  213. * @author qc
  214. * @url /api/Evection/getApproveLeave
  215. * @method POST
  216. * @tag
  217. * @header name:Authorization require:1 desc:Token
  218. * @param name:page type:int default:-- desc:页数
  219. * @param name:page_num type:int default:-- desc:每页数量
  220. * @return name:id type:int default:-- desc:出差记录id
  221. * @return name:start_date type:string default:-- desc:开始日期(格式:2022-11-01)
  222. * @return name:start_time type:string default:-- desc:开始时间(上午||下午)
  223. * @return name:end_date type:string default:-- desc:结束日期(格式:2022-11-01)
  224. * @return name:end_time type:string default:-- desc:结束时间(上午||下午)
  225. * @return name:document type:string default:-- desc:附件(文件路径)
  226. * @return name:images type:string default:-- desc:图片(多张|隔开)
  227. * @return name:content type:string default:-- desc:出差详细内容(是否离深)
  228. * @return name:reason type:string default:-- desc:出差事由
  229. * @return name:approve_status type:int default:-- desc:审批状态
  230. * @return name:approve_time type:string default:-- desc:审批时间(1审批中2审批通过3审批拒绝)
  231. * @return name:remark type:string default:-- desc:审批备注
  232. *
  233. */
  234. public function getApproveLeave()
  235. {
  236. $list = LeaveApprove::field('i.*,p.status approve_status,p.approve_time,p.remark')
  237. ->alias('p')
  238. ->where(['p.approve_user'=>$this->user_id])
  239. ->where('p.status','>','0')
  240. ->leftJoin('EvectionInfo i','p.leave_id = i.id')
  241. ->limit($this->off_set,$this->page_num)
  242. ->select()->toArray();
  243. array_walk($list,function (&$v){
  244. $v['images_arr'] = $v['image'] ? explode('|',$v['image']) : null;
  245. });
  246. $this->success('ok',['list'=>$list]);
  247. }
  248. /**
  249. * @title 审批出差记录
  250. * @desc 审批出差记录
  251. * @author qc
  252. * @url /api/Evection/approveLeave
  253. * @method POST
  254. * @tag
  255. * @header name:Authorization require:1 desc:Token
  256. * @param name:approve_id type:string default:-- desc:审批记录id
  257. * @param name:status type:string default:-- desc:审批状态(2审批通过3审批拒绝)
  258. * @param name:remark type:string default:-- desc:审批备注
  259. */
  260. public function approveLeave()
  261. {
  262. $approve_id = input('post.approve_id');
  263. $status = input('post.status');
  264. $remark = input('post.remark');
  265. $res = ApproveService::approveLeave($approve_id,$this->user_id,$status,$remark);
  266. if(!$res['ret_val']) $this->error($res['msg']);
  267. $this->success('审批完成');
  268. }
  269. /**
  270. * @title 撤销出差申请
  271. * @desc 撤销出差申请
  272. * @author qc
  273. * @url /api/Evection/cancelApply
  274. * @method POST
  275. * @tag
  276. * @header name:Authorization require:1 desc:Token
  277. * @param name:id type:int default:-- desc:出差记录id
  278. *
  279. */
  280. public function cancelApply()
  281. {
  282. $id = input('post.id');
  283. $apply_info = EvectionInfo::where('id',$id)->where('user_id|apply_user',$this->user_id)->find();
  284. if(!$apply_info)$this->error('出差记录有误');
  285. $apply_info->status = 9;
  286. $apply_info->save();
  287. $this->success('撤销成功');
  288. }
  289. }