初始化仓库
This commit is contained in:
93
common/forms/DrugRollBackForm.php
Normal file
93
common/forms/DrugRollBackForm.php
Normal file
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
namespace common\forms;
|
||||
|
||||
use common\core\BaseModel;
|
||||
use common\models\ChineseRepice;
|
||||
use common\models\DrugStoreDrug;
|
||||
use common\models\GranularRepice;
|
||||
use common\models\Prescription;
|
||||
use common\models\ProductOrderItems;
|
||||
use common\models\WestRepice;
|
||||
use yii\base\Exception;
|
||||
use yii\helpers\Json;
|
||||
|
||||
class DrugRollBackForm extends BaseModel
|
||||
{
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
public function rollBack($id,$order_type = 1){
|
||||
if($order_type == 1){
|
||||
$prescription = Prescription::findOne([
|
||||
'id' => $id,
|
||||
'is_deleted' => 0
|
||||
]);
|
||||
|
||||
if($prescription->wr_ids){
|
||||
$repice = WestRepice::find()->where([
|
||||
'in', 'id', explode(',', $prescription->wr_ids)
|
||||
])->select('content,number')->asArray()->all();
|
||||
foreach($repice as $v){
|
||||
$content = Json::decode($v['content']);
|
||||
$drug = DrugStoreDrug::findOne(['id' => $content['id']]);
|
||||
if($drug && $drug->frozen_number > $v['number']){
|
||||
$drug->stock = $drug->stock + $v['number'];
|
||||
$drug->frozen_number = $drug->frozen_number - $v['number'];
|
||||
$drug->saveOrFail();
|
||||
}
|
||||
}
|
||||
} elseif($prescription->cr_ids) {
|
||||
$repice = ChineseRepice::find()->where([
|
||||
'in', 'id', explode(',', $prescription->cr_ids)
|
||||
])->select('content,dosage')->asArray()->all();
|
||||
foreach($repice as $value){
|
||||
$content = Json::decode($value['content']);
|
||||
foreach($content as $v){
|
||||
$drug = DrugStoreDrug::findOne(['id' => $content['drug_id']]);
|
||||
$drugNumber = $v['number'] * $value['dosage'];
|
||||
if($drug && $drug->frozen_number > $drugNumber){
|
||||
$drug->stock = $drug->stock + $drugNumber;
|
||||
$drug->frozen_number = $drug->frozen_number - $drugNumber;
|
||||
$drug->saveOrFail();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$repice = GranularRepice::find()->where([
|
||||
'in', 'id', explode(',', $prescription->gr_ids)
|
||||
])->select('content,dosage')->asArray()->all();
|
||||
foreach($repice as $value){
|
||||
$content = Json::decode($value['content']);
|
||||
foreach($content as $v){
|
||||
$drug = DrugStoreDrug::findOne(['id' => $content['drug_id']]);
|
||||
$drugNumber = $v['number'] * $value['dosage'];
|
||||
if($drug && $drug->frozen_number > $drugNumber){
|
||||
$drug->stock = $drug->stock + $drugNumber;
|
||||
$drug->frozen_number = $drug->frozen_number - $drugNumber;
|
||||
$drug->saveOrFail();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$items = ProductOrderItems::find()->where([
|
||||
'product_order_id' => $id
|
||||
])->select('drug_id,number')->asArray()->all();
|
||||
foreach($items as $v){
|
||||
$drug = DrugStoreDrug::findOne(['id' => $v['drug_id']]);
|
||||
if($drug && $drug->frozen_number > $v['number']){
|
||||
$drug->stock = $drug->stock + $v['number'];
|
||||
$drug->frozen_number = $drug->frozen_number - $v['number'];
|
||||
$drug->saveOrFail();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
213
common/forms/ImMessageForm.php
Normal file
213
common/forms/ImMessageForm.php
Normal file
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
namespace common\forms;
|
||||
|
||||
use common\core\BaseModel;
|
||||
use common\enums\ImMessageSendTypeEnum;
|
||||
use common\enums\ImSessionStatusEnum;
|
||||
use common\enums\ImSessionTypeEnum;
|
||||
use common\enums\UserRoleEnum;
|
||||
use common\jobs\MessageSendJob;
|
||||
use common\models\ImMessage;
|
||||
use common\models\ImMessageSession;
|
||||
use common\models\ServiceUser;
|
||||
use common\models\User;
|
||||
use yii\base\Exception;
|
||||
|
||||
class ImMessageForm extends BaseModel
|
||||
{
|
||||
public $ims_id;
|
||||
public $from_id;
|
||||
public $to_id;
|
||||
public $content;
|
||||
public $type;
|
||||
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
[['ims_id','from_id','content'],'required'],
|
||||
['type','default','value'=>ImMessageSendTypeEnum::USER_SEND],//区分是user_id发给service_id还是service_id发给user_id
|
||||
['to_id','default','value'=>0],//发给导医和客服可能有会话id,没有接收人
|
||||
];
|
||||
}
|
||||
|
||||
public function attributeLabels()
|
||||
{
|
||||
return [
|
||||
'ims_id' => '会话id',
|
||||
'from_id' => '发送人',
|
||||
'to_id' => '接收人',
|
||||
'content' => '消息内容',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $canOffline bool 是否可发送离线消息 如果在线会发送在线消息
|
||||
* @return array
|
||||
* @throws Exception
|
||||
*/
|
||||
public function sendMessage($canOffline = false)
|
||||
{
|
||||
if (!$this->validate()) {
|
||||
throw new Exception($this->getErrorMsg());
|
||||
}
|
||||
$imMessageSession = ImMessageSession::find()->where([
|
||||
'id' => $this->ims_id,
|
||||
'is_delete' => 0,
|
||||
])->one();
|
||||
switch($this->type){
|
||||
case 0:
|
||||
//user_id发
|
||||
$user_id = $this->from_id;
|
||||
$service_id = $this->to_id;
|
||||
|
||||
//检查用户信息
|
||||
switch($imMessageSession->type) {
|
||||
case ImSessionTypeEnum::USER_USER:
|
||||
|
||||
$to = User::findOne($service_id);
|
||||
if(!$to){
|
||||
throw new Exception('该用户不存在');
|
||||
}
|
||||
$to_role = UserRoleEnum::USER;
|
||||
|
||||
break;
|
||||
case ImSessionTypeEnum::USER_DOC:
|
||||
|
||||
$to = ServiceUser::findOne($service_id);
|
||||
if(!$to || $to->is_delete || $to->status!=2){
|
||||
throw new Exception('该'.UserRoleEnum::NAME[$to->role].'不存在');
|
||||
}
|
||||
$to_role = $to->role;
|
||||
|
||||
break;
|
||||
case ImSessionTypeEnum::USER_LEAD:
|
||||
if($service_id){
|
||||
$to = ServiceUser::findOne($service_id);
|
||||
if(!$to || $to->is_delete || $to->status!=2){
|
||||
throw new Exception('该'.UserRoleEnum::NAME[$to->role].'不存在');
|
||||
}
|
||||
$to_role = $to->role;
|
||||
}else{
|
||||
//说明新创建的会话,没人接入,群发
|
||||
$to_role = UserRoleEnum::LEADER;
|
||||
}
|
||||
break;
|
||||
case ImSessionTypeEnum::DOC_SERV:
|
||||
case ImSessionTypeEnum::DRUG_SERV:
|
||||
case ImSessionTypeEnum::LEAD_SERV:
|
||||
if($service_id){
|
||||
$to = ServiceUser::findOne($service_id);
|
||||
if(!$to || $to->is_delete || $to->status!=2){
|
||||
throw new Exception('该'.UserRoleEnum::NAME[$to->role].'不存在');
|
||||
}
|
||||
$to_role = $to->role;
|
||||
}else{
|
||||
//说明新创建的会话,没人接入,群发
|
||||
$to_role = UserRoleEnum::SERVICE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
//service_id发
|
||||
$user_id = $this->to_id;
|
||||
$service_id = $this->from_id;
|
||||
|
||||
//检查用户信息
|
||||
switch($imMessageSession->type) {
|
||||
case ImSessionTypeEnum::USER_USER:
|
||||
case ImSessionTypeEnum::USER_DOC:
|
||||
case ImSessionTypeEnum::USER_LEAD:
|
||||
|
||||
$to = User::findOne($user_id);
|
||||
if(!$to){
|
||||
throw new Exception('该用户不存在');
|
||||
}
|
||||
$to_role = UserRoleEnum::USER;
|
||||
|
||||
break;
|
||||
case ImSessionTypeEnum::DOC_SERV:
|
||||
case ImSessionTypeEnum::DRUG_SERV:
|
||||
case ImSessionTypeEnum::LEAD_SERV:
|
||||
|
||||
$to = ServiceUser::findOne($user_id);
|
||||
if(!$to || $to->is_delete || $to->status!=2){
|
||||
throw new Exception('该'.UserRoleEnum::NAME[$to->role].'不存在');
|
||||
}
|
||||
$to_role = $to->role;
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new Exception('不支持的消息');
|
||||
break;
|
||||
}
|
||||
if(!$imMessageSession || $imMessageSession->user_id!=$user_id || $imMessageSession->service_id!=$service_id){
|
||||
throw new Exception('会话不存在');
|
||||
}
|
||||
// if($imMessageSession->status == ImSessionStatusEnum::END){
|
||||
// //会话已结束
|
||||
// throw new Exception('会话已结束,无法发送消息');
|
||||
// }
|
||||
// $ims_id = $imMessageSession->id;
|
||||
//
|
||||
// $t = \Yii::$app->db->beginTransaction();
|
||||
// try {
|
||||
// ImMessage::sendMessage($ims_id,$user_id,$service_id,$this->content,$this->type);
|
||||
//
|
||||
// \Yii::$app->queue->delay(0)->push(new MessageSendJob([
|
||||
// 'ims_id' => $ims_id,
|
||||
// 'to_id' => $this->to_id,
|
||||
// 'to_role' => $to_role,
|
||||
// 'content' => $this->content,
|
||||
// ]));
|
||||
//
|
||||
// $t->commit();
|
||||
// }catch (\Exception $exception){
|
||||
// $t->rollBack();
|
||||
// throw new Exception('发送失败:'.$exception->getMessage());
|
||||
// }
|
||||
// return [];
|
||||
$isEnd = $imMessageSession->status == ImSessionStatusEnum::END;
|
||||
if(!$canOffline && $isEnd){
|
||||
//会话已结束
|
||||
throw new Exception('会话已结束,无法发送消息');
|
||||
}
|
||||
$ims_id = $imMessageSession->id;
|
||||
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
ImMessage::sendMessage($ims_id,$user_id,$service_id,$this->content,$this->type);
|
||||
|
||||
if (!$canOffline || !$isEnd) {
|
||||
\Yii::$app->queue->delay(0)->push(new MessageSendJob([
|
||||
'ims_id' => $ims_id,
|
||||
'to_id' => $this->to_id,
|
||||
'to_role' => $to_role,
|
||||
'content' => $this->content,
|
||||
]));
|
||||
}
|
||||
|
||||
$t->commit();
|
||||
}catch (\Exception $exception){
|
||||
$t->rollBack();
|
||||
throw new Exception('发送失败:'.$exception->getMessage());
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
//接入的消息发送
|
||||
public function sessionIn($ims_id,$to_id = 0,$to_role,$message)
|
||||
{
|
||||
\Yii::$app->queue->delay(0)->push(new MessageSendJob([
|
||||
'ims_id' => $ims_id,
|
||||
'to_id' => $to_id,
|
||||
'to_role' => $to_role,
|
||||
'content' => $message,
|
||||
]));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
48
common/forms/ImSessionForm.php
Normal file
48
common/forms/ImSessionForm.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
namespace common\models\forms;
|
||||
|
||||
use common\core\BaseModel;
|
||||
use common\enums\ImMessageSendTypeEnum;
|
||||
use common\enums\ImSessionStatusEnum;
|
||||
use common\enums\UserRoleEnum;
|
||||
use common\jobs\MessageSendJob;
|
||||
use common\models\ImMessage;
|
||||
use common\models\ImMessageSession;
|
||||
use common\models\ServiceUser;
|
||||
use common\models\User;
|
||||
use yii\base\Exception;
|
||||
|
||||
class ImSessionForm extends BaseModel
|
||||
{
|
||||
public $user_id;
|
||||
public $service_id;
|
||||
public $type;
|
||||
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
[['user_id','service_id'],'required'],
|
||||
['type','default','value'=>UserRoleEnum::DOCTOR],//默认医生会话
|
||||
];
|
||||
}
|
||||
|
||||
public function attributeLabels()
|
||||
{
|
||||
return [
|
||||
'user_id' => '用户端id',
|
||||
'service_id' => '服务端id',
|
||||
];
|
||||
}
|
||||
|
||||
//创建会话
|
||||
public function session()
|
||||
{
|
||||
if (!$this->validate()) {
|
||||
throw new Exception($this->getErrorMsg());
|
||||
}
|
||||
$ims = new ImMessageSession();
|
||||
$ims->attributes = $this->attributes;
|
||||
$ims->saveOrFail();
|
||||
return $ims;
|
||||
}
|
||||
}
|
||||
578
common/forms/LedgerForm.php
Normal file
578
common/forms/LedgerForm.php
Normal file
@@ -0,0 +1,578 @@
|
||||
<?php
|
||||
|
||||
namespace common\forms;
|
||||
|
||||
use common\core\BaseModel;
|
||||
use common\models\CashAccount;
|
||||
use common\models\Ledger;
|
||||
use common\models\LedgerLog;
|
||||
use common\models\ProductOrder;
|
||||
use common\models\ProductOrderItems;
|
||||
use common\models\ProductOrderLog;
|
||||
use common\models\Reconciliation;
|
||||
use common\models\Register;
|
||||
use common\models\RegisterLog;
|
||||
use common\models\Store;
|
||||
use yii\db\Exception;
|
||||
|
||||
|
||||
class LedgerForm extends BaseModel
|
||||
{
|
||||
public $order_id;
|
||||
public $status;
|
||||
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
[['order_id'],'required'],
|
||||
[['status'],'in','range' => [1,2]]
|
||||
];
|
||||
}
|
||||
|
||||
public function create($type = 'productorder'){
|
||||
switch ($type) {
|
||||
case 'register':
|
||||
RegisterLog::saveLog($this->order_id, '挂号订单增加待结算记录开始');
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
$register = Register::find()->where(['id' => $this->order_id])->one();
|
||||
if(!$register){
|
||||
throw new Exception('挂号订单不存在');
|
||||
}
|
||||
$store = Store::findOne(['id' => $register->store_id]);
|
||||
if(!$store){
|
||||
throw new Exception('门店不存在');
|
||||
}
|
||||
|
||||
|
||||
|
||||
$time = time();
|
||||
$ledger[] = [
|
||||
'order_id' => $this->order_id,
|
||||
'user_id' => $store->id,
|
||||
'user_type' => 1, //诊所
|
||||
'order_type' => 2,//挂号订单
|
||||
'fee_type' => 2,//挂号费用
|
||||
'su_id' => $register->service_user_id,
|
||||
'drugstore_id' => 0,
|
||||
'drug_id' =>0,
|
||||
'xd_time' => strtotime($register->created_at),
|
||||
'number' => 1,
|
||||
'money' => $register->price,
|
||||
'status' => 0,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time
|
||||
];
|
||||
\Yii::$app->db->createCommand()->batchInsert(Ledger::tableName(), [
|
||||
'order_id', 'user_id', 'user_type', 'order_type', 'fee_type', 'su_id', 'drugstore_id',
|
||||
'drug_id','xd_time', 'number', 'money', 'status', 'created_at', 'updated_at'
|
||||
], $ledger)->execute();
|
||||
|
||||
$t->commit();
|
||||
} catch (\Exception $e) {
|
||||
$t->rollBack();
|
||||
RegisterLog::saveLog($this->order_id, '挂号订单增加待结算记录异常:'.$e->getMessage());
|
||||
throw $e;
|
||||
}
|
||||
break;
|
||||
|
||||
default: //产品订单
|
||||
ProductOrderLog::saveLog($this->order_id, '产品订单增加待结算记录开始');
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
$productOrder = ProductOrder::find()->where(['id' => $this->order_id])->one();
|
||||
if(!$productOrder){
|
||||
throw new Exception('产品订单不存在');
|
||||
}
|
||||
$store = Store::findOne(['id' => $productOrder->store_id]);
|
||||
if(!$store){
|
||||
throw new Exception('仓库不存在');
|
||||
}
|
||||
$isLegder = Ledger::find()->where(['order_id' => $this->order_id])->one();
|
||||
if(!empty($isLegder)){
|
||||
throw new Exception('该订单已增加待结算记录');
|
||||
}
|
||||
$time = time();
|
||||
$ledgerData = [];
|
||||
if($productOrder->decoct_price > 0){
|
||||
$ledgerData[] = [
|
||||
'order_id' => $this->order_id,
|
||||
'user_id' => 0,
|
||||
'user_type' => 2, //平台
|
||||
'order_type' => 1,//产品订单
|
||||
'fee_type' => 4,//代煎费用
|
||||
'su_id' => $productOrder->su_id,
|
||||
'drugstore_id' => $productOrder->store_id,
|
||||
'drug_id' => 0,
|
||||
'xd_time' => $productOrder->created_at,
|
||||
'number' => 1,
|
||||
'money' => $productOrder->decoct_price,
|
||||
'status' => 0,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time
|
||||
];
|
||||
}
|
||||
if($productOrder->process_price > 0){
|
||||
$ledgerData[] = [
|
||||
'order_id' => $this->order_id,
|
||||
'user_id' => 0,
|
||||
'user_type' => 2, //平台
|
||||
'order_type' => 1,//产品订单
|
||||
'fee_type' => 5,//加工费用
|
||||
'su_id' => $productOrder->su_id,
|
||||
'drugstore_id' => $productOrder->store_id,
|
||||
'drug_id' => 0,
|
||||
'xd_time' => $productOrder->created_at,
|
||||
'number' => 1,
|
||||
'money' => $productOrder->process_price,
|
||||
'status' => 0,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time
|
||||
];
|
||||
}
|
||||
if($productOrder->treatement_price > 0){
|
||||
$ledgerData[] = [
|
||||
'order_id' => $this->order_id,
|
||||
'user_id' => $store->id,
|
||||
'user_type' => 1, //门店
|
||||
'order_type' => 1,//产品订单
|
||||
'fee_type' => 6,//诊疗费用
|
||||
'su_id' => $productOrder->su_id,
|
||||
'drugstore_id' => $productOrder->store_id,
|
||||
'drug_id' => 0,
|
||||
'xd_time' => $productOrder->created_at,
|
||||
'number' => 1,
|
||||
'money' => $productOrder->treatement_price,
|
||||
'status' => 0,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time
|
||||
];
|
||||
}
|
||||
if($productOrder->trans_expenses > 0){
|
||||
$ledgerData[] = [
|
||||
'order_id' => $this->order_id,
|
||||
'user_id' => 0,
|
||||
'user_type' => 2, //平台
|
||||
'order_type' => 1,//产品订单
|
||||
'fee_type' => 3,//快递费用
|
||||
'su_id' => $productOrder->su_id,
|
||||
'drugstore_id' => $productOrder->store_id,
|
||||
'drug_id' => 0,
|
||||
'xd_time' => $productOrder->created_at,
|
||||
'number' => 1,
|
||||
'money' => $productOrder->trans_expenses,
|
||||
'status' => 0,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time
|
||||
];
|
||||
}
|
||||
if(!empty($ledgerData)){
|
||||
\Yii::$app->db->createCommand()->batchInsert(Ledger::tableName(), [
|
||||
'order_id', 'user_id', 'user_type', 'order_type', 'fee_type', 'su_id', 'drugstore_id',
|
||||
'drug_id', 'xd_time','number','money', 'status', 'created_at', 'updated_at'
|
||||
], $ledgerData)->execute();
|
||||
}
|
||||
$productOrderItems = ProductOrderItems::find()->where(['product_order_id' => $productOrder->id])->all();
|
||||
|
||||
switch ($productOrder->prescription_type) {
|
||||
case '1':case '3': //中药/颗粒药分佣
|
||||
foreach($productOrderItems as $v){
|
||||
$ledger = [];
|
||||
$number = $v['number'];
|
||||
$totalPrice = round($number * $v['price'], 4);
|
||||
$totalBuyPrice = round($number * $v['buy_price'], 4);
|
||||
|
||||
$ledger[] = [
|
||||
'order_id' => $this->order_id,
|
||||
'user_id' => $store->id,
|
||||
'user_type' => 1, //门店
|
||||
'order_type' => 1,//产品订单
|
||||
'fee_type' => 1,//药品费用
|
||||
'su_id' => $productOrder->su_id,
|
||||
'drugstore_id' => $productOrder->store_id,
|
||||
'drug_id' => $v['drug_id'],
|
||||
'xd_time' => $productOrder->created_at,
|
||||
'number' => $number,
|
||||
'money' => $totalPrice - $totalBuyPrice,
|
||||
'status' => 0,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time
|
||||
];
|
||||
|
||||
$ledger[] = [
|
||||
'order_id' => $this->order_id,
|
||||
'user_id' => 0,
|
||||
'user_type' => 2, //平台
|
||||
'order_type' => 1,//产品订单
|
||||
'fee_type' => 1,//药品费用
|
||||
'su_id' => $productOrder->su_id,
|
||||
'drugstore_id' => $productOrder->store_id,
|
||||
'drug_id' => $v['drug_id'],
|
||||
'xd_time' => $productOrder->created_at,
|
||||
'number' => $number,
|
||||
'money' => $totalBuyPrice,
|
||||
'status' => 0,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time
|
||||
];
|
||||
\Yii::$app->db->createCommand()->batchInsert(Ledger::tableName(), [
|
||||
'order_id', 'user_id', 'user_type', 'order_type', 'fee_type', 'su_id', 'drugstore_id',
|
||||
'drug_id','xd_time', 'number', 'money', 'status', 'created_at', 'updated_at'
|
||||
], $ledger)->execute();
|
||||
}
|
||||
break;
|
||||
case '2': //西药分佣
|
||||
$ledger = [];
|
||||
foreach($productOrderItems as $v){
|
||||
$totalPrice = round($v['number'] * $v['price'], 4);
|
||||
$totalBuyPrice = round($v['number'] * $v['buy_price'], 4);
|
||||
$ledger[] = [
|
||||
'order_id' => $this->order_id,
|
||||
'user_id' => $store->id,
|
||||
'user_type' => 1, //门店
|
||||
'order_type' => 1,//产品订单
|
||||
'fee_type' => 1,//药品费用
|
||||
'su_id' => $productOrder->su_id,
|
||||
'drugstore_id' => $productOrder->store_id,
|
||||
'xd_time' => $productOrder->created_at,
|
||||
'drug_id' => $v['drug_id'],
|
||||
'number' => $v['number'],
|
||||
'money' => $totalPrice - $totalBuyPrice,
|
||||
'status' => 0,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time
|
||||
];
|
||||
|
||||
$ledger[] = [
|
||||
'order_id' => $this->order_id,
|
||||
'user_id' => 0,
|
||||
'user_type' => 2, //平台
|
||||
'order_type' => 1,//产品订单
|
||||
'fee_type' => 1,//药品费用
|
||||
'su_id' => $productOrder->su_id,
|
||||
'drugstore_id' => $productOrder->store_id,
|
||||
'drug_id' => $v['drug_id'],
|
||||
'xd_time' => $productOrder->created_at,
|
||||
'number' => $v['number'],
|
||||
'money' => $totalBuyPrice,
|
||||
'status' => 0,
|
||||
'created_at' => $time,
|
||||
'updated_at' => $time
|
||||
];
|
||||
\Yii::$app->db->createCommand()->batchInsert(Ledger::tableName(), [
|
||||
'order_id', 'user_id', 'user_type', 'order_type', 'fee_type', 'su_id', 'drugstore_id',
|
||||
'drug_id','xd_time', 'number','money', 'status', 'created_at', 'updated_at'
|
||||
], $ledger)->execute();
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
throw new Exception('错误的处方类型');
|
||||
break;
|
||||
}
|
||||
$t->commit();
|
||||
|
||||
$ledgerForm = new LedgerForm();
|
||||
$ledgerForm->order_id = $this->order_id;
|
||||
$ledgerForm->status = 1; // 已结算
|
||||
$ledgerForm->update();
|
||||
|
||||
ProductOrderLog::saveLog($this->order_id, '产品订单增加待结算记录结束');
|
||||
} catch (\Exception $e) {
|
||||
$t->rollBack();
|
||||
ProductOrderLog::saveLog($this->order_id, '产品订单增加待结算记录异常:'.$e->getMessage().'——'.$e->getLine());
|
||||
throw $e;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//更新记录状态 1已结算 2已取消
|
||||
public function update($type = 'productorder'){
|
||||
switch ($type) {
|
||||
case 'register': //挂号订单
|
||||
RegisterLog::saveLog($this->order_id, '挂号订单结算更新开始');
|
||||
$Register = Register::find()->where(['id' => $this->order_id])->one();
|
||||
if(!$Register){
|
||||
throw new Exception('产品订单不存在');
|
||||
}
|
||||
$store = Store::findOne(['id' => $Register->store_id]);
|
||||
if(!$store){
|
||||
throw new Exception('门店不存在');
|
||||
}
|
||||
$time = time();
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
$model = new LedgerLog();
|
||||
try {
|
||||
switch ($this->status) {
|
||||
case 1: // 已结算
|
||||
//更新挂号订单为已结算
|
||||
$Register->is_settled = 1;
|
||||
$Register->created_at = strtotime($Register->created_at);
|
||||
$Register->updated_at = $time;
|
||||
$Register->saveOrFail();
|
||||
|
||||
//分账表批量更新状态为已结算
|
||||
Ledger::updateAll(['status' => 1, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 2]); //1产品订单 2挂号订单
|
||||
|
||||
/******************************************** 门店 ********************************************** */
|
||||
$storeTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_id' => $store->id, 'user_type' => 1, 'order_type' => 2, 'fee_type' => 2])->sum('money'); // 该订单门店分佣总金额
|
||||
$storeTotal = round($storeTotal, 2);//4舍5入
|
||||
|
||||
//增加门店分佣
|
||||
$log = clone $model;
|
||||
$log->order_id = $this->order_id;
|
||||
$log->user_id = $store->id;
|
||||
$log->user_type = 1;// 门店
|
||||
$log->order_type = 2; //挂号订单
|
||||
$log->fee_type = 2; //挂号费用
|
||||
$log->type = 1;// 增加
|
||||
$log->amount = $storeTotal;
|
||||
$log->content = '挂号订单结算后增加挂号分佣金额';
|
||||
$log->created_at = $time;
|
||||
$log->updated_at = $time;
|
||||
$log->saveOrFail();
|
||||
|
||||
//门店可提现及累计金额更新
|
||||
CashAccount::updateAllCounters(['able_cash' => $storeTotal, 'total_cash' => $storeTotal],['user_type' => 1, 'user_id' => $store->id]); //门店
|
||||
|
||||
break;
|
||||
case 2://已取消
|
||||
if($Register->is_settled == 1){ //已结算回退
|
||||
//已结算对账单状态更新
|
||||
Reconciliation::updateAll(['status' => -1], ['order_id' => $this->order_id]);
|
||||
//分账表批量更新状态为已取消
|
||||
Ledger::updateAll(['status' => 2, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 1]);//1产品订单 2挂号订单
|
||||
|
||||
$ledgerLog = LedgerLog::find()->where(['order_id' => $this->order_id])->asArray()->all();
|
||||
foreach($ledgerLog as $v){
|
||||
$log = clone $model;
|
||||
$log->order_id = $v['order_id'];
|
||||
$log->user_id = $v['user_id'];
|
||||
$log->user_type = $v['user_type'];
|
||||
$log->order_type = $v['order_type'];
|
||||
$log->fee_type = $v['fee_type'];
|
||||
$log->type = 2;// 扣减
|
||||
$log->amount = $v['amount'];
|
||||
$log->content = '订单结算后用户退货退款,扣减金额';
|
||||
$log->created_at = $time;
|
||||
$log->updated_at = $time;
|
||||
$log->saveOrFail();
|
||||
|
||||
//可提现及累计金额更新
|
||||
CashAccount::updateAllCounters(['able_cash' => $v['amount'] * -1, 'total_cash' => $v['amount'] * -1],['user_type' => $v['user_type'], 'user_id' => $v['user_id'], 'order_type' => $v['order_type'], 'fee_type' => $v['fee_type']]);
|
||||
}
|
||||
} else { // 未结算
|
||||
Ledger::updateAll(['status' => 2, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 2]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
}
|
||||
$t->commit();
|
||||
ProductOrderLog::saveLog($this->order_id, '挂号订单结算更新结束');
|
||||
} catch (\Exception $e){
|
||||
$t->rollBack();
|
||||
ProductOrderLog::saveLog($this->order_id, '挂号订单结算更新异常:'.$e->getMessage().'——'.$e->getLine());
|
||||
throw $e;
|
||||
}
|
||||
break;
|
||||
|
||||
default: //产品订单
|
||||
ProductOrderLog::saveLog($this->order_id, '产品订单结算更新开始');
|
||||
$productOrder = ProductOrder::find()->where(['id' => $this->order_id])->one();
|
||||
if(!$productOrder){
|
||||
throw new Exception('产品订单不存在');
|
||||
}
|
||||
$store = Store::findOne(['id' => $productOrder->store_id]);
|
||||
if(!$store){
|
||||
throw new Exception('门店不存在');
|
||||
}
|
||||
$time = time();
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
$model = new LedgerLog();
|
||||
try {
|
||||
switch ($this->status) {
|
||||
case 1: // 已结算
|
||||
//更新产品订单为已结算
|
||||
$productOrder->is_settled = 1;
|
||||
$productOrder->saveOrFail();
|
||||
|
||||
$productOrderItems = ProductOrderItems::find()->where(['product_order_id' => $productOrder->id])->asArray()->all();
|
||||
$Reconciliation = new Reconciliation();
|
||||
foreach($productOrderItems as $v){
|
||||
$item = clone $Reconciliation;
|
||||
$item->store_id = $productOrder->store_id;
|
||||
$item->order_id = $productOrder->id;
|
||||
$item->pay_time = $productOrder->pay_time;
|
||||
$item->xd_time = $productOrder->created_at;
|
||||
$item->drug_id = $v['drug_id'];
|
||||
$item->drug_type = $v['type'];
|
||||
$item->number = $v['number'];
|
||||
$item->total_buy_price = $v['number'] * $v['buy_price'];
|
||||
$item->total_price = $v['number'] * $v['price'];
|
||||
$item->created_at = $time;
|
||||
$item->updated_at = $time;
|
||||
$item->saveOrFail();
|
||||
}
|
||||
|
||||
//分账表批量更新状态为已结算
|
||||
Ledger::updateAll(['status' => 1, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 1]); //1产品订单 2挂号订单
|
||||
|
||||
/******************************************** 平台 ********************************************** */
|
||||
$platformDrugTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_type' => 2, 'order_type' => 1, 'fee_type' => 1])->sum('money'); // 该订单平台分佣总金额
|
||||
//增加药品分佣
|
||||
$log = clone $model;
|
||||
$log->order_id = $this->order_id;
|
||||
$log->user_id = 0;
|
||||
$log->user_type = 2;// 平台
|
||||
$log->order_type = 1; //产品订单
|
||||
$log->fee_type = 1; //药品费用
|
||||
$log->type = 1;// 增加
|
||||
$log->amount = round($platformDrugTotal, 2);
|
||||
$log->content = '订单结算后增加药品分佣金额';
|
||||
$log->created_at = $time;
|
||||
$log->updated_at = $time;
|
||||
$log->saveOrFail();
|
||||
|
||||
//增加代煎费
|
||||
if($productOrder->decoct_price > 0){
|
||||
$platformDecoctTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_type' => 2, 'order_type' => 1, 'fee_type' => 4])->sum('money'); // 该订单代煎费用
|
||||
$logDecoct = clone $model;
|
||||
$logDecoct->order_id = $this->order_id;
|
||||
$logDecoct->user_id = 0;
|
||||
$logDecoct->user_type = 2;// 平台
|
||||
$logDecoct->order_type = 1; //产品订单
|
||||
$logDecoct->fee_type = 4; //代煎费用
|
||||
$logDecoct->type = 1;// 增加
|
||||
$logDecoct->amount = round($platformDecoctTotal, 2);
|
||||
$logDecoct->content = '订单结算后增加代煎费用';
|
||||
$logDecoct->created_at = $time;
|
||||
$logDecoct->updated_at = $time;
|
||||
$logDecoct->saveOrFail();
|
||||
}
|
||||
|
||||
//增加加工费
|
||||
if($productOrder->process_price > 0){
|
||||
$platformProcessTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_type' => 2, 'order_type' => 1, 'fee_type' => 5])->sum('money'); // 该订单加工费用
|
||||
$logProcess = clone $model;
|
||||
$logProcess->order_id = $this->order_id;
|
||||
$logProcess->user_id = 0;
|
||||
$logProcess->user_type = 2;// 平台
|
||||
$logProcess->order_type = 1; //产品订单
|
||||
$logProcess->fee_type = 5; //代煎费用
|
||||
$logProcess->type = 1;// 增加
|
||||
$logProcess->amount = round($platformProcessTotal, 2);
|
||||
$logProcess->content = '订单结算后增加加工费用';
|
||||
$logProcess->created_at = $time;
|
||||
$logProcess->updated_at = $time;
|
||||
$logProcess->saveOrFail();
|
||||
}
|
||||
|
||||
//增加快递记录
|
||||
if($productOrder->trans_expenses > 0){
|
||||
$platformDeliveryTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_type' => 2, 'order_type' => 1, 'fee_type' => 3])->sum('money'); // 该订单快递费用
|
||||
$logDelivery = clone $model;
|
||||
$logDelivery->order_id = $this->order_id;
|
||||
$logDelivery->user_id = 0;
|
||||
$logDelivery->user_type = 2;// 平台
|
||||
$logDelivery->order_type = 1; //产品订单
|
||||
$logDelivery->fee_type = 3; //快递费用
|
||||
$logDelivery->type = 1;// 增加
|
||||
$logDelivery->amount = round($platformDeliveryTotal, 2);;
|
||||
$logDelivery->content = '订单结算后增加快递费用';
|
||||
$logDelivery->created_at = $time;
|
||||
$logDelivery->updated_at = $time;
|
||||
$logDelivery->saveOrFail();
|
||||
}
|
||||
|
||||
$platformTotal = round($platformDrugTotal+$platformDeliveryTotal+$platformDecoctTotal, 2); //该订单平台分佣总金额
|
||||
//可提现金额表更新
|
||||
CashAccount::updateAllCounters(['able_cash' => $platformTotal, 'total_cash' => $platformTotal],['user_type' => 2]); //平台
|
||||
|
||||
|
||||
/******************************************** 门店 ********************************************** */
|
||||
$storeTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_id' => $store->id, 'user_type' => 1, 'order_type' => 1, 'fee_type' => 1])->sum('money'); // 该订单门店分佣总金额
|
||||
$storeTotal = round($storeTotal, 2);//4舍5入
|
||||
//增加门店分佣
|
||||
$log = clone $model;
|
||||
$log->order_id = $this->order_id;
|
||||
$log->user_id = $store->id;
|
||||
$log->user_type = 1;// 门店
|
||||
$log->order_type = 1; //产品订单
|
||||
$log->fee_type = 1; //药品费用
|
||||
$log->type = 1;// 增加
|
||||
$log->amount = $storeTotal;
|
||||
$log->content = '订单结算后增加药品分佣金额';
|
||||
$log->created_at = $time;
|
||||
$log->updated_at = $time;
|
||||
$log->saveOrFail();
|
||||
|
||||
//增加诊疗费
|
||||
if($productOrder->treatement_price > 0){
|
||||
$platformTreatementTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_type' => 2, 'order_type' => 1, 'fee_type' => 6])->sum('money'); // 该订单诊疗费用
|
||||
$logTreatement = clone $model;
|
||||
$logTreatement->order_id = $this->order_id;
|
||||
$logTreatement->user_id = $store->id;
|
||||
$logTreatement->user_type = 1;// 门店
|
||||
$logTreatement->order_type = 1; //产品订单
|
||||
$logTreatement->fee_type = 6; //诊疗费用
|
||||
$logTreatement->type = 1;// 增加
|
||||
$logTreatement->amount = round($platformTreatementTotal, 2);
|
||||
$logTreatement->content = '订单结算后增加诊疗费用';
|
||||
$logTreatement->created_at = $time;
|
||||
$logTreatement->updated_at = $time;
|
||||
$logTreatement->saveOrFail();
|
||||
}
|
||||
|
||||
//门店可提现及累计金额更新
|
||||
CashAccount::updateAllCounters(['able_cash' => $storeTotal, 'total_cash' => $storeTotal],['user_type' => 1, 'user_id' => $store->id]); //门店
|
||||
|
||||
break;
|
||||
case 2://已取消
|
||||
if($productOrder->is_settled == 1){ //已结算回退
|
||||
//已结算对账单状态更新
|
||||
Reconciliation::updateAll(['status' => -1], ['order_id' => $this->order_id]);
|
||||
//分账表批量更新状态为已取消
|
||||
Ledger::updateAll(['status' => 2, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 1]);//1产品订单 2挂号订单
|
||||
|
||||
$ledgerLog = LedgerLog::find()->where(['order_id' => $this->order_id])->asArray()->all();
|
||||
foreach($ledgerLog as $v){
|
||||
$log = clone $model;
|
||||
$log->order_id = $v['order_id'];
|
||||
$log->user_id = $v['user_id'];
|
||||
$log->user_type = $v['user_type'];
|
||||
$log->order_type = $v['order_type'];
|
||||
$log->fee_type = $v['fee_type'];
|
||||
$log->type = 2;// 扣减
|
||||
$log->amount = $v['amount'];
|
||||
$log->content = '订单结算后用户退货退款,扣减金额';
|
||||
$log->created_at = $time;
|
||||
$log->updated_at = $time;
|
||||
$log->saveOrFail();
|
||||
|
||||
//可提现及累计金额更新
|
||||
CashAccount::updateAllCounters(['able_cash' => $v['amount'] * -1, 'total_cash' => $v['amount'] * -1],['user_type' => $v['user_type'], 'user_id' => $v['user_id']]);
|
||||
}
|
||||
} else { // 未结算
|
||||
Ledger::updateAll(['status' => 2, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 1]);//order_type 1产品订单 2挂号订单
|
||||
}
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
}
|
||||
$t->commit();
|
||||
ProductOrderLog::saveLog($this->order_id, '产品订单结算更新结束');
|
||||
} catch (\Exception $e){
|
||||
$t->rollBack();
|
||||
ProductOrderLog::saveLog($this->order_id, '产品订单结算更新异常'.$e->getMessage().'——'.$e->getLine());
|
||||
throw $e;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
211
common/forms/OrderRefundForm.php
Normal file
211
common/forms/OrderRefundForm.php
Normal file
@@ -0,0 +1,211 @@
|
||||
<?php
|
||||
namespace common\forms;
|
||||
|
||||
use common\core\BaseModel;
|
||||
use common\enums\ImSessionStatusEnum;
|
||||
use common\enums\OrderAcceptEnum;
|
||||
use common\enums\SystemNoticeTypeEnum;
|
||||
use common\events\OrderEvent;
|
||||
use common\helpers\FuncHelper;
|
||||
use common\models\ImMessageSession;
|
||||
use common\models\Order;
|
||||
use common\models\OrderRefund;
|
||||
use common\models\PaymentOrder;
|
||||
use common\models\PaymentRefund;
|
||||
use common\models\SystemNotice;
|
||||
use common\services\EplPayService;
|
||||
use common\services\WechatService;
|
||||
use yii\base\Exception;
|
||||
use yii\web\Application;
|
||||
|
||||
class OrderRefundForm extends BaseModel
|
||||
{
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
public function refund($order_id)
|
||||
{
|
||||
$order = Order::find()->where([
|
||||
'user_id' => \Yii::$app->user->identity->id,
|
||||
'id' => $order_id
|
||||
])->with('session')->one();
|
||||
if(!$order || $order->cancel_status){
|
||||
throw new Exception('订单不存在');
|
||||
}
|
||||
switch($order->is_pay){
|
||||
case 0://未支付
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
$order->cancel_status = 1;
|
||||
$order->cancel_time = time();
|
||||
$order->cancel_remark = '主动取消订单';
|
||||
$order->saveOrFail();
|
||||
|
||||
|
||||
//生成系统消息
|
||||
$SystemNotice=new SystemNotice();
|
||||
$SystemNotice->content='您已主动取消订单';
|
||||
$SystemNotice->base_type=SystemNoticeTypeEnum::ORDER_CANCEL;
|
||||
$SystemNotice->scene_type=1;//用户端
|
||||
$SystemNotice->user_id=\Yii::$app->user->identity->getId();
|
||||
$SystemNotice->notice_at=date('Y-m-d H:i:s',time());
|
||||
$SystemNotice->saveOrFail();
|
||||
|
||||
|
||||
$event = new OrderEvent([
|
||||
'order' => $order,
|
||||
]);
|
||||
\Yii::$app->trigger(Order::EVENT_CANCELED, $event);
|
||||
$t->commit();
|
||||
|
||||
return [];
|
||||
} catch (\Exception $exception) {
|
||||
$t->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
break;
|
||||
case 1://已支付
|
||||
if($order->accept_status!=OrderAcceptEnum::WAIT_ACCEPT){
|
||||
throw new Exception('只有待接诊状态可以取消订单');
|
||||
}
|
||||
$ims_id = $order->session->ims_id;
|
||||
$ImMessageSession = ImMessageSession::findOne($ims_id);
|
||||
if(!$ImMessageSession){
|
||||
throw new Exception('未接诊订单会话不存在');
|
||||
}
|
||||
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
//生成记录
|
||||
$orderRefund = new OrderRefund();
|
||||
$orderRefund->user_id = $order->user_id;
|
||||
$orderRefund->order_id = $order->id;
|
||||
$orderRefund->refund_no = FuncHelper::generate_order_no('RF');
|
||||
$orderRefund->refund_price = $order->total_pay_price;
|
||||
$orderRefund->remark = '主动取消订单';
|
||||
$orderRefund->saveOrFail();
|
||||
|
||||
//取消状态
|
||||
$order->cancel_status = 1;
|
||||
$order->cancel_time = time();
|
||||
$order->cancel_remark = '主动取消订单';
|
||||
//接诊状态
|
||||
$order->accept_status = OrderAcceptEnum::CANCEL;
|
||||
//退款状态
|
||||
$order->refund_status = 1;
|
||||
$order->refund_time = time();
|
||||
$order->saveOrFail();
|
||||
|
||||
//会话修改为已结束
|
||||
$ImMessageSession->status = ImSessionStatusEnum::END;
|
||||
$ImMessageSession->saveOrFail();
|
||||
|
||||
//生成系统消息
|
||||
$SystemNotice=new SystemNotice();
|
||||
$SystemNotice->content='您已主动取消订单';
|
||||
$SystemNotice->base_type=SystemNoticeTypeEnum::ORDER_CANCEL;
|
||||
$SystemNotice->scene_type=1;//用户端
|
||||
$SystemNotice->user_id=\Yii::$app->user->identity->getId();
|
||||
$SystemNotice->notice_at=date('Y-m-d H:i:s',time());
|
||||
$SystemNotice->saveOrFail();
|
||||
|
||||
//退款操作
|
||||
$this->refundMoney($orderRefund); //可能报错 无效的订单号
|
||||
|
||||
$t->commit();
|
||||
}catch (Exception $exception){
|
||||
$t->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function refundMoney($orderRefund)
|
||||
{
|
||||
$orderNo = $orderRefund->order->order_no;
|
||||
$order = Order::findOne([
|
||||
'order_no' => $orderNo,
|
||||
'is_pay' => 1
|
||||
]);
|
||||
$paymentOrder = PaymentOrder::findOne([
|
||||
'order_no' => $orderNo,
|
||||
'is_pay' => 1
|
||||
]);
|
||||
if (!$order || !$paymentOrder) {
|
||||
throw new Exception('无效的订单号');
|
||||
}
|
||||
$price = $orderRefund->refund_price;
|
||||
if(bccomp($paymentOrder->amount,$price,2)==-1){
|
||||
throw new Exception('退款金额大于可退款金额');
|
||||
}
|
||||
|
||||
$transaction = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
$paymentRefund = new PaymentRefund();
|
||||
$paymentRefund->refund_no = $orderRefund->refund_no;
|
||||
$paymentRefund->amount = $price;
|
||||
$paymentRefund->is_pay = 0;
|
||||
$paymentRefund->pay_type = 0;
|
||||
$paymentRefund->created_at = time();
|
||||
$paymentRefund->saveOrFail();
|
||||
if(bccomp($price,0,2)<=0) {
|
||||
$paymentRefund->is_pay = 1;
|
||||
$paymentRefund->save();
|
||||
|
||||
$orderRefund->is_refund = 1;
|
||||
$orderRefund->refund_time = time();
|
||||
$orderRefund->save();
|
||||
}else{
|
||||
switch ($order->pay_type) {
|
||||
case 1://微信退款
|
||||
if(\Yii::$app instanceof \yii\web\Application){
|
||||
$notifyUrl = \Yii::$app->request->hostInfo."/member/v1/callback/refund-notify/";
|
||||
}else{
|
||||
//如果是job中调用的
|
||||
$notifyUrl = \Yii::$app->getHostInfo()."/member/v1/callback/refund-notify/";
|
||||
}
|
||||
|
||||
$order_amount = bcmul($paymentOrder->amount,100,0);
|
||||
$refund_amount = bcmul($price,100,0);
|
||||
|
||||
$result = WechatService::getInstance()->payment->refund->byTransactionId($paymentOrder->transaction_id, $paymentRefund->refund_no,$order_amount, $refund_amount, [
|
||||
'refund_desc' => '订单申请退款',
|
||||
'notify_url' => $notifyUrl
|
||||
]);
|
||||
if($result['return_code']!='SUCCESS' || $result['result_code']!='SUCCESS'){
|
||||
$error = isset($result['err_code_des']) ? $result['err_code_des'] : $result['return_msg'];
|
||||
throw new Exception($error);
|
||||
}
|
||||
break;
|
||||
case 2://易票联退款
|
||||
$eplResult = EplPayService::getInstance()->refund([
|
||||
'refund_no' => $paymentRefund->refund_no,
|
||||
'transaction_id' => $paymentOrder->transaction_id,
|
||||
'total_pay_price' => $paymentOrder->amount,
|
||||
'refund_price' => $price,
|
||||
]);
|
||||
if(!isset($eplResult['returnCode']) || $eplResult['returnCode'] != '0000'){
|
||||
throw new Exception($eplResult['returnMsg']);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Exception('退款失败,请联系客服');
|
||||
break;
|
||||
}
|
||||
//其他状态变更在回调
|
||||
}
|
||||
$transaction->commit();
|
||||
return [];
|
||||
}catch (\Exception $exception){
|
||||
$transaction->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
}
|
||||
}
|
||||
164
common/forms/PrescripRefundForm.php
Normal file
164
common/forms/PrescripRefundForm.php
Normal file
@@ -0,0 +1,164 @@
|
||||
<?php
|
||||
|
||||
namespace common\forms;
|
||||
|
||||
use common\core\BaseModel;
|
||||
use common\events\OrderEvent;
|
||||
use common\helpers\FuncHelper;
|
||||
use common\models\PaymentPrescripOrder;
|
||||
use common\models\PaymentPrescripRefund;
|
||||
use common\models\PrescripOrderRefund;
|
||||
use common\models\Prescription;
|
||||
use common\services\WechatService;
|
||||
use yii\base\Exception;
|
||||
|
||||
class PrescripRefundForm extends BaseModel
|
||||
{
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
public function refund($order_id)
|
||||
{
|
||||
$prescription = Prescription::find()->where([
|
||||
'user_id' =>\Yii::$app->user->identity->getId(),
|
||||
'id' => $order_id
|
||||
])->one();
|
||||
if(!$prescription || $prescription->cancel_status){
|
||||
throw new Exception('订单不存在');
|
||||
}
|
||||
|
||||
switch($prescription->is_pay){
|
||||
case 0://未支付
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
$prescription->cancel_status = 1;
|
||||
$prescription->cancel_time = time();
|
||||
$prescription->cancel_remark = '主动取消订单';
|
||||
$prescription->saveOrFail();
|
||||
|
||||
$event = new OrderEvent([
|
||||
'order' => $prescription,
|
||||
]);
|
||||
\Yii::$app->trigger(Prescription::AUTO_EXPIRE, $event);
|
||||
$t->commit();
|
||||
|
||||
return [];
|
||||
} catch (\Exception $exception) {
|
||||
$t->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
case 1://已支付
|
||||
|
||||
$config = \Yii::$app->params;
|
||||
$orderForbiddenRefundTime = isset($config['product_order']['forbidden_refund_time']) ? $config['product_order']['forbidden_refund_time'] :3600*24*7;
|
||||
|
||||
if ($prescription->prescription_type==1 || $prescription->prescription_type==3 ){
|
||||
throw new Exception('中药饮片和配方颗粒禁止退款');
|
||||
}
|
||||
if ($prescription->prescription_type==2 &&$prescription->prescription_type==4 ){
|
||||
if (time()-$prescription->pay_time>=120){
|
||||
throw new Exception('西药一周之后禁止退款');
|
||||
}
|
||||
}
|
||||
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
//生成记录
|
||||
$prescripOrderRefund = new PrescripOrderRefund();
|
||||
$prescripOrderRefund->user_id = $prescription->user_id;
|
||||
$prescripOrderRefund->order_id = $prescription->id;
|
||||
$prescripOrderRefund->refund_no = FuncHelper::generate_order_no('RF');
|
||||
$prescripOrderRefund->refund_price = $prescription->total_pay_price;
|
||||
$prescripOrderRefund->remark = '主动取消订单';
|
||||
$prescripOrderRefund->saveOrFail();
|
||||
|
||||
//取消状态
|
||||
$prescription->cancel_status = 1;
|
||||
$prescription->cancel_time = time();
|
||||
$prescription->cancel_remark = '主动取消订单';
|
||||
|
||||
//退款状态
|
||||
$prescription->refund_status = 1;
|
||||
$prescription->refund_time = time();
|
||||
$prescription->saveOrFail();
|
||||
|
||||
//退款操作
|
||||
$this->refundMoney($prescripOrderRefund); //可能报错 无效的订单号
|
||||
|
||||
$t->commit();
|
||||
}catch (Exception $exception){
|
||||
$t->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public function refundMoney($prescripOrderRefund)
|
||||
{
|
||||
$orderNo = $prescripOrderRefund->order->order_no;
|
||||
$prescription = Prescription::findOne([
|
||||
'order_no' => $orderNo,
|
||||
'is_pay' => 1
|
||||
]);
|
||||
$paymentPrescripOrder = PaymentPrescripOrder::findOne([
|
||||
'order_no' => $orderNo,
|
||||
'is_pay' => 1
|
||||
]);
|
||||
if (!$prescription || !$paymentPrescripOrder) {
|
||||
throw new Exception('无效的订单号');
|
||||
}
|
||||
$price = $prescripOrderRefund->refund_price;
|
||||
if(bccomp($paymentPrescripOrder->amount,$price,2)==-1){
|
||||
throw new Exception('退款金额大于可退款金额');
|
||||
}
|
||||
|
||||
$transaction = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
$paymentPrescripRefund = new PaymentPrescripRefund();
|
||||
$paymentPrescripRefund->refund_no = $prescripOrderRefund->refund_no;
|
||||
$paymentPrescripRefund->amount = $price;
|
||||
$paymentPrescripRefund->is_pay = 0;
|
||||
$paymentPrescripRefund->pay_type = 0;
|
||||
$paymentPrescripRefund->created_at = time();
|
||||
$paymentPrescripRefund->saveOrFail();
|
||||
if(bccomp($price,0,2)<=0) {
|
||||
$paymentPrescripRefund->is_pay = 1;
|
||||
$paymentPrescripRefund->save();
|
||||
|
||||
$prescripOrderRefund->is_refund = 1;
|
||||
$prescripOrderRefund->refund_time = time();
|
||||
$prescripOrderRefund->save();
|
||||
}else{
|
||||
if(\Yii::$app instanceof \yii\web\Application){
|
||||
$notifyUrl = \Yii::$app->request->hostInfo."/member/v1/callback/refund-notify/";
|
||||
}else{
|
||||
//如果是job中调用的
|
||||
$notifyUrl = \Yii::$app->getHostInfo()."/member/v1/callback/refund-notify/";
|
||||
}
|
||||
|
||||
$order_amount = bcmul($paymentPrescripOrder->amount,100,0);
|
||||
$refund_amount = bcmul($price,100,0);
|
||||
|
||||
$result = WechatService::getInstance()->payment->refund->byTransactionId($paymentPrescripOrder->transaction_id, $paymentPrescripRefund->refund_no,$order_amount, $refund_amount, [
|
||||
'refund_desc' => '订单取消退款',
|
||||
'notify_url' => $notifyUrl
|
||||
]);
|
||||
if($result['return_code']!='SUCCESS' || $result['result_code']!='SUCCESS'){
|
||||
$error = isset($result['err_code_des']) ? $result['err_code_des'] : $result['return_msg'];
|
||||
throw new Exception($error);
|
||||
}
|
||||
//其他状态变更在回调
|
||||
}
|
||||
$transaction->commit();
|
||||
return [];
|
||||
}catch (\Exception $exception){
|
||||
$transaction->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
}
|
||||
}
|
||||
67
common/forms/ProductCancelForm.php
Normal file
67
common/forms/ProductCancelForm.php
Normal file
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace common\forms;
|
||||
|
||||
use common\core\BaseModel;
|
||||
use common\jobs\ProductOrderSyncPlatformJob;
|
||||
use common\models\ProductOrder;
|
||||
use common\enums\ProductOrderEnum;
|
||||
use common\models\Prescription;
|
||||
use yii\base\Exception;
|
||||
|
||||
class ProductCancelForm extends BaseModel
|
||||
{
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
// 取消未支付订单
|
||||
public function cancel($post,$remark = '主动取消订单')
|
||||
{
|
||||
if (isset($post['user_id']) && $post['user_id'] > 0) {
|
||||
$user_id = $post['user_id'];
|
||||
}else{
|
||||
$user_id = \Yii::$app->user->identity->getId();
|
||||
}
|
||||
|
||||
$productOrder = ProductOrder::find()->where([
|
||||
'user_id' => $user_id,
|
||||
'id' => $post['order_id']
|
||||
])->one();
|
||||
if(!$productOrder || $productOrder->cancel_status){
|
||||
throw new Exception('订单不存在');
|
||||
}
|
||||
if($productOrder->is_pay == 1){
|
||||
throw new Exception('订单无法取消');
|
||||
}
|
||||
if($productOrder->order_type == 1){
|
||||
$prescription = Prescription::findOne(['id' => $productOrder->p_id]);
|
||||
$prescription->cancel_status = 1;
|
||||
$prescription->cancel_time = time();
|
||||
$prescription->cancel_remark = '主动取消订单';
|
||||
$prescription->saveOrFail();
|
||||
}
|
||||
|
||||
$productOrder->status = ProductOrderEnum::CANCEL;
|
||||
$productOrder->cancel_status = 1;
|
||||
$productOrder->cancel_time = time();
|
||||
$productOrder->cancel_remark = $remark;
|
||||
$productOrder->saveOrFail();
|
||||
|
||||
//药品库存回滚
|
||||
$DrugRollBackForm = new DrugRollBackForm();
|
||||
$DrugRollBackForm->rollBack($productOrder->order_type == 1?$productOrder->p_id:$productOrder->id, $productOrder->order_type);
|
||||
|
||||
if($productOrder->is_online){ //平台订单状态同步
|
||||
\Yii::$app->queue->push(new ProductOrderSyncPlatformJob([
|
||||
'orderId' => $productOrder->id,
|
||||
'status' => 2
|
||||
]));
|
||||
}
|
||||
|
||||
return ['取消成功'];
|
||||
}
|
||||
}
|
||||
67
common/forms/ProductRefundCancelForm.php
Normal file
67
common/forms/ProductRefundCancelForm.php
Normal file
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace common\forms;
|
||||
|
||||
use common\core\BaseModel;
|
||||
use common\enums\ProductOrderEnum;
|
||||
use common\models\ProductOrder;
|
||||
use common\models\ProductOrderRefund;
|
||||
|
||||
use yii\base\Exception;
|
||||
|
||||
class ProductRefundCancelForm extends BaseModel
|
||||
{
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
// 撤销退款申请
|
||||
public function cancel($order_id)
|
||||
{
|
||||
$productOrder = ProductOrder::find()->where([
|
||||
'user_id' => \Yii::$app->user->identity->getId(),
|
||||
'id' => $order_id
|
||||
])->one();
|
||||
|
||||
if(!$productOrder || $productOrder->cancel_status || $productOrder->is_pay != 1 || $productOrder->refund_status!=1){
|
||||
throw new Exception('订单不存在');
|
||||
}
|
||||
|
||||
$productOrderRefund = ProductOrderRefund::find()->where([
|
||||
'user_id' => \Yii::$app->user->identity->getId(),
|
||||
'order_id' => $order_id,
|
||||
'is_refund' => 0, //未退款
|
||||
'status' => 0 //申请退款中
|
||||
])->one();
|
||||
|
||||
if(!$productOrderRefund){
|
||||
throw new Exception('订单不存在');
|
||||
}
|
||||
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
if($productOrder->is_send ==1){
|
||||
$productOrder->status = ProductOrderEnum::ACCEPTED;
|
||||
} else {
|
||||
$productOrder->status = ProductOrderEnum::WAIT_SEND;
|
||||
}
|
||||
$productOrder->refund_status = 0;
|
||||
$productOrder->refund_time = 0;
|
||||
$productOrder->saveOrFail();
|
||||
|
||||
$productOrderRefund->status = 2;
|
||||
$productOrderRefund->saveOrFail();
|
||||
|
||||
$t->commit();
|
||||
|
||||
return ['撤销退款申请成功'];
|
||||
} catch (\Exception $exception) {
|
||||
$t->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
180
common/forms/ProductRefundForm.php
Normal file
180
common/forms/ProductRefundForm.php
Normal file
@@ -0,0 +1,180 @@
|
||||
<?php
|
||||
|
||||
namespace common\forms;
|
||||
|
||||
use common\core\BaseModel;
|
||||
use common\events\OrderEvent;
|
||||
use common\helpers\FuncHelper;
|
||||
use common\models\PaymentProductOrder;
|
||||
use common\models\PaymentProductRefund;
|
||||
use common\models\ProductOrder;
|
||||
use common\models\ProductOrderRefund;
|
||||
use common\enums\ProductOrderEnum;
|
||||
use common\services\EplPayService;
|
||||
use common\services\WechatService;
|
||||
use yii\base\Exception;
|
||||
use function GuzzleHttp\Promise\all;
|
||||
|
||||
class ProductRefundForm extends BaseModel
|
||||
{
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
public function refund($post, $type = '')
|
||||
{
|
||||
if (isset($post['user_id']) && $post['user_id'] > 0) {
|
||||
$user_id = $post['user_id'];
|
||||
}else{
|
||||
$user_id = \Yii::$app->user->identity->getId();
|
||||
}
|
||||
|
||||
$productOrder = ProductOrder::find()->where([
|
||||
'user_id' => $user_id,
|
||||
'id' => $post['order_id']
|
||||
])->one();
|
||||
if(!$productOrder || $productOrder->cancel_status){
|
||||
throw new Exception('订单不存在');
|
||||
}
|
||||
|
||||
$productOrderRefund = ProductOrderRefund::find()->with(['order'])->where([
|
||||
'order_id' => $post['order_id'],
|
||||
'user_id' => $user_id,
|
||||
|
||||
])->andWhere(['in','status', [0, 1]])->one();
|
||||
if($productOrderRefund){
|
||||
throw new Exception('请勿重复操作');
|
||||
}
|
||||
// $productOrderStatus = $productOrder->status;
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
//更新订单退款状态
|
||||
$productOrder->status = ProductOrderEnum::REFUNDING; //状态变为退款中
|
||||
$productOrder->refund_status = 1; //退款中
|
||||
$productOrder->refund_time = time();
|
||||
$productOrder->saveOrFail();
|
||||
|
||||
//生成订单退款记录
|
||||
$productOrderRefund = new ProductOrderRefund();
|
||||
$productOrderRefund->user_id = $productOrder->user_id;
|
||||
$productOrderRefund->order_id = $productOrder->id;
|
||||
$productOrderRefund->refund_no = FuncHelper::generate_order_no('RF');
|
||||
$productOrderRefund->refund_price = $productOrder->total_pay_price;
|
||||
|
||||
if( $type == 'auto'){
|
||||
$productOrderRefund->status = 1; //直接退款,不需要申请
|
||||
$productOrderRefund->reason = '处方失效自动退款';
|
||||
$productOrderRefund->remark = '处方失效自动退款';
|
||||
$productOrderRefund->saveOrFail();
|
||||
//微信退款操作
|
||||
$this->refundMoney($productOrderRefund);
|
||||
}else{
|
||||
$productOrderRefund->reason = $post['reason'] ?? '';
|
||||
$productOrderRefund->remark = $post['remark'] ?? '主动申请退款';
|
||||
$productOrderRefund->refund_images = $post['refund_images'] ?? '';
|
||||
$productOrderRefund->status = 0; //申请退款
|
||||
$productOrderRefund->refund_type = 1; //退货退款
|
||||
$productOrderRefund->saveOrFail();
|
||||
}
|
||||
|
||||
$t->commit();
|
||||
}catch (Exception $exception){
|
||||
$t->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
return ['操作成功'];
|
||||
}
|
||||
|
||||
public function refundMoney($productOrderRefund)
|
||||
{
|
||||
$orderNo = $productOrderRefund->order->order_no;
|
||||
$productOrder = ProductOrder::findOne([
|
||||
'order_no' => $orderNo,
|
||||
'is_pay' => 1
|
||||
]);
|
||||
$paymentProductOrder = PaymentProductOrder::findOne([
|
||||
'order_no' => $orderNo,
|
||||
'is_pay' => 1
|
||||
]);
|
||||
if (!$productOrder || !$paymentProductOrder) {
|
||||
throw new Exception('无效的订单号');
|
||||
}
|
||||
$price = $productOrderRefund->refund_price;
|
||||
if(bccomp($paymentProductOrder->amount,$price,2)==-1){
|
||||
throw new Exception('退款金额大于可退款金额');
|
||||
}
|
||||
$transaction = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
$paymentProductRefund = new PaymentProductRefund();
|
||||
$paymentProductRefund->refund_no = $productOrderRefund->refund_no;
|
||||
$paymentProductRefund->amount = $price;
|
||||
$paymentProductRefund->is_pay = 0;
|
||||
$paymentProductRefund->pay_type = 0;
|
||||
$paymentProductRefund->created_at = time();
|
||||
$paymentProductRefund->saveOrFail();
|
||||
if(bccomp($price,0,2)<=0) {
|
||||
$paymentProductRefund->is_pay = 1;
|
||||
$paymentProductRefund->save();
|
||||
|
||||
$productOrder->refund_status = 3;//已退款
|
||||
$productOrder->staus = ProductOrderEnum::REFUND;//订单状态变成已退款
|
||||
$productOrder->save();
|
||||
|
||||
$productOrderRefund->is_refund = 1;
|
||||
$productOrderRefund->refund_time = time();
|
||||
$productOrderRefund->save();
|
||||
|
||||
//药品库存回滚
|
||||
$DrugRollBackForm = new DrugRollBackForm();
|
||||
$DrugRollBackForm->rollBack($productOrder->order_type == 1?$productOrder->p_id:$productOrder->id,$productOrder->order_type == 1?1:0);
|
||||
}else{
|
||||
switch ($paymentProductOrder->pay_type) {
|
||||
case 1://微信退款
|
||||
if(\Yii::$app instanceof \yii\web\Application){
|
||||
$notifyUrl = \Yii::$app->request->hostInfo."/member/v1/callback/refund-notify/";
|
||||
}else{
|
||||
//如果是job中调用的
|
||||
$notifyUrl = \Yii::$app->getHostInfo()."/member/v1/callback/refund-notify/";
|
||||
}
|
||||
|
||||
$order_amount = bcmul($paymentProductOrder->amount,100,0);
|
||||
$refund_amount = bcmul($price,100,0);
|
||||
|
||||
$result = WechatService::getInstance()->payment->refund->byTransactionId($paymentProductOrder->transaction_id, $paymentProductRefund->refund_no,$order_amount, $refund_amount, [
|
||||
'refund_desc' => '订单申请退款',
|
||||
'notify_url' => $notifyUrl
|
||||
]);
|
||||
if($result['return_code']!='SUCCESS' || $result['result_code']!='SUCCESS'){
|
||||
$error = isset($result['err_code_des']) ? $result['err_code_des'] : $result['return_msg'];
|
||||
throw new Exception($error);
|
||||
}
|
||||
break;
|
||||
case 2://易票联退款
|
||||
$eplResult = EplPayService::getInstance()->refund([
|
||||
'refund_no' => $paymentProductRefund->refund_no,
|
||||
'transaction_id' => $paymentProductOrder->transaction_id,
|
||||
'total_pay_price' => $paymentProductOrder->amount,
|
||||
'refund_price' => $price,
|
||||
]);
|
||||
if(!isset($eplResult['returnCode']) || $eplResult['returnCode'] != '0000'){
|
||||
throw new Exception($eplResult['returnMsg']);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Exception('退款失败,请联系客服');
|
||||
break;
|
||||
}
|
||||
//其他状态变更在回调
|
||||
}
|
||||
$transaction->commit();
|
||||
return true;
|
||||
} catch (\Exception $exception){
|
||||
$transaction->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
}
|
||||
}
|
||||
210
common/forms/RegisterRefundForm.php
Normal file
210
common/forms/RegisterRefundForm.php
Normal file
@@ -0,0 +1,210 @@
|
||||
<?php
|
||||
|
||||
namespace common\forms;
|
||||
|
||||
use common\core\BaseModel;
|
||||
use common\enums\RegisterEnum;
|
||||
use common\enums\SystemNoticeTypeEnum;
|
||||
use common\events\RegisterEvent;
|
||||
use common\helpers\FuncHelper;
|
||||
use common\models\PaymentRegister;
|
||||
use common\models\PaymentRegisterRefund;
|
||||
use common\models\Register;
|
||||
use common\models\RegisterRefund;
|
||||
use common\models\SystemNotice;
|
||||
use common\services\EplPayService;
|
||||
use common\services\WechatService;
|
||||
use yii\base\Exception;
|
||||
|
||||
class RegisterRefundForm extends BaseModel
|
||||
{
|
||||
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
public function refund($register_id)
|
||||
{
|
||||
$Register = Register::find()->where([
|
||||
// 'user_id' => \Yii::$app->user->identity->id,
|
||||
'id' => $register_id
|
||||
])->one();
|
||||
|
||||
|
||||
if (!$Register || $Register->is_cancel==1) {
|
||||
throw new Exception('订单不存在');
|
||||
}
|
||||
if ($Register->status == 2 || $Register->status == 3 || $Register->status == 5 || $Register->status == 6) {
|
||||
throw new Exception('医生接诊后不能取消挂号!!');
|
||||
}
|
||||
switch ($Register->is_pay) {
|
||||
case 0://未支付
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
$Register->status = RegisterEnum::CANCEL;
|
||||
$Register->is_cancel = 1;
|
||||
$Register->cancel_time = time();
|
||||
$Register->cancel_remark = '您已主动取消订单';
|
||||
$Register->created_at = time();
|
||||
$Register->updated_at = time();
|
||||
$Register->saveOrFail();
|
||||
|
||||
//生成系统消息
|
||||
$SystemNotice = new SystemNotice();
|
||||
$SystemNotice->content = '您已主动取消订单';
|
||||
$SystemNotice->base_type = SystemNoticeTypeEnum::ORDER_CANCEL;
|
||||
$SystemNotice->scene_type = 1;//用户端
|
||||
$SystemNotice->user_id = \Yii::$app->user->identity->getId();
|
||||
$SystemNotice->notice_at = date('Y-m-d H:i:s', time());
|
||||
$SystemNotice->saveOrFail();
|
||||
|
||||
//分账状态更新
|
||||
$ledgerForm = new LedgerForm();
|
||||
$ledgerForm->order_id = $Register->id;
|
||||
$ledgerForm->status = 2;
|
||||
$ledgerForm->update('register');
|
||||
// $event = new RegisterEvent([
|
||||
// 'register' => $Register,
|
||||
// ]);
|
||||
// \Yii::$app->trigger(Register::EVENT_CANCELED, $event);
|
||||
$t->commit();
|
||||
|
||||
return [];
|
||||
} catch (\Exception $exception) {
|
||||
$t->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
break;
|
||||
case 1://已支付
|
||||
$t = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
//生成记录
|
||||
$RegisterRefund = new RegisterRefund();
|
||||
$RegisterRefund->user_id = $Register->user_id;
|
||||
$RegisterRefund->register_id = $Register->id;
|
||||
$RegisterRefund->refund_no = FuncHelper::generate_order_no('RF');
|
||||
$RegisterRefund->refund_price = $Register->price;
|
||||
$RegisterRefund->remark = '主动取消订单';
|
||||
$RegisterRefund->saveOrFail();
|
||||
|
||||
//取消状态
|
||||
$Register->is_cancel = 1;
|
||||
$Register->cancel_time = time();
|
||||
$Register->cancel_remark = '您已主动取消订单';
|
||||
//退款状态
|
||||
$Register->refund_status = 1;
|
||||
$Register->refund_time = time();
|
||||
$Register->status = RegisterEnum::CANCEL;
|
||||
$Register->created_at = time();
|
||||
$Register->updated_at = time();
|
||||
$Register->saveOrFail();
|
||||
|
||||
//生成系统消息
|
||||
$SystemNotice = new SystemNotice();
|
||||
$SystemNotice->content = '您已主动取消订单';
|
||||
$SystemNotice->base_type = SystemNoticeTypeEnum::ORDER_CANCEL;
|
||||
$SystemNotice->scene_type = 1;//用户端
|
||||
$SystemNotice->user_id = \Yii::$app->user->identity->getId();
|
||||
$SystemNotice->notice_at = date('Y-m-d H:i:s', time());
|
||||
$SystemNotice->saveOrFail();
|
||||
|
||||
//退款操作
|
||||
$this->refundMoney($RegisterRefund); //可能报错 无效的订单号
|
||||
|
||||
$t->commit();
|
||||
} catch (Exception $exception) {
|
||||
$t->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public function refundMoney($RegisterRefund)
|
||||
{
|
||||
$orderNo = $RegisterRefund->register->order_no;
|
||||
$Register = Register::findOne([
|
||||
'order_no' => $orderNo,
|
||||
'is_pay' => 1
|
||||
]);
|
||||
$PaymentRegister = PaymentRegister::findOne([
|
||||
'order_no' => $orderNo,
|
||||
'is_pay' => 1
|
||||
]);
|
||||
// return [$PaymentRegister->transaction_id];
|
||||
if (!$Register || !$PaymentRegister) {
|
||||
throw new Exception('无效的订单号');
|
||||
}
|
||||
$price = $RegisterRefund->refund_price;
|
||||
if (bccomp($PaymentRegister->amount, $price, 2) == -1) {
|
||||
throw new Exception('退款金额大于可退款金额');
|
||||
}
|
||||
|
||||
$transaction = \Yii::$app->db->beginTransaction();
|
||||
try {
|
||||
$PaymentRegisterRefund = new PaymentRegisterRefund();
|
||||
$PaymentRegisterRefund->refund_no = $RegisterRefund->refund_no;
|
||||
$PaymentRegisterRefund->amount = $price;
|
||||
$PaymentRegisterRefund->is_pay = 0;
|
||||
$PaymentRegisterRefund->pay_type = 0;
|
||||
$PaymentRegisterRefund->created_at = time();
|
||||
$PaymentRegisterRefund->saveOrFail();
|
||||
|
||||
if (bccomp($price, 0, 2) <= 0) {
|
||||
$PaymentRegisterRefund->is_pay = 1;
|
||||
$PaymentRegisterRefund->save();
|
||||
|
||||
$RegisterRefund->is_refund = 1;
|
||||
$RegisterRefund->refund_time = time();
|
||||
$RegisterRefund->save();
|
||||
} else {
|
||||
switch ($PaymentRegister->pay_type) {
|
||||
case 1://微信退款
|
||||
if (\Yii::$app instanceof \yii\web\Application) {
|
||||
$notifyUrl = \Yii::$app->request->hostInfo . "/member/v1/callback/refund-notify/";
|
||||
} else {
|
||||
//如果是job中调用的
|
||||
$notifyUrl = \Yii::$app->getHostInfo() . "/member/v1/callback/refund-notify/";
|
||||
}
|
||||
|
||||
$order_amount = bcmul($PaymentRegister->amount, 100, 0);
|
||||
$refund_amount = bcmul($price, 100, 0);
|
||||
|
||||
$result = WechatService::getInstance()->payment->refund->byTransactionId($PaymentRegister->transaction_id, $PaymentRegisterRefund->refund_no, $order_amount, $refund_amount, [
|
||||
'refund_desc' => '订单申请退款',
|
||||
'notify_url' => $notifyUrl
|
||||
]);
|
||||
if ($result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS') {
|
||||
$error = isset($result['err_code_des']) ? $result['err_code_des'] : $result['return_msg'];
|
||||
throw new Exception($error);
|
||||
}
|
||||
break;
|
||||
case 2://易票联退款
|
||||
$eplResult = EplPayService::getInstance()->refund([
|
||||
'refund_no' => $PaymentRegisterRefund->refund_no,
|
||||
'transaction_id' => $PaymentRegister->transaction_id,
|
||||
'total_pay_price' => $PaymentRegister->amount,
|
||||
'refund_price' => $price,
|
||||
]);
|
||||
if (!isset($eplResult['returnCode']) || $eplResult['returnCode'] != '0000') {
|
||||
throw new Exception($eplResult['returnMsg']);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Exception('退款失败,请联系客服');
|
||||
break;
|
||||
}
|
||||
//其他状态变更在回调
|
||||
}
|
||||
$transaction->commit();
|
||||
return [];
|
||||
} catch (\Exception $exception) {
|
||||
$transaction->rollBack();
|
||||
throw $exception;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user