// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\api\model; use app\common\enum\goods\GoodsType; use app\common\enum\order\DeliveryStatus as DeliveryStatusEnum; use app\common\enum\order\ReceiptStatus as ReceiptStatusEnum; use app\common\library\express\Kuaidi100; use app\common\library\helper; use app\common\model\Kuaidi as KuaidiModel; use app\store\model\card\UserRiceDelivery as UserRiceDeliveryModel; use app\store\model\card\UserRiceDeliveryExpress as UserRiceDeliveryExpressModel; use app\api\model\OrderGoods as OrderGoodsModel; use app\api\model\Order as OrderModel; use app\api\model\OrderGoodsPackage as OrderGoodsPackageModel; use app\api\model\Setting as SettingModel; use app\common\exception\BaseException; /** * 用户收货地址模型 * Class UserAddress * @package app\common\model */ class Kuaidi extends KuaidiModel { /** * 隐藏字段 * @var array */ protected $hidden = []; /** * 新增或修改快递地址 * @param array $param * @return mixed * @throws BaseException */ public function upd(array $param) { $param['param'] = json_decode(urldecode(htmlspecialchars_decode($param['param'])),true); $json = $param['param']; empty($json) && throwError('没有接收到订单信息'); $com = $json['lastResult']['com']; $nu = $json['lastResult']['nu']; $res = $this->get(['number'=>$nu]); if($res){//有存过数据就更新 $res = $this->updateBase(['json' => serialize($json),'update_time'=>time()], ['id'=>$res['id']]); }else{ $data = [ 'number'=>$nu, 'company'=>$com, 'json'=>serialize($json), 'target_type'=>$param['type'], ]; $res= $this->save($data); } self::updComm($json,$param['type']); return $res; } //根据异步回调的签收状态来修改结算时间 private function updComm($json,$type){ //当前快递为签收状态并且是后台发货 if($json['lastResult']['state']==3 && $type==1){ self::updOrderGoods($json); } //当前快递为签收状态并且是后台拆分发货时 if($json['lastResult']['state']==3 && $type==3){ self::updOrderGoodsPackage($json); } //当前快递为签收状态并且是实物卡类型 if($json['lastResult']['state']==3 && $type==4){ self::updUserRiceDelivery($json); } } //添加订单商品结算时间 private function updOrderGoods($json){ $model = new OrderGoodsModel(); //获取物流单号相同并且没有结算时间的订单商品ID集 $orderGoodsIds = $model->where(['express_no'=>$json['lastResult']['nu'],'provider_settlement_time'=>0])->column('order_goods_id'); // 更新订单商品结算时间 if (!empty($orderGoodsIds)) { // 自动关闭订单的分钟数 $provider_days = SettingModel::getItem('provider_settlement', $this->storeId)['provider_days'];//供应商结算时间 $refund = SettingModel::getItem('refund', $this->storeId);//售后及佣金结算时间 $data = [ 'provider_settlement_time' => time()+$provider_days*86400, 'commission_settlement_time' => time()+$refund['commission_days']*86400, 'refund_time' => time()+$refund['refund_days']*86400, 'auto_receipt_time' => time()+$refund['receive_days']*86400, 'sign_time' => time(), ]; $dataOrder = [ 'commission_settlement_time' => time()+$refund['commission_days']*86400, 'refund_time' => time()+$refund['refund_days']*86400,//关闭售后时间 ]; //添加测试的时间 if(env('SERVE_ENV')=='test') { $data = [ 'provider_settlement_time' => time() + 300,//供应商结算开始时间5分钟后 'commission_settlement_time' => time() + 600,//分佣结算开始时间10分钟后 'refund_time' => time() + 300,//关闭售后时间5分钟 'auto_receipt_time' => time() + 300,//自动收货最晚时间5分钟后 'sign_time' => time(),//记录签到时间 //售后退款用户退货发货超时5分钟 ]; $dataOrder = [ 'commission_settlement_time' => time() + 600,//分佣结算开始时间10分钟后 'refund_time' => time() + 300,//关闭售后时间5分钟 ]; } OrderGoodsModel::updateBase($data, [['order_goods_id', 'in', $orderGoodsIds]]); $orderIds = $model->where('order_goods_id','in',$orderGoodsIds)->column('order_id'); foreach ($orderIds as $orderId){ //不存在未签收未退款非赠品的商品就更新订单的最终结算时间 if(!OrderGoodsModel::where('order_id',$orderId)->where('commission_settlement_time','=',0)->where('has_refund_full',0)->where('goods_type','<>',GoodsType::GIFT )->count()){ OrderModel::updateBase($dataOrder,['order_id'=>$orderId]); } } } } //添加订单商品拆分包裹的签收时间 private function updOrderGoodsPackage($json){ $model = new OrderGoodsPackageModel(); //获取物流单号相同并且没有签收的订单商品包裹记录 $orderGoodsPackages = $model->where(['express_no'=>$json['lastResult']['nu'],'is_sign'=>0])->select(); foreach ($orderGoodsPackages as $orderGoodsPackage){ // if (!$orderGoodsPackage) { $orderGoodsPackage->is_sign = 1; $orderGoodsPackage->sign_time = date('Y-m-d H:i:s'); $orderGoodsPackage->save(); //如果所有的订单商品包裹都已经签收了,那就更新订单商品结算时间 if(!OrderGoodsPackageModel::where('order_goods_id',$orderGoodsPackage['order_goods_id'])->where('is_sign',0)->count()){ // 自动关闭订单的分钟数 $provider_days = SettingModel::getItem('provider_settlement', $this->storeId)['provider_days'];//供应商结算时间 $refund = SettingModel::getItem('refund', $this->storeId);//供应商结算时间 $data = [ 'provider_settlement_time' => time()+$provider_days*86400, 'commission_settlement_time' => time()+$refund['commission_days']*86400, 'refund_time' => time()+$refund['refund_days']*86400, 'auto_receipt_time' => time()+$refund['receive_days']*86400, 'sign_time' => time(), ]; $dataOrder = [ 'commission_settlement_time' => time()+$refund['commission_days']*86400, 'refund_time' => time()+$refund['refund_days']*86400,//关闭售后时间 ]; //添加测试的时间 if(env('SERVE_ENV')=='test') { $data = [ 'provider_settlement_time' => time() + 300,//供应商结算开始时间5分钟后 'commission_settlement_time' => time() + 600,//分佣结算开始时间10分钟后 'refund_time' => time() + 300,//关闭售后时间5分钟 'auto_receipt_time' => time() + 300,//自动收货最晚时间5分钟后 'sign_time' => time(),//记录签到时间 //售后退款用户退货发货超时5分钟 ]; $dataOrder = [ 'commission_settlement_time' => time() + 600,//分佣结算开始时间10分钟后 'refund_time' => time() + 300,//关闭售后时间5分钟 ]; } OrderGoodsModel::updateBase($data, ['order_goods_id'=>$orderGoodsPackage['order_goods_id']]); $orderId = $model->where('order_goods_id',$orderGoodsPackage['order_goods_id'])->value('order_id'); //不存在未签收未退款非赠品的商品就更新订单的最终结算时间 if(!OrderGoodsModel::where('order_id',$orderId)->where('commission_settlement_time','=',0)->where('has_refund_full',0)->where('goods_type','<>',GoodsType::GIFT )->count()){ OrderModel::updateBase($dataOrder,['order_id'=>$orderId]); } } // } } } //当前快递为签收状态并且是实物卡类型 private function updUserRiceDelivery($json){ $model = new UserRiceDeliveryExpressModel(); //获取物流单号相同并且没有签收的订单商品包裹记录 $userRiceDeliveryExpress = $model->where(['express_no'=>$json['lastResult']['nu'],'is_sign'=>0])->select(); foreach ($userRiceDeliveryExpress as $express){ $express->is_sign = 1; $express->sign_time = date('Y-m-d H:i:s'); $express->receipt_status = ReceiptStatusEnum::RECEIVED; $express->receipt_time = date('Y-m-d H:i:s'); $express->save(); //如果所有的订单商品包裹都已经签收了,那就更新订单商品结算时间 if(!UserRiceDeliveryExpressModel::where(['user_rice_delivery_id'=>$express['user_rice_delivery_id'],'is_sign'=>0])->count()){ $data= [ 'receipt_status' => ReceiptStatusEnum::RECEIVED, 'receipt_time' => time(), 'status' => 20, ]; UserRiceDeliveryModel::updateBase($data, ['id'=>$express['user_rice_delivery_id']]); } } } }