ProjectService.php 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Employee;
  4. use App\Model\Project;
  5. use App\Model\ProjectEmployee;
  6. use App\Model\ProjectStage;
  7. use App\Model\ProjectStageNode;
  8. use App\Model\ProjectStageNodeMission;
  9. use App\Model\ProjectStageNodeMissionDetail;
  10. use Illuminate\Support\Facades\DB;
  11. class ProjectService extends Service
  12. {
  13. public function getProjectEmployee($data, $type = 1){
  14. $data_id_column = ProjectEmployee::$type_id[$type] ?? "";
  15. if(empty($data_id_column)) return ['name' => "", 'name_id' => ""];
  16. if(is_array($data['id'])){
  17. $employee = ProjectEmployee::where('del_time',0)
  18. ->whereIn($data_id_column, $data['id'])
  19. ->where('type', $type)
  20. ->select($data_id_column, 'employee_id')
  21. ->get()->toArray();
  22. $employee_id = array_column($employee, 'employee_id');
  23. $man = Employee::whereIn('id', $employee_id)
  24. ->pluck('emp_name','id')
  25. ->toArray();
  26. $array = [];
  27. foreach ($employee as $value){
  28. $tmp = $man[$value['employee_id']] ?? "";
  29. if(isset($array[$value[$data_id_column]])){
  30. $array[$value[$data_id_column]]['name'] .= ',' . $tmp;
  31. $array[$value[$data_id_column]]['name_id'] .= ',' . $value['employee_id'];
  32. }else{
  33. $array[$value[$data_id_column]] = [
  34. 'name' => $tmp,
  35. 'name_id' => $value['employee_id'],
  36. ];
  37. }
  38. }
  39. return $array;
  40. }else{
  41. $employee = ProjectEmployee::where('del_time',0)
  42. ->where($data_id_column, $data['id'])
  43. ->where('type', $type)
  44. ->select('employee_id')
  45. ->get()->toArray();
  46. $employee = array_column($employee, 'employee_id');
  47. $man = Employee::whereIn('id', $employee)
  48. ->pluck('emp_name','id')
  49. ->toArray();
  50. $title = $title_id = "";
  51. foreach ($employee as $value){
  52. $tmp = $man[$value] ?? "";
  53. if($tmp) $title .= $tmp . ',';
  54. $title_id .= $value . ',';
  55. }
  56. $title = rtrim($title, ',');
  57. $title_id = rtrim($title_id, ',');
  58. return ['name' => $title, 'name_id' => $title_id];
  59. }
  60. }
  61. public function projectEmployee($data, $type = 0, $is_add = true){
  62. //关联字段
  63. $data_id_column = ProjectEmployee::$type_id[$type] ?? "";
  64. if(empty($data_id_column)) return;
  65. //关联类型
  66. $type_array = ProjectEmployee::$type_id_type[$type] ?? [];
  67. if(! $is_add) {
  68. ProjectEmployee::where('del_time',0)
  69. ->where($data_id_column, $data['id'])
  70. ->whereIn('type',$type_array)
  71. ->update(['del_time' => time()]);
  72. }
  73. if(! empty($data['employee_id'])){
  74. $array = [];
  75. foreach (ProjectEmployee::$type_id as $v){
  76. $array[$v] = 0;
  77. }
  78. if(isset($array[$data_id_column])) $array[$data_id_column] = $data['id'];
  79. $tmp = [
  80. 'employee_id' => 0,
  81. 'type' => $type,
  82. ];
  83. $tmp = array_merge($tmp, $array);
  84. $insert = [];
  85. $employee = explode(',', $data['employee_id']);
  86. foreach ($employee as $value){
  87. $tmp['employee_id'] = $value;
  88. $insert[] = $tmp;
  89. }
  90. ProjectEmployee::insert($insert);
  91. }
  92. }
  93. public function edit($data){
  94. list($status,$msg) = $this->projectRule($data,false);
  95. if(! $status) return [$status,$msg];
  96. DB::beginTransaction();
  97. try{
  98. $model = Project::where('id',$data['id'])->first();
  99. $model->order_number = $data['order_number'] ?? "";
  100. $model->title = $data['title'] ?? "";
  101. $model->importance = $data['importance'] ?? 0;
  102. $model->company = $data['company'] ?? "";
  103. $model->project_cycle = $data['project_cycle'] ?? 0;
  104. $model->business_director = $data['business_director'] ?? 0;
  105. $model->technical_director = $data['technical_director'] ?? 0;
  106. $model->online_director = $data['online_director'] ?? 0;
  107. $model->after_sale_director = $data['after_sale_director'] ?? 0;
  108. $model->project_amount = $data['project_amount'] ?? 0;
  109. $model->plan_start_time = $data['plan_start_time'] ?? 0;
  110. $model->plan_end_time = $data['plan_end_time'] ?? 0;
  111. $model->finish_time = $data['finish_time'] ?? 0;
  112. $model->budget = $data['budget'] ?? 0;
  113. $model->stage = $data['stage'] ?? 0;
  114. $model->save();
  115. $this->projectEmployee($data, ProjectEmployee::type_one, false);
  116. DB::commit();
  117. }catch (\Exception $exception){
  118. DB::rollBack();
  119. return [false,$exception->getMessage()];
  120. }
  121. return [true, ''];
  122. }
  123. public function add($data,$user){
  124. list($status,$msg) = $this->projectRule($data);
  125. if(! $status) return [$status,$msg];
  126. try{
  127. DB::beginTransaction();
  128. $model = new Project();
  129. $model->order_number = $data['order_number'] ?? "";
  130. $model->title = $data['title'] ?? "";
  131. $model->importance = $data['importance'] ?? 0;
  132. $model->company = $data['company'] ?? "";
  133. $model->project_cycle = $data['project_cycle'] ?? 0;
  134. $model->business_director = $data['business_director'] ?? 0;
  135. $model->technical_director = $data['technical_director'] ?? 0;
  136. $model->online_director = $data['online_director'] ?? 0;
  137. $model->after_sale_director = $data['after_sale_director'] ?? 0;
  138. $model->project_amount = $data['project_amount'] ?? 0;
  139. $model->plan_start_time = $data['plan_start_time'] ?? 0;
  140. $model->plan_end_time = $data['plan_end_time'] ?? 0;
  141. $model->finish_time = $data['finish_time'] ?? 0;
  142. $model->budget = $data['budget'] ?? 0;
  143. $model->stage = $data['stage'] ?? 0;
  144. $model->crt_id = $user['id'];
  145. $model->save();
  146. $data['id'] = $model->id;
  147. $this->projectEmployee($data, ProjectEmployee::type_one);
  148. DB::commit();
  149. }catch (\Exception $exception){
  150. DB::rollBack();
  151. return [false,$exception->getMessage()];
  152. }
  153. return [true, ''];
  154. }
  155. public function del($data){
  156. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  157. DB::beginTransaction();
  158. try {
  159. $this->projectEmployee($data, ProjectEmployee::type_one, false);
  160. Project::where('id',$data['id'])->update([
  161. 'del_time' => time()
  162. ]);
  163. ProjectStage::where('project_id',$data['id'])->where('del_time',0)->update([
  164. 'del_time' => time()
  165. ]);
  166. ProjectStageNode::where('project_id',$data['id'])->where('del_time',0)->update([
  167. 'del_time' => time()
  168. ]);
  169. ProjectStageNodeMission::where('project_id',$data['id'])->where('del_time',0)->update([
  170. 'del_time' => time()
  171. ]);
  172. ProjectStageNodeMissionDetail::where('project_id',$data['id'])->where('del_time',0)->update([
  173. 'del_time' => time()
  174. ]);
  175. DB::commit();
  176. }catch (\Exception $exception){
  177. DB::rollBack();
  178. return [false,$exception->getMessage()];
  179. }
  180. return [true,'删除成功'];
  181. }
  182. public function detail($data){
  183. if(empty($data['id'])) return [false, "ID不能为空"];
  184. $project = Project::where('id',$data['id'])->first();
  185. if(empty($project) || $project->del_time > 0) return [false, '项目不存在或已被删除'];
  186. $project = $project->toArray();
  187. //组织数据
  188. $emp_id = [$project['business_director'], $project['technical_director'], $project['online_director'], $project['after_sale_director'], $project['crt_id']];
  189. $emp_id = array_unique($emp_id);
  190. $emp_map = Employee::whereIn('id',$emp_id)->pluck('emp_name','id')->toArray();
  191. $start_time = $project['plan_start_time'] ? date("Y-m-d H:i",$project['plan_start_time']) : '';
  192. $end_time = $project['plan_end_time'] ? date("Y-m-d H:i",$project['plan_end_time']) : '';
  193. $project['plan_time'] = $start_time . '——' . $end_time;
  194. $project['crt_time'] = $project['crt_time'] ? date("Y-m-d H:i:s",$project['crt_time']): '';
  195. $project['finish_time'] = $project['finish_time'] ? date("Y-m-d",$project['finish_time']): '';
  196. $project['business_director_title'] = $emp_map[$project['business_director']] ?? "";
  197. $project['technical_director_title'] = $emp_map[$project['technical_director']] ?? "";
  198. $project['online_director_title'] = $emp_map[$project['online_director']] ?? "";
  199. $project['after_sale_director_title'] = $emp_map[$project['after_sale_director']] ?? "";
  200. $project['crt_name'] = $emp_map[$project['crt_id']] ?? "";
  201. //项目成员
  202. $return = $this->getProjectEmployee($data, ProjectEmployee::type_one);
  203. $project['employee_title'] = $return['name'] ?? "";
  204. $project['employee_id'] = $return['name_id'] ?? "";
  205. //任务报告
  206. $project_stage_node_mission_detail = ProjectStageNodeMissionDetail::where('del_time',0)
  207. ->where('project_id',$data['id'])
  208. ->get()->toArray();
  209. $employee_id = array_unique(array_column($project_stage_node_mission_detail,'crt_id'));
  210. $emp_map = Employee::whereIn('id',$employee_id)->pluck('emp_name','id')->toArray();
  211. $project_stage_node_mission_detail_map = [];
  212. foreach ($project_stage_node_mission_detail as $key => $value){
  213. $start_time = $value['start_time'] ? date("Y-m-d H:i",$value['start_time']) : '';
  214. $end_time = $value['end_time'] ? date("Y-m-d H:i",$value['end_time']) : '';
  215. $project_stage_node_mission_detail[$key]['time'] = $start_time . '——' . $end_time;
  216. $project_stage_node_mission_detail[$key]['crt_name'] = $emp_map[$value['crt_id']] ?? "";
  217. $project_stage_node_mission_detail_map[$value['project_stage_node_mission_id']][] = $project_stage_node_mission_detail[$key];
  218. }
  219. //任务
  220. $project_stage_node_mission = ProjectStageNodeMission::where('del_time',0)
  221. ->where('project_id',$data['id'])
  222. ->get()->toArray();
  223. $map = [];
  224. $project_stage_node_mission_id = array_column($project_stage_node_mission, 'id');
  225. foreach ($project_stage_node_mission_id as $value){
  226. //任务成员
  227. $return = $this->getProjectEmployee(['id' => $value], ProjectEmployee::type_four);
  228. $map[$value] = $return;
  229. }
  230. $project_stage_node_mission_map = [];
  231. foreach ($project_stage_node_mission as $key => $value){
  232. $tmp = $map[$value['id']] ?? [];
  233. $project_stage_node_mission[$key]['employee_title'] = $tmp['name'] ?? "";
  234. $project_stage_node_mission[$key]['employee_id'] = $tmp['name_id'] ?? "";
  235. $son = $project_stage_node_mission_detail_map[$value['id']] ?? [];
  236. $project_stage_node_mission[$key]['children'] = $son;
  237. $project_stage_node_mission_map[$value['project_stage_node_id']][] = $project_stage_node_mission[$key];
  238. }
  239. //节点
  240. $project_stage_node = ProjectStageNode::where('del_time',0)
  241. ->where('project_id',$data['id'])
  242. ->get()->toArray();
  243. $map = [];
  244. $project_stage_node_id = array_column($project_stage_node, 'id');
  245. foreach ($project_stage_node_id as $value){
  246. //节点成员
  247. $return = $this->getProjectEmployee(['id' => $value], ProjectEmployee::type_three);
  248. $map[$value] = $return;
  249. }
  250. $project_stage_node_map = [];
  251. foreach ($project_stage_node as $key => $value){
  252. $start_time = $value['plan_start_time'] ? date("Y-m-d H:i",$value['plan_start_time']) : '';
  253. $end_time = $value['plan_end_time'] ? date("Y-m-d H:i",$value['plan_end_time']) : '';
  254. $project_stage_node[$key]['plan_time'] = $start_time . '——' . $end_time;
  255. $project_stage_node[$key]['start_time'] = $value['start_time'] ? date("Y-m-d",$value['start_time']): '';
  256. $tmp = $map[$value['id']] ?? [];
  257. $project_stage_node[$key]['employee_title'] = $tmp['name'] ?? "";
  258. $project_stage_node[$key]['employee_id'] = $tmp['name_id'] ?? "";
  259. $son = $project_stage_node_mission_map[$value['id']] ?? [];
  260. $project_stage_node[$key]['children'] = $son;
  261. $project_stage_node_map[$value['project_stage_id']][] = $project_stage_node[$key];
  262. }
  263. //阶段
  264. $project_stage = ProjectStage::where('del_time',0)
  265. ->where('project_id',$data['id'])
  266. ->get()->toArray();
  267. $map = [];
  268. $project_stage_id = array_column($project_stage, 'id');
  269. foreach ($project_stage_id as $value){
  270. //阶段成员
  271. $return = $this->getProjectEmployee(['id' => $value], ProjectEmployee::type_two);
  272. $map[$value] = $return;
  273. }
  274. foreach ($project_stage as $key => $value){
  275. $start_time = $value['plan_start_time'] ? date("Y-m-d H:i",$value['plan_start_time']) : '';
  276. $end_time = $value['plan_end_time'] ? date("Y-m-d H:i",$value['plan_end_time']) : '';
  277. $project_stage[$key]['plan_time'] = $start_time . '——' . $end_time;
  278. $project_stage[$key]['start_time'] = $value['start_time'] ? date("Y-m-d",$value['start_time']): '';
  279. $tmp = $map[$value['id']] ?? [];
  280. $project_stage[$key]['employee_title'] = $tmp['name'] ?? "";
  281. $project_stage[$key]['employee_id'] = $tmp['name_id'] ?? "";
  282. $project_stage[$key]['children'] = $project_stage_node_map[$value['id']] ?? [];
  283. }
  284. // $project['project_stage'] = $project_stage;
  285. // $project['project_stage_node'] = $project_stage_node;
  286. // $project['project_stage_node_mission'] = $project_stage_node_mission;
  287. // $project['project_stage_node_mission_detail'] = $project_stage_node_mission_detail;
  288. $project['children'] = $project_stage;
  289. return [true, $project];
  290. }
  291. public function projectList($data,$user){
  292. $model = Project::where('del_time',0)
  293. ->select('id','title','importance','company','project_cycle','business_director','technical_director','online_director','after_sale_director','project_amount','plan_start_time','plan_end_time','finish_time','budget','stage','crt_time','crt_id','order_number')
  294. ->orderBy('id','desc');
  295. if(! empty($data['title'])) $model->where('title',$data['title']);
  296. if(! empty($data['order_number'])) $model->where('order_number',$data['order_number']);
  297. if(! empty($data['company'])) $model->where('company',$data['company']);
  298. if(isset($data['importance'])) $model->where('importance',$data['importance']);
  299. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  300. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  301. $model->where('crt_time','>=',$return[0]);
  302. $model->where('crt_time','<=',$return[1]);
  303. }
  304. $list = $this->limit($model,'',$data);
  305. $list = $this->organizationData($list);
  306. return [true, $list];
  307. }
  308. public function organizationData($data) {
  309. if (empty($data['data'])) return $data;
  310. $project = array_column($data['data'], 'id');
  311. $map = $this->getProjectEmployee(['id' => $project], ProjectEmployee::type_one);
  312. $emp_id = array_unique(array_merge_recursive(array_column($data['data'], 'business_director'), array_column($data['data'], 'technical_director'),array_column($data['data'], 'online_director'),array_column($data['data'], 'after_sale_director'),array_column($data['data'],'crt_id')));
  313. $emp_map = Employee::whereIn('id',$emp_id)->pluck('emp_name','id')->toArray();
  314. //获取当前阶段 当前阶段节点 已收金额
  315. $other_map = $this->getProjectOtherMessage($project);
  316. foreach ($data['data'] as $key => $value){
  317. $start_time = $value['plan_start_time'] ? date("Y-m-d H:i",$value['plan_start_time']) : '';
  318. $end_time = $value['plan_end_time'] ? date("Y-m-d H:i",$value['plan_end_time']) : '';
  319. $data['data'][$key]['plan_time'] = $start_time . '——' . $end_time;
  320. $data['data'][$key]['crt_name'] = $emp_map[$value['crt_id']] ?? "";
  321. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']): '';
  322. $data['data'][$key]['finish_time'] = $value['finish_time'] ? date("Y-m-d",$value['finish_time']): '';
  323. $data['data'][$key]['business_director_title'] = $emp_map[$value['business_director']] ?? "";
  324. $data['data'][$key]['technical_director_title'] = $emp_map[$value['technical_director']] ?? "";
  325. $data['data'][$key]['online_director_title'] = $emp_map[$value['online_director']] ?? "";
  326. $data['data'][$key]['after_sale_director_title'] = $emp_map[$value['after_sale_director']] ?? "";
  327. $tmp = $map[$value['id']] ?? [];
  328. $data['data'][$key]['employee_title'] = $tmp['name'] ?? "";
  329. $data['data'][$key]['employee_id'] = $tmp['name_id'] ?? "";
  330. //获取当前阶段 当前阶段节点 已收金额
  331. $tmp = $other_map[$value['id']] ?? [];
  332. $stage = $tmp['stage'] ?? [];
  333. $node = $tmp['node'] ?? [];
  334. $data['data'][$key]['current_stage_id'] = $stage['id'] ?? '';
  335. $data['data'][$key]['current_stage_title'] = $stage['title'] ?? '';
  336. $data['data'][$key]['current_stage_node_id'] = $node['id'] ?? '';
  337. $data['data'][$key]['current_stage_node_title'] = $node['title'] ?? '';
  338. $data['data'][$key]['receipt_amount'] = $tmp['receipt'] ?? '';
  339. }
  340. return $data;
  341. }
  342. public function projectRule(&$data, $is_check = true){
  343. if(empty($data['order_number'])) return [false, '项目编号不能为空'];
  344. if(empty($data['title'])) return [false,'项目名称不能为空'];
  345. if(isset($data['project_cycle'])){
  346. if(! is_numeric($data['project_cycle']) || floatval($data['project_cycle']) < 0.0) return [false, '项目周期请输入合法的数字(天数)'];
  347. }
  348. if(isset($data['project_amount'])){
  349. $res = $this->checkNumber($data['project_amount']);
  350. if(! $res) return [false, '项目金额请输入不超过两位小数并且大于的等于0的数值'];
  351. }
  352. if(isset($data['budget'])){
  353. $res = $this->checkNumber($data['budget']);
  354. if(! $res) return [false, '预算请输入不超过两位小数并且大于的等于0的数值'];
  355. }
  356. if(isset($data['stage'])){
  357. $res = $this->checkNumber($data['budget'], 0);
  358. if(! $res) return [false, '阶段数请输入大于等于0的整数'];
  359. }
  360. if(! empty($data['plan_time'][0]) && ! empty($data['plan_time'][1])){
  361. $data['plan_start_time'] = $this->changeDateToDateMin($data['plan_time'][0]);
  362. $data['plan_end_time'] = $this->changeDateToDateMin($data['plan_time'][1]);
  363. }
  364. if(! empty($data['finish_time'])) $data['finish_time'] = $this->changeDateToDate($data['finish_time']);
  365. if($is_check){
  366. $bool = Project::where('order_number',$data['order_number'])->exists();
  367. }else{
  368. if(empty($data['id'])) return [false, '项目ID不能为空'];
  369. $boolean = Project::where('id',$data['id'])->where('del_time',0)->exists();
  370. if(! $boolean) return [false, '项目不存在或已被删除'];
  371. $bool = Project::where('order_number',$data['order_number'])
  372. ->where('id','<>',$data['id'])
  373. ->exists();
  374. }
  375. if($bool) return [false, '项目编号已存在'];
  376. return [true, ''];
  377. }
  378. public function editStage($data){
  379. list($status,$msg) = $this->stageRule($data,false);
  380. if(! $status) return [$status,$msg];
  381. DB::beginTransaction();
  382. try{
  383. $model = ProjectStage::where('id',$data['id'])->first();
  384. $model->project_id = $data['project_id'] ?? 0;
  385. $model->title = $data['title'] ?? "";
  386. $model->plan_start_time = $data['plan_start_time'] ?? 0;
  387. $model->plan_end_time = $data['plan_end_time'] ?? 0;
  388. $model->start_time = $data['start_time'] ?? 0;
  389. $model->receivable_amount = $data['receivable_amount'] ?? 0;
  390. $model->receipt_amount = $data['receipt_amount'] ?? 0;
  391. $model->save();
  392. $this->projectEmployee($data, ProjectEmployee::type_two, false);
  393. DB::commit();
  394. }catch (\Exception $exception){
  395. DB::rollBack();
  396. return [false,$exception->getMessage()];
  397. }
  398. return [true, ''];
  399. }
  400. public function addStage($data,$user){
  401. list($status,$msg) = $this->stageRule($data);
  402. if(! $status) return [$status,$msg];
  403. try{
  404. DB::beginTransaction();
  405. $model = new ProjectStage();
  406. $model->project_id = $data['project_id'] ?? 0;
  407. $model->title = $data['title'] ?? "";
  408. $model->plan_start_time = $data['plan_start_time'] ?? 0;
  409. $model->plan_end_time = $data['plan_end_time'] ?? 0;
  410. $model->start_time = $data['start_time'] ?? 0;
  411. $model->receivable_amount = $data['receivable_amount'] ?? 0;
  412. $model->receipt_amount = $data['receipt_amount'] ?? 0;
  413. $model->save();
  414. $data['id'] = $model->id;
  415. $this->projectEmployee($data, ProjectEmployee::type_two);
  416. DB::commit();
  417. }catch (\Exception $exception){
  418. DB::rollBack();
  419. return [false,$exception->getMessage()];
  420. }
  421. return [true, ''];
  422. }
  423. public function delStage($data){
  424. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  425. DB::beginTransaction();
  426. try {
  427. $this->projectEmployee($data, ProjectEmployee::type_two, false);
  428. ProjectStage::where('id',$data['id'])->where('del_time',0)->update([
  429. 'del_time' => time()
  430. ]);
  431. ProjectStageNode::where('project_stage_id',$data['id'])->where('del_time',0)->update([
  432. 'del_time' => time()
  433. ]);
  434. ProjectStageNodeMission::where('project_stage_id',$data['id'])->where('del_time',0)->update([
  435. 'del_time' => time()
  436. ]);
  437. ProjectStageNodeMissionDetail::where('project_stage_id',$data['id'])->where('del_time',0)->update([
  438. 'del_time' => time()
  439. ]);
  440. DB::commit();
  441. }catch (\Exception $exception){
  442. DB::rollBack();
  443. return [false,$exception->getMessage()];
  444. }
  445. return [true,'删除成功'];
  446. }
  447. public function stageRule(&$data, $is_check = true){
  448. if(empty($data['project_id'])) return [false,'项目ID不能为空'];
  449. $bool = Project::where('id',$data['project_id'])->where('del_time',0)->exists();
  450. if(! $bool) return [false, '该项目不存在或已被删除'];
  451. if(empty($data['title'])) return [false, '阶段名称不能为空'];
  452. if(isset($data['receivable_amount'])){
  453. $res = $this->checkNumber($data['receivable_amount']);
  454. if(! $res) return [false, '阶段应收金额请输入不超过两位小数并且大于的等于0的数值'];
  455. }
  456. if(isset($data['receipt_amount'])){
  457. $res = $this->checkNumber($data['receipt_amount']);
  458. if(! $res) return [false, '阶段实收金额请输入不超过两位小数并且大于的等于0的数值'];
  459. }
  460. if(! empty($data['plan_time'][0]) && ! empty($data['plan_time'][1])){
  461. $data['plan_start_time'] = $this->changeDateToDateMin($data['plan_time'][0]);
  462. $data['plan_end_time'] = $this->changeDateToDateMin($data['plan_time'][1]);
  463. }
  464. if(! empty($data['start_time'])) $data['start_time'] = $this->changeDateToDate($data['start_time']);
  465. if($is_check){
  466. $bool = ProjectStage::where('project_id',$data['project_id'])
  467. ->where('title',$data['title'])
  468. ->exists();
  469. }else{
  470. if(empty($data['id'])) return [false, '阶段ID不能为空'];
  471. $boolean = ProjectStage::where('id',$data['id'])->where('del_time',0)->exists();
  472. if(! $boolean) return [false, '项目阶段不存在或已被删除'];
  473. $bool = ProjectStage::where('project_id',$data['project_id'])
  474. ->where('id','<>',$data['id'])
  475. ->where('title',$data['title'])
  476. ->exists();
  477. }
  478. if($bool) return [false, '项目阶段名已存在'];
  479. return [true, ''];
  480. }
  481. public function projectStageList($data,$user){
  482. $model = ProjectStage::where('del_time',0)
  483. ->select('id','title','project_id','plan_start_time','plan_end_time','start_time','receivable_amount','receipt_amount','crt_time')
  484. ->orderBy('id','desc');
  485. if(! empty($data['title'])) $model->where('title',$data['title']);
  486. if(! empty($data['project_title'])) {
  487. $project_id = $this->searchProject(['title' => $data['project_title']]);
  488. $model->whereIn('project_id', $project_id);
  489. }
  490. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  491. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  492. $model->where('crt_time','>=',$return[0]);
  493. $model->where('crt_time','<=',$return[1]);
  494. }
  495. $list = $this->limit($model,'',$data);
  496. $list = $this->organizationStageData($list);
  497. return [true, $list];
  498. }
  499. public function organizationStageData($data) {
  500. if (empty($data['data'])) return $data;
  501. $map = $this->getProjectEmployee(['id' => array_column($data['data'], 'id')], ProjectEmployee::type_two);
  502. $project_map = $this->getProject(array_column($data['data'],'project_id'));
  503. foreach ($data['data'] as $key => $value){
  504. $start_time = $value['plan_start_time'] ? date("Y-m-d H:i",$value['plan_start_time']) : '';
  505. $end_time = $value['plan_end_time'] ? date("Y-m-d H:i",$value['plan_end_time']) : '';
  506. $data['data'][$key]['plan_time'] = $start_time . '——' . $end_time;
  507. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']): '';
  508. $data['data'][$key]['start_time'] = $value['start_time'] ? date("Y-m-d",$value['start_time']): '';
  509. $data['data'][$key]['project_title'] = $project_map[$value['project_id']] ?? "";
  510. $tmp = $map[$value['id']] ?? [];
  511. $data['data'][$key]['employee_title'] = $tmp['name'] ?? "";
  512. $data['data'][$key]['employee_id'] = $tmp['name_id'] ?? "";
  513. }
  514. return $data;
  515. }
  516. public function editStageNode($data){
  517. list($status,$msg) = $this->stageRuleNode($data,false);
  518. if(! $status) return [$status,$msg];
  519. DB::beginTransaction();
  520. try{
  521. $model = ProjectStageNode::where('id',$data['id'])->first();
  522. $model->project_id = $data['project_id'] ?? 0;
  523. $model->project_stage_id = $data['project_stage_id'] ?? 0;
  524. $model->title = $data['title'] ?? "";
  525. $model->plan_start_time = $data['plan_start_time'] ?? 0;
  526. $model->plan_end_time = $data['plan_end_time'] ?? 0;
  527. $model->start_time = $data['start_time'] ?? 0;
  528. $model->save();
  529. $this->projectEmployee($data, ProjectEmployee::type_three, false);
  530. DB::commit();
  531. }catch (\Exception $exception){
  532. DB::rollBack();
  533. return [false,$exception->getMessage()];
  534. }
  535. return [true, ''];
  536. }
  537. public function addStageNode($data,$user){
  538. list($status,$msg) = $this->stageRuleNode($data);
  539. if(! $status) return [$status,$msg];
  540. try{
  541. DB::beginTransaction();
  542. $model = new ProjectStageNode();
  543. $model->project_id = $data['project_id'] ?? 0;
  544. $model->project_stage_id = $data['project_stage_id'] ?? 0;
  545. $model->title = $data['title'] ?? "";
  546. $model->plan_start_time = $data['plan_start_time'] ?? 0;
  547. $model->plan_end_time = $data['plan_end_time'] ?? 0;
  548. $model->start_time = $data['start_time'] ?? 0;
  549. $model->save();
  550. $data['id'] = $model->id;
  551. $this->projectEmployee($data, ProjectEmployee::type_three);
  552. DB::commit();
  553. }catch (\Exception $exception){
  554. DB::rollBack();
  555. return [false,$exception->getMessage()];
  556. }
  557. return [true, ''];
  558. }
  559. public function delStageNode($data){
  560. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  561. DB::beginTransaction();
  562. try {
  563. $this->projectEmployee($data, ProjectEmployee::type_three, false);
  564. ProjectStageNode::where('id',$data['id'])->where('del_time',0)->update([
  565. 'del_time' => time()
  566. ]);
  567. ProjectStageNodeMission::where('project_stage_node_id',$data['id'])->where('del_time',0)->update([
  568. 'del_time' => time()
  569. ]);
  570. ProjectStageNodeMissionDetail::where('project_stage_node_id',$data['id'])->where('del_time',0)->update([
  571. 'del_time' => time()
  572. ]);
  573. DB::commit();
  574. }catch (\Exception $exception){
  575. DB::rollBack();
  576. return [false,$exception->getMessage()];
  577. }
  578. return [true,'删除成功'];
  579. }
  580. public function stageRuleNode(&$data, $is_check = true){
  581. if(empty($data['project_stage_id'])) return [false,'项目阶段ID不能为空'];
  582. $stage = ProjectStage::where('id',$data['project_stage_id'])->where('del_time',0)->first();
  583. if(empty($stage)) return [false, '该项目阶段不存在或已被删除'];
  584. $stage = $stage->toArray();
  585. $data['project_id'] = $stage['project_id'];
  586. if(empty($data['title'])) return [false, '节点名称不能为空'];
  587. if(! empty($data['plan_time'][0]) && ! empty($data['plan_time'][1])){
  588. $data['plan_start_time'] = $this->changeDateToDateMin($data['plan_time'][0]);
  589. $data['plan_end_time'] = $this->changeDateToDateMin($data['plan_time'][1]);
  590. }
  591. if(! empty($data['start_time'])) $data['start_time'] = $this->changeDateToDate($data['start_time']);
  592. if($is_check){
  593. $bool = ProjectStageNode::where('project_id',$data['project_id'])
  594. ->where('project_stage_id',$data['project_stage_id'])
  595. ->where('title',$data['title'])
  596. ->exists();
  597. }else{
  598. if(empty($data['id'])) return [false, '阶段节点ID不能为空'];
  599. $boolean = ProjectStageNode::where('id',$data['id'])->where('del_time',0)->exists();
  600. if(! $boolean) return [false, '项目阶段节点不存在或已被删除'];
  601. $bool = ProjectStageNode::where('project_id',$data['project_id'])
  602. ->where('project_stage_id',$data['project_stage_id'])
  603. ->where('id','<>',$data['id'])
  604. ->where('title',$data['title'])
  605. ->exists();
  606. }
  607. if($bool) return [false, '项目阶段节点名已存在'];
  608. return [true, ''];
  609. }
  610. public function projectStageNodeList($data,$user){
  611. $model = ProjectStageNode::where('del_time',0)
  612. ->select('id','project_stage_id','project_id','plan_start_time','plan_end_time','start_time','crt_time','title')
  613. ->orderBy('id','desc');
  614. if(! empty($data['project_stage_title'])) {
  615. $project_stage_id = $this->searchProjectStage(['title' => $data['project_stage_title']]);
  616. $model->whereIn('project_stage_id', $project_stage_id);
  617. }
  618. if(! empty($data['project_title'])) {
  619. $project_id = $this->searchProject(['title' => $data['project_title']]);
  620. $model->whereIn('project_id', $project_id);
  621. }
  622. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  623. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  624. $model->where('crt_time','>=',$return[0]);
  625. $model->where('crt_time','<=',$return[1]);
  626. }
  627. $list = $this->limit($model,'',$data);
  628. $list = $this->organizationStageNodeData($list);
  629. return [true, $list];
  630. }
  631. public function organizationStageNodeData($data) {
  632. if (empty($data['data'])) return $data;
  633. $map = $this->getProjectEmployee(['id' => array_column($data['data'], 'id')], ProjectEmployee::type_three);
  634. $project_map = $this->getProject(array_column($data['data'],'project_id'));
  635. $project_stage_map = $this->getProjectStage(array_column($data['data'],'project_stage_id'));
  636. foreach ($data['data'] as $key => $value){
  637. $start_time = $value['plan_start_time'] ? date("Y-m-d H:i",$value['plan_start_time']) : '';
  638. $end_time = $value['plan_end_time'] ? date("Y-m-d H:i",$value['plan_end_time']) : '';
  639. $data['data'][$key]['plan_time'] = $start_time . '——' . $end_time;
  640. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']): '';
  641. $data['data'][$key]['start_time'] = $value['start_time'] ? date("Y-m-d",$value['start_time']): '';
  642. $data['data'][$key]['project_title'] = $project_map[$value['project_id']] ?? "";
  643. $data['data'][$key]['project_stage_title'] = $project_stage_map[$value['project_stage_id']] ?? "";
  644. $tmp = $map[$value['id']] ?? [];
  645. $data['data'][$key]['employee_title'] = $tmp['name'] ?? "";
  646. $data['data'][$key]['employee_id'] = $tmp['name_id'] ?? "";
  647. }
  648. return $data;
  649. }
  650. public function editStageNodeMission($data){
  651. list($status,$msg) = $this->stageRuleNodeMission($data,false);
  652. if(! $status) return [$status,$msg];
  653. DB::beginTransaction();
  654. try{
  655. $model = ProjectStageNodeMission::where('id',$data['id'])->first();
  656. $model->project_id = $data['project_id'] ?? 0;
  657. $model->project_stage_id = $data['project_stage_id'] ?? 0;
  658. $model->project_stage_node_id = $data['project_stage_node_id'] ?? 0;
  659. $model->title = $data['title'] ?? "";
  660. $model->content = $data['content'] ?? 0;
  661. $model->save();
  662. $this->projectEmployee($data, ProjectEmployee::type_four, false);
  663. DB::commit();
  664. }catch (\Exception $exception){
  665. DB::rollBack();
  666. return [false,$exception->getMessage()];
  667. }
  668. return [true, ''];
  669. }
  670. public function addStageNodeMission($data,$user){
  671. list($status,$msg) = $this->stageRuleNodeMission($data);
  672. if(! $status) return [$status,$msg];
  673. try{
  674. DB::beginTransaction();
  675. $model = new ProjectStageNodeMission();
  676. $model->project_id = $data['project_id'] ?? 0;
  677. $model->project_stage_id = $data['project_stage_id'] ?? 0;
  678. $model->project_stage_node_id = $data['project_stage_node_id'] ?? 0;
  679. $model->title = $data['title'] ?? "";
  680. $model->content = $data['content'] ?? 0;
  681. $model->save();
  682. $data['id'] = $model->id;
  683. $this->projectEmployee($data, ProjectEmployee::type_four);
  684. DB::commit();
  685. }catch (\Exception $exception){
  686. DB::rollBack();
  687. return [false,$exception->getMessage()];
  688. }
  689. return [true, ''];
  690. }
  691. public function delStageNodeMission($data){
  692. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  693. DB::beginTransaction();
  694. try {
  695. $this->projectEmployee($data, ProjectEmployee::type_four, false);
  696. ProjectStageNodeMission::where('id',$data['id'])->where('del_time',0)->update([
  697. 'del_time' => time()
  698. ]);
  699. ProjectStageNodeMissionDetail::where('project_stage_node_mission_id',$data['id'])->where('del_time',0)->update([
  700. 'del_time' => time()
  701. ]);
  702. DB::commit();
  703. }catch (\Exception $exception){
  704. DB::rollBack();
  705. return [false,$exception->getMessage()];
  706. }
  707. return [true,'删除成功'];
  708. }
  709. public function stageRuleNodeMission(&$data, $is_check = true){
  710. if(empty($data['project_stage_node_id'])) return [false,'项目阶段节点ID不能为空'];
  711. $stage = ProjectStageNode::where('id',$data['project_stage_node_id'])->where('del_time',0)->first();
  712. if(empty($stage)) return [false, '该项目阶段节点不存在或已被删除'];
  713. $stage = $stage->toArray();
  714. $data['project_id'] = $stage['project_id'];
  715. $data['project_stage_id'] = $stage['project_stage_id'];
  716. if(empty($data['title'])) return [false, '节点任务名称不能为空'];
  717. if(empty($data['content'])) return [false, '节点任务内容不能为空'];
  718. if($is_check){
  719. $bool = ProjectStageNodeMission::where('project_id',$data['project_id'])
  720. ->where('project_stage_id',$data['project_stage_id'])
  721. ->where('project_stage_node_id',$data['project_stage_node_id'])
  722. ->where('title',$data['title'])
  723. ->exists();
  724. }else{
  725. if(empty($data['id'])) return [false, '阶段节点任务ID不能为空'];
  726. $boolean = ProjectStageNodeMission::where('id',$data['id'])->where('del_time',0)->exists();
  727. if(! $boolean) return [false, '项目阶段节点任务不存在或已被删除'];
  728. $bool = ProjectStageNodeMission::where('project_id',$data['project_id'])
  729. ->where('project_stage_id',$data['project_stage_id'])
  730. ->where('project_stage_node_id',$data['project_stage_node_id'])
  731. ->where('id','<>',$data['id'])
  732. ->where('title',$data['title'])
  733. ->exists();
  734. }
  735. if($bool) return [false, '节点任务名称已存在'];
  736. return [true, ''];
  737. }
  738. public function projectStageNodeMissionList($data,$user){
  739. $model = ProjectStageNodeMission::where('del_time',0)
  740. ->select('id','project_stage_id','project_id','project_stage_node_id','title','content','crt_time')
  741. ->orderBy('id','desc');
  742. if(! empty($data['project_stage_title'])) {
  743. $project_stage_id = $this->searchProjectStage(['title' => $data['project_stage_title']]);
  744. $model->whereIn('project_stage_id', $project_stage_id);
  745. }
  746. if(! empty($data['project_title'])) {
  747. $project_id = $this->searchProject(['title' => $data['project_title']]);
  748. $model->whereIn('project_id', $project_id);
  749. }
  750. if(! empty($data['project_stage_node_title'])) {
  751. $project_stage_node_id = $this->searchProjectStageNode(['title' => $data['project_stage_node_title']]);
  752. $model->whereIn('project_stage_node_id', $project_stage_node_id);
  753. }
  754. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  755. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  756. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  757. $model->where('crt_time','>=',$return[0]);
  758. $model->where('crt_time','<=',$return[1]);
  759. }
  760. $list = $this->limit($model,'',$data);
  761. $list = $this->organizationStageNodeMissionData($list);
  762. return [true, $list];
  763. }
  764. public function organizationStageNodeMissionData($data) {
  765. if (empty($data['data'])) return $data;
  766. $map = $this->getProjectEmployee(['id' => array_column($data['data'], 'id')], ProjectEmployee::type_four);
  767. $project_map = $this->getProject(array_column($data['data'],'project_id'));
  768. $project_stage_map = $this->getProjectStage(array_column($data['data'],'project_stage_id'));
  769. $project_stage_node_map = $this->getProjectStageNode(array_column($data['data'],'project_stage_node_id'));
  770. foreach ($data['data'] as $key => $value){
  771. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']): '';
  772. $data['data'][$key]['project_title'] = $project_map[$value['project_id']] ?? "";
  773. $data['data'][$key]['project_stage_title'] = $project_stage_map[$value['project_stage_id']] ?? "";
  774. $data['data'][$key]['project_stage_node_title'] = $project_stage_node_map[$value['project_stage_node_id']] ?? "";
  775. $tmp = $map[$value['id']] ?? [];
  776. $data['data'][$key]['employee_title'] = $tmp['name'] ?? "";
  777. $data['data'][$key]['employee_id'] = $tmp['name_id'] ?? "";
  778. }
  779. return $data;
  780. }
  781. public function editStageNodeMissionDetail($data){
  782. list($status,$msg) = $this->stageRuleNodeMissionDetail($data,false);
  783. if(! $status) return [$status,$msg];
  784. DB::beginTransaction();
  785. try{
  786. $model = ProjectStageNodeMissionDetail::where('id',$data['id'])->first();
  787. $model->project_id = $data['project_id'] ?? 0;
  788. $model->project_stage_id = $data['project_stage_id'] ?? 0;
  789. $model->project_stage_node_id = $data['project_stage_node_id'] ?? 0;
  790. $model->project_stage_node_mission_id = $data['project_stage_node_mission_id'] ?? 0;
  791. $model->start_time = $data['start_time'] ?? 0;
  792. $model->end_time = $data['end_time'] ?? 0;
  793. $model->content = $data['content'] ?? 0;
  794. $model->completion_degree = $data['completion_degree'] ?? "";
  795. $model->save();
  796. DB::commit();
  797. }catch (\Exception $exception){
  798. DB::rollBack();
  799. return [false,$exception->getMessage()];
  800. }
  801. return [true, ''];
  802. }
  803. public function addStageNodeMissionDetail($data,$user){
  804. list($status,$msg) = $this->stageRuleNodeMissionDetail($data);
  805. if(! $status) return [$status,$msg];
  806. try{
  807. DB::beginTransaction();
  808. $model = new ProjectStageNodeMissionDetail();
  809. $model->project_id = $data['project_id'] ?? 0;
  810. $model->project_stage_id = $data['project_stage_id'] ?? 0;
  811. $model->project_stage_node_id = $data['project_stage_node_id'] ?? 0;
  812. $model->project_stage_node_mission_id = $data['project_stage_node_mission_id'] ?? 0;
  813. $model->start_time = $data['start_time'] ?? 0;
  814. $model->end_time = $data['end_time'] ?? 0;
  815. $model->content = $data['content'] ?? 0;
  816. $model->completion_degree = $data['completion_degree'] ?? "";
  817. $model->crt_id = $user['id'] ?? "";
  818. $model->save();
  819. DB::commit();
  820. }catch (\Exception $exception){
  821. DB::rollBack();
  822. return [false,$exception->getMessage()];
  823. }
  824. return [true, ''];
  825. }
  826. public function delStageNodeMissionDetail($data){
  827. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  828. DB::beginTransaction();
  829. try {
  830. ProjectStageNodeMissionDetail::where('id',$data['id'])->where('del_time',0)->update([
  831. 'del_time' => time()
  832. ]);
  833. DB::commit();
  834. }catch (\Exception $exception){
  835. DB::rollBack();
  836. return [false,$exception->getMessage()];
  837. }
  838. return [true,'删除成功'];
  839. }
  840. public function stageRuleNodeMissionDetail(&$data, $is_check = true){
  841. if(empty($data['project_stage_node_mission_id'])) return [false,'项目阶段节点任务ID不能为空'];
  842. $stage = ProjectStageNodeMission::where('id',$data['project_stage_node_mission_id'])->where('del_time',0)->first();
  843. if(empty($stage)) return [false, '该项目阶段节点任务不存在或已被删除'];
  844. $stage = $stage->toArray();
  845. $data['project_id'] = $stage['project_id'];
  846. $data['project_stage_id'] = $stage['project_stage_id'];
  847. $data['project_stage_node_id'] = $stage['project_stage_node_id'];
  848. if(! empty($data['time'][0]) && ! empty($data['time'][1])){
  849. $data['start_time'] = $this->changeDateToDateMin($data['time'][0]);
  850. $data['end_time'] = $this->changeDateToDateMin($data['time'][1]);
  851. }
  852. if(empty($data['content'])) return [false, '节点任务报告内容不能为空'];
  853. if(! isset($data['completion_degree'])) return [false, '任务报告完成度不能为空'];
  854. $res = $this->checkNumber($data['completion_degree'], 0);
  855. if(! $res) return [false, '任务报告完成度请输入大于等于0的整数'];
  856. if($is_check){
  857. }else{
  858. if(empty($data['id'])) return [false, '阶段节点任务ID不能为空'];
  859. $boolean = ProjectStageNodeMissionDetail::where('id',$data['id'])->where('del_time',0)->exists();
  860. if(! $boolean) return [false, '项目阶段节点任务报告不存在或已被删除'];
  861. }
  862. return [true, ''];
  863. }
  864. public function projectStageNodeMissionDetailList($data,$user){
  865. $model = ProjectStageNodeMissionDetail::where('del_time',0)
  866. ->select('id','project_stage_id','project_id','project_stage_node_id','project_stage_node_mission_id','content','start_time','crt_time','end_time','completion_degree','crt_id')
  867. ->orderBy('id','desc');
  868. if(! empty($data['project_stage_title'])) {
  869. $project_stage_id = $this->searchProjectStage(['title' => $data['project_stage_title']]);
  870. $model->whereIn('project_stage_id', $project_stage_id);
  871. }
  872. if(! empty($data['project_title'])) {
  873. $project_id = $this->searchProject(['title' => $data['project_title']]);
  874. $model->whereIn('project_id', $project_id);
  875. }
  876. if(! empty($data['project_stage_node_title'])) {
  877. $project_stage_node_id = $this->searchProjectStageNode(['title' => $data['project_stage_node_title']]);
  878. $model->whereIn('project_stage_node_id', $project_stage_node_id);
  879. }
  880. if(! empty($data['project_stage_node_mission_title'])) {
  881. $project_stage_node_mission_id = $this->searchProjectStageNodeMission(['title' => $data['project_stage_node_mission_title']]);
  882. $model->whereIn('project_stage_node_mission_title', $project_stage_node_mission_id);
  883. }
  884. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  885. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  886. $model->where('crt_time','>=',$return[0]);
  887. $model->where('crt_time','<=',$return[1]);
  888. }
  889. $list = $this->limit($model,'',$data);
  890. $list = $this->organizationStageNodeMissionDetailData($list);
  891. return [true, $list];
  892. }
  893. public function organizationStageNodeMissionDetailData($data) {
  894. if (empty($data['data'])) return $data;
  895. $project_map = $this->getProject(array_column($data['data'],'project_id'));
  896. $project_stage_map = $this->getProjectStage(array_column($data['data'],'project_stage_id'));
  897. $project_stage_node_map = $this->getProjectStageNode(array_column($data['data'],'project_stage_node_id'));
  898. $project_stage_node_mission_map = $this->getProjectStageNodeMission(array_column($data['data'],'project_stage_node_mission_id'));
  899. foreach ($data['data'] as $key => $value){
  900. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']): '';
  901. $data['data'][$key]['start_time'] = $value['start_time'] ? date("Y-m-d H:i",$value['start_time']): '';
  902. $data['data'][$key]['end_time'] = $value['end_time'] ? date("Y-m-d H:i",$value['end_time']): '';
  903. $data['data'][$key]['project_title'] = $project_map[$value['project_id']] ?? "";
  904. $data['data'][$key]['project_stage_title'] = $project_stage_map[$value['project_stage_id']] ?? "";
  905. $data['data'][$key]['project_stage_node_title'] = $project_stage_node_map[$value['project_stage_node_id']] ?? "";
  906. $data['data'][$key]['project_stage_node_mission_title'] = $project_stage_node_mission_map[$value['project_stage_node_mission_id']] ?? "";
  907. }
  908. return $data;
  909. }
  910. public function getSonData($data, $user){
  911. if(empty($data['id'])) return [false, '数据id不能为空'];
  912. if(empty($data['type'])) return [false, '查询类型不能为空'];
  913. $id = $data['id'];
  914. $type = $data['type'];
  915. if($type == 1){
  916. $main = Project::where('del_time',0)
  917. ->where('id',$id)
  918. ->first();
  919. if(empty($main)) return [false, '项目不存在或已删除'];
  920. $main = $main->toArray();
  921. //项目成员
  922. $return = $this->getProjectEmployee($main, ProjectEmployee::type_one);
  923. $main['employee_title'] = $return['name'] ?? "";
  924. $main['employee_id'] = $return['name_id'] ?? "";
  925. //阶段
  926. $project_stage = ProjectStage::where('del_time',0)
  927. ->where('project_id',$id)
  928. ->get()->toArray();
  929. $map = [];
  930. $project_stage_id = array_column($project_stage, 'id');
  931. foreach ($project_stage_id as $value){
  932. //阶段成员
  933. $return = $this->getProjectEmployee(['id' => $value], ProjectEmployee::type_two);
  934. $map[$value] = $return;
  935. }
  936. foreach ($project_stage as $key => $value){
  937. $start_time = $value['plan_start_time'] ? date("Y-m-d H:i",$value['plan_start_time']) : '';
  938. $end_time = $value['plan_end_time'] ? date("Y-m-d H:i",$value['plan_end_time']) : '';
  939. $project_stage[$key]['plan_time'] = $start_time . '——' . $end_time;
  940. $project_stage[$key]['start_time'] = $value['start_time'] ? date("Y-m-d",$value['start_time']): '';
  941. $tmp = $map[$value['id']] ?? [];
  942. $project_stage[$key]['employee_title'] = $tmp['name'] ?? "";
  943. $project_stage[$key]['employee_id'] = $tmp['name_id'] ?? "";
  944. }
  945. $main['children'] = $project_stage;
  946. return [true, $main];
  947. }elseif($type == 2){
  948. $main = ProjectStage::where('del_time',0)
  949. ->where('id',$id)
  950. ->first();
  951. if(empty($main)) return [false, '项目的阶段不存在或已删除'];
  952. $main = $main->toArray();
  953. //阶段成员
  954. $return = $this->getProjectEmployee($main, ProjectEmployee::type_two);
  955. $main['employee_title'] = $return['name'] ?? "";
  956. $main['employee_id'] = $return['name_id'] ?? "";
  957. //节点
  958. $project_stage_node = ProjectStageNode::where('del_time',0)
  959. ->where('project_stage_id',$id)
  960. ->get()->toArray();
  961. $map = [];
  962. $project_stage_node_id = array_column($project_stage_node, 'id');
  963. foreach ($project_stage_node_id as $value){
  964. //节点成员
  965. $return = $this->getProjectEmployee(['id' => $value], ProjectEmployee::type_three);
  966. $map[$value] = $return;
  967. }
  968. foreach ($project_stage_node as $key => $value){
  969. $start_time = $value['plan_start_time'] ? date("Y-m-d H:i",$value['plan_start_time']) : '';
  970. $end_time = $value['plan_end_time'] ? date("Y-m-d H:i",$value['plan_end_time']) : '';
  971. $project_stage_node[$key]['plan_time'] = $start_time . '——' . $end_time;
  972. $project_stage_node[$key]['start_time'] = $value['start_time'] ? date("Y-m-d",$value['start_time']): '';
  973. $tmp = $map[$value['id']] ?? [];
  974. $project_stage_node[$key]['employee_title'] = $tmp['name'] ?? "";
  975. $project_stage_node[$key]['employee_id'] = $tmp['name_id'] ?? "";
  976. }
  977. $main['children'] = $project_stage_node;
  978. return [true, $main];
  979. }elseif($type == 3){
  980. $main = ProjectStageNode::where('del_time',0)
  981. ->where('id',$id)
  982. ->first();
  983. if(empty($main)) return [false, '项目阶段节点不存在或已删除'];
  984. $main = $main->toArray();
  985. //节点成员
  986. $return = $this->getProjectEmployee($main, ProjectEmployee::type_three);
  987. $main['employee_title'] = $return['name'] ?? "";
  988. $main['employee_id'] = $return['name_id'] ?? "";
  989. //任务
  990. $project_stage_node_mission = ProjectStageNodeMission::where('del_time',0)
  991. ->where('project_stage_node_id',$id)
  992. ->get()->toArray();
  993. $map = [];
  994. $project_stage_node_mission_id = array_column($project_stage_node_mission, 'id');
  995. foreach ($project_stage_node_mission_id as $value){
  996. //任务成员
  997. $return = $this->getProjectEmployee(['id' => $value], ProjectEmployee::type_four);
  998. $map[$value] = $return;
  999. }
  1000. foreach ($project_stage_node_mission as $key => $value){
  1001. $tmp = $map[$value['id']] ?? [];
  1002. $project_stage_node_mission[$key]['employee_title'] = $tmp['name'] ?? "";
  1003. $project_stage_node_mission[$key]['employee_id'] = $tmp['name_id'] ?? "";
  1004. }
  1005. $main['children'] = $project_stage_node_mission;
  1006. return [true, $main];
  1007. }elseif ($type == 4){
  1008. $main = ProjectStageNodeMission::where('del_time',0)
  1009. ->where('id',$id)
  1010. ->first();
  1011. if(empty($main)) return [false, '项目阶段节点下该任务不存在或已删除'];
  1012. $main = $main->toArray();
  1013. //任务成员
  1014. $return = $this->getProjectEmployee($main, ProjectEmployee::type_four);
  1015. $main['employee_title'] = $return['name'] ?? "";
  1016. $main['employee_id'] = $return['name_id'] ?? "";
  1017. //任务报告
  1018. $project_stage_node_mission_detail = ProjectStageNodeMissionDetail::where('del_time',0)
  1019. ->where('project_stage_node_mission_id',$data['id'])
  1020. ->get()->toArray();
  1021. $employee_id = array_unique(array_column($project_stage_node_mission_detail,'crt_id'));
  1022. $emp_map = Employee::whereIn('id',$employee_id)->pluck('emp_name','id')->toArray();
  1023. foreach ($project_stage_node_mission_detail as $key => $value){
  1024. $start_time = $value['start_time'] ? date("Y-m-d H:i",$value['start_time']) : '';
  1025. $end_time = $value['end_time'] ? date("Y-m-d H:i",$value['end_time']) : '';
  1026. $project_stage_node_mission_detail[$key]['time'] = $start_time . '——' . $end_time;
  1027. $project_stage_node_mission_detail[$key]['crt_name'] = $emp_map[$value['crt_id']] ?? "";
  1028. }
  1029. $main['children'] = $project_stage_node_mission_detail;
  1030. return [true, $main];
  1031. }
  1032. return [false, '查询类型不存在'];
  1033. }
  1034. public function searchProject($data){
  1035. $model = new Project();
  1036. $model->where('del_time',0);
  1037. if(empty($data['title'])){
  1038. $model->where('title', 'LIKE', '%'.$data['title'].'%');
  1039. $id = $model->select('id')->get()->toArray();
  1040. return array_column($id,'id');
  1041. }
  1042. return [];
  1043. }
  1044. public function getProject($project_id = []){
  1045. if(empty($project_id)) return [];
  1046. $map = Project::whereIn('id', $project_id)
  1047. ->pluck('title','id')
  1048. ->toArray();
  1049. return $map;
  1050. }
  1051. public function searchProjectStage($data){
  1052. $model = new ProjectStage();
  1053. $model->where('del_time',0);
  1054. if(empty($data['title'])){
  1055. $model->where('title', 'LIKE', '%'.$data['title'].'%');
  1056. $id = $model->select('id')->get()->toArray();
  1057. return array_column($id,'id');
  1058. }
  1059. return [];
  1060. }
  1061. public function getProjectStage($project_stage_id = []){
  1062. if(empty($project_stage_id)) return [];
  1063. $map = ProjectStage::whereIn('id', $project_stage_id)
  1064. ->pluck('title','id')
  1065. ->toArray();
  1066. return $map;
  1067. }
  1068. public function searchProjectStageNode($data){
  1069. $model = new ProjectStageNode();
  1070. $model->where('del_time',0);
  1071. if(empty($data['title'])){
  1072. $model->where('title', 'LIKE', '%'.$data['title'].'%');
  1073. $id = $model->select('id')->get()->toArray();
  1074. return array_column($id,'id');
  1075. }
  1076. return [];
  1077. }
  1078. public function getProjectStageNode($project_stage_node_id = []){
  1079. if(empty($project_stage_node_id)) return [];
  1080. $map = ProjectStageNode::whereIn('id', $project_stage_node_id)
  1081. ->pluck('title','id')
  1082. ->toArray();
  1083. return $map;
  1084. }
  1085. public function searchProjectStageNodeMission($data){
  1086. $model = new ProjectStageNodeMission();
  1087. $model->where('del_time',0);
  1088. if(empty($data['title'])){
  1089. $model->where('title', 'LIKE', '%'.$data['title'].'%');
  1090. $id = $model->select('id')->get()->toArray();
  1091. return array_column($id,'id');
  1092. }
  1093. return [];
  1094. }
  1095. public function getProjectStageNodeMission($project_stage_node_mission_id = []){
  1096. if(empty($project_stage_node_mission_id)) return [];
  1097. $map = ProjectStageNodeMission::whereIn('id', $project_stage_node_mission_id)
  1098. ->pluck('title','id')
  1099. ->toArray();
  1100. return $map;
  1101. }
  1102. public function getProjectOtherMessage($project_id = []){
  1103. if(empty($project_id)) return [];
  1104. $project = [];
  1105. $stage = ProjectStage::whereIn('project_id', $project_id)
  1106. ->where('del_time',0)
  1107. ->select('id','title','receipt_amount','project_id')
  1108. ->orderBy('id','desc')
  1109. ->get()->toArray();
  1110. foreach ($stage as $value){
  1111. if(! isset($project[$value['project_id']]['stage'])){
  1112. $project[$value['project_id']]['stage'] = [
  1113. 'id' => $value['id'],
  1114. 'title' => $value['title'],
  1115. ];
  1116. }
  1117. if(isset($project[$value['project_id']]['receipt'])){
  1118. $receipt = bcadd($value['receipt_amount'], $project[$value['project_id']]['receipt'],2);
  1119. $project[$value['project_id']]['receipt'] = $receipt;
  1120. }else{
  1121. $project[$value['project_id']]['receipt'] = $value['receipt_amount'];
  1122. }
  1123. }
  1124. $node = ProjectStageNode::whereIn('project_id', $project_id)
  1125. ->where('del_time',0)
  1126. ->select('id','title','project_id')
  1127. ->get()->toArray();
  1128. foreach ($node as $value){
  1129. if(! isset($project[$value['project_id']]['node'])){
  1130. $project[$value['project_id']]['node'] = [
  1131. 'id' => $value['id'],
  1132. 'title' => $value['title'],
  1133. ];
  1134. }
  1135. }
  1136. return $project;
  1137. }
  1138. }