after_expire_at)) { // throw new BizException('该订单商品还未签收无法发起售后'); // } // // 校验这个订单商品是否还能发起售后-待完成 // if ($orderProduct->after_expire_at < now()) { // throw new BizException('该订单商品已过售后时间'); // } // //校验该订单商品不能有已完成、处理中的售后记录 // if ($orderProduct->after_sale_state > 0) { // throw new BizException('该订单商品已申请售后'); // } if (!$orderProduct->can_after_sale) { throw new BizException('该订单商品无法发起售后'); } //校验申请数量不能超过订单商品数量 if ($num > $orderProduct->quantity) { throw new BizException('申请售后的数量不能大于订单商品数量'); } $amount = ($num == $orderProduct->quantity) ? $orderProduct->total_amount : bcmul(bcdiv($orderProduct->total_amount, $orderProduct->quantity), $num); $afterSale = AfterSale::create(array_merge($params, [ 'user_id' => $user->id, 'order_id' => $orderProduct->order_id, 'amount' => $amount, 'state' => AfterSale::STATE_VERIFY, ])); $orderProduct->after_sale_state = 1; return $afterSale; } /** * 是否待审核 * * @param AfterSale $afterSale * @return boolean */ protected function isWaitVerify(AfterSale $afterSale) { return $afterSale->state == $afterSale::STATE_VERIFY; } /** * 是否待补充资料 * * @param AfterSale $afterSale * @return boolean */ protected function isWaitApply(AfterSale $afterSale) { return $afterSale->state == $afterSale::STATE_APPLY; } /** * 是否待确认 * * @param AfterSale $afterSale * @return boolean */ protected function isWaitAgree(AfterSale $afterSale) { return $afterSale->state == $afterSale::STATE_AGREE; } /** * 是否待确认收货 * * @param AfterSale $afterSale * @return boolean */ protected function isWaitShipping(AfterSale $afterSale) { return $afterSale->state == $afterSale::STATE_SHIPPING; } /** * 是否待打款 * * @param AfterSale $afterSale * @return boolean */ protected function isWaitFinance(AfterSale $afterSale) { return $afterSale->state == $afterSale::STATE_FINANCE; } /** * 补充资料申请 * * @param [AfterSale] $afterSale * @param array $params * @return AfterSale */ public function apply(AfterSale $afterSale, array $params): AfterSale { if ($this->isWaitApply($afterSale)) { $afterSale->update(array_merge($params, [ 'state' => AfterSale::STATE_VERIFY, ])); AfterSaleLog::create([ 'after_sale_id' => $afterSale->id, 'name' => '补充资料', 'desc' => $afterSale->description, 'images' => $afterSale->images, ]); return $afterSale; } else { throw new BizException('售后订单状态异常,请稍后再试'); } } /** * 审核通过 * * @param AfterSale $afterSale * @param string $remarks * @return void */ public function verify(AfterSale $afterSale, string $remarks, int $amount) { if ($this->isWaitVerify($afterSale)) { switch ($afterSale->type) { case AfterSale::TYPE_REFUND_AND_RETURN: $afterSale->update([ 'amount' => $amount, 'state' => $afterSale::STATE_AGREE, 'remarks' => $remarks, ]); AfterSaleLog::create([ 'after_sale_id' => $afterSale->id, 'name' => '客服审核', 'desc' => $remarks, ]); break; case AfterSale::TYPE_REFUND: $afterSale->update([ 'amount' => $amount, 'state' => $afterSale::STATE_AGREE, 'remarks' => $remarks, ]); AfterSaleLog::create([ 'after_sale_id' => $afterSale->id, 'name' => '客服审核', 'desc' => $remarks, ]); break; case AfterSale::TYPE_CHANGE: $afterSale->update([ 'state' => $afterSale::STATE_AGREE, 'remarks' => $remarks, ]); AfterSaleLog::create([ 'after_sale_id' => $afterSale->id, 'name' => '客服审核', 'desc' => $remarks, ]); break; case AfterSale::TYPE_FILL: $afterSale->update([ 'state' => $afterSale::STATE_AGREE, 'remarks' => $remarks, ]); AfterSaleLog::create([ 'after_sale_id' => $afterSale->id, 'name' => '客服审核', 'desc' => $remarks, ]); break; } } else { throw new BizException('该售后订单状态异常'); } } /** * 补充资料 * * @param AfterSale $afterSale * @param string $remarks * @return void */ public function backApply(AfterSale $afterSale, string $remarks) { if ($this->isWaitVerify($afterSale)) { $afterSale->update([ 'state' => $afterSale::STATE_APPLY, 'remarks' => $remarks, ]); AfterSaleLog::create([ 'after_sale_id' => $afterSale->id, 'name' => '客服审核', 'desc' => $remarks, ]); } else { throw new BizException('该售后订单状态异常'); } } public function agree(AfterSale $afterSale, array $params, $remarks = '用户已同意客服审核结果') { if ($this->isWaitAgree($afterSale)) { switch ($afterSale->type) { case AfterSale::TYPE_REFUND_AND_RETURN: $afterSale->update([ 'tracking_number'=>$params['tracking_number'], 'remarks'=> $remarks, 'state' => AfterSale::STATE_SHIPPING, ]); break; case AfterSale::TYPE_REFUND://退款订单 $afterSale->update([ 'remarks'=> $remarks, 'state' => AfterSale::STATE_FINANCE, ]); break; case AfterSale::TYPE_CHANGE: $afterSale->update([ 'tracking_number'=>$params['tracking_number'], 'remarks' => $remarks, 'state' => AfterSale::STATE_SHIPPING, ]); break; case AfterSale::TYPE_FILL: $afterSale->update([ 'remarks' => $remarks, 'state' => AfterSale::STATE_FINISH, ]); break; } AfterSaleLog::create([ 'after_sale_id' => $afterSale->id, 'name' => '客户确认', 'desc' => $remarks, ]); return $afterSale; } else { throw new BizException('售后订单状态异常,请稍后再试'); } } /** * 物流拒绝确认收货 * * @param AfterSale $afterSale * @param string $remarks * @return void */ public function shippingFail(AfterSale $afterSale, $remarks ='物流收货未通过') { if ($this->isWaitShipping($afterSale)) { $afterSale->update([ 'state' => $afterSale::STATE_VERIFY, 'remarks' => $remarks, ]); AfterSaleLog::create([ 'after_sale_id' => $afterSale->id, 'name' => '仓库审核', 'desc' => $remarks, ]); } else { throw new BizException('该售后订单状态异常'); } } /** * 物流确认收货 * * @param AfterSale $afterSale * @param string $remarks * @return void */ public function shipping(AfterSale $afterSale, $remarks ='物流确认收货') { if ($this->isWaitShipping($afterSale)) { $afterSale->update([ 'state' => $afterSale::STATE_FINANCE, 'remarks' => $remarks, ]); AfterSaleLog::create([ 'after_sale_id' => $afterSale->id, 'name' => '仓库审核', 'desc' => $remarks, ]); } else { throw new BizException('该售后订单状态异常'); } } /** * 财务确认退款 * * @return void */ public function finance(AfterSale $afterSale, $remarks ='退款成功') { if ($this->isWaitFinance($afterSale)) { if (in_array($afterSale->type, [AfterSale::TYPE_REFUND_AND_RETURN, AfterSale::TYPE_REFUND])) { //todo-执行实际退款操作; } elseif (in_array($afterSale->type, [AfterSale::TYPE_CHANGE])) {//换货流程 //todo-执行生成新的订单,发货单操作; } AfterSaleLog::create([ 'after_sale_id' => $afterSale->id, 'name' => '财务审核', 'desc' => $remarks, ]); $afterSale->update([ 'state' => $afterSale::STATE_FINISH, 'remarks' => $remarks, ]); } else { throw new BizException('该售后订单状态异常'); } } }