ApproveInfoService.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. <?php
  2. namespace app\common\service;
  3. use app\common\constant\CommonConstant;
  4. use app\common\model\Approve;
  5. use app\common\model\ApproveCopy;
  6. use app\common\model\ApproveEvectionPeerUser;
  7. use app\common\model\ApproveInfo;
  8. use app\common\model\Department;
  9. use app\common\model\User;
  10. use think\Db;
  11. use think\Exception;
  12. /**
  13. * 审批申请服务类
  14. */
  15. class ApproveInfoService
  16. {
  17. /**
  18. * 申请/重新发起
  19. *
  20. * @param integer $id 申请ID
  21. * @param integer $module 模块类型
  22. * @param array $params
  23. * @param mixed $user 用户信息
  24. **/
  25. public static function create($id, $module, $params, $user)
  26. {
  27. $userid = $user['userid'];
  28. // 编辑
  29. if ($id > 0) {
  30. $info = ApproveInfo::field('user_id,is_deleted', true)
  31. ->where('user_id', $userid)
  32. ->where('is_deleted', CommonConstant::IS_DELETED_0)
  33. ->with(['moduleInfo'])
  34. ->find($id);
  35. if (!$info) {
  36. throw new Exception('申请记录不存在或已删除');
  37. }
  38. if (!$info->module_info) {
  39. throw new Exception(CommonConstant::get_module_list()[$module] . '记录不存在或已删除');
  40. }
  41. if ($info->status != CommonConstant::STATUS_4) {
  42. throw new Exception('非审批驳回状态无法操作');
  43. }
  44. }
  45. $order_no = get_order_sn($user['id']);
  46. $approve_user = explode(',', $params['approve_user']);
  47. $copy_user = explode(',', $params['copy_user']);
  48. $approve_num = count($approve_user);
  49. $data = [
  50. 'module' => $module,
  51. 'user_id' => $userid,
  52. 'department' => $user['department'],
  53. 'status' => CommonConstant::STATUS_2,
  54. 'approve_num' => $approve_num,
  55. 'cur_num' => 0,
  56. 'order_no' => $order_no,
  57. 'apply_date' => date("Y-m-d"),
  58. 'reason' => $params['reason'],
  59. 'type' => $params['type'],
  60. 'desc' => $params['desc'],
  61. 'start_time' => $params['start_time'],
  62. 'end_time' => $params['end_time'],
  63. ];
  64. if ($id > 0) {
  65. // 编辑审批申请
  66. $save_data = [
  67. 'create_at' => date('Y-m-d H:i:s'),
  68. ];
  69. $data = array_merge($data, $save_data);
  70. $info->save($data);
  71. // 编辑对应模块
  72. self::create_module($id, $module, $params, $info, 'update');
  73. // 编辑审批抄送
  74. self::create_approve($id, $approve_user, $copy_user, 'update');
  75. } else {
  76. // 添加审批申请
  77. $info = ApproveInfo::create($data);
  78. $info_id = $info->id;
  79. // 添加对应模块
  80. $module_data = self::create_module($info_id, $module, $params, [], 'create');
  81. $info->save(['module_id' => $module_data->id]);
  82. // 添加审批抄送
  83. self::create_approve($info_id, $approve_user, $copy_user, 'create');
  84. }
  85. }
  86. // 添加对应模块
  87. public static function create_module($info_id, $module, $params, $info, $type)
  88. {
  89. $data = [];
  90. switch ($module) {
  91. case CommonConstant::MODULE_1:
  92. $data['info_id'] = $info_id;
  93. $data['reason'] = $params['reason'];
  94. $data['type'] = $params['type'];
  95. $data['total_amount'] = $params['total_amount'];
  96. $data['apply_date'] = $params['apply_date'];
  97. $data['document'] = $params['document'];
  98. $data['images'] = $params['images'];
  99. $data['pay_type'] = $params['pay_type'];
  100. break;
  101. case CommonConstant::MODULE_2:
  102. $data['info_id'] = $info_id;
  103. $data['type'] = $params['type'];
  104. $data['word_size'] = $params['word_size'];
  105. $data['desc'] = $params['desc'];
  106. $data['number'] = $params['number'];
  107. $data['reason'] = $params['reason'];
  108. $data['remark'] = $params['remark'];
  109. $data['document'] = $params['document'];
  110. break;
  111. case CommonConstant::MODULE_3:
  112. $data['info_id'] = $info_id;
  113. $data['document'] = $params['document'];
  114. $data['images'] = $params['images'];
  115. $data['remark'] = $params['remark'];
  116. break;
  117. case CommonConstant::MODULE_4:
  118. $data['info_id'] = $info_id;
  119. $data['reason'] = $params['reason'];
  120. $data['document'] = $params['document'];
  121. $data['remark'] = $params['remark'];
  122. break;
  123. case CommonConstant::MODULE_5:
  124. $data['info_id'] = $info_id;
  125. $data['reason'] = $params['reason'];
  126. $data['start_time'] = $params['start_time'];
  127. $data['end_time'] = $params['end_time'];
  128. $data['document'] = $params['document'];
  129. $data['images'] = $params['images'];
  130. $data['type'] = $params['type'];
  131. $data['is_who'] = $params['is_who'];
  132. $data['remark'] = $params['remark'];
  133. break;
  134. case CommonConstant::MODULE_6:
  135. $data['info_id'] = $info_id;
  136. $data['type'] = $params['type'];
  137. $data['start_time'] = $params['start_time'];
  138. $data['end_time'] = $params['end_time'];
  139. $data['start_am'] = $params['start_am'];
  140. $data['end_am'] = $params['end_am'];
  141. $data['time'] = $params['time'];
  142. $data['reason'] = $params['reason'];
  143. $data['document'] = $params['document'];
  144. $data['remark'] = $params['remark'];
  145. break;
  146. case CommonConstant::MODULE_7:
  147. $data['info_id'] = $info_id;
  148. $data['reason'] = $params['reason'];
  149. $data['start_time'] = $params['start_time'];
  150. $data['reach_address'] = $params['reach_address'];
  151. $data['end_time'] = $params['end_time'];
  152. $data['end_address'] = $params['end_address'];
  153. $data['document'] = $params['document'];
  154. $data['images'] = $params['images'];
  155. break;
  156. case CommonConstant::MODULE_8:
  157. $data['info_id'] = $info_id;
  158. $data['type'] = $params['type'];
  159. $data['reason'] = $params['reason'];
  160. $data['desc'] = $params['desc'];
  161. $data['images'] = $params['images'];
  162. break;
  163. case CommonConstant::MODULE_9:
  164. $data['info_id'] = $info_id;
  165. $data['type'] = $params['type'];
  166. $data['reason'] = $params['reason'];
  167. $data['desc'] = $params['desc'];
  168. $data['number'] = $params['number'];
  169. $data['scope'] = $params['scope'];
  170. $data['legal_opinion'] = $params['legal_opinion'];
  171. $data['document'] = $params['document'];
  172. $data['remark'] = $params['remark'];
  173. break;
  174. case CommonConstant::MODULE_10:
  175. $data['info_id'] = $info_id;
  176. $data['founder'] = $params['founder'];
  177. $data['desc'] = $params['desc'];
  178. $data['serial_number'] = $params['serial_number'];
  179. $data['reason'] = $params['reason'];
  180. $data['apply_date'] = $params['apply_date'];
  181. $data['remark'] = $params['remark'];
  182. $data['degree'] = $params['degree'];
  183. $data['document'] = $params['document'];
  184. break;
  185. case CommonConstant::MODULE_11:
  186. $data['info_id'] = $info_id;
  187. $data['department'] = $params['department'];
  188. $data['reason'] = $params['reason'];
  189. $data['department_sign'] = $params['department_sign'];
  190. $data['remark'] = $params['remark'];
  191. $data['document'] = $params['document'];
  192. $data['desc'] = $params['desc'];
  193. $data['apply_date'] = $params['apply_date'];
  194. $data['serial_number'] = $params['serial_number'];
  195. break;
  196. }
  197. if ($type == 'update') {
  198. $module_result = $info->module_info->save($data);
  199. } else {
  200. $models = CommonConstant::get_module_model_list();
  201. $model = $models[$module];
  202. $module_result = $model::create($data);
  203. }
  204. switch ($module) {
  205. case CommonConstant::MODULE_5:
  206. self::create_peer_user($info_id, $params['peer_user'], $type);
  207. break;
  208. }
  209. return $module_result;
  210. }
  211. // 添加同行人员
  212. public static function create_peer_user($info_id, $params, $type)
  213. {
  214. if ($type == 'update') {
  215. ApproveEvectionPeerUser::where('info_id', $info_id)->delete();
  216. }
  217. if (!$params) {
  218. return true;
  219. }
  220. $data = [];
  221. foreach ($params as $value) {
  222. $data[] = [
  223. 'info_id' => $info_id,
  224. 'is_who' => $value['is_who'],
  225. 'user_id' => isset($value['user_id']) ? $value['user_id'] : '',
  226. 'name' => $value['name'],
  227. 'desc' => isset($value['desc']) ? $value['desc'] : '',
  228. ];
  229. }
  230. ApproveEvectionPeerUser::insertAll($data);
  231. }
  232. // 添加审批抄送
  233. public static function create_approve($info_id, $approve_user, $copy_user, $type)
  234. {
  235. if ($type == 'update') {
  236. Approve::where('info_id', $info_id)->delete();
  237. ApproveCopy::where('info_id', $info_id)->delete();
  238. }
  239. $data = [];
  240. $copy_data = [];
  241. $flow_num = 0;
  242. $copy_num = 0;
  243. $create_at = date('Y-m-d H:i:s');
  244. // 审批人
  245. foreach ($approve_user as $key => $value) {
  246. $flow_num++;
  247. $data[] = [
  248. 'info_id' => $info_id,
  249. 'create_at' => $create_at,
  250. 'status' => $flow_num == 1 ? CommonConstant::STATUS_2 : CommonConstant::STATUS_1,
  251. 'approve_flow' => $flow_num,
  252. 'approve_user' => $value,
  253. 'approve_time' => $create_at,
  254. ];
  255. }
  256. // 抄送人
  257. foreach ($copy_user as $key => $value) {
  258. $copy_num++;
  259. $copy_data[] = [
  260. 'info_id' => $info_id,
  261. 'create_at' => $create_at,
  262. 'approve_flow' => $copy_num,
  263. 'approve_user' => $value,
  264. ];
  265. }
  266. if ($data) {
  267. Approve::insertAll($data);
  268. }
  269. if ($copy_data) {
  270. ApproveCopy::insertAll($copy_data);
  271. }
  272. }
  273. /**
  274. * 我的申请记录
  275. *
  276. * @param integer $module 模块类型
  277. * @param integer $status 审批状态
  278. * @param string $search 搜索
  279. * @param integer $offset 起始位置
  280. * @param integer $length 查询数量
  281. * @param mixed $user 用户信息
  282. **/
  283. public static function get_list($module, $status, $search, $offset, $length, $user)
  284. {
  285. if (!array_key_exists($module, CommonConstant::get_module_list())) {
  286. return [];
  287. }
  288. if (!array_key_exists($status, CommonConstant::get_status_list())) {
  289. return [];
  290. }
  291. $userid = $user['userid'];
  292. $list = ApproveInfo::field('module,module_id,user_id,is_deleted', true)
  293. ->where('module', $module)
  294. ->where('user_id', $userid)
  295. ->where('status', $status)
  296. ->where('is_deleted', CommonConstant::IS_DELETED_0)
  297. ->when($search, function ($query) use ($search) {
  298. $query->where('order_no|reason', 'like', '%' . $search . '%');
  299. });
  300. $list = self::get_with($list, $module, $status);
  301. $list = $list->limit($offset, $length)
  302. ->order('id desc')
  303. ->select();
  304. return $list;
  305. }
  306. /**
  307. * 详情/信息
  308. *
  309. * @param integer $id 申请ID
  310. * @param mixed $user 用户信息 有数据=审批申请详情,没有数据=审批详情
  311. * @param string $type 类型:detail=详情,info=信息
  312. **/
  313. public static function get_detail($id, $user, $type)
  314. {
  315. $where = $user ? ['user_id' => $user['userid']] : [];
  316. $info = ApproveInfo::field('is_deleted', true)
  317. ->where($where)
  318. ->where('is_deleted', CommonConstant::IS_DELETED_0);
  319. if ($type == 'detail') {
  320. $info->with([
  321. 'moduleInfo',
  322. 'approve' => function ($query) {
  323. $query->field('is_deleted,create_at', true)
  324. ->with(['user' => function ($query) {
  325. $query->field('userid,headimg,name');
  326. }]);
  327. },
  328. 'approveCopy' => function ($query) {
  329. $query->field('is_deleted,create_at', true)
  330. ->with(['user' => function ($query) {
  331. $query->field('userid,headimg,name');
  332. }]);
  333. }
  334. ]);
  335. $info = $info->find($id);
  336. if ($info) {
  337. if (!$user) {
  338. // 审批申请人信息
  339. $approve_info_user = User::field('userid,name')->where('userid', $info['user_id'])->find();
  340. $info['approve_info_user'] = $approve_info_user;
  341. }
  342. $department_data = Department::field('dept_id,name')->where('dept_id', 'in', $info['department'])->select();
  343. $info['department_data'] = $department_data;
  344. }
  345. } else {
  346. $info->with(['moduleInfo']);
  347. $info = $info->find($id);
  348. }
  349. $info = self::get_item($info, $type);
  350. return $info;
  351. }
  352. public static function get_with($list, $module, $status)
  353. {
  354. switch ($module) {
  355. case CommonConstant::MODULE_1:
  356. case CommonConstant::MODULE_2:
  357. case CommonConstant::MODULE_3:
  358. case CommonConstant::MODULE_4:
  359. if (in_array($status, [CommonConstant::STATUS_2, CommonConstant::STATUS_4])) {
  360. // 审批中或审批驳回 才关联 审批人信息
  361. $list = $list->with([
  362. 'approveOne' => function ($query) use ($status) {
  363. $query->field('id,info_id,status,approve_user')
  364. ->where('status', $status)
  365. ->with(['user' => function ($query) {
  366. $query->field('userid,name');
  367. }]);
  368. }
  369. ]);
  370. }
  371. break;
  372. case CommonConstant::MODULE_5:
  373. if (in_array($status, [CommonConstant::STATUS_2, CommonConstant::STATUS_4])) {
  374. // 审批中或审批驳回 才关联 审批人信息
  375. $list = $list->with([
  376. 'peer_user' => function ($query) {
  377. $query->field('id,info_id,name');
  378. },
  379. 'approveOne' => function ($query) use ($status) {
  380. $query->field('id,info_id,status,approve_user')
  381. ->where('status', $status)
  382. ->with(['user' => function ($query) {
  383. $query->field('userid,name');
  384. }]);
  385. }
  386. ]);
  387. } else {
  388. $list = $list->with([
  389. 'peer_user' => function ($query) {
  390. $query->field('id,info_id,name');
  391. },
  392. ]);
  393. }
  394. break;
  395. case CommonConstant::MODULE_6:
  396. case CommonConstant::MODULE_7:
  397. case CommonConstant::MODULE_8:
  398. case CommonConstant::MODULE_9:
  399. case CommonConstant::MODULE_10:
  400. case CommonConstant::MODULE_11:
  401. if (in_array($status, [CommonConstant::STATUS_2, CommonConstant::STATUS_4])) {
  402. // 审批中或审批驳回 才关联 审批人信息
  403. $list = $list->with([
  404. 'approveOne' => function ($query) use ($status) {
  405. $query->field('id,info_id,status,approve_user')
  406. ->where('status', $status)
  407. ->with(['user' => function ($query) {
  408. $query->field('userid,name');
  409. }]);
  410. }
  411. ]);
  412. }
  413. break;
  414. }
  415. return $list;
  416. }
  417. public static function get_item($info, $type)
  418. {
  419. $module = $info['module'];
  420. switch ($module) {
  421. case CommonConstant::MODULE_5:
  422. if ($type == 'detail') {
  423. $info['peer_user'] = $info->peerUser()->field('id,info_id,name')->select();
  424. } else {
  425. $info->peerUser;
  426. }
  427. break;
  428. }
  429. return $info;
  430. }
  431. /**
  432. * 操作方法
  433. *
  434. * @param integer $id 申请ID
  435. * @param mixed $user 用户信息
  436. * @param string $type 类型:urging=催办,cancel=撤销
  437. */
  438. public static function make($id, $user, $type)
  439. {
  440. $userid = $user['userid'];
  441. $info = ApproveInfo::field('id,module,status')
  442. ->where('user_id', $userid)
  443. ->where('is_deleted', CommonConstant::IS_DELETED_0)
  444. ->find($id);
  445. if (!$info) {
  446. throw new Exception(CommonConstant::get_module_list()[$info->module] . '记录不存在或已删除');
  447. }
  448. switch ($type) {
  449. case 'urging':
  450. if ($info->status != CommonConstant::STATUS_2) {
  451. throw new Exception('其他人已操作');
  452. }
  453. // 钉钉接口 TODO
  454. break;
  455. case 'cancel':
  456. if ($info->status != CommonConstant::STATUS_4) {
  457. throw new Exception('非审批驳回状态无法操作');
  458. }
  459. $info->status = CommonConstant::STATUS_5;
  460. $info->save();
  461. break;
  462. }
  463. }
  464. }