<?php
|
|
namespace app\api\model\plus\release;
|
|
use app\api\service\order\PaymentService;
|
use app\common\enum\order\OrderTypeEnum;
|
use app\common\model\plus\release\Order as OrderModel;
|
use app\common\model\plus\release\Project as ProjectModel;
|
use app\common\model\plus\release\DemandUser as DemandUserModel;
|
use app\common\exception\BaseException;
|
use app\common\enum\order\OrderPayTypeEnum;
|
use app\api\service\order\paysuccess\type\ReleasePaySuccessService;
|
use app\common\service\order\OrderService;
|
use app\common\model\plus\release\SupplyUser as SupplyUserModel;
|
use app\api\model\plus\release\Setting;
|
|
/**
|
* 订单模型
|
*/
|
class Order extends OrderModel
|
{
|
/**
|
* 隐藏字段
|
*/
|
protected $hidden = [
|
'update_time',
|
];
|
|
/**
|
* 获取用户订单列表
|
*/
|
public function getList($user_id,$postData =[])
|
{
|
$model = $this;
|
if(!empty($postData["state_active"])){
|
if($postData["state_active"] == 10){
|
//未支付,确认订单
|
$model = $model->where('pay_status', '=', 10);
|
}else if ($postData["state_active"] == 20){
|
//已付款,进行中
|
$model = $model->where('order_status', '=', 10)->where('pay_status', '=', 20);
|
}else if ($postData["state_active"] == 30){
|
//已完成
|
$model = $model->where('order_status', '=', 30);
|
}else if ($postData["state_active"] == 40){
|
//已取消
|
$model = $model->where('order_status', '=', 20);
|
}
|
}
|
if(!empty($postData["keyword"])){
|
$model = $model->where('project_name', 'like', '%' . trim($postData["keyword"]) . '%');
|
}
|
if(empty($postData["product_type"])){
|
//获取需求订单
|
$model = $model->where('demand_user_id', '=', $user_id);
|
}else{
|
//获取服务订单
|
$model = $model->where('supply_user_id', '=', $user_id);
|
}
|
$data = $model->with(['demanduser','supplyuser','project'])
|
->order(['create_time' => 'desc'])
|
->paginate($postData);
|
return $data;
|
}
|
|
|
/**
|
* 详情
|
*/
|
public static function detail($id)
|
{
|
if (!$model = parent::detail($id)) {
|
throw new BaseException(['msg' => '信息不存在']);
|
}
|
return $model;
|
}
|
|
/**
|
* 提交
|
*/
|
public function submit($user,$params)
|
{
|
$project_id=$params["project_id"];
|
$pay_type = $params["pay_type"];
|
|
//获取项目信息
|
$project = ProjectModel::detail($project_id);
|
$order_price = $project["price"];
|
//获取抽成比例
|
$settlement = Setting::getItem('settlement');
|
$order_rate = empty($settlement["order_rate"]) ? 0 : $settlement["order_rate"]/100;
|
$order_money = $project["price"];
|
if($order_rate > 0){
|
$order_money = $order_money - $order_money*$order_rate;
|
}
|
$project_type = $project["project_type"];//项目类型
|
|
|
if ($order_price == 0) {
|
$pay_type = OrderPayTypeEnum::BALANCE;
|
}
|
|
if($project["user_id"] == $user["user_id"]){
|
$this->error = '创建失败';
|
return false;
|
}
|
|
if ($pay_type == OrderPayTypeEnum::BALANCE && $user['balance'] < $order_price) {
|
$this->error = '用户余额不足,无法使用余额支付';
|
return false;
|
}
|
|
|
|
$data = [
|
'demand_user_id' => empty($project["product_type"]) ? $project["user_id"] : $user["user_id"],
|
'supply_user_id' => !empty($project["product_type"]) ? $project["user_id"] : $user["user_id"],
|
'order_price' => $order_price,
|
'pay_price' => $order_price,
|
'pay_type' => $pay_type,
|
'project_id' => $project["project_id"],
|
'project_name' => $project["name"],
|
'project_type' => $project_type,
|
'money' => floor($order_money*100)/100,
|
'order_no' => $this->orderNo(),
|
'app_id' => self::$app_id
|
];
|
|
return $this->transaction(function () use ($data) {
|
// 记录内容
|
$this->save($data);
|
// 余额支付标记订单已支付
|
if ($data['pay_type'] == OrderPayTypeEnum::BALANCE) {
|
$this->onPaymentByBalance($data['order_no']);
|
}
|
return $this['id'];
|
});
|
}
|
|
/**
|
* 生成订单号
|
*/
|
public function orderNo()
|
{
|
return OrderService::createOrderNo();
|
}
|
|
/**
|
* 余额支付标记订单已支付
|
*/
|
public function onPaymentByBalance($orderNo)
|
{
|
|
// 获取订单详情
|
$PaySuccess = new ReleasePaySuccessService($orderNo);
|
// 发起余额支付
|
return $PaySuccess->onPaySuccess(OrderPayTypeEnum::BALANCE);
|
}
|
|
/**
|
* 构建支付请求的参数
|
*/
|
public static function onOrderPayment($user, $order, $payType, $pay_source)
|
{
|
//如果来源是h5,首次不处理,payH5再处理
|
if ($pay_source == 'h5') {
|
return [];
|
}
|
if ($payType == OrderPayTypeEnum::WECHAT) {
|
return self::onPaymentByWechat($user, $order, $pay_source);
|
}
|
return [];
|
}
|
|
/**
|
* 构建微信支付请求
|
*/
|
protected static function onPaymentByWechat($user, $order, $pay_source)
|
{
|
return PaymentService::wechat(
|
$user,
|
$order["order_no"],
|
OrderTypeEnum::RELEASE,
|
$pay_source,
|
$order["pay_price"],
|
0,
|
);
|
}
|
|
|
|
/**
|
* 供应方创建订单,不需要支付
|
*/
|
public function createOrder($user,$params)
|
{
|
$project_id=$params["project_id"];
|
$pay_type = 10;
|
|
//获取项目信息
|
$project = ProjectModel::detail($project_id);
|
$order_price = $project["price"];
|
//获取抽成比例
|
$settlement = Setting::getItem('settlement');
|
$order_rate = empty($settlement["order_rate"]) ? 0 : $settlement["order_rate"]/100;
|
$order_money = $project["price"];
|
if($order_rate > 0){
|
$order_money = $order_money - $order_money*$order_rate;
|
}
|
$project_type = $project["project_type"];//项目类型
|
|
if($project["user_id"] == $user["user_id"]){
|
$this->error = '创建失败';
|
return false;
|
}
|
|
$data = [
|
'demand_user_id' => empty($project["product_type"]) ? $project["user_id"] : $user["user_id"],
|
'supply_user_id' => !empty($project["product_type"]) ? $project["user_id"] : $user["user_id"],
|
'order_price' => $order_price,
|
'pay_price' => $order_price,
|
'pay_type' => $pay_type,
|
'project_id' => $project["project_id"],
|
'project_name' => $project["name"],
|
'project_type' => $project_type,
|
'money' => floor($order_money*100)/100,
|
'order_no' => $this->orderNo(),
|
'app_id' => self::$app_id
|
];
|
return $this->save($data);
|
}
|
|
/**
|
* 完成
|
*/
|
public function finish($params)
|
{
|
return $this->transaction(function () use ($params) {
|
//给供应方发放金钱
|
(new SupplyUserModel())->where("user_id","=",$this["supply_user_id"])->inc("money",$this["money"])->update();
|
|
$data["order_status"] = 30;
|
$data["evaluate_content"] = $params["evaluate_content"];
|
$data["server_score"] = $params["server_score"];
|
$data["score"] = empty($params["score"]) ? 10 : $params["score"];
|
$data["finish_time"] = time();
|
return $this->save($data);
|
});
|
}
|
|
/**
|
* 取消订单
|
*/
|
public function cancel($user)
|
{
|
if ($this['order_status'] == 30) {
|
$this->error = '已完成不可取消';
|
return false;
|
}
|
//订单不能取消
|
if($this['order_status'] != 10){
|
$this->error = '该订单已取消';
|
return false;
|
}
|
|
// 订单取消事件
|
return $this->transaction(function () use ($user) {
|
// 订单是否已支付
|
$isPay = $this['pay_status'] == 20;
|
// 更新订单状态
|
return $this->save(['order_status' => $isPay ? 21 : 20]);
|
});
|
}
|
|
}
|