FastMovieAI AI短剧创作平台 二开基线

- 源码: xhadmincn/FastMovieAI (Apache 2.0)
- 二开: Docker部署, Swoole改Select, route.php修复, 补update/VERSION
- vendor/示例资源已gitignore
This commit is contained in:
李建琦
2026-08-26 18:37:36 +08:00
commit eae151fd57
888 changed files with 105571 additions and 0 deletions
@@ -0,0 +1,115 @@
<?php
namespace plugin\finance\app\api\controller;
use app\Basic;
use app\expose\enum\PaymentChannels;
use plugin\finance\app\model\PluginFinanceOrders;
use plugin\finance\app\model\PluginFinanceOrdersLog;
use plugin\finance\utils\enum\OrdersState;
use plugin\marketing\app\model\PluginMarketingCoupon;
use plugin\marketing\app\model\PluginMarketingCouponCode;
use support\Log;
use support\Request;
use think\facade\Db;
class IndexController extends Basic
{
public function index(Request $request)
{
$limit = $request->get('limit', 10);
$where = [];
$title = $request->get('title');
if ($title) {
$where[] = ['title|trade_no', 'like', "%{$title}%"];
}
$state = $request->get('state');
if ($state !== null) {
$where[] = ['state', '=', $state];
}
$type = $request->get('type');
if ($type) {
$where[] = ['type', '=', $type];
}
$where[] = ['uid', '=', $request->uid];
$config = config('plugin.shopwwi.filesystem.app.storage.public');
$list = PluginFinanceOrders::where($where)->with(['site' => function ($query) {
$query->field('id,title,logo,domain,ip')->hidden(['id']);
}])
->order('id desc')->paginate($limit)->scene('external')->each(function ($item) use ($config) {
$item->state_text = OrdersState::get($item->state);
$pay_type = PaymentChannels::get($item->pay_type);
if ($pay_type) {
$pay_type['icon'] = $config['url'] . $pay_type['icon'];
$item->pay_type_text = $pay_type;
}
if (!empty($item->coupon)) {
$coupon_ids = PluginMarketingCouponCode::whereIn('id', $item->coupon)->column('coupon_id');
$item->coupon = PluginMarketingCoupon::whereIn('id', array_unique($coupon_ids))->column('title');
}
});
return $this->resData($list);
}
public function details(Request $request)
{
$trade_no = $request->get('trade_no');
$order = PluginFinanceOrders::where('trade_no', $trade_no)->find()->scene('external');
$order->state_text = OrdersState::get($order->state);
return $this->resData($order);
}
public function OrdersStateEnum(Request $request)
{
$list = OrdersState::getOptions();
return $this->resData($list);
}
public function cancel(Request $request)
{
$trade_no = $request->post('trade_no');
$where = [
['trade_no', '=', $trade_no],
['uid', '=', $request->uid],
['state', '=', OrdersState::WAIT_PAY['value']]
];
$order = PluginFinanceOrders::where($where)->find();
if (!$order) {
return $this->fail('订单不存在');
}
Db::startTrans();
try {
PluginFinanceOrders::cancel($order);
PluginFinanceOrdersLog::info($order, '用户订单取消');
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
Log::error('User Orders Cancel Error:' . $th->getMessage(), $th->getTrace());
return $this->fail('取消失败');
}
return $this->success('取消成功');
}
public function delete(Request $request)
{
$trade_no = $request->post('trade_no');
$where = [
['trade_no', '=', $trade_no],
['uid', '=', $request->uid],
];
$order = PluginFinanceOrders::where($where)->find();
if (!$order) {
return $this->fail('订单不存在');
}
if ($order->state == OrdersState::WAIT_PAY['value']) {
Db::startTrans();
try {
PluginFinanceOrders::cancel($order);
PluginFinanceOrdersLog::info($order, '用户删除订单取消');
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
Log::error('User Orders Delete Error:' . $th->getMessage(), $th->getTrace());
return $this->fail('删除失败');
}
}
$order->delete();
return $this->success('删除成功');
}
}
@@ -0,0 +1,301 @@
<?php
namespace plugin\finance\app\api\controller;
use app\Basic;
use app\expose\enum\EventName;
use app\expose\enum\PaymentChannels;
use app\expose\enum\ResponseCode;
use app\expose\helper\Payment;
use app\model\PaymentConfig;
use plugin\finance\app\model\PluginFinanceOrders;
use plugin\finance\app\model\PluginFinanceOrdersLog;
use plugin\finance\app\model\PluginFinanceWallet;
use plugin\finance\utils\enum\OrdersState;
use plugin\finance\utils\enum\OrdersType;
use plugin\marketing\app\model\PluginMarketingPlan;
use plugin\marketing\app\model\PluginMarketingPlanPrice;
use plugin\marketing\app\model\PluginMarketingPoints;
use support\Log;
use support\Request;
use think\facade\Db;
use Webman\Event\Event;
class OrdersController extends Basic
{
public function payOrder(Request $request)
{
$data = $request->post();
if (empty($data['trade_no'])) {
return $this->fail('参数错误');
}
$order = PluginFinanceOrders::where(['trade_no' => $data['trade_no'], 'uid' => $request->uid])->find();
if (!$order) {
return $this->fail('订单不存在');
}
if ($order->state !== OrdersState::WAIT_PAY['value']) {
return $this->fail('订单状态错误');
}
try {
return $this->builderPay($request, $order);
} catch (\Throwable $th) {
return $this->exception($th);
}
}
public function create(Request $request)
{
$data = $request->post();
if (empty($data['type'])) {
return $this->fail('参数错误');
}
try {
switch ($data['type']) {
case OrdersType::POINTS['value']:
$order = $this->createPoints($request);
break;
case OrdersType::VIP['value']:
$order = $this->createVip($request);
break;
default:
throw new \Exception('订单类型错误');
}
} catch (\Throwable $th) {
return $this->exception($th);
}
Event::emit(EventName::ORDERS_CREATE['value'], $order);
try {
return $this->builderPay($request, $order);
} catch (\Throwable $th) {
return $this->exception($th);
}
}
private function builderPay(Request $request, PluginFinanceOrders $order)
{
if ($order->state === OrdersState::PAID['value']) {
try {
PluginFinanceOrders::finish(['trade_no' => $order->trade_no]);
} catch (\Throwable $th) {
PluginFinanceOrdersLog::fail($order, $th->getMessage());
Log::error("订单完成失败:{$order->trade_no},{$th->getMessage()},{$th->getFile()}:{$th->getLine()}", $th->getTrace());
throw $th;
}
return $this->code(ResponseCode::PAY_SUCCESS, '支付成功');
} else {
$data = $request->post();
if (empty($data['payment_id'])) {
throw new \Exception('支付方式不存在');
}
$PaymentConfig = PaymentConfig::where(['id' => $data['payment_id']])->find();
if (!$PaymentConfig) {
throw new \Exception('支付方式不存在');
}
$order->plugin = 'finance';
$order->trade = $order->trade_no;
$order->price = $order->money;
switch ($PaymentConfig->channels) {
case PaymentChannels::WXPAY['value']:
$result = Payment::wxPay($order, $PaymentConfig);
$orderInfo = [
'platform' => $PaymentConfig->platform,
'title' => $order->title,
'pay_info' => $result,
'trade_no' => $order->trade_no,
'origin_money' => $order->origin_money,
'expire_time' => $order->expire_time,
'money' => $order->money
];
return $this->resData($orderInfo);
case PaymentChannels::ALIPAY['value']:
break;
case PaymentChannels::INTEGRAL['value']:
break;
case PaymentChannels::BALANCE['value']:
Db::startTrans();
try {
$order = PluginFinanceOrders::where(['id' => $order->id])->find();
if (!$order) {
throw new \Exception('订单不存在');
}
$order->state = OrdersState::PAID['value'];
$order->pay_type = PaymentChannels::BALANCE['value'];
$order->pay_time = date('Y-m-d H:i:s');
$order->save();
PluginFinanceWallet::consume($order);
PluginFinanceOrdersLog::info($order, '余额支付成功');
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
PluginFinanceOrdersLog::fail($order, $th->getMessage());
throw $th;
}
Event::emit(EventName::ORDERS_PAY['value'], [
'data' => $order,
'payment_channel' => PaymentChannels::BALANCE['value'],
'plugin' => 'finance',
'template_id' => $PaymentConfig->template_id
]);
return $this->builderPay($request, $order);
default:
throw new \Exception('未知支付方式');
}
}
}
private function createVip(Request $request){
Db::startTrans();
try {
$data = $request->post();
$vipInfoPrice = PluginMarketingPlanPrice::where(['id' => $data['id']])->find();
if (!$vipInfoPrice) {
throw new \Exception('会员套餐不存在');
}
$vipInfo = PluginMarketingPlan::where(['id' => $vipInfoPrice->plan_id])->find();
if (!$vipInfo) {
throw new \Exception('会员套餐不存在');
}
$order = new PluginFinanceOrders;
$order->uid = $request->uid;
$order->alias_id = $vipInfoPrice->id;
$order->title = '购买会员:' . $vipInfo->name;
$order->origin_money = $vipInfoPrice->price;
$order->unit_money = $vipInfoPrice->price;
$order->money = $vipInfoPrice->price;
$order->num = 1;
$order->pay_type = $data['pay_type'];
$order->state = OrdersState::WAIT_PAY['value'];
$order->type = OrdersType::VIP['value'];
$order->channels_uid = $request->channels_uid;
$order->plugin = 'finance';
$order->expire_time = date('Y-m-d H:i:s', strtotime('+15 minutes'));
$order->save();
PluginFinanceOrdersLog::info($order, '创建订单');
Db::commit();
return $order;
} catch (\Throwable $th) {
Db::rollback();
throw $th;
}
}
private function createPoints(Request $request)
{
Db::startTrans();
try {
$data = $request->post();
$pointsInfo = PluginMarketingPoints::where(['id' => $data['id'], 'channels_uid' => $request->channels_uid])->find();
if (!$pointsInfo) {
throw new \Exception('积分套餐不存在');
}
$order = new PluginFinanceOrders;
$order->uid = $request->uid;
$order->alias_id = $pointsInfo->id;
$order->title = '购买套餐:' . $pointsInfo->name;
$order->origin_money = $pointsInfo->price;
$order->unit_money = $pointsInfo->price;
$order->money = $pointsInfo->price;
$order->num = 1;
$order->pay_type = $data['pay_type'];
$order->state = OrdersState::WAIT_PAY['value'];
$order->type = OrdersType::POINTS['value'];
$order->channels_uid = $request->channels_uid;
$order->plugin = 'finance';
$order->expire_time = date('Y-m-d H:i:s', strtotime('+15 minutes'));
$order->save();
PluginFinanceOrdersLog::info($order, '创建订单');
Db::commit();
return $order;
} catch (\Throwable $th) {
Db::rollback();
throw $th;
}
}
private function createMoney(Request $request)
{
$data = $request->post();
Db::startTrans();
try {
//组装订单数据
$order = new PluginFinanceOrders;
$order->uid = $request->uid;
$order->money = (int)$data['num']; //原价 未实现优惠券逻辑
if ($order->money < 1) {
throw new \Exception('充值金额不能小于1元');
}
$order->origin_money = $order->money;
$order->title = '充值金额:' . $order->money . '元';
$order->state = OrdersState::WAIT_PAY['value'];
$order['type'] = $data['type'];
$order->save();
PluginFinanceOrdersLog::info($order->id, '创建订单');
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
throw $th;
}
return $order;
}
/**
* 查看订单状态 是否支付
* @Author: 贵州猿创科技有限公司
* @Date: 2023-05-20
*/
public function state(Request $request)
{
$trade_no = $request->get('trade_no');
if (!$trade_no) {
return $this->fail('参数错误');
}
$info = PluginFinanceOrders::where(['trade_no' => $trade_no, 'uid' => $request->uid])->find();
if (!$info) {
return $this->fail('订单不存在');
}
switch ($info->state) {
case OrdersState::WAIT_PAY['value']:
return $this->code(ResponseCode::WAIT, '支付中');
case OrdersState::PAID['value']:
case OrdersState::FINISH['value']:
return $this->code(ResponseCode::PAY_SUCCESS, '支付成功');
case OrdersState::REFUND_ING['value']:
case OrdersState::REFUND_SUCCESS['value']:
case OrdersState::REFUND_FAIL['value']:
return $this->fail('订单已退款或退款中');
case OrdersState::INVALID['value']:
return $this->fail('订单已作废');
case OrdersState::NOTIFY_FAIL['value']:
return $this->fail('订单通知失败');
case OrdersState::CANCEL['value']:
return $this->fail('订单已取消');
default:
return $this->fail('订单状态错误');
}
}
public function cancel(Request $request)
{
$trade_no = $request->get('trade_no');
if (!$trade_no) {
return $this->fail('参数错误');
}
try {
PluginFinanceOrders::cancel(['trade_no' => $trade_no, 'uid' => $request->uid]);
} catch (\Throwable $th) {
return $this->fail($th->getMessage());
}
return $this->success('取消成功');
}
public function getOrderStatus(Request $request)
{
$trade_no = $request->get('trade');
if (!$trade_no) {
return $this->fail('参数错误');
}
$order = PluginFinanceOrders::where(['trade_no' => $trade_no, 'uid' => $request->uid])->find();
if (!$order) {
return $this->fail('订单不存在');
}
return $this->resData(['status' => in_array($order->state, [OrdersState::PAID['value'], OrdersState::FINISH['value']])]);
}
}
@@ -0,0 +1,22 @@
<?php
namespace plugin\finance\app\api\controller;
use app\Basic;
use plugin\finance\app\model\PluginFinanceWallet;
use support\Request;
class UserController extends Basic
{
public function wallet(Request $request)
{
$uid = $request->uid;
$PluginFinanceWallet = PluginFinanceWallet::where('uid', $uid)->find();
if (!$PluginFinanceWallet) {
$PluginFinanceWallet = new PluginFinanceWallet();
$PluginFinanceWallet->uid = $uid;
$PluginFinanceWallet->save();
}
return $this->resData($PluginFinanceWallet->hidden(['uid']));
}
}