| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524 |
- <?php
- /**
- * MdOrder.php
- * todo 文件描述
- * Created on 2024/4/10 16:38
- * @author: hankaige
- */
- namespace app\modules\client\models\v1;
- use app\models\AccountLog;
- use app\models\Goods;
- use app\models\Order;
- use app\models\OrderDetail;
- use app\models\OrderRefund;
- use app\models\OrderTransit;
- use app\models\RefundAddress;
- use app\models\SaaSLeaguePriceLog;
- use app\models\SaasUser;
- use app\models\User;
- use app\models\VerifyCardSale;
- use app\modules\admin\models\MerchantForm;
- use app\modules\admin\models\OrderRevokeForm;
- use app\modules\client\models\ApiModel;
- use app\utils\Notice\NoticeSend;
- use app\utils\OrderNo;
- use app\utils\PrintOrder;
- use app\utils\Refund;
- class MdOrder extends ApiModel
- {
- public $order_id;
- public $store_id;
- public $md_id;
- public $remark;
- public $status;
- public $order_refund_id;
- public $type;
- public $action;
- public $refund;
- public $address_id;
- public function rules()
- {
- return [
- [['store_id','md_id'], 'required'],
- [['order_id','store_id','md_id', 'order_refund_id'], 'integer'],
- [['remark', 'status', 'type', 'action', 'refund', 'address_id'], 'safe']
- ];
- }
- public function handleCancel(){
- $order = Order::findOne(['id' => $this->order_id,'store_id'=>$this->store_id,'is_delete' => Order::IS_DELETE_FALSE,'md_id'=>$this->md_id]);
- if(empty($order)){
- return ['code'=>1,'msg'=>'订单不存在'];
- }
- $form = new OrderRevokeForm();
- $form->order_id = $order->id;
- $form->delete_pass = true;
- $form->user_id = $order->user_id;
- $form->store_id = $order->store_id;
- $res = $form->save();
- if ($res['code'] == 0) {
- VerifyCardSale::cancelCard($order);
- $order->save();
- $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
- if ($order->order_type == Order::ORDER_TYPE_Adopt) {
- NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 1);
- }else{
- NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 0);
- }
- // 订单打印
- if ((int)$order->md_id === -1 || (int)$order->md_id === 0 || !isset($order->md_id)) {
- $order->md_id = 0;
- }
- $printer_order = new PrintOrder($order->store_id, $order->id, 'confirm', 0, $order->md_id);
- $printer_order->is_refund = true;
- $printer_order->print_order();
- if($order->take_price > 0){
- $user = User::findOne($order->user_id);
- $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
- if($saas_user){
- $take_price = $order->take_price;
- $before = $saas_user->league_price;
- $saas_user->updateCounters(['league_price' => floatval($take_price)]);
- \app\models\SaaSLeaguePriceLog::setLeaguePriceLog(
- $order->store_id,
- $saas_user->id,
- $take_price,
- $before,
- \app\models\SaaSLeaguePriceLog::TYPE_CANCEL,
- \app\models\SaaSLeaguePriceLog::SEND_TYPE,
- \app\models\SaaSLeaguePriceLog::ROLE_USER,
- $order->id
- );
- }
- }
- }
- return ['code'=>0 ,'msg'=>'取消成功'];
- }
- //订单申请取消处理
- public function applyOrderDelete() {
- $store_id = $this->store_id;
- $md_id = $this->md_id;
- $where = [
- 'id' => $this->order_id,
- 'is_delete' => Order::IS_DELETE_FALSE,
- 'store_id' => $store_id,
- 'md_id' => $md_id,
- 'apply_delete' => Order::ORDER_APPLY_DELETE
- ];
- $handle_type = \app\models\OrderAdminHandleLog::HANDLE_TYPE_AGREE_CANCEL;
- $order = Order::findOne($where);
- if (!$order) {
- return [
- 'code' => 1,
- 'msg' => '订单不存在,请刷新页面后重试'
- ];
- }
- // 发送备注消息
- $order->remark = $this->remark;
- // 同意
- if (intval($this->status) == 1) {
- // if (post_params('type') == Order::CANCEL_BACK_TYPE) {
- //
- // }
- ////修改未支付但是取消订单的逻辑
- // if (intval($order->is_pay) === 1 || (intval($order->is_pay) === 0 && intval($order->pay_type) === Order::PAY_TYPE_COD)) {
- //TODO 取消订单需要退积分,这里剩余如果检测到是平台操作,就使用saas_user添加积分信息
- $form = new OrderRevokeForm();
- $form->order_id = $order->id;
- $form->delete_pass = true;
- $form->user_id = $order->user_id;
- $form->store_id = $order->store_id;
- $res = $form->save();
- if ($res['code'] == 0) {
- VerifyCardSale::cancelCard($order);
- $order->save();
- $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
- if ($order->order_type == Order::ORDER_TYPE_Adopt) {
- NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 1);
- }else{
- NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 0);
- }
- // 订单打印
- if ((int)$order->md_id === -1 || (int)$order->md_id === 0 || !isset($order->md_id)) {
- $order->md_id = 0;
- }
- $printer_order = new PrintOrder($order->store_id, $order->id, 'confirm', 0, $order->md_id);
- $printer_order->is_refund = true;
- $printer_order->print_order();
- $check = SaaSLeaguePriceLog::findOne(['order_id' => $order->id, 'type' => 4]);
- if($order->take_price > 0 && $check){
- $user = User::findOne($order->user_id);
- $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
- if($saas_user){
- $take_price = $order->take_price;
- $before = $saas_user->league_price;
- $saas_user->updateCounters(['league_price' => floatval($take_price)]);
- \app\models\SaaSLeaguePriceLog::setLeaguePriceLog(
- $order->store_id,
- $saas_user->id,
- $take_price,
- $before,
- \app\models\SaaSLeaguePriceLog::TYPE_CANCEL,
- \app\models\SaaSLeaguePriceLog::SEND_TYPE,
- \app\models\SaaSLeaguePriceLog::ROLE_USER,
- $order->id
- );
- }
- }
- //如果已经转单 就调用取消接口
- $orderTransit = OrderTransit::findOne(['order_id' => $order->id, 'is_delete' => 0]);
- if ($orderTransit) {
- $merchant = new MerchantForm();
- $merchant->order_id = $orderTransit->cloud_order_id;
- $merchant->purchaseOrderCancel();
- }
- }
- // }
- } else { //拒绝
- $order->apply_delete = Order::ORDER_APPLY_DELETE_DEFAULT;
- $order->save();
- $handle_type = \app\models\OrderAdminHandleLog::HANDLE_TYPE_REJECT_CANCEL;
- // TODO :推送订单取消拒绝消息
- $res = [
- 'code' => 0,
- 'msg' => '操作成功',
- ];
- $merchant = new MerchantForm();
- $merchant->order_id = $order->id;
- $merchant->syncMchOrderRefundStatus(0);
- }
- \app\models\OrderAdminHandleLog::addHandleLog($order->id, $handle_type);
- return $res;
- }
- //订单售后处理
- public function handleRefund()
- {
- if (!$this->validate()) {
- return [
- 'code' => 1,
- 'msg' => $this->getErrorSummary(false)[0],
- ];
- }
- $order_refund = OrderRefund::findOne([
- 'id' => $this->order_refund_id,
- 'store_id' => $this->store_id,
- 'is_delete' => Order::IS_DELETE_FALSE,
- ]);
- if (!$order_refund) {
- return [
- 'code' => 1,
- 'msg' => '售后订单不存在,请刷新页面'
- ];
- }
- $OrderDetail = OrderDetail::find()->where(['in','id',json_decode($order_refund->order_detail_id, true)])->asArray()->all();
- $arr = [];
- foreach ($OrderDetail as $val) {
- $arr[] = $val['goods_id'];
- }
- // 订单时间
- $order = Order::findOne(['id' => $order_refund->order_id, 'md_id' => $this->md_id]);
- $orderTransit = OrderTransit::findOne(['order_id' => $order_refund->order_id, 'is_delete' => 0]);
- if ($orderTransit) {//已转单
- return [
- 'code' => 1,
- 'msg' => '订单已转单,请前往后台操作'
- ];
- }
- $created_at = $order->created_at;
- $confirm_time = $order->confirm_time;
- foreach ($arr as $v) {
- // 获取核销卡id
- $verifyIds = explode(',',Goods::findOne(['id' => $v])->verify_card_id);
- if (!empty($verifyIds)) {
- $verifySales = VerifyCardSale::find()
- ->where(['in', 'verify_card_id', $verifyIds])
- ->andWhere(['in', 'goods_id', $arr])
- ->andWhere(['>' , 'created_at', $created_at])
- ->andWhere(['<=' , 'created_at', $confirm_time])
- ->andWhere(['store_id' => $order_refund->store_id])
- ->andWhere(['user_id' => $order_refund->user_id])
- ->asArray()->all();
- foreach ($verifySales as $val) {
- $verifySale = VerifyCardSale::findOne(['id' => $val['id']]);
- $verifySale->status = 2;
- $verifySale->save();
- }
- }
- }
- if ($order_refund->status != 0) {
- return [
- 'code' => 1,
- 'msg' => '售后订单已经处理过了,请刷新页面',
- 'id' => $order_refund->id,
- ];
- }
- // if ($this->type == 1) {
- return $this->submit1($order_refund);
- // }
- // if ($this->type == 2) {
- // return $this->submit2($order_refund);
- // }
- }
- /**
- * 平台订单退货退款
- * @param $order_refund
- * @return \app\cyy\ValidationErrorResponse|array
- */
- private function submit1($order_refund)
- {
- $order = Order::findOne($order_refund->order_id);
- if ($this->action == 1) {//同意
- if ($this->refund != 1) {
- //仅同意,还未退款
- if (isset($this->refund_price)) {
- if ($this->refund_price > $order_refund->refund_price) {
- return [
- 'code' => 1,
- 'msg' => '退款金额不能大于' . $order_refund->refund_price,
- ];
- }
- $order_refund->refund_price = $this->refund_price;
- }
- if (!$this->address_id) {
- return [
- 'code' => 1,
- 'msg' => '退货地址不能为空',
- ];
- };
- $refundAddress = RefundAddress::findOne($this->address_id);
- if ($refundAddress) {
- $order_refund->refund_address = json_encode([
- 'name' => $refundAddress->name,
- 'address' => $refundAddress->address,
- 'mobile' => $refundAddress->mobile
- ], JSON_UNESCAPED_UNICODE);
- }
- $order_refund->address_id = $this->address_id;
- $order_refund->is_agree = 1;
- $order_refund->save();
- if ($order_refund->save()) {
- return [
- 'code' => 0,
- 'msg' => '已同意退货。',
- ];
- } else {
- return [
- 'code' => 1,
- 'msg' => $order_refund->errors[0],
- ];
- }
- } else {
- //已同意,退款操作
- $order_refund->status = 1;
- $order_refund->response_time = time();
- if ($order_refund->refund_price > 0 && ($order->pay_type == 1 || in_array($order->pay_type, [Order::PAY_TYPE_WX_B2B, Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY, Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX]))) {
- $res = Refund::refund($order, OrderNo::ORDER_MALL, $order_refund->order_refund_no, $order_refund->refund_price);
- if ($res !== true) {
- return $res;
- }
- }
- // 商城商品总库存恢复
- $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => 0])->all();
- foreach ($order_detail_list as $order_detail) {
- $goods = Goods::findOne($order_detail->goods_id);
- $attr_id_list = [];
- foreach (json_decode($order_detail->attr) as $item) {
- array_push($attr_id_list, $item->attr_id);
- }
- $goods->numAdd($attr_id_list, $order_detail->num);
- }
- $user = User::findOne(['id' => $order->user_id]);
- $balance = $order->balance ?? 0;
- if ($balance > 0) {
- $before = $user->money;
- $user->money += $balance;
- $log = new AccountLog();
- $log->store_id = $this->store_id ?? get_store_id();
- $log->user_id = $user->id;
- $log->type = AccountLog::TYPE_GOODS_BALANCE;
- $log->amount = $balance;
- $log->log_type = AccountLog::LOG_TYPE_INCOME;
- $log->desc = "商城售后订单退款,商品余额抵扣:退款订单号:{$order_refund->order_refund_no}";
- $log->before = $before;
- $log->after = $user->money;
- $log->operator = '';
- $log->operator_id = 0;
- $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
- $log->created_at = time();
- $log->order_id = $order->id;
- $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER;
- if (!$log->save()) {
- return [
- 'code' => 1,
- 'msg' => implode(';', array_values($log->firstErrors))
- ];
- };
- if (!$user->save()) {
- return [
- 'code' => 1,
- 'msg' => $this->getErrorSummary(false)[0],
- ];
- }
- }
- $integral = isset($order->integral) ? json_decode($order->integral)->forehead_integral : 0;
- if ($integral > 0) {
- $user->integral += $integral;
- }
- if ($order_refund->refund_price > 0 && $order->pay_type == 3) {
- $before = $user->money;
- $user->money += floatval($order_refund->refund_price);
- $log = new AccountLog();
- $log->store_id = $this->store_id ?? get_store_id();
- $log->user_id = $user->id;
- $log->type = AccountLog::TYPE_BALANCE;
- $log->amount = $order_refund->refund_price;
- $log->log_type = AccountLog::LOG_TYPE_INCOME;
- $log->desc = "商城售后订单退款:退款订单号:{$order_refund->order_refund_no}";
- $log->before = $before;
- $log->after = $user->money;
- $log->operator = '';
- $log->operator_id = 0;
- $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
- $log->created_at = time();
- $log->order_id = $order->id;
- $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER;
- if (!$log->save()) {
- return [
- 'code' => 1,
- 'msg' => implode(';', array_values($log->firstErrors))
- ];
- };
- if (!$user->save()) {
- return [
- 'code' => 1,
- 'msg' => $this->getErrorSummary(false)[0],
- ];
- }
- }
- if ($order_refund->save()) {
- // 删除赠送的核销卡
- VerifyCardSale::cancelCard($order);
- $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
- NoticeSend::OrderRefund($order->user_id, $order->mobile, $order->order_no, $order_refund->refund_price, $goods->name);
- return [
- 'code' => 0,
- 'msg' => '处理成功,已完成退款退货。',
- ];
- }
- return [
- 'code' => 1,
- 'msg' => $this->getErrorSummary(false)[0],
- ];
- }
- }
- if ($this->action == 2) {//拒绝
- $order_refund->status = 3;
- $order_refund->refuse_desc = $this->remark ? $this->remark : '卖家拒绝了您的退货请求';
- $order_refund->response_time = time();
- if ($order_refund->save()) {
- NoticeSend::OrderRefundCancel($order->mobile);
- $merchant = new MerchantForm();
- $merchant->order_id = $order->id;
- $merchant->syncMchOrderRefundStatus(0);
- return [
- 'code' => 0,
- 'msg' => '处理成功,已拒绝该退货退款订单。',
- ];
- }
- return [
- 'code' => 1,
- 'msg' => $this->getErrorSummary(false)[0],
- ];
- }
- }
- /**
- * 统一处理换货
- * @param $order_refund
- * @return \app\cyy\ValidationErrorResponse|array
- */
- private function submit2($order_refund)
- {
- if ($this->action == 1) {//同意
- $order_refund->status = 2;
- if (!$this->address_id) {
- return [
- 'code' => 1,
- 'msg' => '退货地址不能为空',
- ];
- };
- $order_refund->address_id = $this->address_id;
- $order_refund->response_time = time();
- if ($order_refund->save()) {
- // TODO: 消息
- return [
- 'code' => 0,
- 'msg' => '处理成功,已同意换货。',
- ];
- }
- return [
- 'code' => 1,
- 'msg' => $this->getErrorSummary(false)[0],
- ];
- }
- if ($this->action == 2) {//拒绝
- $order_refund->status = 3;
- $order_refund->refuse_desc = $this->remark ? $this->remark : '卖家已拒绝您的换货请求';
- $order_refund->response_time = time();
- if ($order_refund->save()) {
- $merchant = new MerchantForm();
- $merchant->order_id = $order_refund->order_id;
- $merchant->syncMchOrderRefundStatus(0);
- return [
- 'code' => 0,
- 'msg' => '处理成功,已拒绝换货请求。',
- ];
- }
- return [
- 'code' => 1,
- 'msg' => $this->getErrorSummary(false)[0],
- ];
- }
- }
- }
|