|
|
@@ -2,7 +2,6 @@
|
|
|
|
|
|
namespace App\Services;
|
|
|
|
|
|
-use App\Http\Controllers\Controller;
|
|
|
use App\Logistic;
|
|
|
use App\OracleActAllocationDetails;
|
|
|
use App\OracleDOCASNHeader;
|
|
|
@@ -12,10 +11,11 @@ use App\OrderPackage;
|
|
|
use App\OrderPackageCommodities;
|
|
|
use App\Owner;
|
|
|
use App\RejectedBill;
|
|
|
+use App\Services\common\BatchUpdateService;
|
|
|
use App\Shop;
|
|
|
+use Carbon\Carbon;
|
|
|
use Illuminate\Database\Eloquent\Collection;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
-use Carbon\Carbon;
|
|
|
|
|
|
class OrderService
|
|
|
{
|
|
|
@@ -356,8 +356,9 @@ class OrderService
|
|
|
'client_code' => $orderHeadAttr['soreference1'],
|
|
|
];
|
|
|
$order = Order::query()->create($arr);
|
|
|
+ unset($arr,$orderHeadAttr,$owner);
|
|
|
}
|
|
|
- $orderPackageService->createdByOrder($order);
|
|
|
+ $orderPackageService->createdByOrder($order);unset($order);
|
|
|
return Order::with('packages.commodities.commodity')->where('client_code', $clientCode)->first();
|
|
|
}
|
|
|
|
|
|
@@ -389,24 +390,26 @@ class OrderService
|
|
|
|
|
|
public function 根据设置从WMS获取跟踪的订单($startDate)
|
|
|
{
|
|
|
+
|
|
|
/** @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService */
|
|
|
$oracleDOCOrderHeaderService = app('oracleDOCOrderHeaderService');
|
|
|
$orderHeadersResult = $oracleDOCOrderHeaderService->根据时间获取在这段时间内创建的WMS订单($startDate);
|
|
|
- LogService::log('111','111',json_encode($orderHeadersResult));
|
|
|
+
|
|
|
if ($orderHeadersResult->count() == 0) {
|
|
|
return null;
|
|
|
}
|
|
|
- // 数据重组
|
|
|
- $orderHeaders = [];
|
|
|
+
|
|
|
+ $orderHeaders_map = [];
|
|
|
$oracleDOCOrderDetails = [];
|
|
|
$actAllocationDetails = [];
|
|
|
- foreach ($orderHeadersResult as $item) {
|
|
|
- $orderHeaders[$item['orderno']] = $item;
|
|
|
- $oracleDOCOrderDetails[$item['orderno']] = $item['oracleDOCOrderDetails'];
|
|
|
- $details = $item['actAllocationDetails'];
|
|
|
+
|
|
|
+ foreach ($orderHeadersResult as $orderHeader) {
|
|
|
+ $orderHeaders_map[$orderHeader['orderno']] = $orderHeader;
|
|
|
+ $oracleDOCOrderDetails[$orderHeader['orderno']] = $orderHeader['oracleDOCOrderDetails'];
|
|
|
+ $details = $orderHeader['actAllocationDetails'];
|
|
|
+ $orderno = strval($orderHeader['orderno']);
|
|
|
foreach ($details as $detail) {
|
|
|
$picktotraceid = strval($detail['picktotraceid']);
|
|
|
- $orderno = strval($detail['orderno']);
|
|
|
if ($picktotraceid == '*') {
|
|
|
if (!($actAllocationDetails[$orderno] ?? false)) {
|
|
|
$actAllocationDetails[$orderno] = [];
|
|
|
@@ -417,29 +420,62 @@ class OrderService
|
|
|
if (!($actAllocationDetails[$picktotraceid] ?? false)) {
|
|
|
$actAllocationDetails[$picktotraceid] = [];
|
|
|
}
|
|
|
- array_push($actAllocationDetails[$picktotraceid], $detail);
|
|
|
+ $actAllocationDetails[$picktotraceid][] =$detail;
|
|
|
}
|
|
|
}
|
|
|
+ unset($orderHeadersResult);
|
|
|
|
|
|
- return $this->根据WMS订单生成WAS订单($orderHeaders, $oracleDOCOrderDetails, $actAllocationDetails);
|
|
|
+ return $this->根据WMS订单生成WAS订单($orderHeaders_map, $oracleDOCOrderDetails, $actAllocationDetails);
|
|
|
}
|
|
|
|
|
|
public function 根据设置从WMS同步该时间段内更新的订单($startDate)
|
|
|
{
|
|
|
/** @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService */
|
|
|
$oracleDOCOrderHeaderService = app('oracleDOCOrderHeaderService');
|
|
|
+
|
|
|
$editedOrderHeaders = $oracleDOCOrderHeaderService->根据时间获取在这段时间内更新的WMS订单($startDate);
|
|
|
- $orderHeaders = [];
|
|
|
+ $orderHeaders_map = [];
|
|
|
foreach ($editedOrderHeaders as $editedOrderHeader) {
|
|
|
- $orderHeaders[$editedOrderHeader['orderno']] = $editedOrderHeader;
|
|
|
+ $orderHeaders_map[$editedOrderHeader['orderno']] = $editedOrderHeader;
|
|
|
}
|
|
|
- $updateCommodities = $this->将WMS订单对应的WAS订单信息更新($orderHeaders);
|
|
|
- return compact('updateCommodities', 'editedOrderHeaders');
|
|
|
+
|
|
|
+ $orderNos = array_keys($orderHeaders_map);
|
|
|
+
|
|
|
+ $orders = Order::query()
|
|
|
+ ->with('packages.commodities')
|
|
|
+ ->whereIn('code', $orderNos)
|
|
|
+ ->get();
|
|
|
+
|
|
|
+ if ($orders->count() == 0) {
|
|
|
+ return ['orderPackageCommodities'=> null, 'orderHeaders'=>null];
|
|
|
+ }
|
|
|
+
|
|
|
+ $ordersList =[];
|
|
|
+ foreach ($orders as $order) {
|
|
|
+ $ordersList[$order['code']] = $order;
|
|
|
+ }
|
|
|
+ $orderHeaders_map = $this->filterNoCorrespondingOrder($orderHeaders_map,$ordersList);
|
|
|
+
|
|
|
+ $this->将WMS订单对应的WAS订单信息更新($orderHeaders_map,$ordersList);
|
|
|
+
|
|
|
+ $orderPackageCommodities = OrderPackageCommodities::query()
|
|
|
+ ->with('package.order')
|
|
|
+ ->whereHas('package.order', function ($query) use ($orderNos) {
|
|
|
+ $query->whereIn('code',$orderNos);
|
|
|
+ })->get();
|
|
|
+ $orderHeaders = $orderHeaders_map;
|
|
|
+ return compact('orderPackageCommodities', 'orderHeaders');
|
|
|
}
|
|
|
|
|
|
|
|
|
public function 根据WMS订单生成WAS订单($orderHeaders, $oracleDOCOrderDetails, $actAllocationDetails)
|
|
|
{
|
|
|
+
|
|
|
+ /** @var OrderPackageService $orderPackageService */
|
|
|
+ $orderPackageService = app('orderPackageService');
|
|
|
+ /** @var OrderPackageCommoditiesService $orderCommoditiesService */
|
|
|
+ $orderCommoditiesService = app('orderPackageCommoditiesService');
|
|
|
+
|
|
|
if (count($orderHeaders) === 0) {
|
|
|
return [];
|
|
|
}
|
|
|
@@ -447,12 +483,10 @@ class OrderService
|
|
|
$owners = $params['owners'];
|
|
|
$shops = $params['shops'];
|
|
|
$logistics = $params['logistics'];
|
|
|
- /** @var OrderPackageService $orderPackageService */
|
|
|
- $orderPackageService = app('orderPackageService');
|
|
|
- /** @var OrderPackageCommoditiesService $orderCommoditiesService */
|
|
|
- $orderCommoditiesService = app('orderPackageCommoditiesService');
|
|
|
$orderHeaders = $this->过滤已有的WAS订单($orderHeaders);
|
|
|
- $orders = $this->根据WMS订单创建WAS订单($orderHeaders, $owners, $shops, $logistics);
|
|
|
+ $this->根据WMS订单创建WAS订单($orderHeaders, $owners, $shops, $logistics);
|
|
|
+ $orderNos = array_keys($orderHeaders);
|
|
|
+ $orders = Order::query()->whereIn('code',$orderNos)->get();
|
|
|
$orders = $orderPackageService->根据WMS订单创建WAS包裹($orderHeaders, $orders);
|
|
|
$orders = $orderCommoditiesService->根据WMS订单信息创建WAS订单包裹商品($orderHeaders, $oracleDOCOrderDetails, $actAllocationDetails, $orders);
|
|
|
|
|
|
@@ -465,29 +499,51 @@ class OrderService
|
|
|
return compact('orders', 'orderHeaders', 'actAllocationDetails', 'oracleDOCOrderDetails');
|
|
|
}
|
|
|
|
|
|
- public function 过滤已有的WAS订单($orderHeaders)
|
|
|
+ public function 过滤已有的WAS订单($orderHeaders,$orders_map = [])
|
|
|
{
|
|
|
- $orderNos = array_keys($orderHeaders);
|
|
|
- $orders = Order::query()->whereIn('code', $orderNos)->get();
|
|
|
- if ($orders->count() > 0) {
|
|
|
+
|
|
|
+ if(count($orders_map) == 0){
|
|
|
+ $orderNos = array_keys($orderHeaders);
|
|
|
+ $orders = Order::query()->whereIn('code', $orderNos)->get();
|
|
|
foreach ($orders as $order) {
|
|
|
- unset($orderHeaders[$order['code']]);
|
|
|
+ $orders_map[$order['code']] = $order;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(count($orders_map) !== 0){
|
|
|
+ foreach ($orders_map as $key=>$orderHeader) {
|
|
|
+ unset($orderHeaders[$key]);
|
|
|
}
|
|
|
}
|
|
|
return $orderHeaders;
|
|
|
}
|
|
|
|
|
|
+ public function filterNoCorrespondingOrder($orderHeaders_map,$orders_map = []){
|
|
|
+ if(count($orders_map) == 0){
|
|
|
+ $orderNos = array_keys($orderHeaders_map);
|
|
|
+ $orders = Order::query()->whereIn('code', $orderNos)->get();
|
|
|
+ foreach ($orders as $order) {
|
|
|
+ $orders_map[$order['code']] = $order;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(count($orders_map) !== 0){
|
|
|
+ foreach ($orderHeaders_map as $key=>$orderHeader) {
|
|
|
+ if(!($orders_map[$key] ?? false)){
|
|
|
+ unset($orderHeaders_map[$key]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $orderHeaders_map;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
private function 根据WMS订单信息返回创建WAS订单需要信息($orderHeaders)
|
|
|
{
|
|
|
/** @var ShopService $shopService */
|
|
|
$shopService = app('shopService');
|
|
|
-
|
|
|
/** @var LogisticService $logisticService */
|
|
|
$logisticService = app('logisticService');
|
|
|
-
|
|
|
/** @var OwnerService $ownerService */
|
|
|
$ownerService = app('ownerService');
|
|
|
-
|
|
|
$owners = $ownerService->获取订单跟踪的货主(); // 监听的货主
|
|
|
$shops = $shopService->根据追踪的WMS订单返回商铺($orderHeaders); // 商铺
|
|
|
$logistics = $logisticService->getWASLogisticsByWMSOrderHeaders($orderHeaders); // 承运商
|
|
|
@@ -496,45 +552,70 @@ class OrderService
|
|
|
|
|
|
public function 根据WMS订单创建WAS订单($orderHeaders, $owners, $shops, $logistics)
|
|
|
{
|
|
|
+
|
|
|
$fillables = [];
|
|
|
- $client_code = [];
|
|
|
+ $owners_map = [];
|
|
|
+ $shop_map = [];
|
|
|
+ $logistics_map = [];
|
|
|
+ foreach ($owners as $owner) {
|
|
|
+ $key = 'code='.$owner->code;
|
|
|
+ $owners_map[$key] = $owner;
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach ($shops as $shop) {
|
|
|
+ $key = 'name='.$shop->name.' owner_id='.$shop->owner_id;
|
|
|
+ $shop_map[$key] = $shop;
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach ($logistics as $logistic) {
|
|
|
+ $key = 'code='.$logistic->code;
|
|
|
+ $logistics_map[$key] = $logistic;
|
|
|
+ }
|
|
|
+
|
|
|
+ // XXX 循环 300 个元素 3s-5s
|
|
|
foreach ($orderHeaders as $orderHeader) {
|
|
|
- $owner = $owners->where('code', $orderHeader['customerid'])->first();
|
|
|
- $shop = $shops->where('name', $orderHeader['issuepartyname'])->where('owner_id', $owner['id'])->first();
|
|
|
- $logistic = $logistics->where('code', $orderHeader['carrierid'])->first();
|
|
|
-
|
|
|
- $fillable = [
|
|
|
- 'code' => $orderHeader['orderno'] ?? '',
|
|
|
- 'owner_id' => $owner['id'] ?? '',
|
|
|
- 'wms_status' => $orderHeader['oracleBASCode_codename_c'] ?? '',
|
|
|
- 'created_at' => $orderHeader['addtime'] ?? '',
|
|
|
- 'logistic_id' => $logistic['id'] ?? '',
|
|
|
- 'shop_id' => $shop['id'] ?? '',
|
|
|
- 'consignee_name' => $orderHeader['c_contact'] ?? '',
|
|
|
- 'consignee_phone' => $orderHeader['c_tel2'] ?? '',
|
|
|
- 'province' => $orderHeader['c_province'] ?? '',
|
|
|
- 'city' => $orderHeader['c_city'] ?? '',
|
|
|
- 'district' => $orderHeader['c_district'] ?? '',
|
|
|
- 'address' => $orderHeader['c_address1'] ?? '',
|
|
|
- 'client_code' => $orderHeader ['soreference1'] ?? '',
|
|
|
- 'wms_edittime' => $orderHeader['edittime'] ?? '',
|
|
|
+ $customerid = $orderHeader->customerid;
|
|
|
+
|
|
|
+ $owner_key = 'code='.$customerid;
|
|
|
+ $owner = $owners_map[$owner_key];
|
|
|
+
|
|
|
+ $shop_key = 'name='.$orderHeader->issuepartyname.' owner_id='.$owner->owner_id;
|
|
|
+ $shop = $shop_map[$shop_key] ?? '';
|
|
|
+
|
|
|
+ $logistic_key = 'code='.$customerid;
|
|
|
+ $logistic = $logistics_map[$logistic_key] ?? '';
|
|
|
+
|
|
|
+ $fillables[] = [
|
|
|
+ 'code' => $orderHeader->orderno ,
|
|
|
+ 'owner_id' => $owner->id ?? '',
|
|
|
+ 'wms_status' => $orderHeader->oracleBASCode_codename_c,
|
|
|
+ 'created_at' => $orderHeader->addtime,
|
|
|
+ 'logistic_id' => $logistic->id ?? '',
|
|
|
+ 'shop_id' => $shop->id ?? '',
|
|
|
+ 'consignee_name' => $orderHeader->c_contact,
|
|
|
+ 'consignee_phone' => $orderHeader->c_tel2,
|
|
|
+ 'province' => $orderHeader->c_province,
|
|
|
+ 'city' => $orderHeader->c_city,
|
|
|
+ 'district' => $orderHeader->c_district,
|
|
|
+ 'address' => $orderHeader->c_address1,
|
|
|
+ 'client_code' => $orderHeader->soreference1,
|
|
|
+ 'wms_edittime' => $orderHeader->edittime,
|
|
|
];
|
|
|
- array_push($fillables, $fillable);
|
|
|
- array_push($client_code, $fillable['client_code']);
|
|
|
}
|
|
|
try {
|
|
|
if (count($fillables) > 0) {
|
|
|
Order::query()->insert($fillables);
|
|
|
- LogService::log(__METHOD__, __FUNCTION__, '批量创建' . count($fillables) . json_encode($fillables));
|
|
|
+ LogService::log(__METHOD__, __FUNCTION__, '批量创建Order' . count($fillables) . json_encode($fillables));
|
|
|
}
|
|
|
} catch (\Exception $e) {
|
|
|
LogService::log(__METHOD__, __FUNCTION__, $e->getMessage(), $e->getTraceAsString() . json_encode($fillables));
|
|
|
+ } finally {
|
|
|
+ unset($owners_map,$shop_map,$logistics_map,$fillables);
|
|
|
}
|
|
|
- return Order::query()->whereIn('client_code', $client_code)->get();
|
|
|
}
|
|
|
|
|
|
// XXX 业务逻辑待修改完善
|
|
|
- public function 将WMS订单对应的WAS订单信息更新($orderHeaders)
|
|
|
+ public function 将WMS订单对应的WAS订单信息更新($orderHeaders,$ordersList)
|
|
|
{
|
|
|
/** @var CommodityService $commodityService */
|
|
|
$commodityService = app('commodityService');
|
|
|
@@ -542,33 +623,18 @@ class OrderService
|
|
|
$orderPackageService = app('orderPackageService');
|
|
|
/** @var OrderPackageCommoditiesService $orderPackageCommoditiesService */
|
|
|
$orderPackageCommoditiesService = app('orderPackageCommoditiesService');
|
|
|
-
|
|
|
if (count($orderHeaders) == 0) {
|
|
|
return [];
|
|
|
}
|
|
|
-
|
|
|
- $orderNos = array_keys($orderHeaders);
|
|
|
-
|
|
|
- $orders = Order::query()
|
|
|
- ->with('packages.commodities')
|
|
|
- ->whereIn('code', $orderNos)
|
|
|
- ->get();
|
|
|
-
|
|
|
- if ($orders->count() == 0) {
|
|
|
- return [];
|
|
|
- }
|
|
|
-
|
|
|
$commodities = $commodityService->getWASCommoditiesByWMSOrderHeaders($orderHeaders); // 商品信息
|
|
|
|
|
|
- $ordersList = [];
|
|
|
- foreach ($orders as $order) {
|
|
|
- $ordersList[$order['code']] = $order;
|
|
|
- }
|
|
|
-
|
|
|
- $this->更新WMS订单对应的的WAS订单($orderHeaders, $orders);
|
|
|
+ $this->更新WMS订单对应的的WAS订单($orderHeaders, $ordersList);
|
|
|
|
|
|
$orderPackageService->更新WAS订单快递单号信息($orderHeaders, $ordersList);
|
|
|
|
|
|
+ $orderPackageCommoditiesService->更新WAS订单快递打包商品信息($orderHeaders, $ordersList, $commodities);
|
|
|
+
|
|
|
+ $orderNos = data_get($ordersList,'*.code');
|
|
|
$orderPackages = OrderPackage::query()
|
|
|
->with('commodities','order')
|
|
|
->whereHas('order', function ($query) use ($orderNos) {
|
|
|
@@ -576,47 +642,61 @@ class OrderService
|
|
|
})
|
|
|
->get();
|
|
|
|
|
|
- $orderHeadersList = [];
|
|
|
- foreach ($orderHeaders as $item) {
|
|
|
- if (in_array($item['orderno'], $orderNos)) {
|
|
|
- $orderHeadersList[$item['orderno']] = $item;
|
|
|
- }
|
|
|
- }
|
|
|
- $orders = Order::query()
|
|
|
- ->with('packages.commodities')
|
|
|
- ->whereIn('code', $orderNos)
|
|
|
- ->get();
|
|
|
-
|
|
|
- $orderPackageCommoditiesService->更新WAS订单快递打包商品信息($orderHeadersList, $orders, $commodities);
|
|
|
-
|
|
|
- $orderPackageCommodities = OrderPackageCommodities::query()
|
|
|
- ->whereHas('package.order', function ($query) use ($orderNos) {
|
|
|
- $query->whereIn('code',$orderNos);
|
|
|
- })->get();
|
|
|
+ unset($orderNos);
|
|
|
|
|
|
$orderPackageService->更新WAS订单的包裹的重量和体积($orderHeaders,$orderPackages); // 同步包裹重量和体积
|
|
|
|
|
|
- return $orderPackageCommodities;
|
|
|
}
|
|
|
|
|
|
- public function 更新WMS订单对应的的WAS订单($orderHeaders, $orders)
|
|
|
+ public function 更新WMS订单对应的的WAS订单($orderHeaders, $orders)
|
|
|
{
|
|
|
- foreach ($orders as $order) {
|
|
|
- $orderNo = $order['code'];
|
|
|
- $orderHeader = $orderHeaders[$orderNo];
|
|
|
- if ($orderHeader ?? false) {
|
|
|
- $updateFillable = [
|
|
|
- 'wms_status' => $orderHeader->oracleBASCode_codename_c,
|
|
|
- 'consignee_name' => $orderHeader['c_contact'] ?? '',
|
|
|
- 'consignee_phone' => $orderHeader['c_tel2'] ?? '',
|
|
|
- 'province' => $orderHeader['c_province'] ?? '',
|
|
|
- 'city' => $orderHeader['c_city'] ?? '',
|
|
|
- 'district' => $orderHeader['c_district'] ?? '',
|
|
|
- 'wms_edittime' => $orderHeader['edittime'] ?? '',
|
|
|
- 'address' => $orderHeader['c_address1'] ?? '',
|
|
|
- 'client_code' => $orderHeader['soreference1'] ?? '',
|
|
|
- ];
|
|
|
- $order->update($updateFillable);
|
|
|
+ $multipleData = [[
|
|
|
+ 'id', 'wms_status', 'consignee_name', 'consignee_phone', 'province', 'city', 'district', 'wms_edittime', 'address', 'client_code'
|
|
|
+ ]];
|
|
|
+
|
|
|
+ // XXX 循环 300个元素 3s - 5s
|
|
|
+ foreach ($orders as $key=>$order) {
|
|
|
+ $orderHeader = $orderHeaders[$key] ?? false;
|
|
|
+ if ($orderHeader) {
|
|
|
+
|
|
|
+ if($order->wms_status != $orderHeader->oracleBASCode_codename_c ||
|
|
|
+ $order->consignee_name != $orderHeader->c_contact ||
|
|
|
+ $order->consignee_phone != $orderHeader->c_tel2 ||
|
|
|
+ $order->province != $orderHeader->c_province ||
|
|
|
+ $order->city != $orderHeader->c_city ||
|
|
|
+ $order->district != $orderHeader->c_district ||
|
|
|
+ $order->wms_edittime != $orderHeader->edittime ||
|
|
|
+ $order->address != $orderHeader->c_address1 ||
|
|
|
+ $order->client_code != $orderHeader->soreference1 ){
|
|
|
+
|
|
|
+ $multipleData[] =[
|
|
|
+ 'id' =>$order->id,
|
|
|
+ 'wms_status' => $orderHeader->oracleBASCode_codename_c,
|
|
|
+ 'consignee_name' => $orderHeader->c_contact,
|
|
|
+ 'consignee_phone' => $orderHeader->c_tel2,
|
|
|
+ 'province' => $orderHeader->c_province,
|
|
|
+ 'city' => $orderHeader->c_city,
|
|
|
+ 'district' => $orderHeader->c_district,
|
|
|
+ 'wms_edittime' => $orderHeader->edittime,
|
|
|
+ 'address' => $orderHeader->c_address1,
|
|
|
+ 'client_code' => $orderHeader->soreference1,
|
|
|
+ ];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(count($multipleData) > 1){
|
|
|
+ try {
|
|
|
+ /** @var BatchUpdateService $batchUpdateService */
|
|
|
+ $batchUpdateService = app('batchUpdateService');
|
|
|
+ $batchUpdateService->batchUpdate('orders', $multipleData);
|
|
|
+ LogService::log(__METHOD__,__FUNCTION__,'批量更新'.count($multipleData).json_encode($multipleData));
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ LogService::log(__METHOD__,__FUNCTION__,'批量更新失败'.json_encode($multipleData).$e->getMessage(),$e->getTraceAsString());
|
|
|
+ } finally {
|
|
|
+ unset($multipleData);
|
|
|
}
|
|
|
}
|
|
|
}
|