You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
zhishifufei_php/application/kefu/controller/Order.php

484 lines
23 KiB

10 months ago
<?php
// +----------------------------------------------------------------------
// | 天诚科技 [ 刘海东 17600099397赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2020 https://www.tczxkj.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 该系统并不是自由软件,未经许可不能去掉相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\kefu\controller;
use app\kefu\controller\AuthController;
use service\JsonService as Json;
use app\admin\model\order\StoreOrder as StoreOrderModel;
use service\HookService;
use basic\ModelBasic;
use app\wap\model\special\SpecialBuy;
use service\AlipayTradeWapService;
use app\wap\model\store\StorePink;
use app\admin\model\user\User;
use app\admin\model\user\UserBill;
use app\admin\model\user\MemberShip;
use app\admin\model\merchant\MerchantFlowingWater;
use app\admin\model\order\StoreOrderStatus;
use app\admin\model\ump\EventSignUp as EventSignUpModel;
use behavior\wechat\PaymentBehavior;
use app\admin\model\order\DataDownloadOrder as DataDownloadOrderModel;
use app\admin\model\download\DataDownloadBuy;
use app\admin\model\order\TestPaperOrder as TestPaperOrderModel;
use app\admin\model\questions\TestPaperObtain;
use app\admin\model\user\UserRecharge as UserRechargeModel;
use service\SystemConfigService;
class Order extends AuthController
{
public function get_order_list($uid = '', $search = '', $type = 0, $page = 1, $limit = 10)
{
if (!$uid) return Json::fail("用户不存在!");
$orders = [];
$formatTime = true;
if ($type < 3) {
// 课程订单、商品订单、会员订单
$where = [
'type' => '',
'status' => '',
'real_name' => $search,
'uid' => $uid,
'data' => '',
'types' => $type,
'order' => '',
'spread_type' => '',
'page' => $page,
'limit' => $limit,
'excel' => 0
];
$orders = StoreOrderModel::OrderList($where)['data'];
} else if ($type == 4) {
// 报名订单
$where = [
'id' => '',
'page' => $page,
'limit' => $limit,
'status' => '',
'type' => '',
'uid' => $uid,
'real_name' => $search,
'data' => '',
'excel' => 0,
];
$orders = EventSignUpModel::getUserSignUpAll($where)['data'];
} else if ($type == 5) {
// 资料订单
$where = [
'status' => '',
'real_name' => $search,
'uid' => $uid,
'is_del' => 0,
'data' => '',
'type' => '',
'order' => '',
'page' => $page,
'limit' => $limit,
'excel' => 0
];
$orders = DataDownloadOrderModel::orderList($where)['data'];
} else if ($type == 6) {
// 考试订单
$where = [
'status' => '',
'real_name' => $search,
'is_del' => 0,
'uid' => $uid,
'data' => '',
'type' => '',
'order' => '',
'page' => $page,
'limit' => $limit,
'excel' => 0
];
$orders = TestPaperOrderModel::OrderList($where)['data'];
} else if ($type == 7) {
// 充值订单
$where = [
'status' => '',
'real_name' => $search,
'uid' => $uid,
'data' => '',
'order' => '',
'page' => $page,
'limit' => $limit,
'excel' => 0
];
$formatTime = false;
$orders = UserRechargeModel::systemPage($where)['data'];
foreach ($orders as &$order) {
$order['add_time'] = date("Y/m/d H:i:s", $order['add_time']);
}
}
if ($formatTime) {
foreach ($orders as &$order) {
if ($order['pay_time']) {
$order['pay_time'] = date("Y/m/d H:i:s", $order['pay_time']);
} else {
$order['pay_time'] = '';
}
$order['add_time'] = date("Y/m/d H:i:s", $order['add_time']);
}
}
return Json::successful($orders);
}
public function save_order_remark($order_id, $remark, $order_type = 0)
{
if ($order_type < 3) {
// 课程订单、商品订单、会员订单
$order = (new StoreOrderModel)->where([
'order_id' => $order_id,
'type' => $order_type
])->find();
if (!$order) return Json::fail("订单不存在!");
$order->mark = $remark;
$order->save();
return Json::successful("保存成功!");
}
}
public function order_refund($id, $type)
{
if ($type < 3) {
// 课程订单、商品订单、会员订单
$product = StoreOrderModel::get($id);
if (!$product) return Json::fail('数据不存在!');
if ($product['pay_price'] == $product['refund_price']) return Json::fail('已退完支付金额!不能再退款了');
$data = [
'refund_price' => $product['pay_price'],
'type' => 1
];
if (!$data['refund_price']) return Json::fail('请输入退款金额');
$refund_price = $data['refund_price'];
$data['refund_price'] = bcadd($data['refund_price'], $product['refund_price'], 2);
$bj = bccomp((float)$product['pay_price'], (float)$data['refund_price'], 2);
if ($bj < 0) return Json::fail('退款金额大于支付金额请修改退款金额');
if ($data['type'] == 1) {
$data['refund_status'] = 2;
} else if ($data['type'] == 2) {
$data['refund_status'] = 0;
}
$type = $data['type'];
unset($data['type']);
$refund_data['pay_price'] = $product['pay_price'];
$refund_data['refund_price'] = $refund_price;
if ($product['pay_type'] == 'weixin') {
try {
HookService::listen('wechat_pay_order_refund', $product['order_id'], $refund_data, true, PaymentBehavior::class);
} catch (\Exception $e) {
return Json::fail($e->getMessage());
}
} else if ($product['pay_type'] == 'yue') {
ModelBasic::beginTrans();
$res = User::bcInc($product['uid'], 'now_money', $refund_price, 'uid');
ModelBasic::checkTrans($res);
if (!$res) return Json::fail('余额退款失败!');
} else if ($product['pay_type'] == 'zhifubao') {
if ($product['type'] == 0 && $product['combination_id'] > 0) {
$mask = '拼团失败退款';
} elseif ($product['type'] == 0 && $product['combination_id'] == 0) {
$mask = '专题退款';
} elseif ($product['type'] == 2) {
$mask = '商品退款';
}
$res = AlipayTradeWapService::init()->AliPayRefund($product['order_id'], $product['trade_no'], $refund_price, $mask, 'refund');
if (empty($res) || $res != 10000) {
return Json::fail('支付宝退款失败!');
}
}
$data['refund_reason_time'] = time();
$resEdit = StoreOrderModel::edit($data, $id);
if ($resEdit) {
$data['type'] = $type;
if ($data['type'] == 1 && $product['type'] == 0) {
StorePink::setRefundPink($id);
(new SpecialBuy)->where('order_id', $product['order_id'])->delete();
}
if ($product['type'] == 1) {
$merber = (new MemberShip)->where('id', $product['member_id'])->find();
if ($merber['is_permanent']) {
(new User)->where('uid', $product['uid'])->update(['is_permanent' => 0]);
} else {
$time = bcmul($merber['vip_day'], 86400, 0);
(new User)->where('uid', $product['uid'])->setDec('overdue_time', $time);
}
}
if ($product['type'] == 0 && $product['combination_id'] > 0) {
$title = '专题拼团退款';
MerchantFlowingWater::orderRefund($id, $product['mer_id'], 0);
} elseif ($product['type'] == 0 && $product['combination_id'] == 0) {
$title = '专题退款';
MerchantFlowingWater::orderRefund($id, $product['mer_id'], 0);
} elseif ($product['type'] == 1) {
$title = '会员退款';
} elseif ($product['type'] == 2) {
$title = '商品退款';
MerchantFlowingWater::orderRefund($id, $product['mer_id'], 2);
}
$pay_type = $product['pay_type'] == 'yue' ? 'now_money' : $product['pay_type'];
if ($product['pay_type'] == 'yue') {
$balance = (new User)->where(['uid' => $product['uid']])->value('now_money');
} else {
$balance = 0;
}
UserBill::income($title, $product['uid'], $pay_type, 'pay_product_refund', $refund_price, $product['id'], $balance, '订单退款' . floatval($refund_price) . '元');
HookService::afterListen('store_product_order_refund_y', $data, $id, false, StoreProductBehavior::class);
StoreOrderStatus::setStatus($id, 'refund_price', '退款给用户' . $refund_price . '元');
return Json::successful('退款成功!');
} else {
StoreOrderStatus::setStatus($id, 'refund_price', '退款给用户' . $refund_price . '元失败');
return Json::successful('退款失败!');
}
} else if ($type == 4) {
// 报名订单
if (!$id) return Json::fail('数据不存在');
$product = EventSignUpModel::get($id);
if (!$product) return Json::fail('数据不存在!');
$data = [
'refund_price' => $product['pay_price'],
];
if ($product['pay_price'] == $product['refund_price']) return Json::fail('已退完支付金额!不能再退款了');
if (!$data['refund_price']) return Json::fail('请输入退款金额');
$refund_price = $data['refund_price'];
$data['refund_price'] = bcadd($data['refund_price'], $product['refund_price'], 2);
$bj = bccomp((float)$product['pay_price'], (float)$data['refund_price'], 2);
if ($bj < 0) return Json::fail('退款金额大于支付金额请修改退款金额');
$data['refund_status'] = 2;
$refund_data['pay_price'] = $product['pay_price'];
$refund_data['refund_price'] = $refund_price;
if ($product['pay_type'] == 'weixin') {
try {
HookService::listen('wechat_pay_order_refund', $product['order_id'], $refund_data, true, PaymentBehavior::class);
} catch (\Exception $e) {
return Json::fail($e->getMessage());
}
} else if ($product['pay_type'] == 'yue') {
EventSignUpModel::beginTrans();
$res = User::bcInc($product['uid'], 'now_money', $refund_price, 'uid');
EventSignUpModel::checkTrans($res);
if (!$res) return Json::fail('余额退款失败!');
} else if ($product['pay_type'] == 'zhifubao') {
$res = AlipayTradeWapService::init()->AliPayRefund($product['order_id'], $product['trade_no'], $refund_price, '活动订单退款', 'refund');
if (empty($res) || $res != 10000) {
return Json::fail('支付宝退款失败!');
}
}
$data['refund_reason_time'] = time();
$resEdit = EventSignUpModel::edit($data, $id);
if ($resEdit) {
$pay_type = $product['pay_type'] == 'yue' ? 'now_money' : $product['pay_type'];
if ($product['pay_type'] == 'yue') {
$balance = (new User)->where(['uid' => $product['uid']])->value('now_money');
} else {
$balance = 0;
}
UserBill::income('活动订单退款', $product['uid'], $pay_type, 'pay_sign_up_refund', $refund_price, $product['id'], $balance, '活动订单退款' . floatval($refund_price) . '元');
MerchantFlowingWater::orderRefund($id, $product['mer_id'], 4);
return Json::successful('修改成功!');
} else {
return Json::successful('修改失败!');
}
} else if ($type == 5) {
// 资料订单
if (!$id) return Json::fail('数据不存在');
$product = DataDownloadOrderModel::get($id);
if (!$product) return Json::fail('数据不存在!');
$data = [
'refund_price' => $product['pay_price'],
'type' => 1,
];
if ($product['pay_price'] == $product['refund_price']) return Json::fail('已退完支付金额!不能再退款了');
if (!$data['refund_price']) return Json::fail('请输入退款金额');
$refund_price = $data['refund_price'];
$data['refund_price'] = bcadd($data['refund_price'], (string)$product['refund_price'], 2);
$bj = bccomp((float)$product['pay_price'], (float)$data['refund_price'], 2);
if ($bj < 0) return Json::fail('退款金额大于支付金额请修改退款金额');
if ($data['type'] == 1) {
$data['refund_status'] = 2;
} else if ($data['type'] == 2) {
$data['refund_status'] = 0;
}
$type = $data['type'];
unset($data['type']);
$refund_data['pay_price'] = $product['pay_price'];
$refund_data['refund_price'] = $refund_price;
if ($product['pay_type'] == 'weixin') {
try {
HookService::listen('wechat_pay_order_refund', $product['order_id'], $refund_data, true, PaymentBehavior::class);
} catch (\Exception $e) {
return Json::fail($e->getMessage());
}
} else if ($product['pay_type'] == 'yue') {
ModelBasic::beginTrans();
$res = User::bcInc($product['uid'], 'now_money', $refund_price, 'uid');
ModelBasic::checkTrans($res);
if (!$res) return Json::fail('余额退款失败!');
} else if ($product['pay_type'] == 'zhifubao') {
$res = AlipayTradeWapService::init()->AliPayRefund($product['order_id'], $product['trade_no'], $refund_price, '资料退款', 'refund');
if (empty($res) || $res != 10000) {
return Json::fail('支付宝退款失败!');
}
}
$data['refund_reason_time'] = time();
$resEdit = DataDownloadOrderModel::edit($data, $id);
if ($resEdit) {
$data['type'] = $type;
(new DataDownloadBuy)->where('order_id', $product['order_id'])->delete();
$pay_type = $product['pay_type'] == 'yue' ? 'now_money' : $product['pay_type'];
if ($product['pay_type'] == 'yue') {
$balance = (new User)->where(['uid' => $product['uid']])->value('now_money');
} else {
$balance = 0;
}
UserBill::income('资料退款', $product['uid'], $pay_type, 'pay_data_download_refund', $refund_price, $product['id'], $balance, '订单退款' . floatval($refund_price) . '元');
MerchantFlowingWater::orderRefund($id, $product['mer_id'], 3);
return Json::successful('修改成功!');
} else {
return Json::successful('修改失败!');
}
} else if ($type == 6) {
//考试订单
if (!$id) return Json::fail('数据不存在');
$product = TestPaperOrderModel::get($id);
if (!$product) return Json::fail('数据不存在!');
$data = [
'refund_price' => $product['pay_price'],
'type' => 1
];
if ($product['pay_price'] == $product['refund_price']) return Json::fail('已退完支付金额!不能再退款了');
if (!$data['refund_price']) return Json::fail('请输入退款金额');
$refund_price = $data['refund_price'];
$data['refund_price'] = bcadd($data['refund_price'], $product['refund_price'], 2);
$bj = bccomp((float)$product['pay_price'], (float)$data['refund_price'], 2);
if ($bj < 0) return Json::fail('退款金额大于支付金额请修改退款金额');
if ($data['type'] == 1) {
$data['refund_status'] = 2;
} else if ($data['type'] == 2) {
$data['refund_status'] = 0;
}
$type = $data['type'];
unset($data['type']);
$refund_data['pay_price'] = $product['pay_price'];
$refund_data['refund_price'] = $refund_price;
if ($product['pay_type'] == 'weixin') {
try {
HookService::listen('wechat_pay_order_refund', $product['order_id'], $refund_data, true, PaymentBehavior::class);
} catch (\Exception $e) {
return Json::fail($e->getMessage());
}
} else if ($product['pay_type'] == 'yue') {
ModelBasic::beginTrans();
$res = User::bcInc($product['uid'], 'now_money', $refund_price, 'uid');
ModelBasic::checkTrans($res);
if (!$res) return Json::fail('余额退款失败!');
} else if ($product['pay_type'] == 'zhifubao') {
$res = AlipayTradeWapService::init()->AliPayRefund($product['order_id'], $product['trade_no'], $refund_price, '试卷退款', 'refund');
if (empty($res) || $res != 10000) {
return Json::fail('支付宝退款失败!');
}
}
$data['refund_reason_time'] = time();
$resEdit = TestPaperOrderModel::edit($data, $id);
if ($resEdit) {
$data['type'] = $type;
(new TestPaperObtain)->where('order_id', $product['order_id'])->delete();
$pay_type = $product['pay_type'] == 'yue' ? 'now_money' : $product['pay_type'];
if ($product['pay_type'] == 'yue') {
$balance = (new User)->where(['uid' => $product['uid']])->value('now_money');
} else {
$balance = 0;
}
UserBill::income('试卷退款', $product['uid'], $pay_type, 'pay_test_paper_refund', $refund_price, $product['id'], $balance, '订单退款' . floatval($refund_price) . '元');
return Json::successful('修改成功!');
} else {
return Json::successful('修改失败!');
}
} else if ($type == 7) {
// 充值订单
if (!$id) return Json::fail('数据不存在');
$UserRecharge = UserRechargeModel::get($id);
if (!$UserRecharge) return Json::fail('数据不存在!');
$data = [
'refund_price' => $UserRecharge['price'],
];
if ($UserRecharge['price'] == $UserRecharge['refund_price']) return Json::fail('已退完支付金额!不能再退款了');
if (!$data['refund_price']) return Json::fail('请输入退款金额');
$refund_price = $data['refund_price'];
$data['refund_price'] = bcadd($data['refund_price'], (string)$UserRecharge['refund_price'], 2);
$bj = bccomp((float)$UserRecharge['price'], (float)$data['refund_price'], 2);
if ($bj < 0) return Json::fail('退款金额大于支付金额请修改退款金额');
$refund_data['pay_price'] = $UserRecharge['price'];
$refund_data['refund_price'] = $refund_price;
$data['refund_status'] = 2;
if ($UserRecharge['recharge_type'] == 'weixin') {
try {
HookService::listen('user_recharge_refund', $UserRecharge['order_id'], $refund_data, true, PaymentBehavior::class);
} catch (\Exception $e) {
return Json::fail($e->getMessage());
}
} else if ($UserRecharge['recharge_type'] == 'yue') {
UserRechargeModel::beginTrans();
$res = User::bcInc($UserRecharge['uid'], 'now_money', $refund_price, 'uid');
UserRechargeModel::checkTrans($res);
if (!$res) return Json::fail('余额退款失败!');
} else if ($UserRecharge['recharge_type'] == 'zhifubao') {
$res = AlipayTradeWapService::init()->AliPayRefund($UserRecharge['order_id'], $UserRecharge['trade_no'], $refund_price, '虚拟币充值退款', 'refund');
if (empty($res) || $res != 10000) {
return Json::fail('支付宝退款失败!');
}
}
$data['refund_reason_time'] = time();
$resEdit = UserRechargeModel::edit($data, $id);
if ($resEdit) {
$goldNum = money_rate_num($refund_price, 'gold');
$gold_name = SystemConfigService::get('gold_name'); //虚拟币名称
User::bcDec($UserRecharge['uid'], 'gold_num', $goldNum, 'uid');
UserBill::expend($gold_name . '充值退款', $UserRecharge['uid'], 'gold_num', 'return', $goldNum, $UserRecharge['id'], 0, '退' . floatval($goldNum) . $gold_name);
$recharge_type = $UserRecharge['recharge_type'] == 'yue' ? 'now_money' : $UserRecharge['recharge_type'];
UserBill::income('虚拟币充值退款', $UserRecharge['uid'], $recharge_type, 'user_recharge_refund', $refund_price, $UserRecharge['id'], 0, '订单退款' . floatval($refund_price) . '元');
return Json::successful('修改成功!');
} else {
return Json::successful('修改失败!');
}
}
}
}