237 lines
8.4 KiB
PHP
237 lines
8.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @author Any
|
|
* @description KISS
|
|
* @date 2020-11-5
|
|
* @version 1.0.0
|
|
*
|
|
* _____LOG_____
|
|
*
|
|
*/
|
|
|
|
namespace app\modules\admin\models\mall\order;
|
|
|
|
use app\components\EncryptHelper;
|
|
use app\components\SysErrCode;
|
|
use app\models\Balance;
|
|
use app\models\BalanceLog;
|
|
use app\models\common\union\CardFrom;
|
|
use app\models\Model;
|
|
use app\models\Order;
|
|
use app\models\OrderSale;
|
|
use app\models\OrderUnionMeta;
|
|
use app\models\PaymentOrder;
|
|
use app\models\PaymentOrderUnion;
|
|
use app\models\Store;
|
|
use app\models\StoreEarnings;
|
|
use app\models\UniqueOrderNo;
|
|
use app\models\User;
|
|
use app\modules\admin\models\AdminModel;
|
|
|
|
class OrderSaleActionForm extends AdminModel
|
|
{
|
|
public $ids;
|
|
public $merchant_remark;
|
|
public $reset_money;
|
|
public function rules()
|
|
{
|
|
return [
|
|
[['ids'], 'required'],
|
|
[['ids','merchant_remark','reset_money'], 'safe'],
|
|
];
|
|
}
|
|
|
|
public function attributeLabels()
|
|
{
|
|
return [
|
|
'ids' => '选择项',
|
|
'merchant_remark' => '备注',
|
|
];
|
|
}
|
|
|
|
|
|
//拒绝
|
|
public function cancel()
|
|
{
|
|
if (!$this->validate()) {
|
|
return $this->getModelError();
|
|
}
|
|
$t = \Yii::$app->db->beginTransaction();
|
|
foreach ($this->ids as $item) {
|
|
$model = OrderSale::findOne(['id' => $item, 'is_delete' => 0]);
|
|
if ($model == null) {
|
|
$t->rollBack();
|
|
return Model::asReturnError('该订单不存在或已被清理');
|
|
}
|
|
if ($model->status == 3) {
|
|
continue;
|
|
}
|
|
$model->status = 3;
|
|
$model->merchant_remark = $this->merchant_remark;
|
|
$model->updated_at = time();
|
|
if (!$model->save()) {
|
|
$t->rollBack();
|
|
return Model::getModelErrorInfo($model);
|
|
}
|
|
|
|
$order_model = Order::findOne(['id' => $model->order_id, 'is_delete' => 0]);
|
|
if ($order_model == null) {
|
|
$t->rollBack();
|
|
return Model::asReturnError('该订单不存在或已被清理');
|
|
}
|
|
$order_model->is_sale = 1;
|
|
if (!$order_model->save()) {
|
|
$t->rollBack();
|
|
return Model::getModelErrorInfo($model);
|
|
}
|
|
}
|
|
$t->commit();
|
|
return Model::asReturnSuccess('操作成功');
|
|
}
|
|
|
|
|
|
//同意
|
|
public function finish()
|
|
{
|
|
if (!$this->validate()) {
|
|
return $this->getModelError();
|
|
}
|
|
$t = \Yii::$app->db->beginTransaction();
|
|
foreach ($this->ids as $item) {
|
|
$model = OrderSale::findOne(['id' => $item, 'is_delete' => 0]);
|
|
if ($model == null) {
|
|
$t->rollBack();
|
|
return Model::asReturnError('该订单不存在或已被清理');
|
|
}
|
|
if ($model->status == 2) {
|
|
continue;
|
|
}
|
|
$model->status = 2;
|
|
$model->merchant_remark = $this->merchant_remark;
|
|
$model->updated_at = time();
|
|
if (!$model->save()) {
|
|
$t->rollBack();
|
|
return Model::getModelErrorInfo($model);
|
|
}
|
|
|
|
$order_model = Order::findOne(['id' => $model->order_id, 'is_delete' => 0]);
|
|
if ($order_model == null) {
|
|
$t->rollBack();
|
|
return Model::asReturnError('该订单不存在或已被清理');
|
|
}
|
|
$order_model->is_sale = 1;
|
|
if (!$order_model->save()) {
|
|
$t->rollBack();
|
|
return Model::getModelErrorInfo($model);
|
|
}
|
|
}
|
|
$t->commit();
|
|
return Model::asReturnSuccess('操作成功');
|
|
}
|
|
|
|
public function refund()
|
|
{
|
|
if (!$this->validate()) {
|
|
return $this->getModelError();
|
|
}
|
|
$id = $this->ids[0];
|
|
$t = \Yii::$app->db->beginTransaction();
|
|
$model = OrderSale::findOne(['id' => $id, 'is_delete' => 0]);
|
|
if ($model == null) {
|
|
return Model::asReturnError('该订单不存在或已被清理');
|
|
}
|
|
if ($model->status == 4) {
|
|
return Model::asReturnError('该订单已退款,请勿重复操作');
|
|
}
|
|
|
|
if(floatval($this->reset_money) > floatval($model->refund_price)){
|
|
return Model::asReturnError('退款金额不能大于实付金额'.$model->refund_price);
|
|
}
|
|
$model->status = 4;
|
|
$model->merchant_remark = $this->merchant_remark;
|
|
$model->updated_at = time();
|
|
$model->refund_price = $this->reset_money;
|
|
if (!$model->save()) {
|
|
$t->rollBack();
|
|
return Model::getModelErrorInfo($model);
|
|
}
|
|
$order_model = Order::findOne(['id' => $model->order_id, 'is_delete' => 0]);
|
|
if ($order_model == null) {
|
|
$t->rollBack();
|
|
return Model::asReturnError('该订单不存在或已被清理');
|
|
}
|
|
$order_model->is_sale = 1;
|
|
if (!$order_model->save()) {
|
|
$t->rollBack();
|
|
return Model::getModelErrorInfo($model);
|
|
}
|
|
$order_type = UniqueOrderNo::getOrderTypeByOrderNo($order_model->order_no);
|
|
$desc = $order_model->plugin_sign == 'goods' ? '商品退款' : '包厢退款';
|
|
if($order_model->pay_type == 0){
|
|
//账户余额变动
|
|
$ext = "";
|
|
$res = Balance::userWalletLog($order_model->user_id, Balance::TYPE_INCOME, $model->refund_price, $desc, $order_type, $order_model->order_no, $ext);
|
|
if($res['code'] != SysErrCode::$apiReturnSuccess){
|
|
$t->rollBack();
|
|
return Model::asReturnError($res['msg']);
|
|
}
|
|
}elseif ($order_model->pay_type == 1){
|
|
|
|
$paymentOrderUnion = PaymentOrder::find()->alias('po')
|
|
->select('pou.out_trade_no,pou.order_no,pou.amount')
|
|
->leftJoin(['pou' => PaymentOrderUnion::tableName()],'po.payment_order_union_id=pou.id')
|
|
->where([
|
|
'po.is_pay' => 1,
|
|
'po.notify_status' => 1,
|
|
'po.order_no' => $order_model->order_no,
|
|
])
|
|
->asArray()
|
|
->one();
|
|
$total_fee = $paymentOrderUnion['amount'] * 100;
|
|
$refund_fee = floatval($this->reset_money)*100;
|
|
if($refund_fee > $total_fee){
|
|
$refund_fee = $total_fee; # 全额退款
|
|
}
|
|
|
|
$plugin = new \app\models\common\PluginService();
|
|
$wxmpService = $plugin->getWxmpService(0);
|
|
// $url = \Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . '/notify/payment/wxpay-order-refunds';
|
|
$res = $wxmpService->pay->refund([
|
|
'out_trade_no' => $paymentOrderUnion['out_trade_no'],
|
|
'out_refund_no' => $paymentOrderUnion['order_no'],
|
|
'total_fee' => $total_fee,
|
|
'refund_fee' => $refund_fee,
|
|
// 'notify_url' => $url,
|
|
]);
|
|
if (isset($res['return_code']) && $res['return_code'] != 'SUCCESS') {
|
|
$t->rollBack();
|
|
return $this->apiReturnError($res['return_msg']);
|
|
}
|
|
$user = User::findOne(['id' => $order_model->user_id,'is_delete' => 0]);
|
|
//账户变动日志
|
|
$balance_log = new BalanceLog();
|
|
$balance_log->cx_mch_id = 0;
|
|
$balance_log->scene = 0;
|
|
$balance_log->type = Balance::TYPE_INCOME;
|
|
$balance_log->user_id = $order_model->user_id;
|
|
$balance_log->money = $refund_fee / 100;
|
|
$balance_log->before_account_balance = empty($user->balance) ? 0 : $user->balance->account_balance;
|
|
$balance_log->after_account_balance = empty($user->balance) ? 0 : $user->balance->account_balance;
|
|
$balance_log->desc = $desc;
|
|
$balance_log->order_type = $order_type;
|
|
$balance_log->order_no = $order_model->order_no;
|
|
$balance_log->ext = '';
|
|
if(!$balance_log->save()){
|
|
$t->rollBack();
|
|
return (new Model())->getModelError($balance_log);
|
|
}
|
|
}
|
|
|
|
$t->commit();
|
|
return Model::asReturnSuccess('操作成功');
|
|
|
|
}
|
|
|
|
|
|
} |