|
@@ -0,0 +1,136 @@
|
|
|
|
|
+<?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;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|