OaService.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Construction;
  4. use App\Model\Depart;
  5. use App\Model\Employee;
  6. use App\Model\EmployeeTeamPermission;
  7. use App\Model\Oa;
  8. use App\Model\OaOrder;
  9. use App\Model\OaOrderSub;
  10. use App\Model\OaOrderSubEmployee;
  11. use App\Model\OaReportOrder;
  12. use App\Model\OaReportOrderEmployee;
  13. use App\Model\OaSub;
  14. use App\Model\OaSubEmployee;
  15. use App\Model\OaSubReportEmployee;
  16. use App\Model\OaSubRule;
  17. use App\Model\SysMenu;
  18. use App\Service\Weixin\WxSendMessageService;
  19. use Illuminate\Support\Facades\DB;
  20. use Illuminate\Support\Facades\Log;
  21. class OaService extends Service
  22. {
  23. public $user;
  24. public function __construct($user = '')
  25. {
  26. parent::__construct();
  27. $this->user = $user;
  28. }
  29. public function oaList($data,$user)
  30. {
  31. $list = Oa::from('oa as o')
  32. ->leftjoin('sys_menu as s', 's.id', 'o.menu_id')
  33. ->select('o.id', 'o.menu_id', 'o.crt_time', 's.title','o.channel')
  34. ->where('o.del_time', 0);
  35. $list = $this->limit($list, '', $data);
  36. $list = $this->fillData($list);
  37. return [true, $list];
  38. }
  39. public function fillData($data) {
  40. if (empty($data['data'])) return $data;
  41. foreach ($data['data'] as $key => $value){
  42. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']): '';
  43. }
  44. return $data;
  45. }
  46. public function oaDetail($data)
  47. {
  48. $id = $data['id'];
  49. $oa = Oa::where('id', $id)->first();
  50. $list = OaSub::where('oa_id', $id)->where('del_time', 0)->get()->toArray();
  51. $oa_sub_ids = [];
  52. foreach ($list as $v) {
  53. $oa_sub_ids[] = $v['id'];
  54. }
  55. $oaRule = OaSubRule::wherein('oa_sub_id', $oa_sub_ids)->get()->toArray();
  56. $oaEmployee = OaSubEmployee::wherein('oa_sub_id', $oa_sub_ids)->get()->toArray();
  57. $oaReportEmployee = OaSubReportEmployee::wherein('oa_sub_id', $oa_sub_ids)->get()->toArray();
  58. $oaRuleKey = [];
  59. $oaEmployeeKey = [];
  60. $oaReportEmployeeKey = [];
  61. foreach ($oaRule as $v) {
  62. $oaRuleKey[$v['oa_sub_id']][] = [
  63. 'value' => $v['value'],
  64. 'key' => $v['key'],
  65. 'opera' => $v['formula'] == '==' ? '==' : $v['formula'],
  66. ];
  67. }
  68. $employee_key_list = Employee::pluck('emp_name', 'id')->toArray();
  69. foreach ($oaEmployee as $v) {
  70. $oaEmployeeKey[$v['oa_sub_id']][] = [
  71. 'id' => $v['employee_id'],
  72. 'emp_name' => $employee_key_list[$v['employee_id']],
  73. ];
  74. }
  75. foreach ($oaReportEmployee as $v) {
  76. $oaReportEmployeeKey[$v['oa_sub_id']][] = [
  77. 'id' => $v['employee_id'],
  78. 'emp_name' => $employee_key_list[$v['employee_id']],
  79. ];
  80. }
  81. $return = [];
  82. foreach ($list as $v) {
  83. $return[$v['sort']][] = [
  84. 'emp_id' => $oaEmployeeKey[$v['id']],
  85. 'copy_id' => $oaReportEmployeeKey[$v['id']] ?? [],
  86. 'is_copy' => isset($oaReportEmployeeKey[$v['id']]) && !empty($oaReportEmployeeKey[$v['id']]),
  87. 'index' => $v['h5_key'],
  88. 'set' => isset($oaRuleKey[$v['id']]) ? $oaRuleKey[$v['id']] : [],
  89. ];
  90. }
  91. $detail = [];
  92. foreach ($return as $k => $v) {
  93. $children = [];
  94. foreach ($v as $vv) {
  95. $children[] = [
  96. 'set' => $vv['set'],
  97. 'emp_id' => $vv['emp_id'],
  98. 'copy_id' => $vv['copy_id'],
  99. 'is_copy' => $vv['is_copy'],
  100. 'index' => $vv['index'],
  101. ];
  102. }
  103. $detail[] = ['children' => $children];
  104. }
  105. return [true, ['data' => $detail, 'menu_id' => $oa->menu_id, 'title' => $oa->title]];
  106. }
  107. public function oaUserDetail($data)
  108. {
  109. $detail = [
  110. 'detail' => [
  111. [
  112. 'key' => 'area',
  113. 'value' => '南区',
  114. 'formula' => 'dengyu',
  115. ], [
  116. 'key' => 'num',
  117. 'value' => '40',
  118. 'formula' => 'dayu',
  119. ], [
  120. 'key' => 'brand',
  121. 'value' => 'A,B,C',
  122. 'formula' => 'baohan',
  123. ],
  124. ],
  125. 'click' => [
  126. 'area',
  127. 'num',
  128. 'brand',
  129. ],
  130. 'string' => '(area 并且 num) 或者 num'
  131. ];
  132. return [true, $detail];
  133. }
  134. public function oaParam($data)
  135. {
  136. $detail = [
  137. [
  138. 'key' => 'area',
  139. 'value' => '地区',
  140. ], [
  141. 'key' => 'num',
  142. 'value' => '数量',
  143. ], [
  144. 'key' => 'brand',
  145. 'value' => '品牌',
  146. ],
  147. ];
  148. return [true, $detail];
  149. }
  150. public function oaFormula($data)
  151. {
  152. $detail = [
  153. [
  154. 'key' => 'dengyu',
  155. 'value' => '等于',
  156. ], [
  157. 'key' => 'dayu',
  158. 'value' => '大于',
  159. ], [
  160. 'key' => 'baohan',
  161. 'value' => '包含',
  162. ],
  163. ];
  164. return [true, $detail];
  165. }
  166. public function oaAdd($data)
  167. {
  168. $oa = new Oa();
  169. try {
  170. DB::beginTransaction();
  171. $oa->menu_id = $data['menu_id'];
  172. $oa->type = $data['type'];
  173. $oa->title = $data['title'] ?? '';
  174. $oa->channel = $this->user['depart_top'][0]['depart_id'];
  175. $oa->save();
  176. $id = $oa->id;
  177. $insert = [];
  178. foreach ($data['detail'] as $v) {
  179. foreach ($v['employee_list'] as $vv) {
  180. $insert[] = [
  181. 'oa_id' => $id,
  182. 'remark' => $v['remark'],
  183. 'employee_id' => $vv['employee_id'],
  184. 'sort' => $v['sort'],
  185. 'type' => $v['type'],
  186. 'crt_time' => time(),
  187. 'upd_time' => time(),
  188. 'area_id' => $vv['area_id'],
  189. ];
  190. }
  191. }
  192. OaSub::insert($insert);
  193. DB::commit();
  194. } catch (\Exception $e) {
  195. DB::rollBack();
  196. return [false, $e->getLine() . ':' . $e->getMessage()];
  197. }
  198. return [true, '保存成功!'];
  199. }
  200. public function oaEdit($data, $user)
  201. {
  202. $id = $data['id'] ?? 0;
  203. $type = $data['type'] ?? 0;
  204. $first = Oa::where('del_time', 0)
  205. ->where('menu_id', $data['menu_id'])
  206. ->when(! empty($id), function ($query) use ($id) {
  207. return $query->where('id', '<>', $id);
  208. })
  209. ->when(! empty($type), function ($query) use ($type) {
  210. return $query->where('$type', $type);
  211. })
  212. ->first();
  213. if ($first) return [false, '菜单工作流已存在'];
  214. try {
  215. DB::beginTransaction();
  216. if (isset($data['id'])) $oa = Oa::where('id', $data['id'])->first();
  217. else $oa = new Oa();
  218. $oa->menu_id = $data['menu_id'];
  219. $oa->crt_employee_id = $user['id'];
  220. $oa->type = $data['type'] ?? 0;
  221. $oa->title = $data['title'] ?? '';
  222. $oa->save();
  223. $id = $oa->id;
  224. $oa_sub_id = OaSub::where('oa_id', $id)->where('del_time',0)->pluck('id')->toArray();
  225. OaSub::where('oa_id', $id)->update([
  226. 'del_time' => time()
  227. ]);
  228. //处理前端数据
  229. $this->dealOaData($data, $id, $oa_sub_id);
  230. DB::commit();
  231. } catch (\Exception $e) {
  232. DB::rollBack();
  233. return [false, $e->getLine() . $e->getMessage()];
  234. }
  235. return [true, ''];
  236. }
  237. public function dealOaData($data, $id, $oa_sub_id)
  238. {
  239. $data = $data['approval'];
  240. $detail = [];
  241. $sort = 0;
  242. foreach ($data as $v) {
  243. $sort++;
  244. foreach ($v['children'] as $vv) {
  245. $detail[] = [
  246. 'h5_key' => $vv['index'],
  247. 'emp_id' => $vv['emp_id'],
  248. 'copy_id' => $vv['copy_id'] ?? [],
  249. 'set' => $vv['set'],
  250. 'sort' => $sort,
  251. ];
  252. }
  253. }
  254. $oa_subs = [];
  255. foreach ($detail as $v) {
  256. $oa_subs[] = [
  257. 'crt_time' => time(),
  258. 'upd_time' => time(),
  259. 'sort' => $v['sort'],
  260. 'sub_id' => -1,
  261. 'remark' => '',
  262. 'oa_id' => $id,
  263. 'type' => 1,
  264. 'parent_id' => 0,
  265. 'h5_key' => $v['h5_key'],
  266. ];
  267. }
  268. OaSub::insert($oa_subs);
  269. $oa_sub = OaSub::where('oa_id', $id)->get()->toArray();
  270. $list_key = [];
  271. foreach ($oa_sub as $v) {
  272. $list_key[$v['h5_key']] = $v;
  273. }
  274. foreach ($list_key as $k => $v) {
  275. if ($v['sort'] == 1) continue;
  276. $len = strlen($k);
  277. foreach ($list_key as $kk => $vv) {
  278. if (strlen($kk) == ($len - 2) && substr($k, 0, $len - 2) == $kk) {
  279. $list_key[$k]['parent_id'] = $vv['id'];
  280. }
  281. }
  282. }
  283. $employee_list = [];
  284. $set_list = [];
  285. $report_list = [];
  286. foreach ($detail as $v) {
  287. if (isset($v['copy_id'])) {
  288. foreach ($v['copy_id'] as $vv) {
  289. $report_list[] = [
  290. 'employee_id' => $vv,
  291. 'oa_sub_id' => $list_key[$v['h5_key']]['id'],
  292. ];
  293. }
  294. }
  295. foreach ($v['emp_id'] as $vv) {
  296. $employee_list[] = [
  297. 'employee_id' => $vv,
  298. 'oa_sub_id' => $list_key[$v['h5_key']]['id'],
  299. ];
  300. }
  301. $n = 1;
  302. foreach ($v['set'] as $vv) {
  303. if ($vv['opera'] == '=') $v['opera'] = '==';
  304. if ($n > 1) $right_formula = '&&';
  305. else $right_formula = '';
  306. $set_list[] = [
  307. 'oa_sub_id' => $list_key[$v['h5_key']]['id'],
  308. 'key' => $vv['key'],
  309. 'value' => $vv['value'],
  310. 'sort' => $n,
  311. 'formula' => $vv['opera'],
  312. 'right_formula' => $right_formula,
  313. ];
  314. $n++;
  315. }
  316. }
  317. OaSubRule::wherein('oa_sub_id', $oa_sub_id)->delete();
  318. OaSubEmployee::wherein('oa_sub_id', $oa_sub_id)->delete();
  319. OaSubRule::insert($set_list);
  320. OaSubEmployee::insert($employee_list);
  321. if (!empty($report_list)) OaSubReportEmployee::insert($report_list);
  322. foreach ($list_key as $v) {
  323. if ($v['parent_id'] > 0) OaSub::where('id', $v['id'])->update([
  324. 'parent_id' => $v['parent_id']
  325. ]);
  326. }
  327. }
  328. public function oaDel($data)
  329. {
  330. $id = $data['id'];
  331. Oa::where('id', $id)->update([
  332. 'del_time' => time(),
  333. ]);
  334. OaSub::where('oa_id', $id)->update([
  335. 'del_time' => time(),
  336. ]);
  337. return [true, '删除成功'];
  338. }
  339. public function oaSubType($data)
  340. {
  341. $service = new CheckService();
  342. $list = $service->map;
  343. $return = [];
  344. foreach ($list as $k => $v) {
  345. $return[] = [
  346. 'id' => $k,
  347. 'title' => $v,
  348. ];
  349. }
  350. return [true, $return];
  351. }
  352. public function createOaOrder($data)
  353. {
  354. if (!isset($data['order_number'])) $data['order_number'] = $data['order_no'];
  355. $orderObject = $data['order_number'];
  356. $menu_id = $data['menu_id'];
  357. $order_no = $data['order_number'];
  358. $type = isset($data['opt_case']) ? $data['opt_case'] : 0;
  359. //特殊的审批
  360. $list = Oa::from('oa as o')
  361. ->leftJoin('oa_sub as os', 'os.oa_id', 'o.id')
  362. ->select('os.sort', 'os.type', 'os.sub_id')
  363. ->where('o.del_time', 0)
  364. ->where('o.sub_type', 2)
  365. ->where('os.del_time', 0)
  366. ->where('o.menu_id', $menu_id);
  367. if (!empty($type)) $list = $list->where('os.sort', 1);
  368. $list = $list->orderBy('os.sort')->get()->toArray();
  369. if(empty($list)){
  370. $list = Oa::from('oa as o')
  371. ->leftJoin('oa_sub as os', 'os.oa_id', 'o.id')
  372. ->select('os.sort', 'os.type', 'os.sub_id')
  373. ->where('o.del_time', 0)
  374. ->where('os.del_time', 0)
  375. ->where('o.channel', $this->user['depart_top'][0]['depart_id'])
  376. ->where('o.menu_id', $menu_id);
  377. if (!empty($type)) $list = $list->where('os.sort', 1);
  378. $list = $list->orderBy('os.sort')->get()->toArray();
  379. }
  380. if (empty($list)) {
  381. list($parent_status,$parent_msg) = $this->returnOa($order_no, 1, $type);
  382. if(!$parent_status) return [false, $parent_msg];
  383. return [true, ''];
  384. }
  385. try {
  386. DB::beginTransaction();
  387. list($employee_ids, $oa_sub_id,$order_detail) = $this->oaCommon($menu_id, ['order_number' => $orderObject], 1,0,$this->user);
  388. if (empty($employee_ids)) {
  389. list($parent_status,$parent_msg) = $this->returnOa($order_no, 1, $type);
  390. if(!$parent_status) {
  391. DB::rollBack();
  392. return [false, $parent_msg];
  393. }
  394. else{
  395. DB::commit();
  396. return [true, ''];
  397. }
  398. }
  399. $order = new OaOrder();
  400. $order->menu_id = $menu_id;
  401. $order->order_no = $order_no;
  402. $order->opt_case = $type;
  403. $order->save();
  404. $id = $order->id;
  405. $oa_order_sub = new OaOrderSub();
  406. $oa_order_sub->oa_order_id = $id;
  407. $oa_order_sub->sort = 1;
  408. $oa_order_sub->remark = '';
  409. $oa_order_sub->type = 1;
  410. $oa_order_sub->oa_sub_id = $oa_sub_id;
  411. $oa_order_sub->save();
  412. $oa_order_sub_id = $oa_order_sub->id;
  413. //组织数据
  414. $insert = [];
  415. foreach ($employee_ids as $employee_id) {
  416. $insert[] = [
  417. 'oa_order_id' => $id,
  418. 'oa_order_sub_id' => $oa_order_sub_id,
  419. 'employee_id' => $employee_id,
  420. ];
  421. }
  422. OaOrderSubEmployee::insert($insert);
  423. DB::commit();
  424. return [true, ''];
  425. } catch (\Exception $e) {
  426. DB::rollBack();
  427. $this->returnOa($order_no, 2, $type);
  428. return [false, $e->getLine() . ':' . $e->getMessage()];
  429. }
  430. }
  431. public function oaCommon($menu_id, $param, $sort = 1, $parent_id = 0,$user='')
  432. {
  433. $request = request();
  434. foreach ($param as $k => $v) {
  435. $request->$k = $v;
  436. }
  437. $all = $request->all();
  438. if (!isset($all['order_number'])) $request->merge($param);
  439. $detail = $this->oaGetData($menu_id, $request,$user);
  440. //特殊的审批
  441. $oa_id = Oa::where('menu_id',$menu_id)->where('del_time', 0)->where('sub_type',2)->value('id');
  442. if(empty($oa_id)) $oa_id = Oa::where('menu_id', $menu_id)->where('channel',$this->user['depart_top'][0]['depart_id'])->where('del_time', 0)->value('id');
  443. $parent_ids = [$parent_id, 0];
  444. if ($sort > 2) {
  445. $sorts = $sort - 1;
  446. $oa_sub_ids = OaSub::where('sort', '<', $sorts)->where('del_time', 0)->wherein('parent_id', $parent_ids)->pluck('id')->toArray();
  447. $parent_ids = array_merge($parent_ids, $oa_sub_ids);
  448. }
  449. $list = OaSub::where('oa_id', $oa_id)->where('del_time', 0)->where('sort', $sort)->wherein('parent_id', $parent_ids);
  450. $list = $list->select('*')->get()->toArray();
  451. if (empty($list)) return [[], '',$detail];
  452. $oa_sub_ids = [];
  453. $oa_sub_key = [];
  454. foreach ($list as $v) {
  455. $oa_sub_ids[] = $v['id'];
  456. $oa_sub_key[$v['id']] = $v;
  457. $rule_key_list[$v['id']] = [];
  458. }
  459. $rule_list = OaSubRule::wherein('oa_sub_id', $oa_sub_ids)->select('*')->get()->toArray();
  460. foreach ($rule_list as $v) {
  461. $rule_key_list[$v['oa_sub_id']][] = $v;
  462. }
  463. //规则开始判断
  464. $employee_ids = [];
  465. $oa_sub_id = 0;
  466. foreach ($rule_key_list as $k => $v) {
  467. $status = $this->formulaRule($v, $detail);
  468. if ($status) {
  469. if ($oa_sub_key[$k]['type'] == 2 && $oa_sub_key[$k]['sub_id'] > 0) {
  470. $employee_ids = EmployeeTeamPermission::where('team_id', $oa_sub_key[$k]['sub_id'])->pluck('employee_id')->toArray();
  471. } elseif ($oa_sub_key[$k]['sub_id'] == -1) {
  472. $employee_ids = OaSubEmployee::where('oa_sub_id', $oa_sub_key[$k]['id'])->pluck('employee_id')->toArray();
  473. } else {
  474. $employee_ids[] = [$oa_sub_key[$k]['sub_id']];
  475. }
  476. $oa_sub_id = $k;
  477. continue;
  478. }
  479. }
  480. return [$employee_ids, $oa_sub_id,$detail];
  481. }
  482. public function formulaRule($params, $detail)
  483. {
  484. $rule = '';
  485. // dd($params);
  486. if (empty($params)) return true;
  487. foreach ($params as $param) {
  488. if (!$param['key']) continue;
  489. if (!empty($param['right_formula'])) $rule .= ' ' . $param['right_formula'] . ' ';
  490. $rule .= '"' . $detail[$param['key']] . '"' . ' ' . $param['formula'] . ' ' . '"' . $param['value'] . '"';
  491. }
  492. // dd($rule);
  493. if (empty($rule)) return true;
  494. // var_dump($rule);
  495. if (eval("return $rule;")) {
  496. // var_dump($rule);die;
  497. return true;
  498. } else return false;
  499. }
  500. public function oaCheck($data, $user)
  501. {
  502. $user_id = $user['id'];
  503. $id = $data['id'];
  504. $state = $data['state'];
  505. if ($state == 0) $state = 2;
  506. $remark = $data['remark'];
  507. $detail = OaOrderSub::from('oa_order_sub as s')
  508. ->leftJoin('oa_order_sub_employee as e', 'e.oa_order_sub_id', 's.id')
  509. ->where('e.employee_id', $user_id)->where('s.state', 0)
  510. ->where('s.id', $id)
  511. ->select('s.oa_order_id', 'sort', 'oa_sub_id', 's.id')->first();
  512. if (empty($detail)) return [false, '没有审核权限'];
  513. $detail = $detail->toArray();
  514. $oaOrder = OaOrder::where('id', $detail['oa_order_id'])->first();
  515. try {
  516. DB::beginTransaction();
  517. $sys_menu = SysMenu::where('id', $oaOrder->menu_id)->value('title') ?? "";
  518. switch ($state) {
  519. //审核通过
  520. case 1:
  521. $sort = $detail['sort'] + 1;
  522. list($employee_ids, $oa_sub_id,$order_detail) = $this->oaCommon($oaOrder->menu_id, ['order_number' => $oaOrder->order_no], $sort, $detail['oa_sub_id'],$user);
  523. if (empty($employee_ids)) {
  524. $oaOrder->state = 2;
  525. $oaOrder->save();
  526. list($parent_status,$parent_msg) = $this->returnOa($oaOrder->order_no, 1, $oaOrder->opt_case);
  527. if(!$parent_status){
  528. DB::rollBack();
  529. return [false,$parent_msg];
  530. }
  531. } else {
  532. $oaOrder->state = 1;
  533. $oaOrder->save();
  534. $oa_order_sub = new OaOrderSub();
  535. $oa_order_sub->oa_order_id = $oaOrder->id;
  536. $oa_order_sub->sort = $sort;
  537. $oa_order_sub->remark = '';
  538. $oa_order_sub->type = 1;
  539. $oa_order_sub->oa_sub_id = $oa_sub_id;
  540. $oa_order_sub->save();
  541. $oa_order_sub_id = $oa_order_sub->id;
  542. $insert = [];
  543. $emp_map = Employee::whereIn('id',$employee_ids)->pluck('emp_name','id')->toArray();
  544. foreach ($employee_ids as $employee_id) {
  545. $emp_tmp = $emp_map[$employee_id] ?? "";
  546. $insert[] = [
  547. 'oa_order_id' => $oaOrder->id,
  548. 'oa_order_sub_id' => $oa_order_sub_id,
  549. 'employee_id' => $employee_id,
  550. ];
  551. }
  552. OaOrderSubEmployee::insert($insert);
  553. }
  554. break;
  555. //审核驳回
  556. case 2:
  557. if ($detail['sort'] == 1 || true) {
  558. $oaOrder->state = 3;
  559. $oaOrder->save();
  560. list($parent_status,$parent_msg) = $this->returnOa($oaOrder->order_no, 2, $oaOrder->opt_case);
  561. if(! $parent_status){
  562. DB::rollBack();
  563. return [false,$parent_msg];
  564. }
  565. }
  566. OaOrderSub::where('sort', ($detail['sort'] - 1))->where('oa_order_id', $oaOrder->id)->update([
  567. 'state' => 0,
  568. 'remark' => $remark ?? "",
  569. ]);
  570. break;
  571. }
  572. //更新状态
  573. OaOrderSub::where('id', $id)->update([
  574. 'state' => $state,
  575. 'remark' => $remark,
  576. ]);
  577. //抄送
  578. $this->report($oaOrder, $detail['oa_sub_id'],$user_id,$sys_menu);
  579. DB::commit();
  580. return [true, ''];
  581. } catch (\Exception $e) {
  582. DB::rollBack();
  583. return [false, $e->getLine() . ':' . $e->getMessage()];
  584. }
  585. }
  586. //发送公众号消息
  587. public function sendWxOaCheckMessage($send_data){
  588. if(empty($send_data)) return ;
  589. $config = config('morequery');
  590. $path = $config['detail_message'] ?? [];
  591. foreach ($send_data as $value) {
  592. //小程序详情页路径
  593. $tmp_path = $path[$value['menu_id']] ?? "";
  594. if(! empty($tmp_path)) $tmp_path .= $value['order_number'];
  595. //发送
  596. $this->sendWxMsg($value['employee_id'],$value['type'],$value['state'],$value['menu_id'],$value['tmp_data'],$tmp_path);
  597. }
  598. }
  599. public function report($oaOrder, $oa_sub_id,$user_id,$sys_menu)
  600. {
  601. $oa_sub_report_employee = OaSubReportEmployee::where('oa_sub_id', $oa_sub_id)->select('*')->get()->toArray();
  602. if (! empty($oa_sub_report_employee)) {
  603. $list = [];
  604. $report = new OaReportOrder();
  605. $report->menu_id = $oaOrder->menu_id;
  606. $report->order_no = $oaOrder->order_no;
  607. $report->opt_case = $oaOrder->opt_case;
  608. $report->user_id = $user_id;
  609. $report->save();
  610. foreach ($oa_sub_report_employee as $v) {
  611. $list[] = [
  612. 'employee_id' => $v['employee_id'],
  613. 'oa_report_order_id' => $report->id,
  614. ];
  615. }
  616. OaReportOrderEmployee::insert($list);
  617. }
  618. }
  619. public function returnOa($order_no, $type, $opt_case)
  620. {
  621. $service = new CheckService();
  622. list($bool, $msg) = $service->createRecordAndInventory([
  623. 'order_number' => $order_no,
  624. 'type' => $type,
  625. 'opt_case' => $opt_case,
  626. 'user_data' => $this->user,
  627. ]);
  628. return [$bool, $msg];
  629. }
  630. public function oaGetData($menu_id, $request,$user='')
  631. {
  632. $api = SysMenu::where('id', $menu_id)->value('api');
  633. $param = SysMenu::where('id', $menu_id)->value('api_params');
  634. $param = json_decode($param,true);
  635. $param['state'] = null;
  636. $param['menu_id'] = $menu_id;
  637. $param['id'] = null;
  638. $request->merge($param);
  639. $path = $this->getMenu();
  640. $control = '\\' . $path[$api]["controller"];
  641. $act = $path[$api]["act"];
  642. $new = new $control();
  643. $detail = $new->$act($request);
  644. return $detail['data']['data'][0] ?? [];
  645. }
  646. public function getMenu()
  647. {
  648. $app = App();
  649. $routes = $app->routes->getRoutes();
  650. $path = [];
  651. foreach ($routes as $k => $value) {
  652. if (!isset($value->action['controller'])) continue;
  653. $act = explode('@', $value->action['controller']);
  654. if (!isset($act[1])) continue;
  655. $path[$value->uri]['act'] = $act[1];
  656. $path[$value->uri]['controller'] = $act[0];
  657. }
  658. return $path;
  659. }
  660. public function oaOrderList($data)
  661. {
  662. $order_no = $data['order_no'];
  663. $menu_id = $data['menu_id'];
  664. $oa = OaOrder::where('order_no', $order_no)->first();
  665. if (empty($oa)) return [false, '审核不存在'];
  666. $list = OaOrderSub::where('oa_order_id', $oa->id)->orderBy('sort', 'asc')->select('*')->get()->toArray();
  667. return [true, $list];
  668. }
  669. public function oaOrderState($data, $user)
  670. {
  671. $user_id = $user['id'];
  672. $order_no = $data['order_no'];
  673. $menu_id = $data['menu_id'];
  674. $detail = OaOrder::where('order_no', $order_no)
  675. ->orderBy('id', 'desc')
  676. ->where('menu_id', $menu_id)
  677. ->first();
  678. if (empty($detail)) return [true, ['state' => 0]];
  679. if ($detail->state == 2) return [true, ['state' => 0]];
  680. $oa_detail = OaOrderSubEmployee::where('employee_id', $user_id)->where('oa_order_id', $detail->id)->pluck('oa_order_sub_id')->toArray();
  681. if (empty($oa_detail)) return [true, ['state' => 0]];
  682. $state = OaOrderSub::wherein('id', $oa_detail)->where('state', '<>', 2)->orderBy('sort', 'desc')->first();
  683. if (in_array($state->state, [0, 2])) return [true, ['state' => 1, 'id' => $state->id]];
  684. return [true, ['state' => 0]];
  685. }
  686. public function checkAllOver($data)
  687. {
  688. $order_no = $data['order_number'];
  689. $menu_id = $data['menu_id'];
  690. $op_case = $data['opt_case'];
  691. list($parent_status,$parent_msg) = $this->returnOa($order_no, 3, $op_case);
  692. if(!$parent_status) return [false,$parent_msg];
  693. return [true, ''];
  694. }
  695. public function oaCheckMove($data, $user_id)
  696. {
  697. $id = $data['id'];
  698. $employee_id = $data['employee_id'];
  699. if (empty($employee_id)) return [false, '用户不存在'];
  700. $oaOrderSub = OaOrderSub::where('id', $id)->first();
  701. OaOrderSubEmployee::where('oa_order_sub_id', $oaOrderSub->id)->delete();
  702. $add = [
  703. 'oa_order_id' => $oaOrderSub->oa_order_id,
  704. 'oa_order_sub_id' => $oaOrderSub->id,
  705. 'employee_id' => $employee_id
  706. ];
  707. $oaOrder = OaOrder::where('id', $oaOrderSub->oa_order_id)->first();
  708. OaOrderSubEmployee::insert($add);
  709. return [true, ''];
  710. }
  711. public function oaSubUserDetail($data)
  712. {
  713. $order_no = $data['order_no'];
  714. $first = OaOrder::where('order_no', $order_no)->first();
  715. if (empty($first)) return [true, []];
  716. $oa_order_id = $first->id;
  717. $oa_order_sub_id = OaOrderSub::where('oa_order_id', $oa_order_id)->orderBy('sort', 'desc')->value('id');
  718. $employee_list = Employee::pluck('emp_name', 'id')->toArray();
  719. $oa_order_sub_employee_ids = OaOrderSubEmployee::where('oa_order_sub_id', $oa_order_sub_id)->pluck('employee_id')->toArray();
  720. $list = [];
  721. foreach ($oa_order_sub_employee_ids as $v) {
  722. $list[] = $employee_list[$v];
  723. }
  724. return [true, $list];
  725. }
  726. public function oaGetTeamDetail($data)
  727. {
  728. $order_no = $data['order_no'];
  729. $oa_order_id = OaOrder::where('order_no', $order_no)->pluck('id')->toArray();
  730. if (empty($oa_order_id)) return [true, []];
  731. $list = OaOrderSub::wherein('oa_order_id', $oa_order_id)->select('*')->orderBy('id', 'asc')->get()->toArray();
  732. $subEmployeeList = OaOrderSubEmployee::wherein('oa_order_id', $oa_order_id)->select('*')->get()->toArray();
  733. $emp_id_key_list = [];
  734. $employee_key_list = Employee::pluck('emp_name', 'id')->toArray();
  735. foreach ($subEmployeeList as $v) {
  736. $emp_id_key_list[$v['oa_order_sub_id']][] = [
  737. 'id' => $v['employee_id'],
  738. 'emp_name' => $employee_key_list[$v['employee_id']] ?? '',
  739. ];
  740. }
  741. $return = [];
  742. foreach ($list as $v) {
  743. $return[] = [
  744. 'sort' => $v['sort'],
  745. 'team' => $emp_id_key_list[$v['id']],
  746. 'remark' => $v['remark'] ?? '',
  747. 'state' => $v['state'],
  748. ];
  749. }
  750. return [true, $return];
  751. }
  752. public function oaSubRemark($data)
  753. {
  754. $order_no = $data['order_no'];
  755. $first = OaOrder::where('del_time', 0)->where('order_no', $order_no)->orderBy('id', 'desc')->first();
  756. if (empty($first)) return [true, []];
  757. $oa_order_id = $first->id;
  758. $remark = OaOrderSub::where('oa_order_id', $oa_order_id)->orderBy('sort', 'desc')->value('remark');
  759. return [true, $remark];
  760. }
  761. public function reportList($data, $user)
  762. {
  763. $id = $user['id'];
  764. $list = OaReportOrder::from('oa_report_order_employee as e')
  765. ->leftJoin('oa_report_order as o','o.id','e.oa_report_order_id')
  766. ->leftJoin('oa_order as oo','oo.order_no','o.order_no')
  767. ->leftJoin('employee as ee','ee.id','o.user_id')
  768. ->where('e.employee_id',$id)
  769. ->groupBy('oo.id')->orderBy('oo.id','desc')
  770. ->select('oo.*','o.id as sid','o.check','o.user_id','ee.emp_name');
  771. $list = $this->limit($list,'',$data);
  772. return [true, $list];
  773. }
  774. public function reportCheck($data){
  775. $id = $data['sid'];
  776. OaReportOrder::wherein('id',$id)->update([
  777. 'check' => 1
  778. ]);
  779. return [true,''];
  780. }
  781. public function reportCount($data,$user){
  782. $id = $user['id'];
  783. $list = OaReportOrder::from('oa_report_order_employee as e')
  784. ->leftJoin('oa_report_order as o','o.id','e.oa_report_order_id')
  785. ->leftJoin('oa_order as oo','oo.order_no','o.order_no')
  786. ->where('e.employee_id',$id)
  787. ->where('o.check',0)
  788. ->groupBy('oo.id')->orderBy('oo.id','desc')
  789. ->select('oo.*','o.id as sid','o.check')->get()->toArray();
  790. return [true, ['total'=>count($list),'list'=>$list]];
  791. }
  792. public function reportTime($data){
  793. return [true,['time'=>'20小时10分钟']];
  794. }
  795. public function sendWxMsg($user_id,$type,$state,$menu_id,$order_data,$pagepath = ""){
  796. $service = new WxSendMessageService();
  797. file_put_contents('msg_result.txt',date('Y-m-d H:i:s') . "入参:" . json_encode([$user_id,$type,$state,$menu_id,$order_data,$pagepath]). PHP_EOL,8);
  798. list($status, $msg) = $service->wx_sendMsg($user_id,$type,$state,$menu_id,$order_data,$pagepath);
  799. file_put_contents('msg_result.txt',date('Y-m-d H:i:s') . "结果:" . $msg . PHP_EOL,8);
  800. }
  801. public function getConstructionOaOrderState($order_no, $user, $menu_id)
  802. {
  803. $user_id = $user['id'];
  804. $return = [];
  805. foreach ($order_no as $value){
  806. $return[$value] = ['oa_state' => 0];
  807. }
  808. $detail = OaOrder::whereIn('order_no', $order_no)
  809. ->where('menu_id', $menu_id)
  810. ->where('del_time', 0)
  811. ->orderBy('id', 'desc')
  812. ->get()->toArray();
  813. if (empty($detail)) $return;
  814. $final_detail = $oa_order = $oa_order2 = $map = [];
  815. foreach ($detail as $value){
  816. if(! isset($final_detail[$value['order_no']])){
  817. $map[$value['id']] = $value['order_no'];
  818. if($value['state'] == 2) {
  819. $oa_order[] = $value['id'];
  820. }else{
  821. $oa_order2[] = $value['id'];
  822. }
  823. $final_detail[$value['order_no']] = $value['id'];
  824. }
  825. }
  826. if (count($oa_order) == count($final_detail)) return $return;
  827. $oa_detail = OaOrderSubEmployee::where('employee_id', $user_id)
  828. ->whereIn('oa_order_id', $oa_order2)
  829. ->pluck('oa_order_sub_id','oa_order_id')
  830. ->toArray();
  831. if(empty($oa_detail)) return $return;
  832. $oa_detail_map = array_flip($oa_detail);
  833. $oa_detail_value = array_values($oa_detail);
  834. $state = OaOrderSub::whereIn('id', $oa_detail_value)
  835. ->where('state', '<>', 2)
  836. ->orderBy('sort', 'desc')
  837. ->get()->toArray();
  838. foreach ($state as $value){
  839. $oa_order_id_tmp = $oa_detail_map[$value['id']];
  840. $order_no_tmp = $map[$oa_order_id_tmp];
  841. if (in_array($value['state'], [0, 2])) {
  842. $return[$order_no_tmp] = ['oa_state' => 1, 'oa_id' => $value['id']];
  843. }else{
  844. $return[$order_no_tmp] = ['oa_state' => 0];
  845. }
  846. }
  847. return $return;
  848. }
  849. //获取订单审核人员名称
  850. public function getOaTeamDetailList($order_no)
  851. {
  852. if(empty($order_no)) return [];
  853. $orderNoGroups = OaOrder::whereIn('order_no', $order_no)
  854. ->get()
  855. ->groupBy('order_no');
  856. $maxIds = $orderNoGroups->map(function ($group) {
  857. return $group->max('id');
  858. });
  859. $map = $maxIds->toArray();
  860. if(empty($map)) return [];
  861. $map2 = array_flip($map);
  862. $oa_order_id = array_values($map);
  863. $list = OaOrderSub::whereIn('oa_order_id', $oa_order_id)
  864. ->where('state',0)
  865. ->select('id','state','oa_order_id')
  866. ->orderBy('id', 'asc')
  867. ->get()->toArray();
  868. $subEmployeeList = OaOrderSubEmployee::whereIn('oa_order_id', $oa_order_id)
  869. ->select('*')
  870. ->get()->toArray();
  871. $emp_id_key_list = [];
  872. $employee_key_list = Employee::whereIn('id',array_unique(array_column($subEmployeeList,'employee_id')))
  873. ->pluck('emp_name', 'id')
  874. ->toArray();
  875. foreach ($subEmployeeList as $v) {
  876. $emp_id_key_list[$v['oa_order_sub_id']][] = [
  877. 'id' => $v['employee_id'],
  878. 'emp_name' => $employee_key_list[$v['employee_id']] ?? '',
  879. ];
  880. }
  881. $return = [];
  882. foreach ($list as $v) {
  883. $order_no_tmp = $map2[$v['oa_order_id']] ?? "";
  884. if($v['state'] == 0 && ! isset($return[$order_no_tmp])){
  885. $emp_tmp = $emp_id_key_list[$v['id']] ?? [];
  886. $emp_tmp_str = implode('|',array_column($emp_tmp,'emp_name'));
  887. $return[$order_no_tmp] = $emp_tmp_str;
  888. }
  889. }
  890. return $return;
  891. }
  892. }