| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- <?php
- namespace App\Services;
- use App\Http\Controllers\Controller;
- use App\LaborApply;
- use App\LaborCompanyDispatch;
- use App\LaborCompanyDispatchDetail;
- use Carbon\Carbon;
- class LaborCompanyDispatchDetailService extends Controller
- {
- /**
- * 给劳工指定领队人
- *
- * @param LaborCompanyDispatch $laborCompanyDispatch
- */
- public function allocation(LaborCompanyDispatch $laborCompanyDispatch)
- {
- $date = Carbon::parse($laborCompanyDispatch->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;
- }
- }
|