created_at); $startDay = $date->startOfDay()->toDateTimeString(); $endDay = $date->endOfDay()->toDateTimeString(); $isAllEnd = LaborCompanyDispatch::query() ->whereBetween('created_at', [$startDay, $endDay]) ->where('man_num', '!=', 0) ->where('woman_num', '!=', 0) ->whereNotIn('status', [3, 4])->exists(); if ($isAllEnd) { return; } $laborApplies = LaborApply::query()->whereBetween('created_at', [$startDay, $endDay])->get(); // [warehouse_id->[user_workgroup_id->[man_num,woman_num]]] requirements $laborApplyMap = $this->getLaborApplyMap($laborApplies); $laborCompanyDispatchItems = LaborCompanyDispatch::query()->with("laborCompanyDispatchDetails")->whereBetween('created_at', [$startDay, $endDay])->get(); // [warehouse_id->[manIds,womanIds]] provision $laborCompanyApplyMap = $this->getLaborCompanyApplyMap($laborCompanyDispatchItems); $array = []; foreach ($laborApplyMap as $warehouseId => $laborRequirements) { if (!array_key_exists($warehouseId, $laborCompanyApplyMap)) continue; // $laborRequirements -> [user_workgroup_id->[man_num,woman_num]] [requirements] // $laborCompanyProvision -> [manIds,womanIds] [provision] $laborCompanyProvision = $laborCompanyApplyMap[$warehouseId]; foreach ($laborRequirements as $applyUserId => $requirement) { if (!array_key_exists($applyUserId, $array)) { $array[$applyUserId] = []; } while (count($laborCompanyProvision['manIds']) > 0 && $requirement['manAmount'] > 0) { array_push($array[$applyUserId], array_shift($laborCompanyProvision['manIds'])); $requirement['manAmount']--; } while (count($laborCompanyProvision['womanIds']) > 0 && $requirement['womanAmount'] > 0) { array_push($array[$applyUserId], array_shift($laborCompanyProvision['womanIds'])); $requirement['womanAmount']--; } } } foreach ($array as $key => $value) { LaborCompanyDispatchDetail::query()->whereIn('id', $value)->update(['apply_user_id' => $key]); } } /** * @param $laborApplies * @return mixed */ public function getLaborApplyMap($laborApplies) { $laborApplyMap = []; foreach ($laborApplies as $item) { if (array_key_exists($item->warehouse_id, $laborApplyMap)) { if (array_key_exists($item->user_workgroup_id, $laborApplyMap[$item->warehouse_id])) { $laborApplyMap[$item->warehouse_id][$item->apply_user_id]['manAmount'] += $item->man_num; $laborApplyMap[$item->warehouse_id][$item->apply_user_id]['womanAmount'] += $item->woman_num; } else { $laborApplyMap[$item->warehouse_id][$item->apply_user_id] = ['manAmount' => $item->man_num, 'womanAmount' => $item->woman_num]; } } else { $laborApplyMap[$item->warehouse_id][$item->apply_user_id] = ['manAmount' => $item->man_num, 'womanAmount' => $item->woman_num]; } } return $laborApplyMap; } /** * @param $laborCompanyDispatchItems * @return mixed */ public function getLaborCompanyApplyMap($laborCompanyDispatchItems) { $appliesItemsMap = []; foreach ($laborCompanyDispatchItems as $item) { $manIds = $this->manAmountFor($item->laborCompanyDispatchDetails); $womanIds = $this->womanAmountFor($item->laborCompanyDispatchDetails); if (array_key_exists($item->warehouse_id, $appliesItemsMap)) { $appliesItemsMap[$item->warehouse_id]['manIds'] = array_merge($appliesItemsMap[$item->warehouse_id]['manIds'], $manIds); $appliesItemsMap[$item->warehouse_id]['womanIds'] = array_merge($appliesItemsMap[$item->warehouse_id]['womanIds'], $womanIds); } else { $appliesItemsMap[$item->warehouse_id] = [ 'manIds' => $manIds, 'womanIds' => $womanIds, ]; } } return $appliesItemsMap; } private function manAmountFor($laborCompanyDispatchDetails) { $manIds = []; foreach ($laborCompanyDispatchDetails as $item) { if ($item->gender == '男') { array_push($manIds, $item->id); } } return $manIds; } private function womanAmountFor($laborCompanyDispatchDetails) { $womanIds = []; foreach ($laborCompanyDispatchDetails as $item) { if ($item->gender == '女') { array_push($womanIds, $item->id); } } return $womanIds; } }