|
|
@@ -4,6 +4,7 @@ namespace App\Services;
|
|
|
|
|
|
use App\Jobs\OrderCreateInstantBill;
|
|
|
use App\Jobs\OrderFreeze;
|
|
|
+use App\Log;
|
|
|
use App\Logistic;
|
|
|
use App\OracleActAllocationDetails;
|
|
|
use App\OracleDOCASNHeader;
|
|
|
@@ -12,6 +13,7 @@ use App\Order;
|
|
|
use App\OrderIssue;
|
|
|
use App\Owner;
|
|
|
use App\OwnerFeeDetail;
|
|
|
+use App\Province;
|
|
|
use App\RejectedBill;
|
|
|
use App\Services\common\BatchUpdateService;
|
|
|
use App\Services\common\DataHandlerService;
|
|
|
@@ -594,7 +596,7 @@ class OrderService
|
|
|
}
|
|
|
|
|
|
public function pushQueue($orderHeaders){
|
|
|
- $orders = Order::query()->with(["logistic","packages.commodities.commodity"])->where('wms_status','订单完成')->whereIn('code',data_get($orderHeaders,'*.code'))->get();
|
|
|
+ $orders = Order::query()->with(["logistic","packages.commodities.commodity"])->where('wms_status','订单完成')->whereIn('code',data_get($orderHeaders,'*.orderno'))->get();
|
|
|
$orders->each(function($order){
|
|
|
dispatch(new OrderCreateInstantBill($order));
|
|
|
});
|
|
|
@@ -645,8 +647,9 @@ class OrderService
|
|
|
|
|
|
unset($owners,$logistics,$shops,$warehouses,$batches);
|
|
|
// 转换插入 3s
|
|
|
+ $this->pushOrderCreatedCountCache($created_params);
|
|
|
if(count($created_params) > 0){
|
|
|
- collect($created_params)->chunk(3500)->each(function($inner_params){
|
|
|
+ collect($created_params)->chunk(1000)->each(function($inner_params){
|
|
|
$arr = $inner_params->toArray();
|
|
|
$this->insert($arr);
|
|
|
dispatch(new OrderFreeze($arr));
|
|
|
@@ -661,6 +664,7 @@ class OrderService
|
|
|
});
|
|
|
unset($update_order);
|
|
|
if(count($update_params)==0)return;
|
|
|
+ $this->pushOrderUpdatedCountCache($orders,$update_params);
|
|
|
$this->batchUpdate($update_params);
|
|
|
dispatch(new OrderFreeze($update_params));
|
|
|
unset($update_params);
|
|
|
@@ -1031,16 +1035,15 @@ class OrderService
|
|
|
$commodities = array_merge($commodities,$package->commodities->toArray());
|
|
|
|
|
|
if ($logistic_fee!==null){
|
|
|
- $provinceName = $order->province;
|
|
|
+ $provinceName = mb_substr($order->province,0,2);
|
|
|
$province = app(CacheService::class)->getOrExecute("province_".$provinceName,function ()use($provinceName){
|
|
|
- return app("ProvinceService")->first(["name"=>$provinceName]);
|
|
|
- },60);
|
|
|
+ return Province::query()->where("name","like",$provinceName."%")->first();
|
|
|
+ },86400);
|
|
|
if (!$province)$logistic_fee = null;
|
|
|
|
|
|
$fee = $service->matching($package->weight, $order->owner_id, $order->logistic_id, $province->id);
|
|
|
if ($fee<0)$logistic_fee = null;
|
|
|
-
|
|
|
- $logistic_fee += $fee;
|
|
|
+ else $logistic_fee += $fee;
|
|
|
}
|
|
|
}
|
|
|
if ($logistic_fee!==null && $logistic_fee<0)$logistic_fee = null;
|
|
|
@@ -1088,4 +1091,125 @@ class OrderService
|
|
|
return $count->c;
|
|
|
}
|
|
|
|
|
|
+ public function pushOrderUpdatedCountCache($orders,$update_params)
|
|
|
+ {
|
|
|
+ /** @var DataHandlerService $dataHandlerService */
|
|
|
+ $dataHandlerService = app(DataHandlerService::class);
|
|
|
+ $order_map = $dataHandlerService->dataHeader(['code'],$orders);
|
|
|
+ $owner_map = [];
|
|
|
+ $month_begin =date('Y-m-01 00:00:00');
|
|
|
+ foreach ($update_params as $update_param) {
|
|
|
+ if(!($update_param['wms_status'] ?? false) || $update_param['wms_status']!='订单完成')continue;
|
|
|
+ $wms_EditTime = \Illuminate\Support\Carbon::parse($update_param['wms_edittime']);
|
|
|
+ if($wms_EditTime->isBefore($month_begin))continue;
|
|
|
+ $owner_id = $update_param['owner_id'] ?? false;
|
|
|
+ if(!$owner_id)continue;
|
|
|
+ $order = $dataHandlerService->getKeyValue(['code'=>$update_param['code']],$order_map);
|
|
|
+ if(!$order)continue;
|
|
|
+ if($order['wms_status'] ==='订单完成')continue;
|
|
|
+ if(!array_key_exists($owner_id,$owner_map))$owner_map[$owner_id]=1;
|
|
|
+ else $owner_map[$owner_id]+=1;
|
|
|
+ }
|
|
|
+ foreach ($owner_map as $owner_id=>$count) {
|
|
|
+ $this->setCurrentFinishedOrders_byOwnerId($owner_id,$count);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public function pushOrderCreatedCountCache($created_params)
|
|
|
+ {
|
|
|
+ $owner_map=[];
|
|
|
+ $month_begin =date('Y-m-01 00:00:00');
|
|
|
+ foreach ($created_params as $created_param) {
|
|
|
+ $owner_id = $created_param['owner_id'] ?? false;
|
|
|
+ $wms_EditTime = \Illuminate\Support\Carbon::parse($created_param['wms_edittime']);
|
|
|
+ if($wms_EditTime->isBefore($month_begin))continue;
|
|
|
+ if(!$owner_id)continue;
|
|
|
+ if($created_param['wms_status']!=='订单完成')continue;
|
|
|
+ if(!array_key_exists($owner_id,$owner_map)) $owner_map[$owner_id]=1;
|
|
|
+ else $owner_map[$owner_id]+=1;
|
|
|
+ }
|
|
|
+ foreach ($owner_map as $owner_id=>$count) {
|
|
|
+ $this->setCurrentFinishedOrders_byOwnerId($owner_id,$count);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private function setCurrentFinishedOrders_byOwnerId($id,$count,$cancelCount = 0)
|
|
|
+ {
|
|
|
+ $sum = Cache::get("order_count_ownerId_{$id}",function()use($id){
|
|
|
+ return Order::query()
|
|
|
+ ->where('owner_id',$id)
|
|
|
+ ->where('wms_status','订单完成')
|
|
|
+ ->where('wms_edittime','>=',date('Y-m-01 00:00:00'))->count();
|
|
|
+ });
|
|
|
+ $sum += $count;
|
|
|
+ $sum -= $cancelCount;
|
|
|
+ Cache::put("order_count_ownerId_{$id}",$sum,date('Y-m-t 23:59:59'));
|
|
|
+ }
|
|
|
+
|
|
|
+ public function getCurrentFinishedOrders_byOwnerId($id): int
|
|
|
+ {
|
|
|
+ return Cache::get("order_count_ownerId_{$id}",function()use($id){
|
|
|
+ return Order::query()->where('owner_id',$id)
|
|
|
+ ->where('wms_status','订单完成')
|
|
|
+ ->where('wms_edittime','>=',date('Y-m-01 00:00:00'))
|
|
|
+ ->count();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 校正运输费
|
|
|
+ *
|
|
|
+ * @param Order $order
|
|
|
+ *
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+ public function reviseLogisticFee(Order $order):bool
|
|
|
+ {
|
|
|
+ /** @var \stdClass $order */
|
|
|
+ if (!$order || $order->wms_status != '订单完成')return false; //订单不存在或状态不为完成
|
|
|
+ $feeBill = OwnerFeeDetail::query()->where("outer_table_name","orders")
|
|
|
+ ->where("outer_id",$order->id)->whereNull("logistic_fee")->first();
|
|
|
+ if (!$feeBill)return false; //是否已有即时账单,没有跳出
|
|
|
+ $order->loadMissing("packages","owner");//加载包裹
|
|
|
+ if (!$order->packages || !$order->owner)return false;
|
|
|
+ $order->owner->loadCount("ownerPriceExpresses");
|
|
|
+ if ($order->owner->owner_price_expresses_count < 1)return false; //不存在计费模型 跳出
|
|
|
+ foreach ($order->packages as $package)if (!$package->weight)return false; //包裹存在且全部存在数量
|
|
|
+
|
|
|
+ $logisticFee = 0;
|
|
|
+ foreach ($order->packages as $package){
|
|
|
+ if ($logisticFee!==null){
|
|
|
+ $provinceName = mb_substr($order->province,0,2);
|
|
|
+ $province = app(CacheService::class)->getOrExecute("province_".$provinceName,function ()use($provinceName){
|
|
|
+ return Province::query()->where("name","like",$provinceName."%")->first();
|
|
|
+ },86400);
|
|
|
+ if (!$province)$logisticFee = null;
|
|
|
+
|
|
|
+ $fee = app("OwnerPriceExpressService")->matching($package->weight, $order->owner_id, $order->logistic_id, $province->id);
|
|
|
+ if ($fee<0)$logisticFee = null;
|
|
|
+ else $logisticFee += $fee;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ($logisticFee===null || $logisticFee<0)
|
|
|
+ LogService::log(__METHOD__,"ERROR-校正即时账单计算物流费错误","订单ID:".$order->id." 费用结果:".$logisticFee);
|
|
|
+ else $feeBill->update(["logistic_fee"=>$logisticFee]);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function freezeRemoveWave($orders, $isSql = false)
|
|
|
+ {
|
|
|
+ if (!$isSql && !is_array($orders))$orders = [$orders];
|
|
|
+ if (!$isSql){
|
|
|
+ $where = "''";
|
|
|
+ foreach ($orders as $f)$where .= ",'{$f}'";
|
|
|
+ $orders = $where;
|
|
|
+ }
|
|
|
+ $sql = <<<sql
|
|
|
+ DELETE FROM DOC_WAVE_DETAILS WHERE (WAVENO,ORDERNO) IN (SELECT DOC_ORDER_HEADER.WAVENO,DOC_ORDER_HEADER.ORDERNO FROM DOC_ORDER_HEADER LEFT JOIN DOC_WAVE_DETAILS ON DOC_ORDER_HEADER.WAVENO = DOC_WAVE_DETAILS.WAVENO
|
|
|
+ AND DOC_ORDER_HEADER.ORDERNO = DOC_WAVE_DETAILS.ORDERNO WHERE DOC_ORDER_HEADER.orderno IN ({$orders}) AND DOC_ORDER_HEADER.WAVENO != '*' AND DOC_ORDER_HEADER.WAVENO IS NOT NULL)
|
|
|
+sql;
|
|
|
+ $result = DB::connection("oracle")->delete(DB::raw("$sql"));
|
|
|
+ LogService::log(__METHOD__,"删除波次详情",$sql);
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
}
|