|
|
@@ -18,6 +18,7 @@ use App\Shop;
|
|
|
use App\ValueStore;
|
|
|
use App\Warehouse;
|
|
|
use Carbon\Carbon;
|
|
|
+use Illuminate\Database\Eloquent\Builder;
|
|
|
use Illuminate\Support\Collection;
|
|
|
use Illuminate\Support\Facades\App;
|
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
@@ -697,13 +698,10 @@ class OrderService
|
|
|
unset($updateParams, $orderHeaders);
|
|
|
}
|
|
|
|
|
|
- public function getByWmsOrders($orderHeaders)
|
|
|
- {
|
|
|
- if (!$orderHeaders) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- $order_nos = data_get($orderHeaders, '*.orderno');
|
|
|
- return Order::query()->whereIn('code', $order_nos)->get();
|
|
|
+ public function getByWmsOrders($orderHeaders){
|
|
|
+ if(!$orderHeaders){return null;}
|
|
|
+ $order_nos = data_get($orderHeaders,'*.orderno');
|
|
|
+ return Order::query()->with('packages.commodities')->whereIn('code',$order_nos)->get();
|
|
|
}
|
|
|
|
|
|
public function 返回有问题件的订单号($orders)
|
|
|
@@ -800,21 +798,25 @@ class OrderService
|
|
|
return $orders ? $orders->first() : null;
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
public function syncOrder(&$orderHeaders)
|
|
|
{
|
|
|
/**
|
|
|
* @var OrderPackageService $packageService
|
|
|
+ * @var OrderCommodityService $orderCommodityService
|
|
|
*/
|
|
|
$packageService = app("OrderPackageService");
|
|
|
+ $orderCommodityService = app("OrderCommodityService");
|
|
|
+
|
|
|
$this->syncOrderByWMSOrderHeaders($orderHeaders);
|
|
|
+
|
|
|
+ $orderCommodityService->syncOrderCommodities($orderHeaders);
|
|
|
+
|
|
|
$packageService->syncOrderPackage($orderHeaders);
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
public function syncOrderByWMSOrderHeaders(&$orderHeaders)
|
|
|
{
|
|
|
- if ($orderHeaders->isEmpty()) return [];
|
|
|
+ if($orderHeaders->isEmpty())return;
|
|
|
/**
|
|
|
* @var OwnerService $ownerService
|
|
|
* @var LogisticService $logisticService
|
|
|
@@ -825,34 +827,51 @@ class OrderService
|
|
|
$logisticService = app("LogisticService");
|
|
|
$shopService = app('ShopService');
|
|
|
$warehouseService = app('WarehouseService');
|
|
|
+ $owner_codes = [];$logistic_codes = [];$warehouse_codes = [];$shop_names = [];
|
|
|
+ foreach ($orderHeaders as $orderHeader) {
|
|
|
+ if(!empty($orderHeader['customerid']))
|
|
|
+ $owner_codes[$orderHeader['customerid']] = $orderHeader['customerid'];
|
|
|
+ if(!empty($orderHeader['warehouseid']))
|
|
|
+ $warehouse_codes[$orderHeader['warehouseid']] = $orderHeader['warehouseid'];
|
|
|
+ if(!empty($orderHeader['userdefine1']))
|
|
|
+ $logistic_codes[$orderHeader['userdefine1']] = $orderHeader['userdefine1'];
|
|
|
+ if(!empty($orderHeader['issuepartyname']) && !empty($orderHeader['customerid'])){
|
|
|
+ $value = ['owner_code'=>$orderHeader['customerid'],'issuepartyname'=>$orderHeader['issuepartyname']];
|
|
|
+ $key = "owner_code_{$orderHeader['customerid']}_issuepartyname_{$orderHeader['issuepartyname']}";
|
|
|
+ $shop_names[$key] = $value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $owners = $ownerService->getOwnerByCodes($owner_codes);
|
|
|
+ $logistics = $logisticService->getLogisticByCodes($logistic_codes);
|
|
|
+ $shops = $shopService->getShopByCodeMap($shop_names);
|
|
|
+ $warehouses = $warehouseService->getWareHouseByCode($warehouse_codes);
|
|
|
|
|
|
- $owners = $ownerService->getByWmsOrders($orderHeaders);
|
|
|
- $logistics = $logisticService->getByWmsOrders($orderHeaders);
|
|
|
- $shops = $shopService->getByWmsOrders($orderHeaders);
|
|
|
- $warehouses = $warehouseService->getByWmsOrders($orderHeaders);
|
|
|
$orders = $this->getByWmsOrders($orderHeaders);
|
|
|
- $created_params = $this->getCreateOrderModelsByWMSOrderHeaders($orderHeaders, $orders, $warehouses, $owners, $logistics, $shops); //3s
|
|
|
|
|
|
- $update_order = $this->getUpdateOrderModelByWMSOrderHeaders($orderHeaders, $orders, $warehouses, $owners, $logistics, $shops);
|
|
|
+ $created_params = $this->getCreateOrderModelsByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops); //3s
|
|
|
+
|
|
|
+ $update_order = $this->getUpdateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops);
|
|
|
+
|
|
|
+
|
|
|
// 转换插入 3s
|
|
|
- if (count($created_params) > 0) {
|
|
|
- collect($created_params)->chunk(4000)->each(function ($inner_params) {
|
|
|
+ if(count($created_params) > 0){
|
|
|
+ collect($created_params)->chunk(3500)->each(function($inner_params){
|
|
|
$this->insert($inner_params->toArray());
|
|
|
});
|
|
|
}
|
|
|
$update_params = [
|
|
|
- ['id', 'code', 'warehouse_id', 'owner_id', 'shop_id', 'logistic_id', 'consignee_name', 'consignee_phone', 'province', 'city', 'district', 'address', 'client_code', 'wms_status', 'created_at', 'updated_at', 'wms_edittime']
|
|
|
+ ['id','code','warehouse_id','owner_id','shop_id','logistic_id','consignee_name','consignee_phone','province','city','district','address','client_code','wms_status','created_at','updated_at','wms_edittime','order_type']
|
|
|
];
|
|
|
- $update_order->map(function ($item) {
|
|
|
- return $item->toArray();
|
|
|
- })->each(function ($item) use (&$update_params) {
|
|
|
- $update_params[] = $item;
|
|
|
+
|
|
|
+ $update_order->each(function($item)use(&$update_params){
|
|
|
+ $update_params[] = $item->toArray();
|
|
|
});
|
|
|
+ if(count($update_order)==0)return;
|
|
|
+
|
|
|
$this->batchUpdate($update_params);
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
- public function getCreateOrderModelsByWMSOrderHeaders($orderHeaders, $orders, $warehouses, $owners, $logistics, $shops)
|
|
|
+ public function getCreateOrderModelsByWMSOrderHeaders(&$orderHeaders,&$orders,&$warehouses,&$owners,&$logistics,&$shops)
|
|
|
{
|
|
|
/** @var DataHandlerService $dataHandlerService */
|
|
|
$dataHandlerService = app('DataHandlerService');
|
|
|
@@ -863,8 +882,7 @@ class OrderService
|
|
|
$shop_map = $dataHandlerService->dataHeader(['name', 'owner_id'], $shops);
|
|
|
$order_map = $dataHandlerService->dataHeader(['code'], $orders);
|
|
|
|
|
|
-// $collect = collect();
|
|
|
- $inner_params = [];
|
|
|
+ $inner_params = [];
|
|
|
$date = (string)Carbon::now();
|
|
|
foreach ($orderHeaders as $orderHeader) {
|
|
|
$order_no = $orderHeader->orderno;
|
|
|
@@ -872,13 +890,11 @@ class OrderService
|
|
|
if (isset($order)) continue;
|
|
|
$order_model = $this->getCreateOrderModels($orderHeader, $warehouse_map, $owner_map, $logistic_map, $shop_map, $date);
|
|
|
$inner_params[] = $order_model;
|
|
|
-// $collect->push($order_model);
|
|
|
}
|
|
|
return $inner_params;
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
- public function getUpdateOrderModelByWMSOrderHeaders($orderHeaders, $orders, $warehouses, $owners, $logistics, $shops)
|
|
|
+ public function getUpdateOrderModelByWMSOrderHeaders(&$orderHeaders,&$orders,&$warehouses,&$owners,&$logistics,&$shops)
|
|
|
{
|
|
|
/**
|
|
|
* @var DataHandlerService $dataHandlerService
|
|
|
@@ -904,8 +920,7 @@ class OrderService
|
|
|
return $collect;
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
- public function getCreateOrderModels(&$orderHeader, &$warehouse_map, &$owner_map, &$logistic_map, &$shop_map, $date)
|
|
|
+ public function getCreateOrderModels(&$orderHeader,&$warehouse_map,&$owner_map,&$logistic_map,&$shop_map,$date)
|
|
|
{
|
|
|
/** @var DataHandlerService $dataHandlerService */
|
|
|
$dataHandlerService = app('DataHandlerService');
|
|
|
@@ -930,7 +945,8 @@ class OrderService
|
|
|
'address' => $orderHeader['c_address1'],
|
|
|
'client_code' => $orderHeader['soreference1'],
|
|
|
'wms_edittime' => $orderHeader['edittime'],
|
|
|
- 'wms_status' => $orderHeader->oracleBASCode->codename_c ?? '',
|
|
|
+ 'wms_status' => $orderHeader->oracleBASCode->codename_c??'',
|
|
|
+ 'order_type' => $orderHeader->orderType->codename_c??'',
|
|
|
'updated_at' => $date,
|
|
|
'created_at' => $orderHeader['addtime']
|
|
|
];
|
|
|
@@ -947,7 +963,7 @@ class OrderService
|
|
|
* @param $updateParams
|
|
|
* @return mixed
|
|
|
*/
|
|
|
- public function UpdateOrderParamBy($shop, $logistic, $owner, $warehouse, $order, $orderHeader, string $updated_at, &$updateParams)
|
|
|
+ public function UpdateOrderParamBy(&$shop, &$logistic, &$owner, &$warehouse, &$order, &$orderHeader, string &$updated_at, &$updateParams)
|
|
|
{
|
|
|
$shop_id = $shop->id ?? null;
|
|
|
$logistic_id = $logistic->id ?? null;
|
|
|
@@ -982,11 +998,11 @@ class OrderService
|
|
|
'updated_at' => $updated_at,
|
|
|
'created_at' => $orderHeader->addtime,
|
|
|
'wms_edittime' => $orderHeader->edittime,
|
|
|
+ 'order_type' => $orderHeader->orderType->codename_c??'',
|
|
|
'warehouse_id' => $warehouse_id];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
public function createOrFindOrder($orderHeader)
|
|
|
{
|
|
|
$order = Order::query()->where('code', $orderHeader->orderno)->first();
|
|
|
@@ -1002,7 +1018,6 @@ class OrderService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
public function createOrFindOrderInfo($orderHeader)
|
|
|
{
|
|
|
/**
|
|
|
@@ -1015,7 +1030,7 @@ class OrderService
|
|
|
$orderHeaders->push($orderHeader);
|
|
|
try {
|
|
|
$this->syncOrderByWMSOrderHeaders($orderHeaders);
|
|
|
- $orderPackageService->syncOrderPackage($orderHeaders);
|
|
|
+ $orderPackageService->syncPackageByOrderHeaders($orderHeaders);
|
|
|
$orderPackageCommoditiesService->syncOrderPackageCommodities($orderHeaders);
|
|
|
return Order::query()->with('packages.commodities')->where('code', $orderHeader->orderno)->first();
|
|
|
} catch (\Exception $e) {
|
|
|
@@ -1024,31 +1039,24 @@ class OrderService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- // TODO
|
|
|
- public function setOrderSyncAt($key, $date, $bool = true)
|
|
|
- {
|
|
|
- if ($bool) {
|
|
|
- ValueStore::query()->where('name', $key)->update(['value' => Carbon::parse($date)->subSeconds(1)]);
|
|
|
+ public function setOrderSyncAt($key,$date,$bool=true){
|
|
|
+ if($bool){
|
|
|
+ ValueStore::query()->where('name',$key)->update(['value'=>Carbon::parse($date)->subSeconds(1)]);
|
|
|
} else {
|
|
|
ValueStore::query()->where('name', $key)->update(['value' => $date]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
- public function getOrderSyncAt($key, $type = 'newest')
|
|
|
- {
|
|
|
- $keyValue = ValueStore::query()->where('name', $key)->first();
|
|
|
- if ($keyValue->value) return $keyValue->value;
|
|
|
- if ($type == 'newest') $order = Order::query()->orderByDesc('Created_At')->first();
|
|
|
+ public function getOrderSyncAt($key,$type='newest'){
|
|
|
+ $keyValue = ValueStore::query()->where('name',$key)->first();
|
|
|
+ if($keyValue->value)return $keyValue->value;
|
|
|
+ if($type == 'newest') $order = Order::query()->orderByDesc('Created_At')->first();
|
|
|
else $order = Order::query()->orderByDesc('Wms_EditTime')->first();
|
|
|
if ($order) return $order->created_at;
|
|
|
return Carbon::now()->subSeconds(65);
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
- public function pushOrderCache($orderHeaders, $prefixKey, $hasKey, $list_key)
|
|
|
- {
|
|
|
+ public function pushOrderCache($orderHeaders,$prefixKey,$hasKey,$list_key){
|
|
|
$list = [];
|
|
|
if (Cache::get($hasKey)) {
|
|
|
collect($orderHeaders)->each(function ($item) use (&$list, $prefixKey) {
|
|
|
@@ -1062,8 +1070,7 @@ class OrderService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
- public function filterOrderByCache($orderHeaders, $key)
|
|
|
+ public function filterOrderByCache($orderHeaders,$key)
|
|
|
{
|
|
|
/**
|
|
|
* @var OracleDOCOrderHeader $item
|
|
|
@@ -1079,10 +1086,10 @@ class OrderService
|
|
|
return $orderHeaders;
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
- public function cancelOrderCache($key, string $prefix)
|
|
|
+ public function cancelOrderCache($key,string $prefix)
|
|
|
{
|
|
|
- if (Cache::get($key)) {
|
|
|
+ try {
|
|
|
+ Redis::LLEN($key);
|
|
|
$list = Cache::get($key);
|
|
|
collect($list)->each(function ($item) use ($prefix) {
|
|
|
Cache::forget($prefix . $item);
|
|
|
@@ -1091,9 +1098,7 @@ class OrderService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
- public function syncCreatedOrder()
|
|
|
- {
|
|
|
+ public function syncCreatedOrder(){
|
|
|
/**
|
|
|
* @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService
|
|
|
* @var OrderService $orderService
|
|
|
@@ -1114,15 +1119,13 @@ class OrderService
|
|
|
|
|
|
if (count($orderHeaders) > 0 && count($orderHeaders) > 0) {
|
|
|
$orderService->syncOrder($orderHeaders); // 同步订单
|
|
|
- $orderService->cancelOrderCache($newest_list); // 清除缓存
|
|
|
- $orderService->pushOrderCache($renewal_orders, $prefixKey, $hasKey, $newest_list); // 添加缓存
|
|
|
- $orderService->setOrderSyncAt($newest, $last_order->addTime, count($orderHeaders) > 0); // 更新时间
|
|
|
+ $orderService->cancelOrderCache($newest_list,$prefixKey); // 清除缓存
|
|
|
+ $orderService->pushOrderCache($renewal_orders,$prefixKey,$hasKey,$newest_list); // 添加缓存
|
|
|
+ $orderService->setOrderSyncAt($newest,$last_order->addTime,count($orderHeaders)>0); // 更新时间
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // TODO
|
|
|
- public function syncUpdatedOrder()
|
|
|
- {
|
|
|
+ public function syncUpdatedOrder(){
|
|
|
/**
|
|
|
* @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService
|
|
|
* @var OrderService $orderService
|
|
|
@@ -1143,9 +1146,9 @@ class OrderService
|
|
|
|
|
|
if (count($renewal_orders) > 0 && count($orderHeaders) > 0) {
|
|
|
$orderService->syncOrder($orderHeaders); // 同步订单
|
|
|
- $orderService->cancelOrderCache($renewal_list); // 清除缓存
|
|
|
- $orderService->pushOrderCache($renewal_orders, $prefixKey, $hasKey, $renewal_list); // 添加缓存
|
|
|
- $orderService->setOrderSyncAt($renewal, $renewal_order->addTime, count($orderHeaders) > 0); // 更新时间
|
|
|
+ $orderService->cancelOrderCache($renewal_list,$prefixKey); // 清除缓存
|
|
|
+ $orderService->pushOrderCache($renewal_orders,$prefixKey,$hasKey,$renewal_list); // 添加缓存
|
|
|
+ $orderService->setOrderSyncAt($renewal,$renewal_order->addTime,count($orderHeaders)>0); // 更新时间
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1162,29 +1165,75 @@ class OrderService
|
|
|
public function createInstantBill(Order $order):bool
|
|
|
{
|
|
|
//检查订单对象
|
|
|
- if (!$order || $order->status != "订单完成")return false;
|
|
|
- if (!$order->packages)$order->load("packages");
|
|
|
+ if (!$order || $order->wms_status != "订单完成")return false;
|
|
|
+ $order->loadMissing(["logistic","packages.commodities.commodity"]);
|
|
|
|
|
|
/** @var OwnerPriceExpressService $service */
|
|
|
$service = app("OwnerPriceExpressService");
|
|
|
$logistic_fee = 0;
|
|
|
- foreach ($order->packages as $package){
|
|
|
- $provinceName = $order->province;
|
|
|
- $province = app(CacheService::class)->getOrExecute("province_".$provinceName,function ()use($provinceName){
|
|
|
- return app("ProvinceService")->first(["name"=>$provinceName]);
|
|
|
- },86400);
|
|
|
- if (!$province){$logistic_fee = null;break;}
|
|
|
+ $commodities = [];
|
|
|
+ $amount = 0;
|
|
|
+ $volume = 0;
|
|
|
+ $weight = 0;
|
|
|
+ $logistic_bill = "";
|
|
|
+
|
|
|
+ if (!$order->logistic || $order->logistic->type != "快递")$logistic_fee = null;
|
|
|
+
|
|
|
+ foreach ($order->packages as &$package){
|
|
|
+ $logistic_bill .= $package->logistic_number.",";
|
|
|
+ $volume += $package->bulk;
|
|
|
+ $weight += $package->weight;
|
|
|
+
|
|
|
+ // 四维转二维
|
|
|
+ foreach($package->commodities as &$commodity){
|
|
|
+ $commodity["commodity_name"] = $commodity->commodity ? $commodity->commodity->name : '';
|
|
|
+ $commodity["sku"] = $commodity->commodity ? $commodity->commodity->sku : '';
|
|
|
+ $amount += $commodity->amount;
|
|
|
+ }
|
|
|
+ $commodities = array_merge($commodities,$package->commodities->toArray());
|
|
|
|
|
|
- $fee = $service->matching($package->weight, $order->owner_id, $order->logistic_id, $province->id);
|
|
|
- if ($fee<0){$logistic_fee = null;break;}
|
|
|
+ if ($logistic_fee!==null){
|
|
|
+ $provinceName = $order->province;
|
|
|
+ $province = app(CacheService::class)->getOrExecute("province_".$provinceName,function ()use($provinceName){
|
|
|
+ return app("ProvinceService")->first(["name"=>$provinceName]);
|
|
|
+ },60);
|
|
|
+ if (!$province)$logistic_fee = null;
|
|
|
|
|
|
- $logistic_fee += $fee;
|
|
|
+ $fee = $service->matching($package->weight, $order->owner_id, $order->logistic_id, $province->id);
|
|
|
+ if ($fee<0)$logistic_fee = null;
|
|
|
+
|
|
|
+ $logistic_fee += $fee;
|
|
|
+ }
|
|
|
}
|
|
|
+ if ($logistic_fee!==null && $logistic_fee<0)$logistic_fee = null;
|
|
|
+
|
|
|
+ $object = ["commodities"=>$commodities,"logistic_name"=>($order->logistic ? $order->logistic->name : ''),"shop_name"=>($order->shop ? $order->shop->name : ''),"order_type"=>$order->order_type];
|
|
|
+ $mapping = ["packages"=>"commodities","商品名称"=>"commodity_name","承运商"=>"logistic_name","店铺类型"=>"shop_name","订单类型"=>"order_type"];
|
|
|
|
|
|
- $work_fee = 0;
|
|
|
/** @var OwnerPriceOperationService $service */
|
|
|
$service = app("OwnerPriceOperationService");
|
|
|
- $service->matchRule($order,[]);
|
|
|
-
|
|
|
+ $work_fee = $service->matchRule($object,$mapping,$order->owner_id,"出库");
|
|
|
+ if ($work_fee < 0)$work_fee = null;
|
|
|
+
|
|
|
+ if (app("OwnerFeeDetailService")->create([
|
|
|
+ "owner_id" => $order->owner_id,
|
|
|
+ "worked_at" => $order->wms_edittime,
|
|
|
+ "type" => "发货",
|
|
|
+ "shop_id" => $order->shop_id,
|
|
|
+ "operation_bill" => $order->code,
|
|
|
+ "consignee_name" => $order->consignee_name,
|
|
|
+ "consignee_phone" => $order->consignee_phone,
|
|
|
+ "commodity_amount" => $amount,
|
|
|
+ "logistic_bill" => rtrim($logistic_bill,","),
|
|
|
+ "volume" => $volume,
|
|
|
+ "weight" => $weight,
|
|
|
+ "logistic_id" => $order->logistic_id,
|
|
|
+ "work_fee" => $work_fee,
|
|
|
+ "logistic_fee" => $logistic_fee,
|
|
|
+ "created_at" => date('Y-m-d H:i:s'),
|
|
|
+ "outer_id" => $order->id,
|
|
|
+ "outer_table_name" => "orders",
|
|
|
+ ]))return true;
|
|
|
+ return false;
|
|
|
}
|
|
|
}
|