cxgj/modules/admin/models/mall/order/OrderSaleActionForm.php
2023-11-27 09:45:13 +08:00

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('操作成功');
}
}